From 092381577fce2ccbf7a333b6df0450f77d5e0240 Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Wed, 3 Jun 2009 03:04:47 +0200 Subject: [PATCH] Some minor changes to handling of variables referenced from nested functions in D2 . Added generation of new 'void*[4] reserved;' !ModuleInfo member . --- dmd/declaration.c | 4 ++++ gen/functions.cpp | 32 ++++++++++++++++++-------------- gen/toobj.cpp | 11 +++++++++++ 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/dmd/declaration.c b/dmd/declaration.c index 7baeaabf..613038a3 100644 --- a/dmd/declaration.c +++ b/dmd/declaration.c @@ -1163,7 +1163,11 @@ void VarDeclaration::checkNestedReference(Scope *sc, Loc loc) fdthis->getLevel(loc, fdv); nestedref = 1; fdv->nestedFrameRef = 1; +#if IN_LLVM +#if DMDV1 fdv->nestedVars.insert(this); +#endif +#endif //printf("var %s in function %s is nested ref\n", toChars(), fdv->toChars()); } } diff --git a/gen/functions.cpp b/gen/functions.cpp index 03ba310a..1b2a1a9f 100644 --- a/gen/functions.cpp +++ b/gen/functions.cpp @@ -665,7 +665,7 @@ void DtoDefineFunction(FuncDeclaration* fd) LLValue* thismem = DtoRawAlloca(thisvar->getType(), 0, "this"); // FIXME: align? DtoStore(thisvar, thismem); irfunction->thisArg = thismem; - + assert(!fd->vthis->ir.irLocal); fd->vthis->ir.irLocal = new IrLocal(fd->vthis); fd->vthis->ir.irLocal->value = thismem; @@ -673,14 +673,12 @@ void DtoDefineFunction(FuncDeclaration* fd) if (global.params.symdebug) DtoDwarfLocalVariable(thismem, fd->vthis); - #if DMDV2 - if (fd->vthis->nestedrefs.dim) - #else + #if DMDV1 if (fd->vthis->nestedref) - #endif { fd->nestedVars.insert(fd->vthis); } + #endif } // give arguments storage @@ -698,14 +696,12 @@ void DtoDefineFunction(FuncDeclaration* fd) IrLocal* irloc = vd->ir.irLocal; assert(irloc); - #if DMDV2 - if (vd->nestedrefs.dim) - #else + #if DMDV1 if (vd->nestedref) - #endif { fd->nestedVars.insert(vd); } + #endif bool refout = vd->storage_class & (STCref | STCout); bool lazy = vd->storage_class & STClazy; @@ -734,19 +730,27 @@ void DtoDefineFunction(FuncDeclaration* fd) } // need result variable? (nested) -#if DMDV2 - if (fd->vresult && fd->vresult->nestedrefs.dim) { -#else +#if DMDV1 if (fd->vresult && fd->vresult->nestedref) { -#endif Logger::println("nested vresult value: %s", fd->vresult->toChars()); fd->nestedVars.insert(fd->vresult); } +#endif + +#if DMDV2 + // fill nestedVars + size_t nnest = fd->closureVars.dim; + for (size_t i = 0; i < nnest; ++i) + { + VarDeclaration* vd = (VarDeclaration*)fd->closureVars.data[i]; + fd->nestedVars.insert(vd); + } +#endif DtoCreateNestedContext(fd); #if DMDV2 - if (fd->vresult && fd->vresult->nestedrefs.dim) + if (fd->vresult && fd->vresult->nestedrefs.dim) // FIXME: not sure here :/ #else if (fd->vresult && fd->vresult->nestedref) #endif diff --git a/gen/toobj.cpp b/gen/toobj.cpp index b96ac479..f8769b7b 100644 --- a/gen/toobj.cpp +++ b/gen/toobj.cpp @@ -611,6 +611,8 @@ void Module::genmoduleinfo() // // void* xgetMembers; // void function() ictor; +// +// void*[4] reserved; // useless to us // } // resolve ModuleInfo @@ -756,6 +758,15 @@ void Module::genmoduleinfo() c = getNullValue(fnptrTy); b.push(c); +#if DMDV2 + + // void*[4] reserved :/ + const LLType* AT = llvm::ArrayType::get(getVoidPtrType(), 4); + c = getNullValue(AT); + b.push(c); + +#endif + /*Logger::println("MODULE INFO INITIALIZERS"); for (size_t i=0; i