aboutsummaryrefslogtreecommitdiff
path: root/include/clang/Basic/IdentifierTable.h
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-03-07 01:42:16 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-03-07 01:42:16 +0000
commitccb9bac3adb35a2dc78c1737e7b2dc6537a16393 (patch)
tree616c55886a76326106391d535f9435ce8bb4e08a /include/clang/Basic/IdentifierTable.h
parentb9eb3afc9eafbb1c6815c8b63633065f370be6a5 (diff)
Cleanup/comment IdentifierInfo::get.
- Shaves off a few instructions on x86_64. One notable change: this intentionally stops setting the II->Entry field of IdentifierInfo's retrieved by the ExternalLookup method. This is to maintain the invariant that .getName() has a constant value for any given IdentifierInfo. IRgen currently relies on this; which is quite questionable but will be cleaned up in time. Apologies for the lack of a test case; there really isn't a good way to make one. As IRgen will eventually be fixed to not rely on this, we can survive without one. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66316 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Basic/IdentifierTable.h')
-rw-r--r--include/clang/Basic/IdentifierTable.h31
1 files changed, 17 insertions, 14 deletions
diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h
index b6cee028f4..93651d3d91 100644
--- a/include/clang/Basic/IdentifierTable.h
+++ b/include/clang/Basic/IdentifierTable.h
@@ -267,24 +267,27 @@ public:
HashTable.GetOrCreateValue(NameStart, NameEnd);
IdentifierInfo *II = Entry.getValue();
+ if (II) return *II;
- if (!II) {
- while (1) {
- if (ExternalLookup) {
- II = ExternalLookup->get(NameStart, NameEnd);
- if (II) break;
- }
-
- void *Mem = getAllocator().Allocate<IdentifierInfo>();
- II = new (Mem) IdentifierInfo();
- break;
+ // No entry; if we have an external lookup, look there first.
+ if (ExternalLookup) {
+ II = ExternalLookup->get(NameStart, NameEnd);
+ if (II) {
+ // Cache in the StringMap for subsequent lookups.
+ Entry.setValue(II);
+ return *II;
}
-
- Entry.setValue(II);
- II->Entry = &Entry;
}
- assert(II->Entry != 0);
+ // Lookups failed, make a new IdentifierInfo.
+ void *Mem = getAllocator().Allocate<IdentifierInfo>();
+ II = new (Mem) IdentifierInfo();
+ Entry.setValue(II);
+
+ // Make sure getName() knows how to find the IdentifierInfo
+ // contents.
+ II->Entry = &Entry;
+
return *II;
}