diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-04-28 20:33:11 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-04-28 20:33:11 +0000 |
commit | 92b059ea944adaa3e00bb53d63a09868a4752547 (patch) | |
tree | 2fbfb91154b92fe0f593eb05ed715284df375873 /lib/Frontend/PCHReader.cpp | |
parent | 02fc75169afe785c114e795ec4d24edfb4073c42 (diff) |
Implement checking for macro definitions that occur on the command
line when using a PCH that were not provided when building the PCH
file. If those names were used as identifiers somewhere in the PCH
file, reject the PCH file.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70321 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReader.cpp')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index f1d7e7a558..e7404f899b 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -507,9 +507,17 @@ bool PCHReader::CheckPredefinesBuffer(const char *PCHPredef, std::string MacroName = Extra.substr(StartOfMacroName, EndOfMacroName - StartOfMacroName); - // FIXME: Perform this check! - fprintf(stderr, "FIXME: check whether '%s' was used in the PCH file\n", - MacroName.c_str()); + // Check whether this name was used somewhere in the PCH file. If + // so, defining it as a macro could change behavior, so we reject + // the PCH file. + if (IdentifierInfo *II = get(MacroName.c_str(), + MacroName.c_str() + MacroName.size())) { + Diag(diag::warn_macro_name_used_in_pch) + << II; + Diag(diag::note_ignoring_pch) + << FileName; + return true; + } // Add this definition to the suggested predefines buffer. SuggestedPredefines += Extra; @@ -818,9 +826,11 @@ PCHReader::PCHReadResult PCHReader::ReadSLocEntryRecord(unsigned ID) { Name); FileID BufferID = SourceMgr.createFileIDForMemBuffer(Buffer, ID, Offset); - if (strcmp(Name, "<built-in>") == 0 - && CheckPredefinesBuffer(BlobStart, BlobLen - 1, BufferID)) - return IgnorePCH; + if (strcmp(Name, "<built-in>") == 0) { + PCHPredefinesBufferID = BufferID; + PCHPredefines = BlobStart; + PCHPredefinesLen = BlobLen - 1; + } break; } @@ -1287,7 +1297,12 @@ PCHReader::PCHReadResult PCHReader::ReadPCH(const std::string &FileName) { // Load the translation unit declaration if (Context) ReadDeclRecord(DeclOffsets[0], 0); - + + // Check the predefines buffer. + if (CheckPredefinesBuffer(PCHPredefines, PCHPredefinesLen, + PCHPredefinesBufferID)) + return IgnorePCH; + // Initialization of builtins and library builtins occurs before the // PCH file is read, so there may be some identifiers that were // loaded into the IdentifierTable before we intercepted the |