Mercurial > projects > ldc
diff gen/tollvm.cpp @ 209:c4c9b4ac021b trunk
[svn r225] Fixed: delete expressions no longer use llvm's free instruction, which crashes on a GC provided pointer.
author | lindquist |
---|---|
date | Wed, 14 May 2008 01:22:40 +0200 |
parents | e0b6040585b4 |
children | 1d6cfdbc97f0 |
line wrap: on
line diff
--- a/gen/tollvm.cpp Tue May 13 21:41:25 2008 +0200 +++ b/gen/tollvm.cpp Wed May 14 01:22:40 2008 +0200 @@ -703,6 +703,40 @@ 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)