From 44593f6220fb4f5415941e27db724b0cbbdeaad6 Mon Sep 17 00:00:00 2001 From: Alexey Prokhin Date: Sun, 19 Dec 2010 15:51:00 +0300 Subject: [PATCH] Call d_delarray_t() instead of _d_delarray() --- gen/llvmhelpers.cpp | 25 +++++++++++++++++++++---- gen/runtime.cpp | 29 ++++++++++++++++++++--------- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/gen/llvmhelpers.cpp b/gen/llvmhelpers.cpp index 4a9c41ff..faa4d9e1 100644 --- a/gen/llvmhelpers.cpp +++ b/gen/llvmhelpers.cpp @@ -82,6 +82,24 @@ void DtoDeleteInterface(LLValue* inst) gIR->CreateCallOrInvoke(fn, arg.begin(), arg.end()); } +#if DMDV2 + +void DtoDeleteArray(DValue* arr) +{ + // get runtime function + llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_delarray_t"); + + // build args + LLSmallVector arg; + arg.push_back(DtoBitCast(arr->getLVal(), fn->getFunctionType()->getParamType(0))); + arg.push_back(DtoBitCast(DtoTypeInfoOf(arr->type->nextOf()), fn->getFunctionType()->getParamType(1))); + + // call + gIR->CreateCallOrInvoke(fn, arg.begin(), arg.end()); +} + +#else + void DtoDeleteArray(DValue* arr) { // get runtime function @@ -89,16 +107,15 @@ void DtoDeleteArray(DValue* arr) // build args LLSmallVector arg; -#if DMDV2 - arg.push_back(DtoBitCast(arr->getLVal(), fn->getFunctionType()->getParamType(0))); -#else arg.push_back(DtoArrayLen(arr)); arg.push_back(DtoBitCast(DtoArrayPtr(arr), getVoidPtrType(), ".tmp")); -#endif + // call gIR->CreateCallOrInvoke(fn, arg.begin(), arg.end()); } +#endif + /****************************************************************************************/ /*//////////////////////////////////////////////////////////////////////////////////////// // ALLOCA HELPERS diff --git a/gen/runtime.cpp b/gen/runtime.cpp index 96e76998..93a46a63 100644 --- a/gen/runtime.cpp +++ b/gen/runtime.cpp @@ -442,21 +442,32 @@ static void LLVM_D_BuildRuntimeModule() ->setAttributes(Attr_NoAlias); } - // D1: void _d_delarray(size_t plength, void* pdata) - // D2: void _d_delarray(void[]* array) - { - llvm::StringRef fname("_d_delarray"); - std::vector types; #if DMDV2 + + // void _d_delarray_t(Array *p, TypeInfo ti) + { + llvm::StringRef fname("_d_delarray_t"); + std::vector types; types.push_back(voidArrayPtrTy); -#else - types.push_back(sizeTy); - types.push_back(voidPtrTy); -#endif + types.push_back(typeInfoTy); const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); } +#else + + // void _d_delarray(size_t plength, void* pdata) + { + llvm::StringRef fname("_d_delarray"); + std::vector types; + types.push_back(sizeTy); + types.push_back(voidPtrTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + +#endif + // D1: // void _d_delmemory(void* p) // void _d_delinterface(void* p)