diff options
| -rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 29 | ||||
| -rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 23 | ||||
| -rw-r--r-- | llvm/test/Assembler/2008-02-20-MultipleReturnValue.ll | 2 | 
3 files changed, 35 insertions, 19 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index ebfca09c491..487a135509c 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1337,17 +1337,24 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {      }      case bitc::FUNC_CODE_INST_RET: // RET: [opty,opval<optional>] -      if (Record.empty()) { -        I = new ReturnInst(); -        break; -      } else { -        unsigned OpNum = 0; -        Value *Op; -        if (getValueTypePair(Record, OpNum, NextValueNo, Op) || -            OpNum != Record.size()) -          return Error("Invalid RET record"); -        I = new ReturnInst(Op); -        break; +      { +        unsigned Size = Record.size(); +        if (Size == 0) { +          I = new ReturnInst(); +          break; +        } else { +          unsigned OpNum = 0; +          std::vector<Value *> Vs; +          do { +            Value *Op = NULL; +            if (getValueTypePair(Record, OpNum, NextValueNo, Op)) +              return Error("Invalid RET record"); +            Vs.push_back(Op); +          } while(OpNum != Record.size()); + +          I = new ReturnInst(Vs); +          break; +        }        }      case bitc::FUNC_CODE_INST_BR: { // BR: [bb#, bb#, opval] or [bb#]        if (Record.size() != 1 && Record.size() != 3) diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 9b2b93cfcea..6a54514db6d 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -747,15 +747,24 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,    case Instruction::GetResult:      Code = bitc::FUNC_CODE_INST_GETRESULT;      PushValueAndType(I.getOperand(0), InstID, Vals, VE); -    Vals.push_back(Log2_32(cast<GetResultInst>(I).getIndex())+1); +    Vals.push_back(cast<GetResultInst>(I).getIndex());      break; -  case Instruction::Ret: -    Code = bitc::FUNC_CODE_INST_RET; -    if (!I.getNumOperands()) -      AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV; -    else if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) -      AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV; +  case Instruction::Ret:  +    { +      Code = bitc::FUNC_CODE_INST_RET; +      unsigned NumOperands = I.getNumOperands(); +      //      printf ("dpatel write %d\n", NumOperands); +      if (NumOperands == 0) +        AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV; +      else if (NumOperands == 1) { +        if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) +          AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV; +      } else { +        for (unsigned i = 0, e = NumOperands; i != e; ++i) +          PushValueAndType(I.getOperand(i), InstID, Vals, VE); +      } +    }      break;    case Instruction::Br:      Code = bitc::FUNC_CODE_INST_BR; diff --git a/llvm/test/Assembler/2008-02-20-MultipleReturnValue.ll b/llvm/test/Assembler/2008-02-20-MultipleReturnValue.ll index f84ceef293b..5b2ed7e8f48 100644 --- a/llvm/test/Assembler/2008-02-20-MultipleReturnValue.ll +++ b/llvm/test/Assembler/2008-02-20-MultipleReturnValue.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s -disable-output +; RUN: llvm-as < %s | opt -verify | llvm-dis | llvm-as -disable-output  define {i32, i8} @foo(i32 %p) {    ret i32 1, i8 2  | 

