From: Douglas Gregor Date: Tue, 28 Apr 2009 21:32:13 +0000 (+0000) Subject: Optimize IdentifierInfo storage within the precompiled header. We've X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5998da5c29dae3f654cb65738ff237203e2222c8;p=clang Optimize IdentifierInfo storage within the precompiled header. We've now gotten back about 180k of the 500k we lost. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70326 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 64929dcb1d..4e3f50db2e 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -237,7 +237,7 @@ public: return II; } - uint32_t Bits = ReadUnalignedLE32(d); + unsigned Bits = ReadUnalignedLE16(d); bool CPlusPlusOperatorKeyword = Bits & 0x01; Bits >>= 1; bool Poisoned = Bits & 0x01; @@ -248,11 +248,9 @@ public: Bits >>= 1; unsigned ObjCOrBuiltinID = Bits & 0x3FF; Bits >>= 10; - unsigned TokenID = Bits & 0xFF; - Bits >>= 8; assert(Bits == 0 && "Extra bits in the identifier?"); - DataLen -= 8; + DataLen -= 6; // Build the IdentifierInfo itself and link the identifier ID with // the new IdentifierInfo. @@ -264,9 +262,6 @@ public: // Set or check the various bits in the IdentifierInfo structure. // FIXME: Load token IDs lazily, too? - assert((unsigned)II->getTokenID() == TokenID && - "Incorrect token ID loaded"); - (void)TokenID; II->setObjCOrBuiltinID(ObjCOrBuiltinID); assert(II->isExtensionToken() == ExtensionToken && "Incorrect extension token flag"); @@ -279,9 +274,9 @@ public: // If this identifier is a macro, deserialize the macro // definition. if (hasMacroDefinition) { - uint32_t Offset = ReadUnalignedLE64(d); + uint32_t Offset = ReadUnalignedLE32(d); Reader.ReadMacroRecord(Offset); - DataLen -= 8; + DataLen -= 4; } // Read all of the declarations visible at global scope with this diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index 4870b4933a..04b552a488 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -1322,10 +1322,10 @@ public: unsigned KeyLen = strlen(II->getName()) + 1; unsigned DataLen = 4; // 4 bytes for the persistent ID << 1 if (isInterestingIdentifier(II)) { - DataLen += 4; // 4 bytes for token ID, builtin, flags + DataLen += 2; // 2 bytes for builtin ID, flags if (II->hasMacroDefinition() && !PP.getMacroInfo(const_cast(II))->isBuiltinMacro()) - DataLen += 8; + DataLen += 4; for (IdentifierResolver::iterator D = IdentifierResolver::begin(II), DEnd = IdentifierResolver::end(); D != DEnd; ++D) @@ -1353,21 +1353,21 @@ public: clang::io::Emit32(Out, ID << 1); return; } + clang::io::Emit32(Out, (ID << 1) | 0x01); uint32_t Bits = 0; bool hasMacroDefinition = II->hasMacroDefinition() && !PP.getMacroInfo(const_cast(II))->isBuiltinMacro(); - Bits = Bits | (uint32_t)II->getTokenID(); - Bits = (Bits << 10) | (uint32_t)II->getObjCOrBuiltinID(); + Bits = (uint32_t)II->getObjCOrBuiltinID(); Bits = (Bits << 1) | hasMacroDefinition; Bits = (Bits << 1) | II->isExtensionToken(); Bits = (Bits << 1) | II->isPoisoned(); Bits = (Bits << 1) | II->isCPlusPlusOperatorKeyword(); - clang::io::Emit32(Out, Bits); + clang::io::Emit16(Out, Bits); if (hasMacroDefinition) - clang::io::Emit64(Out, Writer.getMacroOffset(II)); + clang::io::Emit32(Out, Writer.getMacroOffset(II)); // Emit the declaration IDs in reverse order, because the // IdentifierResolver provides the declarations as they would be