summaryrefslogtreecommitdiffstats
path: root/clang/lib/Frontend/PCHWriter.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-04-25 21:04:17 +0000
committerDouglas Gregor <dgregor@apple.com>2009-04-25 21:04:17 +0000
commit5287b4e8ec8a53ee1807007e8869f1a3d3c83ec0 (patch)
tree85c0718d417d5f482974a692aa11c6197f20012f /clang/lib/Frontend/PCHWriter.cpp
parent0f3b758f013b552410e6dd7f8b8bffc359c5c630 (diff)
downloadbcm5719-llvm-5287b4e8ec8a53ee1807007e8869f1a3d3c83ec0.tar.gz
bcm5719-llvm-5287b4e8ec8a53ee1807007e8869f1a3d3c83ec0.zip
PCH optimization for the identifier table, where we separate
"interesting" identifiers (e.g., those where the IdentifierInfo has some useful information) from "uninteresting" identifiers (where the IdentifierInfo is just a name). This makes the hash table smaller (so searching in it should be faster) and, when loading "uninteresting" identifiers, we skip the lookup in the hash table. PCH file size is slightly smaller than before (since we don't emit the contents of the uninteresting IdentifierInfo structures). The Cocoa.h-prefixed "Hello, World" doesn't show any speedup, although we're getting to the point where system noise is a bit issue. llvm-svn: 70075
Diffstat (limited to 'clang/lib/Frontend/PCHWriter.cpp')
-rw-r--r--clang/lib/Frontend/PCHWriter.cpp38
1 files changed, 36 insertions, 2 deletions
diff --git a/clang/lib/Frontend/PCHWriter.cpp b/clang/lib/Frontend/PCHWriter.cpp
index 4ac836419eb..bce941a8497 100644
--- a/clang/lib/Frontend/PCHWriter.cpp
+++ b/clang/lib/Frontend/PCHWriter.cpp
@@ -2013,7 +2013,6 @@ public:
EmitKeyDataLength(llvm::raw_ostream& Out, const IdentifierInfo* II,
pch::IdentID ID) {
unsigned KeyLen = strlen(II->getName()) + 1;
- clang::io::Emit16(Out, KeyLen);
unsigned DataLen = 4 + 4; // 4 bytes for token ID, builtin, flags
// 4 bytes for the persistent ID
if (II->hasMacroDefinition() &&
@@ -2023,7 +2022,13 @@ public:
DEnd = IdentifierResolver::end();
D != DEnd; ++D)
DataLen += sizeof(pch::DeclID);
+ // We emit the key length after the data length so that the
+ // "uninteresting" identifiers following the identifier hash table
+ // structure will have the same (key length, key characters)
+ // layout as the keys in the hash table. This also matches the
+ // format for identifiers in pretokenized headers.
clang::io::Emit16(Out, DataLen);
+ clang::io::Emit16(Out, KeyLen);
return std::make_pair(KeyLen, DataLen);
}
@@ -2083,12 +2088,33 @@ void PCHWriter::WriteIdentifierTable(Preprocessor &PP) {
{
OnDiskChainedHashTableGenerator<PCHIdentifierTableTrait> Generator;
+ llvm::SmallVector<const IdentifierInfo *, 32> UninterestingIdentifiers;
+
// Create the on-disk hash table representation.
for (llvm::DenseMap<const IdentifierInfo *, pch::IdentID>::iterator
ID = IdentifierIDs.begin(), IDEnd = IdentifierIDs.end();
ID != IDEnd; ++ID) {
assert(ID->first && "NULL identifier in identifier table");
- Generator.insert(ID->first, ID->second);
+
+ // Classify each identifier as either "interesting" or "not
+ // interesting". Interesting identifiers are those that have
+ // additional information that needs to be read from the PCH
+ // file, e.g., a built-in ID, declaration chain, or macro
+ // definition. These identifiers are placed into the hash table
+ // so that they can be found when looked up in the user program.
+ // All other identifiers are "uninteresting", which means that
+ // the IdentifierInfo built by default has all of the
+ // information we care about. Such identifiers are placed after
+ // the hash table.
+ const IdentifierInfo *II = ID->first;
+ if (II->isPoisoned() ||
+ II->isExtensionToken() ||
+ II->hasMacroDefinition() ||
+ II->getObjCOrBuiltinID() ||
+ II->getFETokenInfo<void>())
+ Generator.insert(ID->first, ID->second);
+ else
+ UninterestingIdentifiers.push_back(II);
}
// Create the on-disk hash table in a buffer.
@@ -2100,6 +2126,14 @@ void PCHWriter::WriteIdentifierTable(Preprocessor &PP) {
// Make sure that no bucket is at offset 0
clang::io::Emit32(Out, 0);
BucketOffset = Generator.Emit(Out, Trait);
+
+ for (unsigned I = 0, N = UninterestingIdentifiers.size(); I != N; ++I) {
+ const IdentifierInfo *II = UninterestingIdentifiers[I];
+ unsigned N = II->getLength() + 1;
+ clang::io::Emit16(Out, N);
+ SetIdentifierOffset(II, Out.tell());
+ Out.write(II->getName(), N);
+ }
}
// Create a blob abbreviation
OpenPOWER on IntegriCloud