Implemented serialization for IdentifierInfo and IdentifierTable.
Updated serialization test code in the driver to test serialization of
these types.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43266 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Basic/IdentifierTable.cpp b/Basic/IdentifierTable.cpp
index 7c26816..760dcf4 100644
--- a/Basic/IdentifierTable.cpp
+++ b/Basic/IdentifierTable.cpp
@@ -16,6 +16,8 @@
#include "clang/Basic/LangOptions.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/Bitcode/Serialization.h"
+
using namespace clang;
//===----------------------------------------------------------------------===//
@@ -48,6 +50,9 @@
AddKeywords(LangOpts);
}
+// This cstor is intended to be used only for serialization.
+IdentifierTable::IdentifierTable() : HashTable(8192) {}
+
//===----------------------------------------------------------------------===//
// Language Keyword Implementation
//===----------------------------------------------------------------------===//
@@ -93,7 +98,7 @@
IdentifierTable &Table) {
IdentifierInfo &Info = Table.get(Keyword, Keyword + KWLen);
Info.setTokenID(TokenCode);
- Info.setIsCPlusplusOperatorKeyword();
+ Info.setIsCPlusPlusOperatorKeyword();
}
/// AddObjCKeyword - Register an Objective-C @keyword like "class" "selector" or
@@ -372,4 +377,63 @@
delete static_cast<llvm::FoldingSet<MultiKeywordSelector> *>(Impl);
}
+//===----------------------------------------------------------------------===//
+// Serialization for IdentifierInfo and IdentifierTable.
+//===----------------------------------------------------------------------===//
+
+void llvm::SerializeTrait<IdentifierInfo>::Serialize(llvm::Serializer& S,
+ const IdentifierInfo& I) {
+
+ S.Emit<tok::TokenKind>(I.getTokenID());
+ S.EmitInt(I.getBuiltinID(),9);
+ S.Emit<tok::ObjCKeywordKind>(I.getObjCKeywordID());
+ S.Emit(I.hasMacroDefinition());
+ S.Emit(I.isExtensionToken());
+ S.Emit(I.isPoisoned());
+ S.Emit(I.isOtherTargetMacro());
+ S.Emit(I.isCPlusPlusOperatorKeyword());
+ S.Emit(I.isNonPortableBuiltin());
+}
+
+void llvm::SerializeTrait<IdentifierInfo>::Deserialize(llvm::Deserializer& D,
+ IdentifierInfo& I) {
+ tok::TokenKind X;
+ I.setTokenID(D.Read<tok::TokenKind>(X));
+
+ I.setBuiltinID(D.ReadInt(9));
+
+ tok::ObjCKeywordKind Y;
+ I.setObjCKeywordID(D.Read<tok::ObjCKeywordKind>(Y));
+
+ I.setHasMacroDefinition(D.ReadBool());
+ I.setIsExtensionToken(D.ReadBool());
+ I.setIsPoisoned(D.ReadBool());
+ I.setIsOtherTargetMacro(D.ReadBool());
+ I.setIsCPlusPlusOperatorKeyword(D.ReadBool());
+ I.setNonPortableBuiltin(D.ReadBool());
+}
+
+void llvm::SerializeTrait<IdentifierTable>::Serialize(llvm::Serializer& S,
+ const IdentifierTable& T){
+ S.Emit<unsigned>(T.size());
+
+ for (clang::IdentifierTable::iterator I=T.begin(), E=T.end(); I != E; ++I) {
+ S.EmitCString(I->getKeyData());
+ S.Emit(I->getValue());
+ }
+}
+
+void llvm::SerializeTrait<IdentifierTable>::Deserialize(llvm::Deserializer& D,
+ IdentifierTable& T) {
+ unsigned len = D.ReadInt();
+ std::vector<char> buff;
+ buff.reserve(200);
+
+ for (unsigned i = 0; i < len; ++i) {
+ D.ReadCString(buff);
+ IdentifierInfo& Info = T.get(&buff[0],&buff[0]+buff.size());
+ D.Read(Info);
+ }
+}
+