mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-27 14:24:40 +00:00
MIR Parser: Use source locations for MBB naming errors.
This commit changes the type of the field 'Name' in the struct 'yaml::MachineBasicBlock' from 'std::string' to 'yaml::StringValue'. This change allows the MIR parser to report errors related to the MBB name with the proper source locations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241718 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -83,7 +83,7 @@ namespace yaml {
|
|||||||
|
|
||||||
struct MachineBasicBlock {
|
struct MachineBasicBlock {
|
||||||
unsigned ID;
|
unsigned ID;
|
||||||
std::string Name;
|
StringValue Name;
|
||||||
unsigned Alignment = 0;
|
unsigned Alignment = 0;
|
||||||
bool IsLandingPad = false;
|
bool IsLandingPad = false;
|
||||||
bool AddressTaken = false;
|
bool AddressTaken = false;
|
||||||
@ -97,7 +97,7 @@ template <> struct MappingTraits<MachineBasicBlock> {
|
|||||||
static void mapping(IO &YamlIO, MachineBasicBlock &MBB) {
|
static void mapping(IO &YamlIO, MachineBasicBlock &MBB) {
|
||||||
YamlIO.mapRequired("id", MBB.ID);
|
YamlIO.mapRequired("id", MBB.ID);
|
||||||
YamlIO.mapOptional("name", MBB.Name,
|
YamlIO.mapOptional("name", MBB.Name,
|
||||||
std::string()); // Don't print out an empty name.
|
StringValue()); // Don't print out an empty name.
|
||||||
YamlIO.mapOptional("alignment", MBB.Alignment);
|
YamlIO.mapOptional("alignment", MBB.Alignment);
|
||||||
YamlIO.mapOptional("isLandingPad", MBB.IsLandingPad);
|
YamlIO.mapOptional("isLandingPad", MBB.IsLandingPad);
|
||||||
YamlIO.mapOptional("addressTaken", MBB.AddressTaken);
|
YamlIO.mapOptional("addressTaken", MBB.AddressTaken);
|
||||||
|
@ -60,6 +60,11 @@ public:
|
|||||||
/// Always returns true.
|
/// Always returns true.
|
||||||
bool error(const Twine &Message);
|
bool error(const Twine &Message);
|
||||||
|
|
||||||
|
/// Report an error with the given message at the given location.
|
||||||
|
///
|
||||||
|
/// Always returns true.
|
||||||
|
bool error(SMLoc Loc, const Twine &Message);
|
||||||
|
|
||||||
/// Report a given error with the location translated from the location in an
|
/// Report a given error with the location translated from the location in an
|
||||||
/// embedded string literal to a location in the MIR file.
|
/// embedded string literal to a location in the MIR file.
|
||||||
///
|
///
|
||||||
@ -124,6 +129,12 @@ bool MIRParserImpl::error(const Twine &Message) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MIRParserImpl::error(SMLoc Loc, const Twine &Message) {
|
||||||
|
Context.diagnose(DiagnosticInfoMIRParser(
|
||||||
|
DS_Error, SM.GetMessage(Loc, SourceMgr::DK_Error, Message)));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool MIRParserImpl::error(const SMDiagnostic &Error, SMRange SourceRange) {
|
bool MIRParserImpl::error(const SMDiagnostic &Error, SMRange SourceRange) {
|
||||||
assert(Error.getKind() == SourceMgr::DK_Error && "Expected an error");
|
assert(Error.getKind() == SourceMgr::DK_Error && "Expected an error");
|
||||||
reportDiagnostic(diagFromMIStringDiag(Error, SourceRange));
|
reportDiagnostic(diagFromMIStringDiag(Error, SourceRange));
|
||||||
@ -239,12 +250,15 @@ bool MIRParserImpl::initializeMachineFunction(MachineFunction &MF) {
|
|||||||
const auto &F = *MF.getFunction();
|
const auto &F = *MF.getFunction();
|
||||||
for (const auto &YamlMBB : YamlMF.BasicBlocks) {
|
for (const auto &YamlMBB : YamlMF.BasicBlocks) {
|
||||||
const BasicBlock *BB = nullptr;
|
const BasicBlock *BB = nullptr;
|
||||||
if (!YamlMBB.Name.empty()) {
|
const yaml::StringValue &Name = YamlMBB.Name;
|
||||||
|
if (!Name.Value.empty()) {
|
||||||
BB = dyn_cast_or_null<BasicBlock>(
|
BB = dyn_cast_or_null<BasicBlock>(
|
||||||
F.getValueSymbolTable().lookup(YamlMBB.Name));
|
F.getValueSymbolTable().lookup(Name.Value));
|
||||||
if (!BB)
|
if (!BB)
|
||||||
return error(Twine("basic block '") + YamlMBB.Name +
|
return error(Name.SourceRange.Start,
|
||||||
"' is not defined in the function '" + MF.getName() + "'");
|
Twine("basic block '") + Name.Value +
|
||||||
|
"' is not defined in the function '" + MF.getName() +
|
||||||
|
"'");
|
||||||
}
|
}
|
||||||
auto *MBB = MF.CreateMachineBasicBlock(BB);
|
auto *MBB = MF.CreateMachineBasicBlock(BB);
|
||||||
MF.insert(MF.end(), MBB);
|
MF.insert(MF.end(), MBB);
|
||||||
|
@ -127,9 +127,9 @@ void MIRPrinter::convert(ModuleSlotTracker &MST,
|
|||||||
YamlMBB.ID = (unsigned)MBB.getNumber();
|
YamlMBB.ID = (unsigned)MBB.getNumber();
|
||||||
// TODO: Serialize unnamed BB references.
|
// TODO: Serialize unnamed BB references.
|
||||||
if (const auto *BB = MBB.getBasicBlock())
|
if (const auto *BB = MBB.getBasicBlock())
|
||||||
YamlMBB.Name = BB->hasName() ? BB->getName() : "<unnamed bb>";
|
YamlMBB.Name.Value = BB->hasName() ? BB->getName() : "<unnamed bb>";
|
||||||
else
|
else
|
||||||
YamlMBB.Name = "";
|
YamlMBB.Name.Value = "";
|
||||||
YamlMBB.Alignment = MBB.getAlignment();
|
YamlMBB.Alignment = MBB.getAlignment();
|
||||||
YamlMBB.AddressTaken = MBB.hasAddressTaken();
|
YamlMBB.AddressTaken = MBB.hasAddressTaken();
|
||||||
YamlMBB.IsLandingPad = MBB.isLandingPad();
|
YamlMBB.IsLandingPad = MBB.isLandingPad();
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
---
|
---
|
||||||
name: foo
|
name: foo
|
||||||
body:
|
body:
|
||||||
# CHECK: basic block 'entrie' is not defined in the function 'foo'
|
# CHECK: [[@LINE+2]]:18: basic block 'entrie' is not defined in the function 'foo'
|
||||||
- id: 0
|
- id: 0
|
||||||
name: entrie
|
name: entrie
|
||||||
...
|
...
|
||||||
|
Reference in New Issue
Block a user