Mercurial > projects > ldc
changeset 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 | cd2c9f4010e4 |
children | 086e1aa99557 |
files | gen/toir.cpp gen/tollvm.cpp ir/irfunction.cpp ir/irfunction.h |
diffstat | 4 files changed, 25 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/gen/toir.cpp Tue May 13 18:07:03 2008 +0200 +++ b/gen/toir.cpp Tue May 13 21:40:39 2008 +0200 @@ -2121,10 +2121,7 @@ } else { - llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - llvm::Value* ptr = DtoGEP(u->getRVal(),zero,zero,"tmp",p->scopebb()); - ptr = new llvm::LoadInst(ptr, "tmp", p->scopebb()); - return new DImValue(type, ptr); + return new DImValue(type, DtoArrayLen(u)); } }
--- 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()); }