add a new TGError class and use it to propagate location info with
authorChris Lattner <sabre@nondot.org>
Fri, 13 Mar 2009 16:25:21 +0000 (16:25 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 Mar 2009 16:25:21 +0000 (16:25 +0000)
errors when thrown.  This gets us nice errors like this from tblgen:

CMOVL32rr:  (set GR32:i32:$dst, (X86cmov GR32:$src1, GR32:$src2))
/Users/sabre/llvm/Debug/bin/tblgen: error:
Included from X86.td:116:
Parsing X86InstrInfo.td:922: In CMOVL32rr: X86cmov node requires exactly 4 operands!
def CMOVL32rr : I<0x4C, MRMSrcReg,       // if <s, GR32 = GR32
^

instead of just:

CMOVL32rr:  (set GR32:i32:$dst, (X86cmov GR32:$src1, GR32:$src2))
/Users/sabre/llvm/Debug/bin/tblgen: In CMOVL32rr: X86cmov node requires exactly 4 operands!

This is all I plan to do with this, but it should be easy enough to improve if anyone
cares (e.g. keeping more loc info in "dag" expr records in tblgen.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66898 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/CodeGenDAGPatterns.cpp
utils/TableGen/Record.h
utils/TableGen/TableGen.cpp

index 6e7dd1eae05dd9a946434f53196f2b939d24f9f5..6af05158f1cd26d79abf241c5498586d4b092170 100644 (file)
@@ -1113,7 +1113,7 @@ TreePattern::TreePattern(Record *TheRec, TreePatternNode *Pat, bool isInput,
 
 void TreePattern::error(const std::string &Msg) const {
   dump();
-  throw "In " + TheRecord->getName() + ": " + Msg;
+  throw TGError(TheRecord->getLoc(), "In " + TheRecord->getName() + ": " + Msg);
 }
 
 TreePatternNode *TreePattern::ParseTreePattern(DagInit *Dag) {
index 5eb07eb1e996c6dbfbea2737caea4a2ff5895fe1..00b77305cdca2e4b5a948ba55d55a1287fbf47f2 100644 (file)
@@ -1195,6 +1195,17 @@ struct LessRecordFieldName {
   }
 };
 
+
+class TGError {
+  TGLoc Loc;
+  std::string Message;
+public:
+  TGError(TGLoc loc, const std::string &message) : Loc(loc), Message(message) {}
+  
+  TGLoc getLoc() const { return Loc; }
+  const std::string &getMessage() const { return Message; }
+};
+  
   
 std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK);
 
index 1beddf0693d4d2f00bc84eb1aedea07051b420d4..36ad999a1e2ba586b24c2bf4a2d4090c5c6b492a 100644 (file)
@@ -114,7 +114,7 @@ RecordKeeper llvm::Records;
 
 static TGSourceMgr SrcMgr;
 
-void PrintError(TGLoc ErrorLoc, const std::string &Msg) {
+void llvm::PrintError(TGLoc ErrorLoc, const std::string &Msg) {
   SrcMgr.PrintError(ErrorLoc, Msg);
 }
 
@@ -229,31 +229,26 @@ int main(int argc, char **argv) {
       assert(1 && "Invalid Action");
       return 1;
     }
+    
+    if (Out != cout.stream()) 
+      delete Out;                               // Close the file
+    return 0;
+    
+  } catch (const TGError &Error) {
+    cerr << argv[0] << ": error:\n";
+    PrintError(Error.getLoc(), Error.getMessage());
+    
   } catch (const std::string &Error) {
     cerr << argv[0] << ": " << Error << "\n";
-    if (Out != cout.stream()) {
-      delete Out;                             // Close the file
-      std::remove(OutputFilename.c_str());    // Remove the file, it's broken
-    }
-    return 1;
   } catch (const char *Error) {
     cerr << argv[0] << ": " << Error << "\n";
-    if (Out != cout.stream()) {
-      delete Out;                             // Close the file
-      std::remove(OutputFilename.c_str());    // Remove the file, it's broken
-    }
-    return 1;
   } catch (...) {
     cerr << argv[0] << ": Unknown unexpected exception occurred.\n";
-    if (Out != cout.stream()) {
-      delete Out;                             // Close the file
-      std::remove(OutputFilename.c_str());    // Remove the file, it's broken
-    }
-    return 2;
   }
-
+  
   if (Out != cout.stream()) {
-    delete Out;                               // Close the file
+    delete Out;                             // Close the file
+    std::remove(OutputFilename.c_str());    // Remove the file, it's broken
   }
-  return 0;
+  return 1;
 }