Mercurial > projects > ldc
diff gen/tollvm.cpp @ 207:e0b6040585b4 trunk
[svn r223] Fixed: assert with message could be broken.
Fixed: array length exp could fail on slice.
author | lindquist |
---|---|
date | Tue, 13 May 2008 21:40:39 +0200 |
parents | 9d44ec83acd1 |
children | c4c9b4ac021b |
line wrap: on
line diff
--- a/gen/tollvm.cpp Tue May 13 18:07:03 2008 +0200 +++ b/gen/tollvm.cpp Tue May 13 21:40:39 2008 +0200 @@ -712,16 +712,35 @@ // func const char* fname = msg ? "_d_assert_msg" : "_d_assert"; + llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname); + + c = DtoConstString(loc->filename); // msg param - if (msg) args.push_back(msg->getRVal()); + if (msg) + { + if (DSliceValue* s = msg->isSlice()) + { + llvm::AllocaInst* alloc = gIR->func()->msgArg; + if (!alloc) + { + alloc = new llvm::AllocaInst(c->getType(), ".assertmsg", gIR->topallocapoint()); + DtoSetArray(alloc, DtoArrayLen(s), DtoArrayPtr(s)); + gIR->func()->msgArg = alloc; + } + args.push_back(alloc); + } + else + { + args.push_back(msg->getRVal()); + } + } // file param - c = DtoConstString(loc->filename); llvm::AllocaInst* alloc = gIR->func()->srcfileArg; if (!alloc) { - alloc = new llvm::AllocaInst(c->getType(), "srcfile", gIR->topallocapoint()); + alloc = new llvm::AllocaInst(c->getType(), ".srcfile", gIR->topallocapoint()); gIR->func()->srcfileArg = alloc; } llvm::Value* ptr = DtoGEPi(alloc, 0,0, "tmp"); @@ -735,7 +754,6 @@ args.push_back(c); // call - llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname); llvm::CallInst* call = llvm::CallInst::Create(fn, args.begin(), args.end(), "", gIR->scopebb()); }