Start implementing the PTH IdentifierInfo-saving trick in PCH,

allocating IdentifierInfos with a pointer into the string data stored
in the PCH file rather than having an entry in the identifier table's
string map. However, we don't actually get these savings at the
moment, because we go through the IdentifierTable when loading
identifiers from the on-disk hash table.

This commit is for record-keeping purposes only. I'll be reverting
this change (and the PCH layout tweak that preceded it) because it
appears that implementing this optimization will collide with another,
future optimization to reduce the size of the on-disk hash table for
identifiers. That optimization is likely to provide more benefit (with
less voodoo).

llvm-svn: 70070
This commit is contained in:
Douglas Gregor 2009-04-25 20:21:25 +00:00
parent 80ad2e6b42
commit 518bd14f2d
3 changed files with 25 additions and 30 deletions

View File

@ -293,34 +293,6 @@ public:
return *II;
}
/// \brief Creates a new IdentifierInfo from the given string.
///
/// This is a lower-level version of get() that requires that this
/// identifier not be known previously and that does not consult an
/// external source for identifiers. In particular, external
/// identifier sources can use this routine to build IdentifierInfo
/// nodes and then introduce additional information about those
/// identifiers.
IdentifierInfo &CreateIdentifierInfo(const char *NameStart,
const char *NameEnd) {
llvm::StringMapEntry<IdentifierInfo*> &Entry =
HashTable.GetOrCreateValue(NameStart, NameEnd);
IdentifierInfo *II = Entry.getValue();
assert(!II && "IdentifierInfo already exists");
// 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;
}
IdentifierInfo &get(const char *Name) {
return get(Name, Name+strlen(Name));
}

View File

@ -27,6 +27,7 @@
#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Bitcode/BitstreamReader.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/DataTypes.h"
#include <map>
#include <string>
@ -85,6 +86,9 @@ private:
/// \brief The bitstream reader from which we'll read the PCH file.
llvm::BitstreamReader Stream;
/// \brief Allocator used for IdentifierInfo objects.
llvm::BumpPtrAllocator Alloc;
/// \brief The file name of the PCH file.
std::string FileName;
@ -370,6 +374,13 @@ public:
IdentifierInfo *GetIdentifierInfo(const RecordData &Record, unsigned &Idx) {
return DecodeIdentifierInfo(Record[Idx++]);
}
/// \brief Builds a new IdentifierInfo object that refers to a
/// string stored within the PCH file.
///
/// \brief Str must be a pointer into the start of a string within
/// IdentifierTableData.
IdentifierInfo &BuildIdentifierInfoInsidePCH(const unsigned char *Str);
Selector DecodeSelector(unsigned Idx);

View File

@ -1282,8 +1282,7 @@ public:
// the new IdentifierInfo.
IdentifierInfo *II = KnownII;
if (!II)
II = &Reader.getIdentifierTable().CreateIdentifierInfo(
k.first, k.first + k.second);
II = &Reader.BuildIdentifierInfoInsidePCH((const unsigned char *)k.first);
Reader.SetIdentifierInfo(ID, II);
// Set or check the various bits in the IdentifierInfo structure.
@ -2849,6 +2848,19 @@ IdentifierInfo *PCHReader::DecodeIdentifierInfo(unsigned ID) {
return IdentifiersLoaded[ID - 1];
}
IdentifierInfo &
PCHReader::BuildIdentifierInfoInsidePCH(const unsigned char *Str) {
// Allocate the object.
std::pair<IdentifierInfo,const unsigned char*> *Mem =
Alloc.Allocate<std::pair<IdentifierInfo,const unsigned char*> >();
// Build the IdentifierInfo itself.
Mem->second = Str;
assert(Str[0] != '\0');
IdentifierInfo *II = new ((void*) Mem) IdentifierInfo();
return *II;
}
Selector PCHReader::DecodeSelector(unsigned ID) {
if (ID == 0)
return Selector();