comparison gen/statements.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 e9c93739bc4c
comparison
equal deleted inserted replaced
314:8d98e42ece93 315:a9697749e898
711 DValue* e = exp->toElem(p); 711 DValue* e = exp->toElem(p);
712 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_throw_exception"); 712 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_throw_exception");
713 //Logger::cout() << "calling: " << *fn << '\n'; 713 //Logger::cout() << "calling: " << *fn << '\n';
714 LLValue* arg = DtoBitCast(e->getRVal(), fn->getFunctionType()->getParamType(0)); 714 LLValue* arg = DtoBitCast(e->getRVal(), fn->getFunctionType()->getParamType(0));
715 //Logger::cout() << "arg: " << *arg << '\n'; 715 //Logger::cout() << "arg: " << *arg << '\n';
716 gIR->ir->CreateCall(fn, arg, ""); 716 gIR->CreateCallOrInvoke(fn, arg);
717 gIR->ir->CreateUnreachable(); 717 gIR->ir->CreateUnreachable();
718 718
719 // need a block after the throw for now 719 // need a block after the throw for now
720 llvm::BasicBlock* oldend = gIR->scopeend(); 720 llvm::BasicBlock* oldend = gIR->scopeend();
721 llvm::BasicBlock* bb = llvm::BasicBlock::Create("afterthrow", p->topfunc(), oldend); 721 llvm::BasicBlock* bb = llvm::BasicBlock::Create("afterthrow", p->topfunc(), oldend);
779 { 779 {
780 llval = val->getRVal(); 780 llval = val->getRVal();
781 } 781 }
782 assert(llval->getType() == fn->getFunctionType()->getParamType(1)); 782 assert(llval->getType() == fn->getFunctionType()->getParamType(1));
783 783
784 llvm::CallInst* call = gIR->ir->CreateCall2(fn, table, llval, "tmp"); 784 CallOrInvoke* call = gIR->CreateCallOrInvoke2(fn, table, llval, "tmp");
785 785
786 llvm::PAListPtr palist; 786 llvm::PAListPtr palist;
787 palist = palist.addAttr(1, llvm::ParamAttr::ByVal); 787 palist = palist.addAttr(1, llvm::ParamAttr::ByVal);
788 palist = palist.addAttr(2, llvm::ParamAttr::ByVal); 788 palist = palist.addAttr(2, llvm::ParamAttr::ByVal);
789 call->setParamAttrs(palist); 789 call->setParamAttrs(palist);
790 790
791 return call; 791 return call->get();
792 } 792 }
793 793
794 void SwitchStatement::toIR(IRState* p) 794 void SwitchStatement::toIR(IRState* p)
795 { 795 {
796 Logger::println("SwitchStatement::toIR(): %s", loc.toChars()); 796 Logger::println("SwitchStatement::toIR(): %s", loc.toChars());