From 2da08f9d8dff5f2a0ffb0cef72db80f03900a2cf Mon Sep 17 00:00:00 2001 From: Sebastian Redl Date: Mon, 19 Jul 2010 22:28:42 +0000 Subject: [PATCH] Promote IdentifierOffsets to per-file data. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108762 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Frontend/PCHReader.h | 23 +++++++++++++---------- lib/Frontend/PCHReader.cpp | 24 ++++++++++++------------ 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/include/clang/Frontend/PCHReader.h b/include/clang/Frontend/PCHReader.h index 81acd51a86..9002c169b5 100644 --- a/include/clang/Frontend/PCHReader.h +++ b/include/clang/Frontend/PCHReader.h @@ -238,9 +238,19 @@ private: /// \brief The number of declarations in this PCH file. unsigned LocalNumDecls; - /// \brief Offset of each declaration within the bitstream, indexed - /// by the declaration ID (-1). - const uint32_t *DeclOffsets; + /// \brief Offset of each declaration within the bitstream, indexed + /// by the declaration ID (-1). + const uint32_t *DeclOffsets; + + /// \brief The number of identifiers in this PCH file. + unsigned LocalNumIdentifiers; + + /// \brief Offsets into the identifier table data. + /// + /// This array is indexed by the identifier ID (-1), and provides + /// the offset into IdentifierTableData where the string data is + /// stored. + const uint32_t *IdentifierOffsets; /// \brief Actual data for the on-disk hash table. /// @@ -284,13 +294,6 @@ private: /// DeclContext. DeclContextOffsetsMap DeclContextOffsets; - /// \brief Offsets into the identifier table data. - /// - /// This array is indexed by the identifier ID (-1), and provides - /// the offset into IdentifierTableData where the string data is - /// stored. - const uint32_t *IdentifierOffsets; - /// \brief A vector containing identifiers that have already been /// loaded. /// diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 9a9a1fc29b..fb9e32b34f 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -418,8 +418,7 @@ PCHReader::PCHReader(Preprocessor &PP, ASTContext *Context, : Listener(new PCHValidator(PP, *this)), DeserializationListener(0), SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()), SemaObj(0), PP(&PP), Context(Context), - Consumer(0), IdentifierOffsets(0), - MethodPoolLookupTable(0), MethodPoolLookupTableData(0), + Consumer(0), MethodPoolLookupTable(0), MethodPoolLookupTableData(0), TotalSelectorsInMethodPool(0), SelectorOffsets(0), TotalNumSelectors(0), MacroDefinitionOffsets(0), NumPreallocatedPreprocessingEntities(0), @@ -435,7 +434,6 @@ PCHReader::PCHReader(SourceManager &SourceMgr, FileManager &FileMgr, Diagnostic &Diags, const char *isysroot) : DeserializationListener(0), SourceMgr(SourceMgr), FileMgr(FileMgr), Diags(Diags), SemaObj(0), PP(0), Context(0), Consumer(0), - IdentifierOffsets(0), MethodPoolLookupTable(0), MethodPoolLookupTableData(0), TotalSelectorsInMethodPool(0), SelectorOffsets(0), TotalNumSelectors(0), MacroDefinitionOffsets(0), @@ -455,8 +453,8 @@ PCHReader::~PCHReader() { PCHReader::PerFileData::PerFileData() : StatCache(0), LocalNumSLocEntries(0), LocalNumTypes(0), TypeOffsets(0), - LocalNumDecls(0), DeclOffsets(0), IdentifierTableData(0), - IdentifierLookupTable(0) + LocalNumDecls(0), DeclOffsets(0), LocalNumIdentifiers(0), + IdentifierOffsets(0), IdentifierTableData(0), IdentifierLookupTable(0) {} @@ -1527,14 +1525,12 @@ PCHReader::ReadPCHBlock(PerFileData &F) { break; case pch::IDENTIFIER_OFFSET: - if (!IdentifiersLoaded.empty()) { + if (F.LocalNumIdentifiers != 0) { Error("duplicate IDENTIFIER_OFFSET record in PCH file"); return Failure; } - IdentifierOffsets = (const uint32_t *)BlobStart; - IdentifiersLoaded.resize(Record[0]); - if (PP) - PP->getHeaderSearchInfo().SetExternalLookup(this); + F.IdentifierOffsets = (const uint32_t *)BlobStart; + F.LocalNumIdentifiers = Record[0]; break; case pch::EXTERNAL_DEFINITIONS: @@ -1695,13 +1691,17 @@ PCHReader::PCHReadResult PCHReader::ReadPCH(const std::string &FileName) { // Here comes stuff that we only do once the entire chain is loaded. // Allocate space for loaded decls and types. - unsigned TotalNumTypes = 0, TotalNumDecls = 0; + unsigned TotalNumIdentifiers = 0, TotalNumTypes = 0, TotalNumDecls = 0; for (unsigned I = 0, N = Chain.size(); I != N; ++I) { + TotalNumIdentifiers += Chain[I]->LocalNumIdentifiers; TotalNumTypes += Chain[I]->LocalNumTypes; TotalNumDecls += Chain[I]->LocalNumDecls; } + IdentifiersLoaded.resize(TotalNumIdentifiers); TypesLoaded.resize(TotalNumTypes); DeclsLoaded.resize(TotalNumDecls); + if (PP && TotalNumIdentifiers > 0) + PP->getHeaderSearchInfo().SetExternalLookup(this); // Check the predefines buffers. if (CheckPredefinesBuffers()) @@ -3131,7 +3131,7 @@ IdentifierInfo *PCHReader::DecodeIdentifierInfo(unsigned ID) { assert(PP && "Forgot to set Preprocessor ?"); if (!IdentifiersLoaded[ID - 1]) { - uint32_t Offset = IdentifierOffsets[ID - 1]; + uint32_t Offset = Chain[0]->IdentifierOffsets[ID - 1]; const char *Str = Chain[0]->IdentifierTableData + Offset; // All of the strings in the PCH file are preceded by a 16-bit -- 2.40.0