From a170f520a990a50c35f72d81b4415dc4c3ec50de Mon Sep 17 00:00:00 2001 From: Sean Silva Date: Thu, 7 Feb 2013 04:30:39 +0000 Subject: tblgen: Diagnose duplicate includes. A double inclusion will pretty much always be an error in TableGen, so there's no point going on just to die with "def already defined" or whatnot. I'm not too thrilled about the "public: ... private: ..." to expose the DependenciesMapTy, but I really didn't see a better way to keep that type centralized. It's a smell that indicates that some refactoring is needed to make this code more loosely coupled. This should avoid all bugs of the same nature as PR15189. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174582 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/TableGen/Main.cpp | 8 ++++---- lib/TableGen/TGLexer.cpp | 10 +++++++++- lib/TableGen/TGLexer.h | 13 +++++++++---- lib/TableGen/TGParser.h | 2 +- 4 files changed, 23 insertions(+), 10 deletions(-) (limited to 'lib/TableGen') diff --git a/lib/TableGen/Main.cpp b/lib/TableGen/Main.cpp index d0ca756..e1cd623 100644 --- a/lib/TableGen/Main.cpp +++ b/lib/TableGen/Main.cpp @@ -64,11 +64,11 @@ static int createDependencyFile(const TGParser &Parser, const char *argv0) { return 1; } DepOut.os() << OutputFilename << ":"; - const std::vector &Dependencies = Parser.getDependencies(); - for (std::vector::const_iterator I = Dependencies.begin(), - E = Dependencies.end(); + const TGLexer::DependenciesMapTy &Dependencies = Parser.getDependencies(); + for (TGLexer::DependenciesMapTy::const_iterator I = Dependencies.begin(), + E = Dependencies.end(); I != E; ++I) { - DepOut.os() << " " << (*I); + DepOut.os() << " " << I->first; } DepOut.os() << "\n"; DepOut.keep(); diff --git a/lib/TableGen/TGLexer.cpp b/lib/TableGen/TGLexer.cpp index e75abcf..c6be4f8 100644 --- a/lib/TableGen/TGLexer.cpp +++ b/lib/TableGen/TGLexer.cpp @@ -309,7 +309,15 @@ bool TGLexer::LexInclude() { return true; } - Dependencies.push_back(IncludedFile); + DependenciesMapTy::const_iterator Found = Dependencies.find(IncludedFile); + if (Found != Dependencies.end()) { + PrintError(getLoc(), + "File '" + IncludedFile + "' has already been included."); + SrcMgr.PrintMessage(Found->second, SourceMgr::DK_Note, + "previously included here"); + return true; + } + Dependencies.insert(std::make_pair(IncludedFile, getLoc())); // Save the line number and lex buffer of the includer. CurBuf = SrcMgr.getMemoryBuffer(CurBuffer); CurPtr = CurBuf->getBufferStart(); diff --git a/lib/TableGen/TGLexer.h b/lib/TableGen/TGLexer.h index a0818f9..d1bd70d 100644 --- a/lib/TableGen/TGLexer.h +++ b/lib/TableGen/TGLexer.h @@ -15,9 +15,10 @@ #define TGLEXER_H #include "llvm/Support/DataTypes.h" +#include "llvm/Support/SMLoc.h" #include +#include #include -#include namespace llvm { class MemoryBuffer; @@ -73,9 +74,13 @@ class TGLexer { /// CurBuffer - This is the current buffer index we're lexing from as managed /// by the SourceMgr object. int CurBuffer; + +public: + typedef std::map DependenciesMapTy; +private: /// Dependencies - This is the list of all included files. - std::vector Dependencies; - + DependenciesMapTy Dependencies; + public: TGLexer(SourceMgr &SrcMgr); ~TGLexer() {} @@ -84,7 +89,7 @@ public: return CurCode = LexToken(); } - const std::vector &getDependencies() const { + const DependenciesMapTy &getDependencies() const { return Dependencies; } diff --git a/lib/TableGen/TGParser.h b/lib/TableGen/TGParser.h index e55805d..044e3a0 100644 --- a/lib/TableGen/TGParser.h +++ b/lib/TableGen/TGParser.h @@ -96,7 +96,7 @@ public: bool TokError(const Twine &Msg) const { return Error(Lex.getLoc(), Msg); } - const std::vector &getDependencies() const { + const TGLexer::DependenciesMapTy &getDependencies() const { return Lex.getDependencies(); } -- cgit v1.1