diff options
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
| -rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 3eb887367c3..6883f448802 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1647,6 +1647,8 @@ namespace { /// inode numbers, so that the search can cope with non-normalized path names /// and symlinks. class HeaderFileInfoTrait { + HeaderSearch *HS; + const char *FrameworkStrings; const char *SearchPath; struct stat SearchPathStatBuf; llvm::Optional<int> SearchPathStatResult; @@ -1669,7 +1671,10 @@ namespace { typedef HeaderFileInfo data_type; - HeaderFileInfoTrait(const char *SearchPath = 0) : SearchPath(SearchPath) { } + HeaderFileInfoTrait(HeaderSearch *HS, + const char *FrameworkStrings, + const char *SearchPath = 0) + : HS(HS), FrameworkStrings(FrameworkStrings), SearchPath(SearchPath) { } static unsigned ComputeHash(const char *path) { return llvm::HashString(llvm::sys::path::filename(path)); @@ -1704,21 +1709,29 @@ namespace { return (const char *)d; } - static data_type ReadData(const internal_key_type, const unsigned char *d, - unsigned DataLen) { + data_type ReadData(const internal_key_type, const unsigned char *d, + unsigned DataLen) { const unsigned char *End = d + DataLen; using namespace clang::io; HeaderFileInfo HFI; unsigned Flags = *d++; - HFI.isImport = (Flags >> 4) & 0x01; - HFI.isPragmaOnce = (Flags >> 3) & 0x01; - HFI.DirInfo = (Flags >> 1) & 0x03; - HFI.Resolved = Flags & 0x01; + HFI.isImport = (Flags >> 5) & 0x01; + HFI.isPragmaOnce = (Flags >> 4) & 0x01; + HFI.DirInfo = (Flags >> 2) & 0x03; + HFI.Resolved = (Flags >> 1) & 0x01; + HFI.IndexHeaderMapHeader = Flags & 0x01; HFI.NumIncludes = ReadUnalignedLE16(d); HFI.ControllingMacroID = ReadUnalignedLE32(d); + if (unsigned FrameworkOffset = ReadUnalignedLE32(d)) { + // The framework offset is 1 greater than the actual offset, + // since 0 is used as an indicator for "no framework name". + StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); + HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); + } + assert(End == d && "Wrong data length in HeaderFileInfo deserialization"); (void)End; - + // This HeaderFileInfo was externally loaded. HFI.External = true; return HFI; @@ -2424,19 +2437,23 @@ ASTReader::ReadASTBlock(Module &F) { CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); break; - case HEADER_SEARCH_TABLE: + case HEADER_SEARCH_TABLE: { F.HeaderFileInfoTableData = BlobStart; F.LocalNumHeaderFileInfos = Record[1]; + F.HeaderFileFrameworkStrings = BlobStart + Record[2]; if (Record[0]) { F.HeaderFileInfoTable = HeaderFileInfoLookupTable::Create( (const unsigned char *)F.HeaderFileInfoTableData + Record[0], - (const unsigned char *)F.HeaderFileInfoTableData); + (const unsigned char *)F.HeaderFileInfoTableData, + HeaderFileInfoTrait(PP? &PP->getHeaderSearchInfo() : 0, + BlobStart + Record[2])); if (PP) PP->getHeaderSearchInfo().SetExternalSource(this); } break; - + } + case FP_PRAGMA_OPTIONS: // Later tables overwrite earlier ones. FPPragmaOptions.swap(Record); @@ -3076,9 +3093,13 @@ PreprocessedEntity *ASTReader::ReadPreprocessedEntityAtOffset(uint64_t Offset) { } HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { - HeaderFileInfoTrait Trait(FE->getName()); for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) { Module &F = *(*I); + + HeaderFileInfoTrait Trait(&PP->getHeaderSearchInfo(), + F.HeaderFileFrameworkStrings, + FE->getName()); + HeaderFileInfoLookupTable *Table = static_cast<HeaderFileInfoLookupTable *>(F.HeaderFileInfoTable); if (!Table) @@ -5356,6 +5377,7 @@ Module::Module(ModuleKind Kind) IdentifierLookupTable(0), LocalNumMacroDefinitions(0), MacroDefinitionOffsets(0), LocalNumHeaderFileInfos(0), HeaderFileInfoTableData(0), HeaderFileInfoTable(0), + HeaderFileFrameworkStrings(0), LocalNumSelectors(0), SelectorOffsets(0), SelectorLookupTableData(0), SelectorLookupTable(0), LocalNumDecls(0), DeclOffsets(0), LocalNumCXXBaseSpecifiers(0), CXXBaseSpecifiersOffsets(0), |

