diff gen/toir.cpp @ 136:0e28624814e8 trunk

[svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
author lindquist
date Thu, 17 Jan 2008 03:15:12 +0100
parents 44a95ac7368a
children ce7b81fb957f
line wrap: on
line diff
--- a/gen/toir.cpp	Mon Jan 14 23:09:55 2008 +0100
+++ b/gen/toir.cpp	Thu Jan 17 03:15:12 2008 +0100
@@ -57,12 +57,14 @@
                 DtoAnnotation(toChars());
 
             Logger::println("vdtype = %s", vd->type->toChars());
+
             // referenced by nested delegate?
             if (vd->nestedref) {
                 Logger::println("has nestedref set");
-                vd->llvmValue = p->func()->decl->llvmNested;
-                assert(vd->llvmValue);
-                assert(vd->llvmNestedIndex >= 0);
+                assert(vd->irLocal);
+                vd->irLocal->value = p->func()->decl->irFunc->nestedVar;
+                assert(vd->irLocal->value);
+                assert(vd->irLocal->nestedIndex >= 0);
             }
             // normal stack variable
             else {
@@ -70,14 +72,16 @@
                 const llvm::Type* lltype = DtoType(vd->type);
                 llvm::AllocaInst* allocainst = new llvm::AllocaInst(lltype, vd->toChars(), p->topallocapoint());
                 //allocainst->setAlignment(vd->type->alignsize()); // TODO
-                vd->llvmValue = allocainst;
+                assert(!vd->irLocal);
+                vd->irLocal = new IrLocal(vd);
+                vd->irLocal->value = allocainst;
             }
 
-            Logger::cout() << "llvm value for decl: " << *vd->llvmValue << '\n';
+            Logger::cout() << "llvm value for decl: " << *vd->irLocal->value << '\n';
             DValue* ie = DtoInitializer(vd->init);
         }
 
-        return new DVarValue(vd, vd->llvmValue, true);
+        return new DVarValue(vd, vd->getIrValue(), true);
     }
     // struct declaration
     else if (StructDeclaration* s = declaration->isStructDeclaration())
@@ -149,19 +153,19 @@
         if (vd->ident == Id::_arguments)
         {
             Logger::println("Id::_arguments");
-            if (!vd->llvmValue)
-                vd->llvmValue = p->func()->decl->llvmArguments;
-            assert(vd->llvmValue);
-            return new DVarValue(vd, vd->llvmValue, true);
+            if (!vd->getIrValue())
+                vd->getIrValue() = p->func()->decl->irFunc->_arguments;
+            assert(vd->getIrValue());
+            return new DVarValue(vd, vd->getIrValue(), true);
         }
         // _argptr
         else if (vd->ident == Id::_argptr)
         {
             Logger::println("Id::_argptr");
-            if (!vd->llvmValue)
-                vd->llvmValue = p->func()->decl->llvmArgPtr;
-            assert(vd->llvmValue);
-            return new DVarValue(vd, vd->llvmValue, true);
+            if (!vd->getIrValue())
+                vd->getIrValue() = p->func()->decl->irFunc->_argptr;
+            assert(vd->getIrValue());
+            return new DVarValue(vd, vd->getIrValue(), true);
         }
         // _dollar
         else if (vd->ident == Id::dollar)
@@ -176,13 +180,13 @@
         {
             Logger::println("TypeInfoDeclaration");
             DtoForceDeclareDsymbol(tid);
-            assert(tid->llvmValue);
+            assert(tid->getIrValue());
             const llvm::Type* vartype = DtoType(type);
             llvm::Value* m;
-            if (tid->llvmValue->getType() != getPtrToType(vartype))
-                m = p->ir->CreateBitCast(tid->llvmValue, vartype, "tmp");
+            if (tid->getIrValue()->getType() != getPtrToType(vartype))
+                m = p->ir->CreateBitCast(tid->getIrValue(), vartype, "tmp");
             else
-                m = tid->llvmValue;
+                m = tid->getIrValue();
             return new DVarValue(vd, m, true);
         }
         // classinfo
@@ -201,16 +205,16 @@
         // function parameter
         else if (vd->isParameter()) {
             Logger::println("function param");
-            if (!vd->llvmValue) {
+            if (!vd->getIrValue()) {
                 // TODO: determine this properly
                 // this happens when the DMD frontend generates by pointer wrappers for struct opEquals(S) and opCmp(S)
-                vd->llvmValue = &p->func()->func->getArgumentList().back();
+                vd->getIrValue() = &p->func()->func->getArgumentList().back();
             }
-            if (vd->isRef() || vd->isOut() || DtoIsPassedByRef(vd->type) || llvm::isa<llvm::AllocaInst>(vd->llvmValue)) {
-                return new DVarValue(vd, vd->llvmValue, true);
+            if (vd->isRef() || vd->isOut() || DtoIsPassedByRef(vd->type) || llvm::isa<llvm::AllocaInst>(vd->getIrValue())) {
+                return new DVarValue(vd, vd->getIrValue(), true);
             }
-            else if (llvm::isa<llvm::Argument>(vd->llvmValue)) {
-                return new DImValue(type, vd->llvmValue);
+            else if (llvm::isa<llvm::Argument>(vd->getIrValue())) {
+                return new DImValue(type, vd->getIrValue());
             }
             else assert(0);
         }
@@ -220,11 +224,11 @@
                 vd->toObjFile();
                 DtoConstInitGlobal(vd);
             }
-            if (!vd->llvmValue || vd->llvmValue->getType()->isAbstract()) {
+            if (!vd->getIrValue() || vd->getIrValue()->getType()->isAbstract()) {
                 Logger::println("global variable not resolved :/ %s", vd->toChars());
                 assert(0);
             }
-            return new DVarValue(vd, vd->llvmValue, true);
+            return new DVarValue(vd, vd->getIrValue(), true);
         }
     }
     else if (FuncDeclaration* fdecl = var->isFuncDeclaration())
@@ -233,7 +237,7 @@
         if (fdecl->llvmInternal != LLVMva_arg) {// && fdecl->llvmValue == 0)
             DtoForceDeclareDsymbol(fdecl);
         }
-        return new DFuncValue(fdecl, fdecl->llvmValue);
+        return new DFuncValue(fdecl, fdecl->irFunc->func);
     }
     else if (SymbolDeclaration* sdecl = var->isSymbolDeclaration())
     {
@@ -274,11 +278,11 @@
     else if (TypeInfoDeclaration* ti = var->isTypeInfoDeclaration())
     {
         DtoForceDeclareDsymbol(ti);
-        assert(ti->llvmValue);
+        assert(ti->getIrValue());
         const llvm::Type* vartype = DtoType(type);
-        llvm::Constant* m = isaConstant(ti->llvmValue);
+        llvm::Constant* m = isaConstant(ti->getIrValue());
         assert(m);
-        if (ti->llvmValue->getType() != getPtrToType(vartype))
+        if (ti->getIrValue()->getType() != getPtrToType(vartype))
             m = llvm::ConstantExpr::getBitCast(m, vartype);
         return m;
     }
@@ -974,7 +978,7 @@
             llargs[j] = new llvm::AllocaInst(argiter->get()->getContainedType(0),"rettmp",p->topallocapoint());
         }
 
-        if (dfn && dfn->func && dfn->func->llvmRunTimeHack) {
+        if (dfn && dfn->func && dfn->func->runTimeHack) {
             const llvm::Type* rettype = getPtrToType(DtoType(type));
             if (llargs[j]->getType() != llfnty->getParamType(j)) {
                 Logger::println("llvmRunTimeHack==true - force casting return value param");
@@ -1075,8 +1079,8 @@
                 Expression* argexp = (Expression*)arguments->data[i];
                 TypeInfoDeclaration* tidecl = argexp->type->getTypeInfoDeclaration();
                 DtoForceDeclareDsymbol(tidecl);
-                assert(tidecl->llvmValue);
-                vtypeinfos.push_back(tidecl->llvmValue);
+                assert(tidecl->getIrValue());
+                vtypeinfos.push_back(tidecl->getIrValue());
                 llvm::Value* v = p->ir->CreateBitCast(vtypeinfos[i], typeinfotype, "tmp");
                 p->ir->CreateStore(v, DtoGEPi(typeinfomem,0,i,"tmp"));
             }
@@ -1108,7 +1112,7 @@
                 }
 
                 // this hack is necessary :/
-                if (dfn && dfn->func && dfn->func->llvmRunTimeHack) {
+                if (dfn && dfn->func && dfn->func->runTimeHack) {
                     if (llfnty->getParamType(j) != NULL) {
                         if (llargs[j]->getType() != llfnty->getParamType(j)) {
                             Logger::println("llvmRunTimeHack==true - force casting argument");
@@ -1137,7 +1141,7 @@
     llvm::CallInst* call = new llvm::CallInst(funcval, llargs.begin(), llargs.end(), varname, p->scopebb());
     llvm::Value* retllval = (retinptr) ? llargs[0] : call;
 
-    if (retinptr && dfn && dfn->func && dfn->func->llvmRunTimeHack) {
+    if (retinptr && dfn && dfn->func && dfn->func->runTimeHack) {
         const llvm::Type* rettype = getPtrToType(DtoType(type));
         if (retllval->getType() != rettype) {
             Logger::println("llvmRunTimeHack==true - force casting return value");
@@ -1208,12 +1212,12 @@
             vd->toObjFile(); // TODO
         }
 
-        assert(vd->llvmValue);
+        assert(vd->getIrValue());
         Type* t = DtoDType(type);
         Type* tnext = DtoDType(t->next);
         Type* vdtype = DtoDType(vd->type);
 
-        llvm::Value* llvalue = vd->nestedref ? DtoNestedVariable(vd) : vd->llvmValue;
+        llvm::Value* llvalue = vd->nestedref ? DtoNestedVariable(vd) : vd->getIrValue();
         llvm::Value* varmem = 0;
 
         if (vdtype->ty == Tstruct && !(t->ty == Tpointer && t->next == vdtype)) {
@@ -1287,9 +1291,8 @@
         //Logger::println("FuncDeclaration");
         FuncDeclaration* fd = fv->func;
         assert(fd);
-        if (fd->llvmValue == 0)
-            DtoForceDeclareDsymbol(fd);
-        return new DFuncValue(fd, fd->llvmValue);
+        DtoForceDeclareDsymbol(fd);
+        return new DFuncValue(fd, fd->irFunc->func);
     }
     else if (DImValue* im = v->isIm()) {
         Logger::println("is immediate");
@@ -1394,7 +1397,7 @@
         // super call
         if (e1->op == TOKsuper) {
             DtoForceDeclareDsymbol(fdecl);
-            funcval = fdecl->llvmValue;
+            funcval = fdecl->irFunc->func;
             assert(funcval);
         }
         // normal virtual call
@@ -1415,7 +1418,7 @@
         // static call
         else {
             DtoForceDeclareDsymbol(fdecl);
-            funcval = fdecl->llvmValue;
+            funcval = fdecl->irFunc->func;
             assert(funcval);
             //assert(funcval->getType() == DtoType(fdecl->type));
         }
@@ -1438,7 +1441,7 @@
 
     if (VarDeclaration* vd = var->isVarDeclaration()) {
         llvm::Value* v;
-        v = p->func()->decl->llvmThisVar;
+        v = p->func()->decl->irFunc->thisVar;
         if (llvm::isa<llvm::AllocaInst>(v))
             v = new llvm::LoadInst(v, "tmp", p->scopebb());
         return new DThisValue(vd, v);
@@ -2187,7 +2190,7 @@
     if (DFuncValue* f = u->isFunc()) {
         //assert(f->vthis);
         //uval = f->vthis;
-        llvm::Value* nestvar = p->func()->decl->llvmNested;
+        llvm::Value* nestvar = p->func()->decl->irFunc->nestedVar;
         if (nestvar)
             uval = nestvar;
         else
@@ -2213,7 +2216,7 @@
     else if (func->toParent()->isInterfaceDeclaration())
         assert(0 && "TODO delegate to interface method");
     else
-        castfptr = func->llvmValue;
+        castfptr = func->irFunc->func;
 
     castfptr = DtoBitCast(castfptr, fptr->getType()->getContainedType(0));
     DtoStore(castfptr, fptr);
@@ -2440,7 +2443,7 @@
 
     llvm::Value* context = DtoGEPi(lval,0,0,"tmp",p->scopebb());
     const llvm::PointerType* pty = isaPointer(context->getType()->getContainedType(0));
-    llvm::Value* llvmNested = p->func()->decl->llvmNested;
+    llvm::Value* llvmNested = p->func()->decl->irFunc->nestedVar;
     if (llvmNested == NULL) {
         llvm::Value* nullcontext = llvm::ConstantPointerNull::get(pty);
         p->ir->CreateStore(nullcontext, context);
@@ -2452,8 +2455,8 @@
 
     llvm::Value* fptr = DtoGEPi(lval,0,1,"tmp",p->scopebb());
 
-    assert(fd->llvmValue);
-    llvm::Value* castfptr = new llvm::BitCastInst(fd->llvmValue,fptr->getType()->getContainedType(0),"tmp",p->scopebb());
+    assert(fd->irFunc->func);
+    llvm::Value* castfptr = new llvm::BitCastInst(fd->irFunc->func,fptr->getType()->getContainedType(0),"tmp",p->scopebb());
     new llvm::StoreInst(castfptr, fptr, p->scopebb());
 
     if (temp)