[cfe-commits] r70071 - in /cfe/trunk: include/clang/Basic/IdentifierTable.h include/clang/Frontend/PCHReader.h lib/Frontend/PCHReader.cpp lib/Frontend/PCHWriter.cpp
Douglas Gregor
dgregor at apple.com
Sat Apr 25 13:26:24 PDT 2009
Author: dgregor
Date: Sat Apr 25 15:26:24 2009
New Revision: 70071
URL: http://llvm.org/viewvc/llvm-project?rev=70071&view=rev
Log:
Revert my changes that try to avoid creating StringMap entries for
identifiers. They don't yet work, but will inhibit future
optimizations.
Modified:
cfe/trunk/include/clang/Basic/IdentifierTable.h
cfe/trunk/include/clang/Frontend/PCHReader.h
cfe/trunk/lib/Frontend/PCHReader.cpp
cfe/trunk/lib/Frontend/PCHWriter.cpp
Modified: cfe/trunk/include/clang/Basic/IdentifierTable.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/IdentifierTable.h?rev=70071&r1=70070&r2=70071&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/IdentifierTable.h (original)
+++ cfe/trunk/include/clang/Basic/IdentifierTable.h Sat Apr 25 15:26:24 2009
@@ -293,6 +293,34 @@
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));
}
Modified: cfe/trunk/include/clang/Frontend/PCHReader.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/PCHReader.h?rev=70071&r1=70070&r2=70071&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/PCHReader.h (original)
+++ cfe/trunk/include/clang/Frontend/PCHReader.h Sat Apr 25 15:26:24 2009
@@ -27,7 +27,6 @@
#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>
@@ -86,9 +85,6 @@
/// \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;
@@ -374,13 +370,6 @@
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);
Modified: cfe/trunk/lib/Frontend/PCHReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHReader.cpp?rev=70071&r1=70070&r2=70071&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/PCHReader.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHReader.cpp Sat Apr 25 15:26:24 2009
@@ -1245,8 +1245,8 @@
static std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char*& d) {
using namespace clang::io;
- unsigned DataLen = ReadUnalignedLE16(d);
unsigned KeyLen = ReadUnalignedLE16(d);
+ unsigned DataLen = ReadUnalignedLE16(d);
return std::make_pair(KeyLen, DataLen);
}
@@ -1282,7 +1282,8 @@
// the new IdentifierInfo.
IdentifierInfo *II = KnownII;
if (!II)
- II = &Reader.BuildIdentifierInfoInsidePCH((const unsigned char *)k.first);
+ II = &Reader.getIdentifierTable().CreateIdentifierInfo(
+ k.first, k.first + k.second);
Reader.SetIdentifierInfo(ID, II);
// Set or check the various bits in the IdentifierInfo structure.
@@ -2848,19 +2849,6 @@
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();
Modified: cfe/trunk/lib/Frontend/PCHWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHWriter.cpp?rev=70071&r1=70070&r2=70071&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/PCHWriter.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHWriter.cpp Sat Apr 25 15:26:24 2009
@@ -2013,6 +2013,7 @@
EmitKeyDataLength(llvm::raw_ostream& Out, const IdentifierInfo* II,
pch::IdentID ID) {
unsigned KeyLen = strlen(II->getName()) + 1;
+ clang::io::Emit16(Out, KeyLen);
unsigned DataLen = 4 + 4; // 4 bytes for token ID, builtin, flags
// 4 bytes for the persistent ID
if (II->hasMacroDefinition() &&
@@ -2022,14 +2023,7 @@
DEnd = IdentifierResolver::end();
D != DEnd; ++D)
DataLen += sizeof(pch::DeclID);
-
- // We emit the data length before the key length, because we want
- // the key length to immediately precede the actual string
- // data. This is so that our identifier length + key layout
- // matches that of the identifier hash table for pretokenized
- // headers.
clang::io::Emit16(Out, DataLen);
- clang::io::Emit16(Out, KeyLen);
return std::make_pair(KeyLen, DataLen);
}
More information about the cfe-commits
mailing list