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);
 }