[llvm-commits] CVS: llvm/lib/Bitcode/Writer/BitcodeWriter.cpp

Chris Lattner sabre at nondot.org
Mon Apr 30 19:13:43 PDT 2007



Changes in directory llvm/lib/Bitcode/Writer:

BitcodeWriter.cpp updated: 1.16 -> 1.17
---
Log message:

encode all of the instructions.


---
Diffs of the changes:  (+166 -3)

 BitcodeWriter.cpp |  169 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 166 insertions(+), 3 deletions(-)


Index: llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
diff -u llvm/lib/Bitcode/Writer/BitcodeWriter.cpp:1.16 llvm/lib/Bitcode/Writer/BitcodeWriter.cpp:1.17
--- llvm/lib/Bitcode/Writer/BitcodeWriter.cpp:1.16	Sun Apr 29 15:56:48 2007
+++ llvm/lib/Bitcode/Writer/BitcodeWriter.cpp	Mon Apr 30 21:13:26 2007
@@ -485,13 +485,12 @@
 static void WriteInstruction(const Instruction &I, ValueEnumerator &VE, 
                              BitstreamWriter &Stream,
                              SmallVector<unsigned, 64> &Vals) {
-  return; // FIXME: REMOVE
   unsigned Code = 0;
   unsigned AbbrevToUse = 0;
   switch (I.getOpcode()) {
   default:
     if (Instruction::isCast(I.getOpcode())) {
-      Code = bitc::FUNC_CODE_INST_BINOP;
+      Code = bitc::FUNC_CODE_INST_CAST;
       Vals.push_back(GetEncodedCastOpcode(I.getOpcode()));
       Vals.push_back(VE.getTypeID(I.getType()));
       Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
@@ -505,15 +504,179 @@
       Vals.push_back(VE.getValueID(I.getOperand(1)));
     }
     break;
+
+  case Instruction::GetElementPtr:
+    Code = bitc::FUNC_CODE_INST_GEP;
+    Vals.push_back(I.getNumOperands());
+    for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) {
+      Vals.push_back(VE.getTypeID(I.getOperand(i)->getType()));
+      Vals.push_back(VE.getValueID(I.getOperand(i)));
+    }
+    break;
+  case Instruction::Select:
+    Code = bitc::FUNC_CODE_INST_SELECT;
+    Vals.push_back(VE.getTypeID(I.getType()));
+    Vals.push_back(VE.getValueID(I.getOperand(0)));
+    Vals.push_back(VE.getValueID(I.getOperand(1)));
+    Vals.push_back(VE.getValueID(I.getOperand(2)));
+    break;
+  case Instruction::ExtractElement:
+    Code = bitc::FUNC_CODE_INST_EXTRACTELT;
+    Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
+    Vals.push_back(VE.getValueID(I.getOperand(0)));
+    Vals.push_back(VE.getValueID(I.getOperand(1)));
+    break;
+  case Instruction::InsertElement:
+    Code = bitc::FUNC_CODE_INST_INSERTELT;
+    Vals.push_back(VE.getTypeID(I.getType()));
+    Vals.push_back(VE.getValueID(I.getOperand(0)));
+    Vals.push_back(VE.getValueID(I.getOperand(1)));
+    Vals.push_back(VE.getValueID(I.getOperand(2)));
+    break;
+  case Instruction::ShuffleVector:
+    Code = bitc::FUNC_CODE_INST_SHUFFLEVEC;
+    Vals.push_back(VE.getTypeID(I.getType()));
+    Vals.push_back(VE.getValueID(I.getOperand(0)));
+    Vals.push_back(VE.getValueID(I.getOperand(1)));
+    Vals.push_back(VE.getValueID(I.getOperand(2)));
+    break;
+  case Instruction::ICmp:
+  case Instruction::FCmp:
+    Code = bitc::FUNC_CODE_INST_CMP;
+    Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
+    Vals.push_back(VE.getValueID(I.getOperand(0)));
+    Vals.push_back(VE.getValueID(I.getOperand(1)));
+    Vals.push_back(cast<CmpInst>(I).getPredicate());
+    break;
+
+  case Instruction::Ret:
+    Code = bitc::FUNC_CODE_INST_RET;
+    if (I.getNumOperands()) {
+      Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
+      Vals.push_back(VE.getValueID(I.getOperand(0)));
+    }
+    break;
+  case Instruction::Br:
+    Code = bitc::FUNC_CODE_INST_BR;
+    Vals.push_back(VE.getValueID(I.getOperand(0)));
+    if (cast<BranchInst>(I).isConditional()) {
+      Vals.push_back(VE.getValueID(I.getOperand(1)));
+      Vals.push_back(VE.getValueID(I.getOperand(2)));
+    }
+    break;
+  case Instruction::Switch:
+    Code = bitc::FUNC_CODE_INST_SWITCH;
+    Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
+    Vals.push_back(I.getNumOperands());
+    for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i)
+      Vals.push_back(VE.getValueID(I.getOperand(i)));
+    break;
+  case Instruction::Invoke:
+    Code = bitc::FUNC_CODE_INST_INVOKE;
+    // FIXME: param attrs
+    Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
+    Vals.push_back(VE.getValueID(I.getOperand(0)));  // callee
+    Vals.push_back(VE.getValueID(I.getOperand(1)));  // normal
+    Vals.push_back(VE.getValueID(I.getOperand(2)));  // unwind
     
-    
+    // Emit value #'s for the fixed parameters.
+    const PointerType *PTy = cast<PointerType>(I.getOperand(0)->getType());
+    const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
+    for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
+      Vals.push_back(VE.getValueID(I.getOperand(i+3)));  // fixed param.
+
+    // Emit type/value pairs for varargs params.
+    if (FTy->isVarArg()) {
+      unsigned NumVarargs = I.getNumOperands()-3-FTy->getNumParams();
+      Vals.push_back(NumVarargs);
+      for (unsigned i = I.getNumOperands()-NumVarargs, e = I.getNumOperands();
+           i != e; ++i) {
+        Vals.push_back(VE.getTypeID(I.getOperand(i)->getType()));
+        Vals.push_back(VE.getValueID(I.getOperand(i)));
+      }
+    }
+    break;
   case Instruction::Unwind:
     Code = bitc::FUNC_CODE_INST_UNWIND;
     break;
   case Instruction::Unreachable:
     Code = bitc::FUNC_CODE_INST_UNREACHABLE;
     break;
+  
+  case Instruction::PHI:
+    Code = bitc::FUNC_CODE_INST_PHI;
+    Vals.push_back(VE.getTypeID(I.getType()));
+    Vals.push_back(I.getNumOperands());
+    for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i)
+      Vals.push_back(VE.getValueID(I.getOperand(i)));
+    break;
+    
+  case Instruction::Malloc:
+    Code = bitc::FUNC_CODE_INST_MALLOC;
+    Vals.push_back(VE.getTypeID(I.getType()));
+    Vals.push_back(VE.getValueID(I.getOperand(0))); // size.
+    Vals.push_back(Log2_32(cast<MallocInst>(I).getAlignment())+1);
+    break;
+    
+  case Instruction::Free:
+    Code = bitc::FUNC_CODE_INST_FREE;
+    Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
+    Vals.push_back(VE.getValueID(I.getOperand(0)));
+    break;
     
+  case Instruction::Alloca:
+    Code = bitc::FUNC_CODE_INST_ALLOCA;
+    Vals.push_back(VE.getTypeID(I.getType()));
+    Vals.push_back(VE.getValueID(I.getOperand(0))); // size.
+    Vals.push_back(Log2_32(cast<AllocaInst>(I).getAlignment())+1);
+    break;
+    
+  case Instruction::Load:
+    Code = bitc::FUNC_CODE_INST_LOAD;
+    Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
+    Vals.push_back(VE.getValueID(I.getOperand(0))); // ptr.
+    Vals.push_back(Log2_32(cast<LoadInst>(I).getAlignment())+1);
+    Vals.push_back(cast<LoadInst>(I).isVolatile());
+    break;
+  case Instruction::Store:
+    Code = bitc::FUNC_CODE_INST_STORE;
+    Vals.push_back(VE.getTypeID(I.getOperand(1)->getType()));   // Pointer
+    Vals.push_back(VE.getValueID(I.getOperand(0))); // val.
+    Vals.push_back(VE.getValueID(I.getOperand(1))); // ptr.
+    Vals.push_back(Log2_32(cast<StoreInst>(I).getAlignment())+1);
+    Vals.push_back(cast<StoreInst>(I).isVolatile());
+    break;
+  case Instruction::Call: {
+    Code = bitc::FUNC_CODE_INST_CALL;
+    // FIXME: param attrs
+    Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
+    Vals.push_back(VE.getValueID(I.getOperand(0)));  // callee
+    
+    // Emit value #'s for the fixed parameters.
+    const PointerType *PTy = cast<PointerType>(I.getOperand(0)->getType());
+    const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
+    for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
+      Vals.push_back(VE.getValueID(I.getOperand(i+1)));  // fixed param.
+      
+      // Emit type/value pairs for varargs params.
+      if (FTy->isVarArg()) {
+        unsigned NumVarargs = I.getNumOperands()-1-FTy->getNumParams();
+        Vals.push_back(NumVarargs);
+        for (unsigned i = I.getNumOperands()-NumVarargs, e = I.getNumOperands();
+             i != e; ++i) {
+          Vals.push_back(VE.getTypeID(I.getOperand(i)->getType()));
+          Vals.push_back(VE.getValueID(I.getOperand(i)));
+        }
+      }
+    }
+    break;
+    
+  case Instruction::VAArg:
+    Code = bitc::FUNC_CODE_INST_VAARG;
+    Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));   // valistty
+    Vals.push_back(VE.getValueID(I.getOperand(0))); // valist.
+    Vals.push_back(VE.getTypeID(I.getType())); // restype.
+    break;
   }
   
   Stream.EmitRecord(Code, Vals, AbbrevToUse);






More information about the llvm-commits mailing list