diff gen/llvmhelpers.cpp @ 1207:83d3b25c2213

Isolate all knowledge of what a function's nested context looks like in a single place. No functional change.
author Frits van Bommel <fvbommel wxs.nl>
date Sun, 12 Apr 2009 13:08:24 +0200
parents a5bfed1f6775
children 79758fd2f48a
line wrap: on
line diff
--- a/gen/llvmhelpers.cpp	Sun Apr 12 12:52:01 2009 +0200
+++ b/gen/llvmhelpers.cpp	Sun Apr 12 13:08:24 2009 +0200
@@ -21,6 +21,7 @@
 #include "gen/typeinf.h"
 #include "gen/todebug.h"
 #include "gen/cl_options.h"
+#include "gen/nested.h"
 #include "ir/irmodule.h"
 
 #include <stack>
@@ -313,75 +314,6 @@
 
 /****************************************************************************************/
 /*////////////////////////////////////////////////////////////////////////////////////////
-// NESTED VARIABLE HELPERS
-////////////////////////////////////////////////////////////////////////////////////////*/
-
-DValue* DtoNestedVariable(Loc loc, Type* astype, VarDeclaration* vd)
-{
-    Dsymbol* vdparent = vd->toParent2();
-    assert(vdparent);
-    
-    IrFunction* irfunc = gIR->func();
-    
-    // is the nested variable in this scope?
-    if (vdparent == irfunc->decl)
-    {
-        LLValue* val = vd->ir.getIrValue();
-        return new DVarValue(astype, vd, val);
-    }
-    
-    // get it from the nested context
-    LLValue* ctx = 0;
-    if (irfunc->decl->isMember2())
-    {
-        ClassDeclaration* cd = irfunc->decl->isMember2()->isClassDeclaration();
-        LLValue* val = DtoLoad(irfunc->thisArg);
-        ctx = DtoLoad(DtoGEPi(val, 0,cd->vthis->ir.irField->index, ".vthis"));
-    }
-    else
-        ctx = irfunc->nestArg;
-    assert(ctx);
-    
-    assert(vd->ir.irLocal);
-    LLValue* val = DtoBitCast(ctx, getPtrToType(getVoidPtrType()));
-    val = DtoGEPi1(val, vd->ir.irLocal->nestedIndex);
-    val = DtoLoad(val);
-    assert(vd->ir.irLocal->value);
-    val = DtoBitCast(val, vd->ir.irLocal->value->getType(), vd->toChars());
-    return new DVarValue(astype, vd, val);
-}
-
-LLValue* DtoNestedContext(Loc loc, Dsymbol* sym)
-{
-    Logger::println("DtoNestedContext for %s", sym->toPrettyChars());
-    LOG_SCOPE;
-
-    IrFunction* irfunc = gIR->func();
-
-    // if this func has its own vars that are accessed by nested funcs
-    // use its own context
-    if (irfunc->nestedVar)
-        return irfunc->nestedVar;
-    // otherwise, it may have gotten a context from the caller
-    else if (irfunc->nestArg)
-        return irfunc->nestArg;
-    // or just have a this argument
-    else if (irfunc->thisArg)
-    {
-        ClassDeclaration* cd = irfunc->decl->isMember2()->isClassDeclaration();
-        if (!cd || !cd->vthis)
-            return getNullPtr(getVoidPtrType());
-        LLValue* val = DtoLoad(irfunc->thisArg);
-        return DtoLoad(DtoGEPi(val, 0,cd->vthis->ir.irField->index, ".vthis"));
-    }
-    else
-    {
-        return getNullPtr(getVoidPtrType());
-    }
-}
-
-/****************************************************************************************/
-/*////////////////////////////////////////////////////////////////////////////////////////
 // ASSIGNMENT HELPER (store this in that)
 ////////////////////////////////////////////////////////////////////////////////////////*/
 
@@ -946,22 +878,7 @@
                 Logger::println("has nestedref set");
                 assert(vd->ir.irLocal);
                 
-                // alloca as usual if no value already
-                if (!vd->ir.irLocal->value)
-                {
-                    vd->ir.irLocal->value = DtoAlloca(DtoType(vd->type), vd->toChars());
-                }
-                
-                // store the address into the nested vars array
-                
-                assert(vd->ir.irLocal->nestedIndex >= 0);
-                LLValue* gep = DtoGEPi(gIR->func()->decl->ir.irFunc->nestedVar, 0, vd->ir.irLocal->nestedIndex);
-                
-                assert(isaPointer(vd->ir.irLocal->value));
-                LLValue* val = DtoBitCast(vd->ir.irLocal->value, getVoidPtrType());
-                
-                DtoStore(val, gep);
-                
+                DtoNestedInit(vd);
             }
             // normal stack variable, allocate storage on the stack if it has not already been done
             else if(!vd->ir.irLocal) {
@@ -1110,12 +1027,7 @@
         else
             assert(!addr || addr == var->ir.irLocal->value);
 
-        // store the address into the nested vars array
-        assert(var->ir.irLocal->nestedIndex >= 0);
-        LLValue* gep = DtoGEPi(gIR->func()->decl->ir.irFunc->nestedVar, 0, var->ir.irLocal->nestedIndex);
-        assert(isaPointer(var->ir.irLocal->value));
-        LLValue* val = DtoBitCast(var->ir.irLocal->value, getVoidPtrType());
-        DtoStore(val, gep);
+        DtoNestedInit(var);
     }
     // normal local variable
     else