Mercurial > projects > ldc
diff gen/toir.cpp @ 315:a9697749e898 trunk
[svn r336] Made sure calls within a landing pad area are invokes.
Nested trys still need some consideration.
author | ChristianK |
---|---|
date | Thu, 03 Jul 2008 22:05:45 +0200 |
parents | 8d98e42ece93 |
children | 571959608194 |
line wrap: on
line diff
--- a/gen/toir.cpp Wed Jul 02 22:20:18 2008 +0200 +++ b/gen/toir.cpp Thu Jul 03 22:05:45 2008 +0200 @@ -1246,82 +1246,39 @@ //Logger::cout() << "Calling: " << *funcval << '\n'; // call the function - LLValue* retllval; - if(p->landingPads.empty()) - { - llvm::CallInst* call = llvm::CallInst::Create(funcval, llargs.begin(), llargs.end(), varname, p->scopebb()); - - retllval = (retinptr) ? llargs[0] : call; - - if (retinptr && dfn && dfn->func && dfn->func->runTimeHack) { - const LLType* rettype = getPtrToType(DtoType(type)); - if (retllval->getType() != rettype) { - Logger::println("llvmRunTimeHack==true - force casting return value"); - Logger::cout() << "from: " << *retllval->getType() << " to: " << *rettype << '\n'; - retllval = DtoBitCast(retllval, rettype); - } + CallOrInvoke* call = gIR->CreateCallOrInvoke(funcval, llargs.begin(), llargs.end(), varname); + + LLValue* retllval = (retinptr) ? llargs[0] : call->get(); + + if (retinptr && dfn && dfn->func && dfn->func->runTimeHack) { + const LLType* rettype = getPtrToType(DtoType(type)); + if (retllval->getType() != rettype) { + Logger::println("llvmRunTimeHack==true - force casting return value"); + Logger::cout() << "from: " << *retllval->getType() << " to: " << *rettype << '\n'; + retllval = DtoBitCast(retllval, rettype); } - - // set calling convention - if (dfn && dfn->func) { - int li = dfn->func->llvmInternal; - if (li != LLVMintrinsic && li != LLVMva_start && li != LLVMva_intrinsic) { - call->setCallingConv(DtoCallingConv(dlink)); - } - } - /*else if (delegateCall) { - call->setCallingConv(DtoCallingConv(dlink)); - }*/ - else if (dfn && dfn->cc != (unsigned)-1) { - call->setCallingConv(dfn->cc); - } - else { + } + + // set calling convention + if (dfn && dfn->func) { + int li = dfn->func->llvmInternal; + if (li != LLVMintrinsic && li != LLVMva_start && li != LLVMva_intrinsic) { call->setCallingConv(DtoCallingConv(dlink)); } - - // param attrs - call->setParamAttrs(palist); + } + /*else if (delegateCall) { + call->setCallingConv(DtoCallingConv(dlink)); + }*/ + else if (dfn && dfn->cc != (unsigned)-1) { + call->setCallingConv(dfn->cc); } - else - { - llvm::BasicBlock* postinvoke = llvm::BasicBlock::Create("postinvoke", p->topfunc(), p->scopeend()); - llvm::InvokeInst* call = llvm::InvokeInst::Create(funcval, postinvoke, *p->landingPads.rbegin(), llargs.begin(), llargs.end(), varname, p->scopebb()); - p->scope() = IRScope(postinvoke, p->scopeend()); - - - //FIXME: Code duplication! - retllval = (retinptr) ? llargs[0] : call; - - if (retinptr && dfn && dfn->func && dfn->func->runTimeHack) { - const LLType* rettype = getPtrToType(DtoType(type)); - if (retllval->getType() != rettype) { - Logger::println("llvmRunTimeHack==true - force casting return value"); - Logger::cout() << "from: " << *retllval->getType() << " to: " << *rettype << '\n'; - retllval = DtoBitCast(retllval, rettype); - } - } - - // set calling convention - if (dfn && dfn->func) { - int li = dfn->func->llvmInternal; - if (li != LLVMintrinsic && li != LLVMva_start && li != LLVMva_intrinsic) { - call->setCallingConv(DtoCallingConv(dlink)); - } - } - /*else if (delegateCall) { - call->setCallingConv(DtoCallingConv(dlink)); - }*/ - else if (dfn && dfn->cc != (unsigned)-1) { - call->setCallingConv(dfn->cc); - } - else { - call->setCallingConv(DtoCallingConv(dlink)); - } - - // param attrs - call->setParamAttrs(palist); + else { + call->setCallingConv(DtoCallingConv(dlink)); } + // param attrs + call->setParamAttrs(palist); + return new DImValue(type, retllval, isInPlace); }