diff options
-rw-r--r-- | include/clang/Frontend/PCHBitCodes.h | 5 | ||||
-rw-r--r-- | include/clang/Frontend/PCHReader.h | 4 | ||||
-rw-r--r-- | include/clang/Lex/HeaderSearch.h | 7 | ||||
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 25 | ||||
-rw-r--r-- | lib/Frontend/PCHWriter.cpp | 30 | ||||
-rw-r--r-- | test/PCH/headermap.h | 3 | ||||
-rw-r--r-- | test/PCH/headermap.m | 15 |
7 files changed, 52 insertions, 37 deletions
diff --git a/include/clang/Frontend/PCHBitCodes.h b/include/clang/Frontend/PCHBitCodes.h index e234e9838a..e2c27e6ddf 100644 --- a/include/clang/Frontend/PCHBitCodes.h +++ b/include/clang/Frontend/PCHBitCodes.h @@ -245,10 +245,7 @@ namespace clang { SM_SLOC_INSTANTIATION_ENTRY = 4, /// \brief Describes the SourceManager's line table, with /// information about #line directives. - SM_LINE_TABLE = 5, - /// \brief Describes one header file info [isImport, DirInfo, NumIncludes] - /// ControllingMacro is optional. - SM_HEADER_FILE_INFO = 6 + SM_LINE_TABLE = 5 }; /// \brief Record types used within a preprocessor block. diff --git a/include/clang/Frontend/PCHReader.h b/include/clang/Frontend/PCHReader.h index 065006fce5..7aafb2d5de 100644 --- a/include/clang/Frontend/PCHReader.h +++ b/include/clang/Frontend/PCHReader.h @@ -106,7 +106,7 @@ public: } /// \brief Receives a HeaderFileInfo entry. - virtual void ReadHeaderFileInfo(const HeaderFileInfo &HFI) {} + virtual void ReadHeaderFileInfo(const HeaderFileInfo &HFI, unsigned ID) {} /// \brief Receives __COUNTER__ value. virtual void ReadCounter(unsigned Value) {} @@ -130,7 +130,7 @@ public: FileID PCHBufferID, llvm::StringRef OriginalFileName, std::string &SuggestedPredefines); - virtual void ReadHeaderFileInfo(const HeaderFileInfo &HFI); + virtual void ReadHeaderFileInfo(const HeaderFileInfo &HFI, unsigned ID); virtual void ReadCounter(unsigned Value); }; diff --git a/include/clang/Lex/HeaderSearch.h b/include/clang/Lex/HeaderSearch.h index 16b8379045..978585caf0 100644 --- a/include/clang/Lex/HeaderSearch.h +++ b/include/clang/Lex/HeaderSearch.h @@ -214,9 +214,10 @@ public: void IncrementFrameworkLookupCount() { ++NumFrameworkLookups; } - typedef std::vector<HeaderFileInfo>::iterator header_file_iterator; - header_file_iterator header_file_begin() { return FileInfo.begin(); } - header_file_iterator header_file_end() { return FileInfo.end(); } + typedef std::vector<HeaderFileInfo>::const_iterator header_file_iterator; + header_file_iterator header_file_begin() const { return FileInfo.begin(); } + header_file_iterator header_file_end() const { return FileInfo.end(); } + unsigned header_file_size() const { return FileInfo.size(); } // Used by PCHReader. void setHeaderFileInfoForUID(HeaderFileInfo HFI, unsigned UID); diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 49eb2a0e60..f1c0247b81 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -300,8 +300,10 @@ bool PCHValidator::ReadPredefinesBuffer(llvm::StringRef PCHPredef, return false; } -void PCHValidator::ReadHeaderFileInfo(const HeaderFileInfo &HFI) { - PP.getHeaderSearchInfo().setHeaderFileInfoForUID(HFI, NumHeaderInfos++); +void PCHValidator::ReadHeaderFileInfo(const HeaderFileInfo &HFI, + unsigned ID) { + PP.getHeaderSearchInfo().setHeaderFileInfoForUID(HFI, ID); + ++NumHeaderInfos; } void PCHValidator::ReadCounter(unsigned Value) { @@ -850,17 +852,6 @@ PCHReader::PCHReadResult PCHReader::ReadSourceManagerBlock() { return Failure; break; - case pch::SM_HEADER_FILE_INFO: { - HeaderFileInfo HFI; - HFI.isImport = Record[0]; - HFI.DirInfo = Record[1]; - HFI.NumIncludes = Record[2]; - HFI.ControllingMacroID = Record[3]; - if (Listener) - Listener->ReadHeaderFileInfo(HFI); - break; - } - case pch::SM_SLOC_FILE_ENTRY: case pch::SM_SLOC_BUFFER_ENTRY: case pch::SM_SLOC_INSTANTIATION_ENTRY: @@ -918,6 +909,14 @@ PCHReader::PCHReadResult PCHReader::ReadSLocEntryRecord(unsigned ID) { const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()) .setHasLineDirectives(); + // Reconstruct header-search information for this file. + HeaderFileInfo HFI; + HFI.isImport = Record[4]; + HFI.DirInfo = Record[5]; + HFI.NumIncludes = Record[6]; + HFI.ControllingMacroID = Record[7]; + if (Listener) + Listener->ReadHeaderFileInfo(HFI, File->getUID()); break; } diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index c256b4103a..e55599b7ec 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -573,7 +573,6 @@ void PCHWriter::WriteBlockInfoBlock() { RECORD(SM_SLOC_BUFFER_BLOB); RECORD(SM_SLOC_INSTANTIATION_ENTRY); RECORD(SM_LINE_TABLE); - RECORD(SM_HEADER_FILE_INFO); // Preprocessor Block. BLOCK(PREPROCESSOR_BLOCK); @@ -918,6 +917,11 @@ static unsigned CreateSLocFileAbbrev(llvm::BitstreamWriter &Stream) { Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Include location Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // Characteristic Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Line directives + // HeaderFileInfo fields. + Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isImport + Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // DirInfo + Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // NumIncludes + Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // ControllingMacro Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name return Stream.EmitAbbrev(Abbrev); } @@ -1019,20 +1023,6 @@ void PCHWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, Stream.EmitRecord(pch::SM_LINE_TABLE, Record); } - // Write out entries for all of the header files we know about. - HeaderSearch &HS = PP.getHeaderSearchInfo(); - Record.clear(); - for (HeaderSearch::header_file_iterator I = HS.header_file_begin(), - E = HS.header_file_end(); - I != E; ++I) { - Record.push_back(I->isImport); - Record.push_back(I->DirInfo); - Record.push_back(I->NumIncludes); - AddIdentifierRef(I->ControllingMacro, Record); - Stream.EmitRecord(pch::SM_HEADER_FILE_INFO, Record); - Record.clear(); - } - // Write out the source location entry table. We skip the first // entry, which is always the same dummy entry. std::vector<uint32_t> SLocEntryOffsets; @@ -1069,6 +1059,16 @@ void PCHWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, // The source location entry is a file. The blob associated // with this entry is the file name. + // Emit header-search information associated with this file. + HeaderFileInfo HFI; + HeaderSearch &HS = PP.getHeaderSearchInfo(); + if (Content->Entry->getUID() < HS.header_file_size()) + HFI = HS.header_file_begin()[Content->Entry->getUID()]; + Record.push_back(HFI.isImport); + Record.push_back(HFI.DirInfo); + Record.push_back(HFI.NumIncludes); + AddIdentifierRef(HFI.ControllingMacro, Record); + // Turn the file name into an absolute path, if it isn't already. const char *Filename = Content->Entry->getName(); llvm::sys::Path FilePath(Filename, strlen(Filename)); diff --git a/test/PCH/headermap.h b/test/PCH/headermap.h new file mode 100644 index 0000000000..efab2d8cab --- /dev/null +++ b/test/PCH/headermap.h @@ -0,0 +1,3 @@ +/* Helper for the headermap.m test */ +int x = 17; + diff --git a/test/PCH/headermap.m b/test/PCH/headermap.m new file mode 100644 index 0000000000..6ba83d7cf7 --- /dev/null +++ b/test/PCH/headermap.m @@ -0,0 +1,15 @@ +// RUN: touch %t.hmap + +// RUN: %clang_cc1 -x objective-c -emit-pch -o %t.h.pch %S/headermap.h +// RUN: %clang_cc1 -include-pch %t.h.pch %s + +// RUN: %clang_cc1 -x objective-c -emit-pch -o %t.h.pch %S/headermap.h +// RUN: %clang_cc1 -include-pch %t.h.pch -I%t.hmap %s + +// RUN: %clang_cc1 -x objective-c -I%t.hmap -emit-pch -o %t.h.pch %S/headermap.h +// RUN: %clang_cc1 -include-pch %t.h.pch %s + +// RUN: %clang_cc1 -x objective-c -I%t.hmap -emit-pch -o %t.h.pch %S/headermap.h +// RUN: %clang_cc1 -include-pch %t.h.pch -I%t.hmap %s +#import "headermap.h" + |