[llvm-commits] CVS: llvm/lib/Bitcode/Reader/BitcodeReader.cpp

Chris Lattner sabre at nondot.org
Thu May 3 15:34:26 PDT 2007



Changes in directory llvm/lib/Bitcode/Reader:

BitcodeReader.cpp updated: 1.29 -> 1.30
---
Log message:

Encoding calling conv info in call/invoke instrs, tree add now round trips completely


---
Diffs of the changes:  (+21 -16)

 BitcodeReader.cpp |   37 +++++++++++++++++++++----------------
 1 files changed, 21 insertions(+), 16 deletions(-)


Index: llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.29 llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.30
--- llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.29	Thu May  3 17:21:59 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp	Thu May  3 17:34:03 2007
@@ -1236,14 +1236,15 @@
       break;
     }
       
-    case bitc::FUNC_CODE_INST_INVOKE: { // INVOKE: [fnty, op0,op1,op2, ...]
-      if (Record.size() < 4)
+    case bitc::FUNC_CODE_INST_INVOKE: { // INVOKE: [cc,fnty, op0,op1,op2, ...]
+      if (Record.size() < 5)
         return Error("Invalid INVOKE record");
+      unsigned CCInfo = Record[0];
       const PointerType *CalleeTy =
-        dyn_cast_or_null<PointerType>(getTypeByID(Record[0]));
-      Value *Callee = getFnValueByID(Record[1], CalleeTy);
-      BasicBlock *NormalBB = getBasicBlock(Record[2]);
-      BasicBlock *UnwindBB = getBasicBlock(Record[3]);
+        dyn_cast_or_null<PointerType>(getTypeByID(Record[1]));
+      Value *Callee = getFnValueByID(Record[2], CalleeTy);
+      BasicBlock *NormalBB = getBasicBlock(Record[3]);
+      BasicBlock *UnwindBB = getBasicBlock(Record[4]);
       if (CalleeTy == 0 || Callee == 0 || NormalBB == 0 || UnwindBB == 0)
         return Error("Invalid INVOKE record");
       
@@ -1251,17 +1252,17 @@
         dyn_cast<FunctionType>(CalleeTy->getElementType());
 
       // Check that the right number of fixed parameters are here.
-      if (FTy == 0 || Record.size() < 4+FTy->getNumParams())
+      if (FTy == 0 || Record.size() < 5+FTy->getNumParams())
         return Error("Invalid INVOKE record");
 
       SmallVector<Value*, 16> Ops;
       for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
-        Ops.push_back(getFnValueByID(Record[4+i], FTy->getParamType(4+i)));
+        Ops.push_back(getFnValueByID(Record[5+i], FTy->getParamType(i)));
         if (Ops.back() == 0)
           return Error("Invalid INVOKE record");
       }
       
-      unsigned FirstVarargParam = 4+FTy->getNumParams();
+      unsigned FirstVarargParam = 5+FTy->getNumParams();
       if (FTy->isVarArg()) {
         // Read type/value pairs for varargs params.
         if ((Record.size()-FirstVarargParam) & 1)
@@ -1279,6 +1280,7 @@
       }
       
       I = new InvokeInst(Callee, NormalBB, UnwindBB, &Ops[0], Ops.size());
+      cast<InvokeInst>(I)->setCallingConv(CCInfo);
       break;
     }
     case bitc::FUNC_CODE_INST_UNWIND: // UNWIND
@@ -1360,27 +1362,28 @@
       I = new StoreInst(Op, Ptr, (1 << Record[3]) >> 1, Record[4]);
       break;
     }
-    case bitc::FUNC_CODE_INST_CALL: { // CALL: [fnty, fnid, arg0, arg1...]
-      if (Record.size() < 2)
+    case bitc::FUNC_CODE_INST_CALL: { // CALL: [cc, fnty, fnid, arg0, arg1...]
+      if (Record.size() < 3)
         return Error("Invalid CALL record");
+      unsigned CCInfo = Record[0];
       const PointerType *OpTy = 
-        dyn_cast_or_null<PointerType>(getTypeByID(Record[0]));
+        dyn_cast_or_null<PointerType>(getTypeByID(Record[1]));
       const FunctionType *FTy = 0;
       if (OpTy) FTy = dyn_cast<FunctionType>(OpTy->getElementType());
-      Value *Callee = getFnValueByID(Record[1], OpTy);
-      if (!FTy || !Callee || Record.size() < FTy->getNumParams()+2)
+      Value *Callee = getFnValueByID(Record[2], OpTy);
+      if (!FTy || !Callee || Record.size() < FTy->getNumParams()+3)
         return Error("Invalid CALL record");
       
       SmallVector<Value*, 16> Args;
       // Read the fixed params.
       for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
-        Args.push_back(getFnValueByID(Record[i+2], FTy->getParamType(i)));
+        Args.push_back(getFnValueByID(Record[i+3], FTy->getParamType(i)));
         if (Args.back() == 0) return Error("Invalid CALL record");
       }
       
       
       // Read type/value pairs for varargs params.
-      unsigned NextArg = FTy->getNumParams()+2;
+      unsigned NextArg = FTy->getNumParams()+3;
       if (!FTy->isVarArg()) {
         if (NextArg != Record.size())
           return Error("Invalid CALL record");
@@ -1395,6 +1398,8 @@
       }
       
       I = new CallInst(Callee, &Args[0], Args.size());
+      cast<CallInst>(I)->setCallingConv(CCInfo>>1);
+      cast<CallInst>(I)->setTailCall(CCInfo & 1);
       break;
     }
     case bitc::FUNC_CODE_INST_VAARG: { // VAARG: [valistty, valist, instty]






More information about the llvm-commits mailing list