[svn r225] Fixed: delete expressions no longer use llvm's free instruction, which crashes on a GC provided pointer.

This commit is contained in:
Tomas Lindquist Olsen
2008-05-14 01:22:40 +02:00
parent bcc112e37f
commit 19748f09ec
12 changed files with 241 additions and 145 deletions

View File

@@ -703,6 +703,40 @@ llvm::Value* DtoNew(Type* newtype)
return DtoBitCast(mem, getPtrToType(DtoType(newtype)), ".gc_mem");
}
void DtoDeleteMemory(llvm::Value* ptr)
{
// get runtime function
llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_delmemory");
// build args
llvm::SmallVector<llvm::Value*,1> arg;
arg.push_back(DtoBitCast(ptr, getVoidPtrType(), ".tmp"));
// call
llvm::CallInst::Create(fn, arg.begin(), arg.end(), "", gIR->scopebb());
}
void DtoDeleteClass(llvm::Value* inst)
{
// get runtime function
llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_delclass");
// build args
llvm::SmallVector<llvm::Value*,1> arg;
arg.push_back(DtoBitCast(inst, fn->getFunctionType()->getParamType(0), ".tmp"));
// call
llvm::CallInst::Create(fn, arg.begin(), arg.end(), "", gIR->scopebb());
}
void DtoDeleteArray(DValue* arr)
{
// get runtime function
llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_delarray");
// build args
llvm::SmallVector<llvm::Value*,2> arg;
arg.push_back(DtoArrayLen(arr));
arg.push_back(DtoBitCast(DtoArrayPtr(arr), getVoidPtrType(), ".tmp"));
// call
llvm::CallInst::Create(fn, arg.begin(), arg.end(), "", gIR->scopebb());
}
//////////////////////////////////////////////////////////////////////////////////////////
void DtoAssert(Loc* loc, DValue* msg)