Implement writing of arbitrary precision integers.
authorReid Spencer <rspencer@reidspencer.com>
Wed, 28 Feb 2007 02:25:20 +0000 (02:25 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Wed, 28 Feb 2007 02:25:20 +0000 (02:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34717 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bytecode/Writer/Writer.cpp

index de15267d5cabe068042ed131529c4056ab2997d3..e0aa110d5ccd5c293484d053f9583e39d00892ac 100644 (file)
@@ -307,13 +307,23 @@ void BytecodeWriter::outputConstant(const Constant *CPV) {
 
   switch (CPV->getType()->getTypeID()) {
   case Type::IntegerTyID: { // Integer types...
+    const ConstantInt *CI = cast<ConstantInt>(CPV);
     unsigned NumBits = cast<IntegerType>(CPV->getType())->getBitWidth();
     if (NumBits <= 32)
-      output_vbr(uint32_t(cast<ConstantInt>(CPV)->getZExtValue()));
+      output_vbr(uint32_t(CI->getZExtValue()));
     else if (NumBits <= 64)
-      output_vbr(uint64_t(cast<ConstantInt>(CPV)->getZExtValue()));
-    else 
-      assert(0 && "Integer types > 64 bits not supported.");
+      output_vbr(uint64_t(CI->getZExtValue()));
+    else {
+      // We have an arbitrary precision integer value to write whose 
+      // bit width is > 64. However, in canonical unsigned integer 
+      // format it is likely that the high bits are going to be zero.
+      // So, we only write the number of active words. 
+      uint32_t activeWords = CI->getValue().getActiveWords();
+      const uint64_t *rawData = CI->getValue().getRawData();
+      output_vbr(activeWords);
+      for (uint32_t i = 0; i < activeWords; ++i)
+        output_vbr(rawData[i]);
+    }
     break;
   }