[svn r223] Fixed: assert with message could be broken.

Fixed: array length exp could fail on slice.
This commit is contained in:
Tomas Lindquist Olsen
2008-05-13 21:40:39 +02:00
parent 39ed86269e
commit 1eb35898c6
4 changed files with 25 additions and 8 deletions

View File

@@ -2121,10 +2121,7 @@ DValue* ArrayLengthExp::toElem(IRState* p)
}
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));
}
}

View File

@@ -712,16 +712,35 @@ void DtoAssert(Loc* loc, DValue* msg)
// 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 @@ void DtoAssert(Loc* loc, DValue* msg)
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());
}

View File

@@ -26,6 +26,7 @@ IrFunction::IrFunction(FuncDeclaration* fd)
dwarfSubProg = NULL;
srcfileArg = NULL;
msgArg = NULL;
inVolatile = false;
}

View File

@@ -23,6 +23,7 @@ struct IrFunction : IrBase
llvm::Constant* dwarfSubProg;
llvm::AllocaInst* srcfileArg;
llvm::AllocaInst* msgArg;
bool inVolatile;