diff gen/toir.cpp @ 120:5ce8ab11e75a trunk

[svn r124] Fixed another D vararg + return in ptr bug. Fixed some nested function calls failed to resolve the context ptr.
author lindquist
date Mon, 26 Nov 2007 07:26:21 +0100
parents 79c9ac745fbc
children 9c79b61fb638
line wrap: on
line diff
--- a/gen/toir.cpp	Mon Nov 26 06:45:13 2007 +0100
+++ b/gen/toir.cpp	Mon Nov 26 07:26:21 2007 +0100
@@ -936,7 +936,7 @@
         Logger::println("This Call");
         if (dfn->vthis->getType() != argiter->get()) {
             //Logger::cout() << *fn->thisparam << '|' << *argiter->get() << '\n';
-            llargs[j] = new llvm::BitCastInst(dfn->vthis, argiter->get(), "tmp", p->scopebb());
+            llargs[j] = DtoBitCast(dfn->vthis, argiter->get());
         }
         else {
             llargs[j] = dfn->vthis;
@@ -956,8 +956,9 @@
     else if (dfn && dfn->func && dfn->func->isNested()) {
         Logger::println("Nested Call");
         llvm::Value* contextptr = p->func()->decl->llvmNested;
-        assert(contextptr);
-        llargs[j] = p->ir->CreateBitCast(contextptr, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp");
+        if (!contextptr)
+            contextptr = llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty));
+        llargs[j] = DtoBitCast(contextptr, llvm::PointerType::get(llvm::Type::Int8Ty));
         ++j;
         ++argiter;
     }
@@ -970,7 +971,7 @@
             Argument* fnarg = Argument::getNth(tf->parameters, i);
             Expression* exp = (Expression*)arguments->data[i];
             DValue* expelem = exp->toElem(p);
-            llargs[j] = p->ir->CreateBitCast(expelem->getLVal(), llvm::PointerType::get(llvm::Type::Int8Ty), "tmp");
+            llargs[j] = DtoBitCast(expelem->getLVal(), llvm::PointerType::get(llvm::Type::Int8Ty));
         }
     }
     // regular arguments
@@ -979,6 +980,8 @@
         {
             Logger::println("doing d-style variadic arguments");
 
+            size_t nimplicit = j;
+
             std::vector<const llvm::Type*> vtypes;
             std::vector<llvm::Value*> vvalues;
             std::vector<llvm::Value*> vtypeinfos;
@@ -1020,7 +1023,7 @@
             j++;
             llargs[j] = p->ir->CreateBitCast(mem, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp");
             j++;
-            llargs.resize(2);
+            llargs.resize(nimplicit+2);
         }
         else {
             Logger::println("doing normal arguments");