mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-27 13:30:05 +00:00
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
This commit is contained in:
parent
65c46b0cff
commit
a170f520a9
@ -64,11 +64,11 @@ static int createDependencyFile(const TGParser &Parser, const char *argv0) {
|
||||
return 1;
|
||||
}
|
||||
DepOut.os() << OutputFilename << ":";
|
||||
const std::vector<std::string> &Dependencies = Parser.getDependencies();
|
||||
for (std::vector<std::string>::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();
|
||||
|
@ -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();
|
||||
|
@ -15,9 +15,10 @@
|
||||
#define TGLEXER_H
|
||||
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
#include "llvm/Support/SMLoc.h"
|
||||
#include <cassert>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
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<std::string, SMLoc> DependenciesMapTy;
|
||||
private:
|
||||
/// Dependencies - This is the list of all included files.
|
||||
std::vector<std::string> Dependencies;
|
||||
|
||||
DependenciesMapTy Dependencies;
|
||||
|
||||
public:
|
||||
TGLexer(SourceMgr &SrcMgr);
|
||||
~TGLexer() {}
|
||||
@ -84,7 +89,7 @@ public:
|
||||
return CurCode = LexToken();
|
||||
}
|
||||
|
||||
const std::vector<std::string> &getDependencies() const {
|
||||
const DependenciesMapTy &getDependencies() const {
|
||||
return Dependencies;
|
||||
}
|
||||
|
||||
|
@ -96,7 +96,7 @@ public:
|
||||
bool TokError(const Twine &Msg) const {
|
||||
return Error(Lex.getLoc(), Msg);
|
||||
}
|
||||
const std::vector<std::string> &getDependencies() const {
|
||||
const TGLexer::DependenciesMapTy &getDependencies() const {
|
||||
return Lex.getDependencies();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user