mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-17 23:44:43 +00:00
move include searching logic from TGLexer to SourceMgr.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73845 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8070ea3f06
commit
7ee5d5f97b
@ -57,12 +57,20 @@ class SourceMgr {
|
||||
/// Buffers - This is all of the buffers that we are reading from.
|
||||
std::vector<SrcBuffer> Buffers;
|
||||
|
||||
// IncludeDirectories - This is the list of directories we should search for
|
||||
// include files in.
|
||||
std::vector<std::string> IncludeDirectories;
|
||||
|
||||
SourceMgr(const SourceMgr&); // DO NOT IMPLEMENT
|
||||
void operator=(const SourceMgr&); // DO NOT IMPLEMENT
|
||||
public:
|
||||
SourceMgr() {}
|
||||
~SourceMgr();
|
||||
|
||||
void setIncludeDirs(const std::vector<std::string> &Dirs) {
|
||||
IncludeDirectories = Dirs;
|
||||
}
|
||||
|
||||
const SrcBuffer &getBufferInfo(unsigned i) const {
|
||||
assert(i < Buffers.size() && "Invalid Buffer ID!");
|
||||
return Buffers[i];
|
||||
@ -86,6 +94,11 @@ public:
|
||||
return Buffers.size()-1;
|
||||
}
|
||||
|
||||
/// AddIncludeFile - Search for a file with the specified name in the current
|
||||
/// directory or in one of the IncludeDirs. If no file is found, this returns
|
||||
/// ~0, otherwise it returns the buffer ID of the stacked file.
|
||||
unsigned AddIncludeFile(const std::string &Filename, SMLoc IncludeLoc);
|
||||
|
||||
/// FindBufferContainingLoc - Return the ID of the buffer containing the
|
||||
/// specified location, returning -1 if not found.
|
||||
int FindBufferContainingLoc(SMLoc Loc) const;
|
||||
|
@ -25,6 +25,26 @@ SourceMgr::~SourceMgr() {
|
||||
}
|
||||
}
|
||||
|
||||
/// AddIncludeFile - Search for a file with the specified name in the current
|
||||
/// directory or in one of the IncludeDirs. If no file is found, this returns
|
||||
/// ~0, otherwise it returns the buffer ID of the stacked file.
|
||||
unsigned SourceMgr::AddIncludeFile(const std::string &Filename,
|
||||
SMLoc IncludeLoc) {
|
||||
|
||||
MemoryBuffer *NewBuf = MemoryBuffer::getFile(Filename.c_str());
|
||||
|
||||
// If the file didn't exist directly, see if it's in an include path.
|
||||
for (unsigned i = 0, e = IncludeDirectories.size(); i != e && !NewBuf; ++i) {
|
||||
std::string IncFile = IncludeDirectories[i] + "/" + Filename;
|
||||
NewBuf = MemoryBuffer::getFile(IncFile.c_str());
|
||||
}
|
||||
|
||||
if (NewBuf == 0) return ~0U;
|
||||
|
||||
return AddNewSourceBuffer(NewBuf, IncludeLoc);
|
||||
}
|
||||
|
||||
|
||||
/// FindBufferContainingLoc - Return the ID of the buffer containing the
|
||||
/// specified location, returning -1 if not found.
|
||||
int SourceMgr::FindBufferContainingLoc(SMLoc Loc) const {
|
||||
|
@ -278,24 +278,15 @@ bool TGLexer::LexInclude() {
|
||||
// Get the string.
|
||||
std::string Filename = CurStrVal;
|
||||
|
||||
// Try to find the file.
|
||||
MemoryBuffer *NewBuf = MemoryBuffer::getFile(Filename.c_str());
|
||||
|
||||
// If the file didn't exist directly, see if it's in an include path.
|
||||
for (unsigned i = 0, e = IncludeDirectories.size(); i != e && !NewBuf; ++i) {
|
||||
std::string IncFile = IncludeDirectories[i] + "/" + Filename;
|
||||
NewBuf = MemoryBuffer::getFile(IncFile.c_str());
|
||||
}
|
||||
|
||||
if (NewBuf == 0) {
|
||||
|
||||
CurBuffer = SrcMgr.AddIncludeFile(Filename, SMLoc::getFromPointer(CurPtr));
|
||||
if (CurBuffer == ~0U) {
|
||||
PrintError(getLoc(), "Could not find include file '" + Filename + "'");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Save the line number and lex buffer of the includer.
|
||||
CurBuffer = SrcMgr.AddNewSourceBuffer(NewBuf, SMLoc::getFromPointer(CurPtr));
|
||||
|
||||
CurBuf = NewBuf;
|
||||
CurBuf = SrcMgr.getMemoryBuffer(CurBuffer);
|
||||
CurPtr = CurBuf->getBufferStart();
|
||||
return false;
|
||||
}
|
||||
|
@ -73,17 +73,10 @@ class TGLexer {
|
||||
/// by the SourceMgr object.
|
||||
int CurBuffer;
|
||||
|
||||
// IncludeDirectories - This is the list of directories we should search for
|
||||
// include files in.
|
||||
std::vector<std::string> IncludeDirectories;
|
||||
public:
|
||||
TGLexer(SourceMgr &SrcMgr);
|
||||
~TGLexer() {}
|
||||
|
||||
void setIncludeDirs(const std::vector<std::string> &Dirs) {
|
||||
IncludeDirectories = Dirs;
|
||||
}
|
||||
|
||||
tgtok::TokKind Lex() {
|
||||
return CurCode = LexToken();
|
||||
}
|
||||
|
@ -49,8 +49,6 @@ class TGParser {
|
||||
public:
|
||||
TGParser(SourceMgr &SrcMgr) : Lex(SrcMgr), CurMultiClass(0) {}
|
||||
|
||||
void setIncludeDirs(const std::vector<std::string> &D){Lex.setIncludeDirs(D);}
|
||||
|
||||
/// ParseFile - Main entrypoint for parsing a tblgen file. These parser
|
||||
/// routines return true on error, or false on success.
|
||||
bool ParseFile();
|
||||
|
@ -146,12 +146,12 @@ static bool ParseFile(const std::string &Filename,
|
||||
|
||||
// Tell SrcMgr about this buffer, which is what TGParser will pick up.
|
||||
SrcMgr.AddNewSourceBuffer(F, SMLoc());
|
||||
|
||||
TGParser Parser(SrcMgr);
|
||||
|
||||
// Record the location of the include directory so that the lexer can find
|
||||
// it later.
|
||||
Parser.setIncludeDirs(IncludeDirs);
|
||||
SrcMgr.setIncludeDirs(IncludeDirs);
|
||||
|
||||
TGParser Parser(SrcMgr);
|
||||
|
||||
return Parser.ParseFile();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user