From 7e6807b0df54c208071ea9a28fe7eb06594b4551 Mon Sep 17 00:00:00 2001 From: Alexey Prokhin Date: Fri, 17 Dec 2010 12:55:28 +0300 Subject: [PATCH] Fixed calling of _d_delmemory() and _d_delinterface() --- gen/runtime.cpp | 5 +++++ gen/toir.cpp | 13 +++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/gen/runtime.cpp b/gen/runtime.cpp index 7b7bfd99a1..96e769986a 100644 --- a/gen/runtime.cpp +++ b/gen/runtime.cpp @@ -457,9 +457,14 @@ static void LLVM_D_BuildRuntimeModule() llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M); } + // D1: // void _d_delmemory(void* p) // void _d_delinterface(void* p) // void _d_callfinalizer(void* p) + // D2: + // void _d_delmemory(void **p) + // void _d_delinterface(void **p) + // void _d_callfinalizer(void *p) { llvm::StringRef fname("_d_delmemory"); llvm::StringRef fname2("_d_delinterface"); diff --git a/gen/toir.cpp b/gen/toir.cpp index bc3a77678f..3aeaef498b 100644 --- a/gen/toir.cpp +++ b/gen/toir.cpp @@ -1749,11 +1749,15 @@ DValue* DeleteExp::toElem(IRState* p) // simple pointer if (et->ty == Tpointer) - { + { +#if DMDV2 + DtoDeleteMemory(dval->isLVal() ? dval->getLVal() : makeLValue(loc, dval)); +#else LLValue* rval = dval->getRVal(); DtoDeleteMemory(rval); if (dval->isVar()) DtoStore(LLConstant::getNullValue(rval->getType()), dval->getLVal()); +#endif } // class else if (et->ty == Tclass) @@ -1762,7 +1766,12 @@ DValue* DeleteExp::toElem(IRState* p) TypeClass* tc = (TypeClass*)et; if (tc->sym->isInterfaceDeclaration()) { - DtoDeleteInterface(dval->getRVal()); +#if DMDV2 + LLValue *val = dval->getLVal(); +#else + LLValue *val = dval->getRVal(); +#endif + DtoDeleteInterface(val); onstack = true; } else if (DVarValue* vv = dval->isVar()) {