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)