diff options
author | Dan Gohman <gohman@apple.com> | 2008-07-23 00:34:11 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2008-07-23 00:34:11 +0000 |
commit | 29474e9327b30f3f79a5ce3d4264cc23e1e6dcdb (patch) | |
tree | 36ed972103bbbb170370e4e6688787ed5f1f9ac8 /lib/AsmParser/llvmAsmParser.y | |
parent | 3cae033b4107c5bc1097e17ed9f8338a076502b3 (diff) | |
download | external_llvm-29474e9327b30f3f79a5ce3d4264cc23e1e6dcdb.zip external_llvm-29474e9327b30f3f79a5ce3d4264cc23e1e6dcdb.tar.gz external_llvm-29474e9327b30f3f79a5ce3d4264cc23e1e6dcdb.tar.bz2 |
Enable first-class aggregates support.
Remove the GetResultInst instruction. It is still accepted in LLVM assembly
and bitcode, where it is now auto-upgraded to ExtractValueInst. Also, remove
support for return instructions with multiple values. These are auto-upgraded
to use InsertValueInst instructions.
The IRBuilder still accepts multiple-value returns, and auto-upgrades them
to InsertValueInst instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53941 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AsmParser/llvmAsmParser.y')
-rw-r--r-- | lib/AsmParser/llvmAsmParser.y | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index 6f483fa..b9d5616 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -2704,7 +2704,20 @@ BBTerminatorInst : RET ReturnedVal { // Return with a result... ValueList &VL = *$2; assert(!VL.empty() && "Invalid ret operands!"); - $$ = ReturnInst::Create(&VL[0], VL.size()); + const Type *ReturnType = CurFun.CurrentFunction->getReturnType(); + if (VL.size() > 1 || + (isa<StructType>(ReturnType) && + (VL.empty() || VL[0]->getType() != ReturnType))) { + Value *RV = UndefValue::get(ReturnType); + for (unsigned i = 0, e = VL.size(); i != e; ++i) { + Instruction *I = InsertValueInst::Create(RV, VL[i], i, "mrv"); + ($<BasicBlockVal>-1)->getInstList().push_back(I); + RV = I; + } + $$ = ReturnInst::Create(RV); + } else { + $$ = ReturnInst::Create(VL[0]); + } delete $2; CHECK_FOR_ERROR } @@ -3309,12 +3322,18 @@ MemoryInst : MALLOC Types OptCAlign { delete $5; } | GETRESULT Types ValueRef ',' EUINT64VAL { - Value *TmpVal = getVal($2->get(), $3); - if (!GetResultInst::isValidOperands(TmpVal, $5)) - GEN_ERROR("Invalid getresult operands"); - $$ = new GetResultInst(TmpVal, $5); - delete $2; + if (!UpRefs.empty()) + GEN_ERROR("Invalid upreference in type: " + (*$2)->getDescription()); + if (!isa<StructType>($2->get()) && !isa<ArrayType>($2->get())) + GEN_ERROR("getresult insn requires an aggregate operand"); + if (!ExtractValueInst::getIndexedType(*$2, $5)) + GEN_ERROR("Invalid getresult index for type '" + + (*$2)->getDescription()+ "'"); + + Value *tmpVal = getVal(*$2, $3); CHECK_FOR_ERROR + $$ = ExtractValueInst::Create(tmpVal, $5); + delete $2; } | GETELEMENTPTR Types ValueRef IndexList { if (!UpRefs.empty()) |