Encoding calling conv info in call/invoke instrs, tree add now round trips completely
authorChris Lattner <sabre@nondot.org>
Thu, 3 May 2007 22:34:03 +0000 (22:34 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 3 May 2007 22:34:03 +0000 (22:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36707 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bitcode/Reader/BitcodeReader.cpp
lib/Bitcode/Writer/BitcodeWriter.cpp

index 8396d442fc5fbf9cab1b0a5570c5acd880aa3609..7e4f69460899434a84863977450aa0c46ac448f9 100644 (file)
@@ -1236,14 +1236,15 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
       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 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
         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 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
       }
       
       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 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
       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 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
       }
       
       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]
index 270ded55cbce409648e576a215eaaafb7d7e0ce8..6dcc37296c11ab5479cc75aeef988406013b8652 100644 (file)
@@ -571,7 +571,7 @@ static void WriteInstruction(const Instruction &I, ValueEnumerator &VE,
     break;
   case Instruction::Invoke: {
     Code = bitc::FUNC_CODE_INST_INVOKE;
-    // FIXME: param attrs
+    Vals.push_back(cast<InvokeInst>(I).getCallingConv());
     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
@@ -647,7 +647,8 @@ static void WriteInstruction(const Instruction &I, ValueEnumerator &VE,
     break;
   case Instruction::Call: {
     Code = bitc::FUNC_CODE_INST_CALL;
-    // FIXME: param attrs
+    Vals.push_back((cast<CallInst>(I).getCallingConv() << 1) |
+                   cast<CallInst>(I).isTailCall());
     Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
     Vals.push_back(VE.getValueID(I.getOperand(0)));  // callee