aboutsummaryrefslogtreecommitdiff
path: root/include/clang/Basic
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2007-10-23 22:18:37 +0000
committerTed Kremenek <kremenek@apple.com>2007-10-23 22:18:37 +0000
commitc637e6b7afeebc6b4f751e4373715b6a8ea77272 (patch)
treeaf7d80893b0a99bd38fad34dc0a5019436b557f5 /include/clang/Basic
parentb9b00ad6260b17c18195ff4a54c8b3abbf33fcc9 (diff)
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
Diffstat (limited to 'include/clang/Basic')
-rw-r--r--include/clang/Basic/IdentifierTable.h50
-rw-r--r--include/clang/Basic/TokenKinds.h29
2 files changed, 63 insertions, 16 deletions
diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h
index e94d50519f..3e21344802 100644
--- a/include/clang/Basic/IdentifierTable.h
+++ b/include/clang/Basic/IdentifierTable.h
@@ -23,8 +23,10 @@
namespace llvm {
- template <typename T> struct IntrospectionTrait;
template <typename T> struct DenseMapInfo;
+ template <typename T> struct SerializeTrait;
+ class Serializer;
+ class Deserializer;
}
namespace clang {
@@ -129,7 +131,7 @@ public:
/// isCPlusPlusOperatorKeyword/setIsCPlusPlusOperatorKeyword controls whether
/// this identifier is a C++ alternate representation of an operator.
- void setIsCPlusplusOperatorKeyword(bool Val = true)
+ void setIsCPlusPlusOperatorKeyword(bool Val = true)
{ IsCPPOperatorKeyword = Val; }
bool isCPlusPlusOperatorKeyword() const { return IsCPPOperatorKeyword; }
@@ -138,13 +140,6 @@ public:
template<typename T>
T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }
void setFETokenInfo(void *T) { FETokenInfo = T; }
-
- // For serialization and profiling.
-#if defined(_MSC_VER) && _MSC_VER <= 1400 // workaround for VC++ upto V8.0
- template<typename T> friend class /*llvm::*/IntrospectionTrait;
-#else
- template<typename T> friend class llvm::IntrospectionTrait;
-#endif
};
/// IdentifierTable - This table implements an efficient mapping from strings to
@@ -182,18 +177,20 @@ public:
iterator begin() const { return HashTable.begin(); }
iterator end() const { return HashTable.end(); }
+ unsigned size() const { return HashTable.size(); }
+
/// PrintStats - Print some statistics to stderr that indicate how well the
/// hashing is doing.
void PrintStats() const;
- // For serialization and profiling.
-#if defined(_MSC_VER) && _MSC_VER <= 1400 // workaround for VC++ upto V8.0
- template<typename T> friend class /*llvm::*/IntrospectionTrait;
-#else
- template<typename T> friend class llvm::IntrospectionTrait;
-#endif
-private:
void AddKeywords(const LangOptions &LangOpts);
+
+private:
+ /// This ctor is not intended to be used by anyone except for object
+ /// serialization.
+ IdentifierTable();
+
+ friend class llvm::SerializeTrait<IdentifierTable>;
};
/// Selector - This smart pointer class efficiently represents Objective-C
@@ -311,6 +308,27 @@ struct DenseMapInfo<clang::Selector> {
static bool isPod() { return true; }
};
+/// Define SerializeTrait to enable serialization for IdentifierInfos.
+template <>
+struct SerializeTrait<clang::IdentifierInfo> {
+ static void Serialize(llvm::Serializer& S, const clang::IdentifierInfo& I);
+ static void Deserialize(llvm::Deserializer& S, clang::IdentifierInfo& I);
+};
+
+/// Define SerializeTrait to enable serialization for IdentifierTables.
+template <>
+struct SerializeTrait<clang::IdentifierTable> {
+ static void Serialize(llvm::Serializer& S, const clang::IdentifierTable& X);
+ static void Deserialize(llvm::Deserializer& S, clang::IdentifierTable& X);
+
+private:
+ static inline clang::IdentifierTable* Instantiate() {
+ return new clang::IdentifierTable();
+ }
+
+ friend class Deserializer;
+};
+
} // end namespace llvm
#endif
diff --git a/include/clang/Basic/TokenKinds.h b/include/clang/Basic/TokenKinds.h
index e51f0c7f8a..2e213bddf1 100644
--- a/include/clang/Basic/TokenKinds.h
+++ b/include/clang/Basic/TokenKinds.h
@@ -48,4 +48,33 @@ const char *getTokenName(enum TokenKind Kind);
} // end namespace tok
} // end namespace clang
+//===----------------------------------------------------------------------===//
+// Serialization traits.
+//===----------------------------------------------------------------------===//
+
+namespace llvm {
+ template <typename T> struct SerializeTrait;
+ class Serializer;
+ class Deserializer;
+
+template<>
+struct SerializeTrait<clang::tok::TokenKind> {
+ static void Serialize(llvm::Serializer& S, clang::tok::TokenKind X);
+ static void Deserialize(llvm::Deserializer& D, clang::tok::TokenKind& X);
+};
+
+template<>
+struct SerializeTrait<clang::tok::PPKeywordKind> {
+ static void Serialize(llvm::Serializer& S, clang::tok::PPKeywordKind X);
+ static void Deserialize(llvm::Deserializer& D, clang::tok::PPKeywordKind& X);
+};
+
+template<>
+struct SerializeTrait<clang::tok::ObjCKeywordKind> {
+ static void Serialize(llvm::Serializer& S, clang::tok::ObjCKeywordKind X);
+ static void Deserialize(llvm::Deserializer& D, clang::tok::ObjCKeywordKind& X);
+};
+
+} // end namespace llvm
+
#endif