MIR Parser: Use source locations for MBB naming errors.
authorAlex Lorenz <arphaman@gmail.com>
Wed, 8 Jul 2015 20:22:20 +0000 (20:22 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Wed, 8 Jul 2015 20:22:20 +0000 (20:22 +0000)
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

include/llvm/CodeGen/MIRYamlMapping.h
lib/CodeGen/MIRParser/MIRParser.cpp
lib/CodeGen/MIRPrinter.cpp
test/CodeGen/MIR/machine-basic-block-unknown-name.mir

index a6ffeb3829785a7d1a1c45134491b119e73bfd81..72b52586982a547f4be85113452faa8db732ed5e 100644 (file)
@@ -83,7 +83,7 @@ namespace yaml {
 
 struct MachineBasicBlock {
   unsigned ID;
-  std::string Name;
+  StringValue Name;
   unsigned Alignment = 0;
   bool IsLandingPad = false;
   bool AddressTaken = false;
@@ -97,7 +97,7 @@ template <> struct MappingTraits<MachineBasicBlock> {
   static void mapping(IO &YamlIO, MachineBasicBlock &MBB) {
     YamlIO.mapRequired("id", MBB.ID);
     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("isLandingPad", MBB.IsLandingPad);
     YamlIO.mapOptional("addressTaken", MBB.AddressTaken);
index 5756853d4aaf58d9c2ad5251892025e278b2fbee..fc1f9753309a42fa4bb388e94e2db1a0f41c8db7 100644 (file)
@@ -60,6 +60,11 @@ public:
   /// Always returns true.
   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
   /// embedded string literal to a location in the MIR file.
   ///
@@ -124,6 +129,12 @@ bool MIRParserImpl::error(const Twine &Message) {
   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) {
   assert(Error.getKind() == SourceMgr::DK_Error && "Expected an error");
   reportDiagnostic(diagFromMIStringDiag(Error, SourceRange));
@@ -239,12 +250,15 @@ bool MIRParserImpl::initializeMachineFunction(MachineFunction &MF) {
   const auto &F = *MF.getFunction();
   for (const auto &YamlMBB : YamlMF.BasicBlocks) {
     const BasicBlock *BB = nullptr;
-    if (!YamlMBB.Name.empty()) {
+    const yaml::StringValue &Name = YamlMBB.Name;
+    if (!Name.Value.empty()) {
       BB = dyn_cast_or_null<BasicBlock>(
-          F.getValueSymbolTable().lookup(YamlMBB.Name));
+          F.getValueSymbolTable().lookup(Name.Value));
       if (!BB)
-        return error(Twine("basic block '") + YamlMBB.Name +
-                     "' is not defined in the function '" + MF.getName() + "'");
+        return error(Name.SourceRange.Start,
+                     Twine("basic block '") + Name.Value +
+                         "' is not defined in the function '" + MF.getName() +
+                         "'");
     }
     auto *MBB = MF.CreateMachineBasicBlock(BB);
     MF.insert(MF.end(), MBB);
index 4a66365cad3e250666bc210c0d78bca118f1e3b0..a1f20f5725114c3324d93f6bdb759ffe2599cc77 100644 (file)
@@ -127,9 +127,9 @@ void MIRPrinter::convert(ModuleSlotTracker &MST,
   YamlMBB.ID = (unsigned)MBB.getNumber();
   // TODO: Serialize unnamed BB references.
   if (const auto *BB = MBB.getBasicBlock())
-    YamlMBB.Name = BB->hasName() ? BB->getName() : "<unnamed bb>";
+    YamlMBB.Name.Value = BB->hasName() ? BB->getName() : "<unnamed bb>";
   else
-    YamlMBB.Name = "";
+    YamlMBB.Name.Value = "";
   YamlMBB.Alignment = MBB.getAlignment();
   YamlMBB.AddressTaken = MBB.hasAddressTaken();
   YamlMBB.IsLandingPad = MBB.isLandingPad();
index ed675c5edbc32e4319ee5d9859d7f84d3113da2f..df8eee9d2708611b1d39c7bba819f8e9adeec960 100644 (file)
@@ -13,7 +13,7 @@
 ---
 name:            foo
 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
     name:        entrie
 ...