Implemented prototype serialization of pointers, including support
[oota-llvm.git] / include / llvm / Bitcode / Serialize.h
index 061ccaf7c302179330ec5b94231b8e5cc64096f6..dc1fe646f227df00e6bbab4f05223aa691b2604f 100644 (file)
@@ -18,6 +18,7 @@
 #include "llvm/Bitcode/Serialization.h"
 #include "llvm/Bitcode/BitstreamWriter.h"
 #include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/DenseMap.h"
 
 namespace llvm {
 
@@ -25,6 +26,10 @@ class Serializer {
   BitstreamWriter& Stream;
   SmallVector<uint64_t,10> Record;
   bool inBlock;
+  
+  typedef DenseMap<void*,unsigned> MapTy;
+  MapTy PtrMap;
+  
 public:
   Serializer(BitstreamWriter& stream, unsigned BlockID = 0);
   ~Serializer();
@@ -35,13 +40,22 @@ public:
   void EmitInt(unsigned X);
   void EmitBool(bool X) { EmitInt(X); }
   void EmitCStr(const char* beg, const char* end);
-  void EmitCStr(const char* cstr);    
+  void EmitCStr(const char* cstr);
+  
+  void EmitPtr(void* ptr) { EmitInt(getPtrId(ptr)); }
+  
+  template <typename T>
+  void EmitOwnedPtr(T* ptr) {
+    EmitPtr(ptr);
+    SerializeTrait<T>::Emit(*this,*ptr);    
+  }
 
   void Flush() { if (inRecord()) EmitRecord(); }
   
 private:
   void EmitRecord();
-  inline bool inRecord() { return Record.size() > 0; }  
+  inline bool inRecord() { return Record.size() > 0; }
+  unsigned getPtrId(void* ptr);
 };
 
 } // end namespace llvm