Mercurial > projects > ldc
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");