aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--utils/TableGen/Record.h17
-rw-r--r--utils/TableGen/TGParser.cpp12
-rw-r--r--utils/TableGen/TGSourceMgr.h4
-rw-r--r--utils/TableGen/TableGen.cpp11
4 files changed, 29 insertions, 15 deletions
diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h
index 87a49ee2f8..5eb07eb1e9 100644
--- a/utils/TableGen/Record.h
+++ b/utils/TableGen/Record.h
@@ -15,15 +15,13 @@
#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
diff --git a/utils/TableGen/TGParser.cpp b/utils/TableGen/TGParser.cpp
index d3eaa929a0..1fa8272727 100644
--- a/utils/TableGen/TGParser.cpp
+++ b/utils/TableGen/TGParser.cpp
@@ -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;
diff --git a/utils/TableGen/TGSourceMgr.h b/utils/TableGen/TGSourceMgr.h
index 6b2dc101dd..69fb74ca20 100644
--- a/utils/TableGen/TGSourceMgr.h
+++ b/utils/TableGen/TGSourceMgr.h
@@ -14,9 +14,9 @@
#ifndef TGSOURCEMGR_H
#define TGSOURCEMGR_H
-#include <cassert>
-#include <vector>
#include <string>
+#include <vector>
+#include <cassert>
namespace llvm {
class MemoryBuffer;
diff --git a/utils/TableGen/TableGen.cpp b/utils/TableGen/TableGen.cpp
index 8cbba22069..1beddf0693 100644
--- a/utils/TableGen/TableGen.cpp
+++ b/utils/TableGen/TableGen.cpp
@@ -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))