* Use new style casts more
* Add real support for global variable addresses initializing constants
* Fix encoding/decoding of VarArgs calls
* Support the Invoke instruction


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@761 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Bytecode/Writer/ConstantWriter.cpp b/lib/Bytecode/Writer/ConstantWriter.cpp
index d0c58f1..8a252dd 100644
--- a/lib/Bytecode/Writer/ConstantWriter.cpp
+++ b/lib/Bytecode/Writer/ConstantWriter.cpp
@@ -101,14 +101,14 @@
   case Type::UShortTyID:
   case Type::UIntTyID:
   case Type::ULongTyID:
-    output_vbr(((const ConstPoolUInt*)CPV)->getValue(), Out);
+    output_vbr(cast<const ConstPoolUInt>(CPV)->getValue(), Out);
     break;
 
   case Type::SByteTyID:   // Signed integer types...
   case Type::ShortTyID:
   case Type::IntTyID:
   case Type::LongTyID:
-    output_vbr(((const ConstPoolSInt*)CPV)->getValue(), Out);
+    output_vbr(cast<const ConstPoolSInt>(CPV)->getValue(), Out);
     break;
 
   case Type::TypeTyID:     // Serialize type type
@@ -116,7 +116,7 @@
     break;
 
   case Type::ArrayTyID: {
-    const ConstPoolArray *CPA = (const ConstPoolArray *)CPV;
+    const ConstPoolArray *CPA = cast<const ConstPoolArray>(CPV);
     unsigned size = CPA->getValues().size();
     if (!((const ArrayType *)CPA->getType())->isSized())
       output_vbr(size, Out);            // Not for sized arrays!!!
@@ -130,7 +130,7 @@
   }
 
   case Type::StructTyID: {
-    const ConstPoolStruct *CPS = (const ConstPoolStruct*)CPV;
+    const ConstPoolStruct *CPS = cast<const ConstPoolStruct>(CPV);
     const vector<Use> &Vals = CPS->getValues();
 
     for (unsigned i = 0; i < Vals.size(); ++i) {
@@ -142,17 +142,28 @@
   }
 
   case Type::PointerTyID: {
-    output_vbr((unsigned)0, Out);
+    const ConstPoolPointer *CPP = cast<const ConstPoolPointer>(CPV);
+    if (isa<ConstPoolPointerNull>(CPP)) {
+      output_vbr((unsigned)0, Out);
+    } else if (const ConstPoolPointerReference *CPR = 
+	                dyn_cast<ConstPoolPointerReference>(CPP)) {
+      output_vbr((unsigned)1, Out);
+      int Slot = Table.getValSlot((Value*)CPR->getValue());
+      assert(Slot != -1 && "Global used but not available!!");
+      output_vbr((unsigned)Slot, Out);
+    } else {
+      assert(0 && "Unknown ConstPoolPointer Subclass!");
+    }
     break;
   }
 
   case Type::FloatTyID: {   // Floating point types...
-    float Tmp = (float)((const ConstPoolFP*)CPV)->getValue();
+    float Tmp = (float)cast<ConstPoolFP>(CPV)->getValue();
     output_data(&Tmp, &Tmp+1, Out);
     break;
   }
   case Type::DoubleTyID: {
-    double Tmp = ((const ConstPoolFP*)CPV)->getValue();
+    double Tmp = cast<ConstPoolFP>(CPV)->getValue();
     output_data(&Tmp, &Tmp+1, Out);
     break;
   }