diff options
author | Devang Patel <dpatel@apple.com> | 2008-02-20 22:39:45 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2008-02-20 22:39:45 +0000 |
commit | 5af2f634797080c649df5ff82bce3679a8518c14 (patch) | |
tree | 98d7710226f4e39ee9c7237e496172756656bf81 /lib/AsmParser/llvmAsmParser.y | |
parent | 93f9d57bcdf74a3d5d1959b6136ffd26bd1750e8 (diff) | |
download | external_llvm-5af2f634797080c649df5ff82bce3679a8518c14.zip external_llvm-5af2f634797080c649df5ff82bce3679a8518c14.tar.gz external_llvm-5af2f634797080c649df5ff82bce3679a8518c14.tar.bz2 |
Parse
ret i32 1, i8 2
another step towards multiple return value support.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47407 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AsmParser/llvmAsmParser.y')
-rw-r--r-- | lib/AsmParser/llvmAsmParser.y | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index b2667a3..b0cdbc7 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -1024,6 +1024,7 @@ Module *llvm::RunVMAsmParser(llvm::MemoryBuffer *MB) { // ValueRef - Unresolved reference to a definition or BB %type <ValIDVal> ValueRef ConstValueRef SymbolicValueRef %type <ValueVal> ResolvedVal // <type> <valref> pair +%type <ValueList> ReturnedVal // Tokens and types for handling constant integer values // // ESINT64VAL - A negative number within long long range @@ -1459,7 +1460,7 @@ ResultTypes : Types { if (!UpRefs.empty()) GEN_ERROR("Invalid upreference in type: " + (*$1)->getDescription()); - if (!(*$1)->isFirstClassType()) + if (!(*$1)->isFirstClassType() && (*$1)->getTypeID() != Type::StructTyID) GEN_ERROR("LLVM functions cannot return aggregate types"); $$ = $1; } @@ -2523,6 +2524,16 @@ ResolvedVal : Types ValueRef { } ; +ReturnedVal : ResolvedVal { + $$ = new std::vector<Value *>(); + $$->push_back($1); + CHECK_FOR_ERROR + } + | ReturnedVal ',' ConstVal { + ($$=$1)->push_back($3); + CHECK_FOR_ERROR + }; + BasicBlockList : BasicBlockList BasicBlock { $$ = $1; CHECK_FOR_ERROR @@ -2565,8 +2576,31 @@ InstructionList : InstructionList Inst { }; -BBTerminatorInst : RET ResolvedVal { // Return with a result... - $$ = new ReturnInst($2); +BBTerminatorInst : + RET ReturnedVal { // Return with a result... + if($2->size() == 1) + $$ = new ReturnInst($2->back()); + else { + + std::vector<const Type*> Elements; + std::vector<Constant*> Vals; + for (std::vector<Value *>::iterator I = $2->begin(), + E = $2->end(); I != E; ++I) { + Value *V = *I; + Constant *C = cast<Constant>(V); + Elements.push_back(V->getType()); + Vals.push_back(C); + } + + const StructType *STy = StructType::get(Elements); + PATypeHolder *PTy = + new PATypeHolder(HandleUpRefs(StructType::get(Elements))); + + Constant *CS = ConstantStruct::get(STy, Vals); // *$2); + $$ = new ReturnInst(CS); + delete PTy; + } + delete $2; CHECK_FOR_ERROR } | RET VOID { // Return with no result... |