From: Ted Kremenek Date: Thu, 19 Mar 2009 22:19:30 +0000 (+0000) Subject: Add PTHManager::getOriginalSourceFile(), a method that returns the name of the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=68228634016f644a1164fa1f024a9ce2093656bf;p=clang Add PTHManager::getOriginalSourceFile(), a method that returns the name of the original source file (if any) that was used to generate the PTH cache. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67343 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Lex/PTHManager.h b/include/clang/Lex/PTHManager.h index b937556e43..6c3cabb164 100644 --- a/include/clang/Lex/PTHManager.h +++ b/include/clang/Lex/PTHManager.h @@ -69,12 +69,16 @@ class PTHManager : public IdentifierInfoLookup { /// contains the cached spellings for literals. const unsigned char* const SpellingBase; + /// OriginalSourceFile - A null-terminated C-string that specifies the name + /// if the file (if any) that was to used to generate the PTH cache. + const char* OriginalSourceFile; + /// This constructor is intended to only be called by the static 'Create' /// method. PTHManager(const llvm::MemoryBuffer* buf, void* fileLookup, const unsigned char* idDataTable, IdentifierInfo** perIDCache, void* stringIdLookup, unsigned numIds, - const unsigned char* spellingBase); + const unsigned char* spellingBase, const char *originalSourceFile); // Do not implement. PTHManager(); @@ -96,10 +100,16 @@ class PTHManager : public IdentifierInfoLookup { public: // The current PTH version. - enum { Version = 8 }; + enum { Version = 9 }; ~PTHManager(); + /// getOriginalSourceFile - Return the full path to the original header + /// file name that was used to generate the PTH cache. + const char* getOriginalSourceFile() const { + return OriginalSourceFile; + } + /// get - Return the identifier token info for the specified named identifier. /// Unlike the version in IdentifierTable, this returns a pointer instead /// of a reference. If the pointer is NULL then the IdentifierInfo cannot diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp index a5423d08f8..0a810ceaa6 100644 --- a/lib/Lex/PTHLexer.cpp +++ b/lib/Lex/PTHLexer.cpp @@ -569,10 +569,12 @@ PTHManager::PTHManager(const llvm::MemoryBuffer* buf, void* fileLookup, const unsigned char* idDataTable, IdentifierInfo** perIDCache, void* stringIdLookup, unsigned numIds, - const unsigned char* spellingBase) + const unsigned char* spellingBase, + const char* originalSourceFile) : Buf(buf), PerIDCache(perIDCache), FileLookup(fileLookup), IdDataTable(idDataTable), StringIdLookup(stringIdLookup), - NumIds(numIds), PP(0), SpellingBase(spellingBase) {} + NumIds(numIds), PP(0), SpellingBase(spellingBase), + OriginalSourceFile(originalSourceFile) {} PTHManager::~PTHManager() { delete Buf; @@ -701,10 +703,17 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) { } } + // Compute the address of the original source file. + const unsigned char* originalSourceBase = PrologueOffset + sizeof(uint32_t)*4; + unsigned len = ReadUnalignedLE16(originalSourceBase); + if (!len) originalSourceBase = 0; + // Create the new PTHManager. return new PTHManager(File.take(), FL.take(), IData, PerIDCache, - SL.take(), NumIds, spellingBase); + SL.take(), NumIds, spellingBase, + (const char*) originalSourceBase); } + IdentifierInfo* PTHManager::LazilyCreateIdentifierInfo(unsigned PersistentID) { // Look in the PTH file for the string data for the IdentifierInfo object. const unsigned char* TableEntry = IdDataTable + sizeof(uint32_t)*PersistentID;