diff options
author | Chris Lattner <sabre@nondot.org> | 2009-03-13 16:01:53 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-03-13 16:01:53 +0000 |
commit | 1c8ae59dfdc85d917db0333ae0b93e2be4ca6c36 (patch) | |
tree | 6f5e05ef52d3c8eac1f42518dc5d7db4be9d8949 /utils | |
parent | d9c9bf77d82a00c2fe34db2da00244523f4ac288 (diff) |
make "locations" a class instead of a typedef.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66895 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/TGLexer.cpp | 19 | ||||
-rw-r--r-- | utils/TableGen/TGLexer.h | 7 | ||||
-rw-r--r-- | utils/TableGen/TGParser.cpp | 40 | ||||
-rw-r--r-- | utils/TableGen/TGParser.h | 14 | ||||
-rw-r--r-- | utils/TableGen/TGSourceMgr.cpp | 23 | ||||
-rw-r--r-- | utils/TableGen/TGSourceMgr.h | 34 | ||||
-rw-r--r-- | utils/TableGen/TableGen.cpp | 3 |
7 files changed, 82 insertions, 58 deletions
diff --git a/utils/TableGen/TGLexer.cpp b/utils/TableGen/TGLexer.cpp index 761985e410..e315db2545 100644 --- a/utils/TableGen/TGLexer.cpp +++ b/utils/TableGen/TGLexer.cpp @@ -31,6 +31,10 @@ TGLexer::TGLexer(TGSourceMgr &SM) : SrcMgr(SM) { TokStart = 0; } +TGLoc TGLexer::getLoc() const { + return TGLoc::getFromPointer(TokStart); +} + /// ReturnError - Set the error to the specified string at the specified /// location. This is defined to always return tgtok::Error. @@ -40,10 +44,15 @@ tgtok::TokKind TGLexer::ReturnError(const char *Loc, const std::string &Msg) { } -void TGLexer::PrintError(LocTy Loc, const std::string &Msg) const { +void TGLexer::PrintError(const char *Loc, const std::string &Msg) const { + SrcMgr.PrintError(TGLoc::getFromPointer(Loc), Msg); +} + +void TGLexer::PrintError(TGLoc Loc, const std::string &Msg) const { SrcMgr.PrintError(Loc, Msg); } + int TGLexer::getNextChar() { char CurChar = *CurPtr++; switch (CurChar) { @@ -57,11 +66,11 @@ int TGLexer::getNextChar() { // If this is the end of an included file, pop the parent file off the // include stack. - TGLocTy ParentIncludeLoc = SrcMgr.getParentIncludeLoc(CurBuffer); - if (ParentIncludeLoc != TGLocTy()) { + TGLoc ParentIncludeLoc = SrcMgr.getParentIncludeLoc(CurBuffer); + if (ParentIncludeLoc != TGLoc()) { CurBuffer = SrcMgr.FindBufferContainingLoc(ParentIncludeLoc); CurBuf = SrcMgr.getMemoryBuffer(CurBuffer); - CurPtr = ParentIncludeLoc; + CurPtr = ParentIncludeLoc.getPointer(); return getNextChar(); } @@ -239,7 +248,7 @@ bool TGLexer::LexInclude() { } // Save the line number and lex buffer of the includer. - CurBuffer = SrcMgr.AddNewSourceBuffer(NewBuf, CurPtr); + CurBuffer = SrcMgr.AddNewSourceBuffer(NewBuf, TGLoc::getFromPointer(CurPtr)); CurBuf = NewBuf; CurPtr = CurBuf->getBufferStart(); diff --git a/utils/TableGen/TGLexer.h b/utils/TableGen/TGLexer.h index 59e9fa0ef5..245dd41461 100644 --- a/utils/TableGen/TGLexer.h +++ b/utils/TableGen/TGLexer.h @@ -23,6 +23,7 @@ namespace llvm { class MemoryBuffer; class TGSourceMgr; +class TGLoc; namespace tgtok { enum TokKind { @@ -99,10 +100,10 @@ public: return CurIntVal; } - typedef const char* LocTy; - LocTy getLoc() const { return TokStart; } + TGLoc getLoc() const; - void PrintError(LocTy Loc, const std::string &Msg) const; + void PrintError(const char *Loc, const std::string &Msg) const; + void PrintError(TGLoc Loc, const std::string &Msg) const; private: /// LexToken - Read the next token and return its code. diff --git a/utils/TableGen/TGParser.cpp b/utils/TableGen/TGParser.cpp index d31e2a50ee..d3eaa929a0 100644 --- a/utils/TableGen/TGParser.cpp +++ b/utils/TableGen/TGParser.cpp @@ -31,17 +31,17 @@ struct MultiClass { }; struct SubClassReference { - TGParser::LocTy RefLoc; + TGLoc RefLoc; Record *Rec; std::vector<Init*> TemplateArgs; - SubClassReference() : RefLoc(0), Rec(0) {} + SubClassReference() : Rec(0) {} bool isInvalid() const { return Rec == 0; } }; } // end namespace llvm -bool TGParser::AddValue(Record *CurRec, LocTy Loc, const RecordVal &RV) { +bool TGParser::AddValue(Record *CurRec, TGLoc Loc, const RecordVal &RV) { if (CurRec == 0) CurRec = &CurMultiClass->Rec; @@ -60,7 +60,7 @@ bool TGParser::AddValue(Record *CurRec, LocTy Loc, const RecordVal &RV) { /// SetValue - /// Return true on error, false on success. -bool TGParser::SetValue(Record *CurRec, LocTy Loc, const std::string &ValName, +bool TGParser::SetValue(Record *CurRec, TGLoc Loc, const std::string &ValName, const std::vector<unsigned> &BitList, Init *V) { if (!V) return false; @@ -357,7 +357,7 @@ bool TGParser::ParseOptionalRangeList(std::vector<unsigned> &Ranges) { if (Lex.getCode() != tgtok::less) return false; - LocTy StartLoc = Lex.getLoc(); + TGLoc StartLoc = Lex.getLoc(); Lex.Lex(); // eat the '<' // Parse the range list. @@ -379,7 +379,7 @@ bool TGParser::ParseOptionalBitList(std::vector<unsigned> &Ranges) { if (Lex.getCode() != tgtok::l_brace) return false; - LocTy StartLoc = Lex.getLoc(); + TGLoc StartLoc = Lex.getLoc(); Lex.Lex(); // eat the '{' // Parse the range list. @@ -464,7 +464,7 @@ RecTy *TGParser::ParseType() { Init *TGParser::ParseIDValue(Record *CurRec) { assert(Lex.getCode() == tgtok::Id && "Expected ID in ParseIDValue"); std::string Name = Lex.getCurStrVal(); - LocTy Loc = Lex.getLoc(); + TGLoc Loc = Lex.getLoc(); Lex.Lex(); return ParseIDValue(CurRec, Name, Loc); } @@ -472,7 +472,7 @@ Init *TGParser::ParseIDValue(Record *CurRec) { /// ParseIDValue - This is just like ParseIDValue above, but it assumes the ID /// has already been read. Init *TGParser::ParseIDValue(Record *CurRec, - const std::string &Name, LocTy NameLoc) { + const std::string &Name, TGLoc NameLoc) { if (CurRec) { if (const RecordVal *RV = CurRec->getValue(Name)) return new VarInit(Name, RV->getType()); @@ -540,7 +540,7 @@ Init *TGParser::ParseSimpleValue(Record *CurRec) { R = new CodeInit(Lex.getCurStrVal()); Lex.Lex(); break; case tgtok::question: R = new UnsetInit(); Lex.Lex(); break; case tgtok::Id: { - LocTy NameLoc = Lex.getLoc(); + TGLoc NameLoc = Lex.getLoc(); std::string Name = Lex.getCurStrVal(); if (Lex.Lex() != tgtok::less) // consume the Id. return ParseIDValue(CurRec, Name, NameLoc); // Value ::= IDValue @@ -585,7 +585,7 @@ Init *TGParser::ParseSimpleValue(Record *CurRec) { return new DefInit(NewRec); } case tgtok::l_brace: { // Value ::= '{' ValueList '}' - LocTy BraceLoc = Lex.getLoc(); + TGLoc BraceLoc = Lex.getLoc(); Lex.Lex(); // eat the '{' std::vector<Init*> Vals; @@ -711,7 +711,7 @@ Init *TGParser::ParseValue(Record *CurRec) { switch (Lex.getCode()) { default: return Result; case tgtok::l_brace: { - LocTy CurlyLoc = Lex.getLoc(); + TGLoc CurlyLoc = Lex.getLoc(); Lex.Lex(); // eat the '{' std::vector<unsigned> Ranges = ParseRangeList(); if (Ranges.empty()) return 0; @@ -733,7 +733,7 @@ Init *TGParser::ParseValue(Record *CurRec) { break; } case tgtok::l_square: { - LocTy SquareLoc = Lex.getLoc(); + TGLoc SquareLoc = Lex.getLoc(); Lex.Lex(); // eat the '[' std::vector<unsigned> Ranges = ParseRangeList(); if (Ranges.empty()) return 0; @@ -849,7 +849,7 @@ std::string TGParser::ParseDeclaration(Record *CurRec, return ""; } - LocTy IdLoc = Lex.getLoc(); + TGLoc IdLoc = Lex.getLoc(); std::string DeclName = Lex.getCurStrVal(); Lex.Lex(); @@ -870,7 +870,7 @@ std::string TGParser::ParseDeclaration(Record *CurRec, // If a value is present, parse it. if (Lex.getCode() == tgtok::equal) { Lex.Lex(); - LocTy ValLoc = Lex.getLoc(); + TGLoc ValLoc = Lex.getLoc(); Init *Val = ParseValue(CurRec); if (Val == 0 || SetValue(CurRec, ValLoc, DeclName, std::vector<unsigned>(), Val)) @@ -936,7 +936,7 @@ bool TGParser::ParseBodyItem(Record *CurRec) { if (Lex.Lex() != tgtok::Id) return TokError("expected field identifier after let"); - LocTy IdLoc = Lex.getLoc(); + TGLoc IdLoc = Lex.getLoc(); std::string FieldName = Lex.getCurStrVal(); Lex.Lex(); // eat the field name. @@ -1034,7 +1034,7 @@ bool TGParser::ParseObjectBody(Record *CurRec) { /// DefInst ::= DEF ObjectName ObjectBody /// llvm::Record *TGParser::ParseDef(MultiClass *CurMultiClass) { - LocTy DefLoc = Lex.getLoc(); + TGLoc DefLoc = Lex.getLoc(); assert(Lex.getCode() == tgtok::Def && "Unknown tok"); Lex.Lex(); // Eat the 'def' token. @@ -1122,7 +1122,7 @@ std::vector<LetRecord> TGParser::ParseLetList() { return std::vector<LetRecord>(); } std::string Name = Lex.getCurStrVal(); - LocTy NameLoc = Lex.getLoc(); + TGLoc NameLoc = Lex.getLoc(); Lex.Lex(); // Eat the identifier. // Check for an optional RangeList. @@ -1174,7 +1174,7 @@ bool TGParser::ParseTopLevelLet() { if (ParseObject()) return true; } else { // Object ::= LETCommand '{' ObjectList '}' - LocTy BraceLoc = Lex.getLoc(); + TGLoc BraceLoc = Lex.getLoc(); // Otherwise, this is a group let. Lex.Lex(); // eat the '{'. @@ -1265,7 +1265,7 @@ bool TGParser::ParseDefm() { if (Lex.Lex() != tgtok::Id) // eat the defm. return TokError("expected identifier after defm"); - LocTy DefmPrefixLoc = Lex.getLoc(); + TGLoc DefmPrefixLoc = Lex.getLoc(); std::string DefmPrefix = Lex.getCurStrVal(); if (Lex.Lex() != tgtok::colon) return TokError("expected ':' after defm identifier"); @@ -1273,7 +1273,7 @@ bool TGParser::ParseDefm() { // eat the colon. Lex.Lex(); - LocTy SubClassLoc = Lex.getLoc(); + TGLoc SubClassLoc = Lex.getLoc(); SubClassReference Ref = ParseSubClassReference(0, true); if (Ref.Rec == 0) return true; diff --git a/utils/TableGen/TGParser.h b/utils/TableGen/TGParser.h index a1aa8a9c2b..5d5330de51 100644 --- a/utils/TableGen/TGParser.h +++ b/utils/TableGen/TGParser.h @@ -15,6 +15,7 @@ #define TGPARSER_H #include "TGLexer.h" +#include "TGSourceMgr.h" #include <map> namespace llvm { @@ -29,9 +30,9 @@ namespace llvm { std::string Name; std::vector<unsigned> Bits; Init *Value; - TGLexer::LocTy Loc; + TGLoc Loc; LetRecord(const std::string &N, const std::vector<unsigned> &B, Init *V, - TGLexer::LocTy L) + TGLoc L) : Name(N), Bits(B), Value(V), Loc(L) { } }; @@ -45,7 +46,6 @@ class TGParser { /// current value. MultiClass *CurMultiClass; public: - typedef TGLexer::LocTy LocTy; TGParser(TGSourceMgr &SrcMgr) : Lex(SrcMgr), CurMultiClass(0) {} @@ -55,7 +55,7 @@ public: /// routines return true on error, or false on success. bool ParseFile(); - bool Error(LocTy L, const std::string &Msg) const { + bool Error(TGLoc L, const std::string &Msg) const { Lex.PrintError(L, Msg); return true; } @@ -63,8 +63,8 @@ public: return Error(Lex.getLoc(), Msg); } private: // Semantic analysis methods. - bool AddValue(Record *TheRec, LocTy Loc, const RecordVal &RV); - bool SetValue(Record *TheRec, LocTy Loc, const std::string &ValName, + bool AddValue(Record *TheRec, TGLoc Loc, const RecordVal &RV); + bool SetValue(Record *TheRec, TGLoc Loc, const std::string &ValName, const std::vector<unsigned> &BitList, Init *V); bool AddSubClass(Record *Rec, SubClassReference &SubClass); @@ -89,7 +89,7 @@ private: // Parser methods. SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm); Init *ParseIDValue(Record *CurRec); - Init *ParseIDValue(Record *CurRec, const std::string &Name, LocTy NameLoc); + Init *ParseIDValue(Record *CurRec, const std::string &Name, TGLoc NameLoc); Init *ParseSimpleValue(Record *CurRec); Init *ParseValue(Record *CurRec); std::vector<Init*> ParseValueList(Record *CurRec); diff --git a/utils/TableGen/TGSourceMgr.cpp b/utils/TableGen/TGSourceMgr.cpp index 1e0ab7e368..9c39230def 100644 --- a/utils/TableGen/TGSourceMgr.cpp +++ b/utils/TableGen/TGSourceMgr.cpp @@ -25,17 +25,17 @@ TGSourceMgr::~TGSourceMgr() { /// FindBufferContainingLoc - Return the ID of the buffer containing the /// specified location, returning -1 if not found. -int TGSourceMgr::FindBufferContainingLoc(TGLocTy Loc) const { +int TGSourceMgr::FindBufferContainingLoc(TGLoc Loc) const { for (unsigned i = 0, e = Buffers.size(); i != e; ++i) - if (Loc >= Buffers[i].Buffer->getBufferStart() && - Loc < Buffers[i].Buffer->getBufferEnd()) + if (Loc.getPointer() >= Buffers[i].Buffer->getBufferStart() && + Loc.getPointer() < Buffers[i].Buffer->getBufferEnd()) return i; return -1; } /// FindLineNumber - Find the line number for the specified location in the /// specified file. This is not a fast method. -unsigned TGSourceMgr::FindLineNumber(TGLocTy Loc, int BufferID) const { +unsigned TGSourceMgr::FindLineNumber(TGLoc Loc, int BufferID) const { if (BufferID == -1) BufferID = FindBufferContainingLoc(Loc); assert(BufferID != -1 && "Invalid Location!"); @@ -47,13 +47,13 @@ unsigned TGSourceMgr::FindLineNumber(TGLocTy Loc, int BufferID) const { const char *Ptr = Buff->getBufferStart(); - for (; Ptr != Loc; ++Ptr) + for (; TGLoc::getFromPointer(Ptr) != Loc; ++Ptr) if (*Ptr == '\n') ++LineNo; return LineNo; } -void TGSourceMgr::PrintIncludeStack(TGLocTy IncludeLoc) const { - if (IncludeLoc == TGLocTy()) return; // Top of stack. +void TGSourceMgr::PrintIncludeStack(TGLoc IncludeLoc) const { + if (IncludeLoc == TGLoc()) return; // Top of stack. int CurBuf = FindBufferContainingLoc(IncludeLoc); assert(CurBuf != -1 && "Invalid or unspecified location!"); @@ -66,7 +66,7 @@ void TGSourceMgr::PrintIncludeStack(TGLocTy IncludeLoc) const { } -void TGSourceMgr::PrintError(TGLocTy ErrorLoc, const std::string &Msg) const { +void TGSourceMgr::PrintError(TGLoc ErrorLoc, const std::string &Msg) const { raw_ostream &OS = errs(); // First thing to do: find the current buffer containing the specified @@ -83,22 +83,21 @@ void TGSourceMgr::PrintError(TGLocTy ErrorLoc, const std::string &Msg) const { << FindLineNumber(ErrorLoc, CurBuf) << ": "; OS << Msg << "\n"; - assert(ErrorLoc && "Location not specified!"); // Scan backward to find the start of the line. - const char *LineStart = ErrorLoc; + const char *LineStart = ErrorLoc.getPointer(); while (LineStart != CurMB->getBufferStart() && LineStart[-1] != '\n' && LineStart[-1] != '\r') --LineStart; // Get the end of the line. - const char *LineEnd = ErrorLoc; + const char *LineEnd = ErrorLoc.getPointer(); while (LineEnd != CurMB->getBufferEnd() && LineEnd[0] != '\n' && LineEnd[0] != '\r') ++LineEnd; // Print out the line. OS << std::string(LineStart, LineEnd) << "\n"; // Print out spaces before the carat. - for (const char *Pos = LineStart; Pos != ErrorLoc; ++Pos) + for (const char *Pos = LineStart; Pos != ErrorLoc.getPointer(); ++Pos) OS << (*Pos == '\t' ? '\t' : ' '); OS << "^\n"; } diff --git a/utils/TableGen/TGSourceMgr.h b/utils/TableGen/TGSourceMgr.h index 257b950efa..6b2dc101dd 100644 --- a/utils/TableGen/TGSourceMgr.h +++ b/utils/TableGen/TGSourceMgr.h @@ -20,9 +20,25 @@ namespace llvm { class MemoryBuffer; + class TGSourceMgr; -/// FIXME: Make this a struct that is opaque. -typedef const char *TGLocTy; +class TGLoc { + const char *Ptr; +public: + TGLoc() : Ptr(0) {} + TGLoc(const TGLoc &RHS) : Ptr(RHS.Ptr) {} + + bool operator==(const TGLoc &RHS) const { return RHS.Ptr == Ptr; } + bool operator!=(const TGLoc &RHS) const { return RHS.Ptr != Ptr; } + + const char *getPointer() const { return Ptr; } + + static TGLoc getFromPointer(const char *Ptr) { + TGLoc L; + L.Ptr = Ptr; + return L; + } +}; /// TGSourceMgr - This owns the files read by tblgen, handles include stacks, /// and handles printing of diagnostics. @@ -33,7 +49,7 @@ class TGSourceMgr { /// IncludeLoc - This is the location of the parent include, or null if at /// the top level. - TGLocTy IncludeLoc; + TGLoc IncludeLoc; }; /// Buffers - This is all of the buffers that we are reading from. @@ -55,12 +71,12 @@ public: return Buffers[i].Buffer; } - TGLocTy getParentIncludeLoc(unsigned i) const { + TGLoc getParentIncludeLoc(unsigned i) const { assert(i < Buffers.size() && "Invalid Buffer ID!"); return Buffers[i].IncludeLoc; } - unsigned AddNewSourceBuffer(MemoryBuffer *F, TGLocTy IncludeLoc) { + unsigned AddNewSourceBuffer(MemoryBuffer *F, TGLoc IncludeLoc) { SrcBuffer NB; NB.Buffer = F; NB.IncludeLoc = IncludeLoc; @@ -70,19 +86,19 @@ public: /// FindBufferContainingLoc - Return the ID of the buffer containing the /// specified location, returning -1 if not found. - int FindBufferContainingLoc(TGLocTy Loc) const; + int FindBufferContainingLoc(TGLoc Loc) const; /// FindLineNumber - Find the line number for the specified location in the /// specified file. This is not a fast method. - unsigned FindLineNumber(TGLocTy Loc, int BufferID = -1) const; + unsigned FindLineNumber(TGLoc Loc, int BufferID = -1) const; /// PrintError - Emit an error message about the specified location with the /// specified string. - void PrintError(TGLocTy ErrorLoc, const std::string &Msg) const; + void PrintError(TGLoc ErrorLoc, const std::string &Msg) const; private: - void PrintIncludeStack(TGLocTy IncludeLoc) const; + void PrintIncludeStack(TGLoc IncludeLoc) const; }; } // end llvm namespace diff --git a/utils/TableGen/TableGen.cpp b/utils/TableGen/TableGen.cpp index c6a1f2e4ab..8cbba22069 100644 --- a/utils/TableGen/TableGen.cpp +++ b/utils/TableGen/TableGen.cpp @@ -17,7 +17,6 @@ #include "Record.h" #include "TGParser.h" -#include "TGSourceMgr.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Streams.h" #include "llvm/System/Signals.h" @@ -124,7 +123,7 @@ static bool ParseFile(const std::string &Filename, } // Tell SrcMgr about this buffer, which is what TGParser will pick up. - SrcMgr.AddNewSourceBuffer(F, TGLocTy()); + SrcMgr.AddNewSourceBuffer(F, TGLoc()); TGParser Parser(SrcMgr); |