give each Record a location.
authorChris Lattner <sabre@nondot.org>
Fri, 13 Mar 2009 16:09:24 +0000 (16:09 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 Mar 2009 16:09:24 +0000 (16:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66897 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/Record.h
utils/TableGen/TGParser.cpp
utils/TableGen/TGSourceMgr.h
utils/TableGen/TableGen.cpp

index 87a49ee2f8448c2fc89481cb3fd4460acf5d53ca..5eb07eb1e996c6dbfbea2737caea4a2ff5895fe1 100644 (file)
 #ifndef RECORD_H
 #define RECORD_H
 
+#include "TGSourceMgr.h"
 #include "llvm/Support/DataTypes.h"
-#include <string>
-#include <vector>
 #include <map>
 #include <ostream>
-#include <cassert>
 
 namespace llvm {
-
+  
 // RecTy subclasses.
 class BitRecTy;
 class BitsRecTy;
@@ -962,16 +960,20 @@ inline std::ostream &operator<<(std::ostream &OS, const RecordVal &RV) {
 
 class Record {
   std::string Name;
+  TGLoc Loc;
   std::vector<std::string> TemplateArgs;
   std::vector<RecordVal> Values;
   std::vector<Record*> SuperClasses;
 public:
 
-  explicit Record(const std::string &N) : Name(N) {}
+  explicit Record(const std::string &N, TGLoc loc) : Name(N), Loc(loc) {}
   ~Record() {}
-
+  
   const std::string &getName() const { return Name; }
   void setName(const std::string &Name);  // Also updates RecordKeeper.
+  
+  TGLoc getLoc() const { return Loc; }
+  
   const std::vector<std::string> &getTemplateArgs() const {
     return TemplateArgs;
   }
@@ -1198,6 +1200,9 @@ std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK);
 
 extern RecordKeeper Records;
 
+void PrintError(TGLoc ErrorLoc, const std::string &Msg);
+
+  
 } // End llvm namespace
 
 #endif
index d3eaa929a07b01fce75e2a9ab616f3e1b9d6073a..1fa8272727bd8fdd602947298b319c8c49d738c5 100644 (file)
@@ -27,7 +27,7 @@ struct MultiClass {
   Record Rec;  // Placeholder for template args and Name.
   std::vector<Record*> DefPrototypes;
     
-  MultiClass(const std::string &Name) : Rec(Name) {}
+  MultiClass(const std::string &Name, TGLoc Loc) : Rec(Name, Loc) {}
 };
   
 struct SubClassReference {
@@ -570,7 +570,7 @@ Init *TGParser::ParseSimpleValue(Record *CurRec) {
     
     // Create the new record, set it as CurRec temporarily.
     static unsigned AnonCounter = 0;
-    Record *NewRec = new Record("anonymous.val."+utostr(AnonCounter++));
+    Record *NewRec = new Record("anonymous.val."+utostr(AnonCounter++),NameLoc);
     SubClassReference SCRef;
     SCRef.RefLoc = NameLoc;
     SCRef.Rec = Class;
@@ -1039,7 +1039,7 @@ llvm::Record *TGParser::ParseDef(MultiClass *CurMultiClass) {
   Lex.Lex();  // Eat the 'def' token.  
 
   // Parse ObjectName and make a record for it.
-  Record *CurRec = new Record(ParseObjectName());
+  Record *CurRec = new Record(ParseObjectName(), DefLoc);
   
   if (!CurMultiClass) {
     // Top-level def definition.
@@ -1093,7 +1093,7 @@ bool TGParser::ParseClass() {
       return TokError("Class '" + CurRec->getName() + "' already defined");
   } else {
     // If this is the first reference to this class, create and add it.
-    CurRec = new Record(Lex.getCurStrVal());
+    CurRec = new Record(Lex.getCurStrVal(), Lex.getLoc());
     Records.addClass(CurRec);
   }
   Lex.Lex(); // eat the name.
@@ -1232,7 +1232,7 @@ bool TGParser::ParseMultiClass() {
   if (MultiClasses.count(Name))
     return TokError("multiclass '" + Name + "' already defined");
   
-  CurMultiClass  = MultiClasses[Name] = new MultiClass(Name);
+  CurMultiClass = MultiClasses[Name] = new MultiClass(Name, Lex.getLoc());
   Lex.Lex();  // Eat the identifier.
   
   // If there are template args, parse them.
@@ -1299,7 +1299,7 @@ bool TGParser::ParseDefm() {
     Record *DefProto = MC->DefPrototypes[i];
     
     // Add the suffix to the defm name to get the new name.
-    Record *CurRec = new Record(DefmPrefix + DefProto->getName());
+    Record *CurRec = new Record(DefmPrefix + DefProto->getName(),DefmPrefixLoc);
     
     SubClassReference Ref;
     Ref.RefLoc = DefmPrefixLoc;
index 6b2dc101ddb8bd2d6adb16b959214111a246281b..69fb74ca20c6f4365b375027a7e3cdde80ddacf7 100644 (file)
@@ -14,9 +14,9 @@
 #ifndef TGSOURCEMGR_H
 #define TGSOURCEMGR_H
 
-#include <cassert>
-#include <vector>
 #include <string>
+#include <vector>
+#include <cassert>
 
 namespace llvm {
   class MemoryBuffer;
index 8cbba22069bdd6fc88cef93d5893769e1ad29060..1beddf0693d4d2f00bc84eb1aedea07051b420d4 100644 (file)
@@ -108,8 +108,18 @@ namespace {
               cl::value_desc("directory"), cl::Prefix);
 }
 
+
+// FIXME: Eliminate globals from tblgen.
 RecordKeeper llvm::Records;
 
+static TGSourceMgr SrcMgr;
+
+void PrintError(TGLoc ErrorLoc, const std::string &Msg) {
+  SrcMgr.PrintError(ErrorLoc, Msg);
+}
+
+
+
 /// ParseFile - this function begins the parsing of the specified tablegen
 /// file.
 static bool ParseFile(const std::string &Filename,
@@ -139,7 +149,6 @@ int main(int argc, char **argv) {
   PrettyStackTraceProgram X(argc, argv);
   cl::ParseCommandLineOptions(argc, argv);
 
-  TGSourceMgr SrcMgr;
   
   // Parse the input file.
   if (ParseFile(InputFilename, IncludeDirs, SrcMgr))