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.

llvm-svn: 66316
This commit is contained in:
Daniel Dunbar 2009-03-07 01:42:16 +00:00
parent 9153f08c74
commit fc1b80d481

View File

@ -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;
}