forked from OSchip/llvm-project
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:
parent
80ad2e6b42
commit
518bd14f2d
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue