aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Basic/IdentifierTable.h28
-rw-r--r--include/clang/Frontend/PCHReader.h11
-rw-r--r--lib/Frontend/PCHReader.cpp16
3 files changed, 25 insertions, 30 deletions
diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h
index 235c19081c..99580a17fe 100644
--- a/include/clang/Basic/IdentifierTable.h
+++ b/include/clang/Basic/IdentifierTable.h
@@ -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));
}
diff --git a/include/clang/Frontend/PCHReader.h b/include/clang/Frontend/PCHReader.h
index 0c8520ceb4..c6f7ad9301 100644
--- a/include/clang/Frontend/PCHReader.h
+++ b/include/clang/Frontend/PCHReader.h
@@ -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);
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index 2d894774a1..918fd93fdd 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -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();