diff gen/typinf.cpp @ 102:027b8d8b71ec trunk

[svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up. Basically it tries to do the following in order: Resolve types, Declare symbols, Create constant initializers, Apply initializers, Generate functions bodies. ClassInfo is now has the most useful(biased?) members working. Probably other stuf...
author lindquist
date Sun, 18 Nov 2007 06:52:57 +0100
parents 5071469303d4
children 182b41f56b7f
line wrap: on
line diff
--- a/gen/typinf.cpp	Fri Nov 16 10:01:24 2007 +0100
+++ b/gen/typinf.cpp	Sun Nov 18 06:52:57 2007 +0100
@@ -8,6 +8,10 @@
 // in artistic.txt, or the GNU General Public License in gnu.txt.
 // See the included readme.txt for details.
 
+// Modifications for LLVMDC:
+// Copyright (c) 2007 by Tomas Lindquist Olsen
+// tomas at famolsen dk
+
 #include <cstdio>
 #include <cassert>
 
@@ -238,32 +242,76 @@
 
 void TypeInfoDeclaration::toObjFile()
 {
-    if (llvmTouched) return;
-    else llvmTouched = true;
+    gIR->resolveList.push_back(this);
+}
 
-    Logger::println("TypeInfoDeclaration::toObjFile()");
+void DtoResolveTypeInfo(TypeInfoDeclaration* tid)
+{
+    if (tid->llvmResolved) return;
+    tid->llvmResolved = true;
+
+    Logger::println("* DtoResolveTypeInfo(%s)", tid->toChars());
     LOG_SCOPE;
 
-    std::string mangled(mangle());
+    tid->llvmIRGlobal = new IRGlobal(tid);
+
+    gIR->declareList.push_back(tid);
+}
 
-    Logger::println("type = '%s'", tinfo->toChars());
+void DtoDeclareTypeInfo(TypeInfoDeclaration* tid)
+{
+    if (tid->llvmDeclared) return;
+    tid->llvmDeclared = true;
+
+    Logger::println("* DtoDeclareTypeInfo(%s)", tid->toChars());
+    LOG_SCOPE;
+
+    std::string mangled(tid->mangle());
+
+    Logger::println("type = '%s'", tid->tinfo->toChars());
     Logger::println("typeinfo mangle: %s", mangled.c_str());
 
     // this is a declaration of a builtin __initZ var
-    if (tinfo->builtinTypeInfo()) {
-        llvmValue = LLVM_D_GetRuntimeGlobal(gIR->module, mangled.c_str());
-        assert(llvmValue);
+    if (tid->tinfo->builtinTypeInfo()) {
+        tid->llvmValue = LLVM_D_GetRuntimeGlobal(gIR->module, mangled.c_str());
+        assert(tid->llvmValue);
         mangled.append("__TYPE");
-        gIR->module->addTypeName(mangled, llvmValue->getType()->getContainedType(0));
-        Logger::println("Got typeinfo var: %s", llvmValue->getName().c_str());
+        gIR->module->addTypeName(mangled, tid->llvmValue->getType()->getContainedType(0));
+        Logger::println("Got typeinfo var: %s", tid->llvmValue->getName().c_str());
+        tid->llvmInitialized = true;
+        tid->llvmDefined = true;
     }
     // custom typedef
     else {
-        // emit globals
-        toDt(NULL);
+        gIR->constInitList.push_back(tid);
     }
 }
 
+void DtoConstInitTypeInfo(TypeInfoDeclaration* tid)
+{
+    if (tid->llvmInitialized) return;
+    tid->llvmInitialized = true;
+
+    Logger::println("* DtoConstInitTypeInfo(%s)", tid->toChars());
+    LOG_SCOPE;
+
+    tid->toDt(NULL);
+
+    tid->llvmDefined = true;
+    //gIR->defineList.push_back(tid);
+}
+
+void DtoDefineTypeInfo(TypeInfoDeclaration* tid)
+{
+    if (tid->llvmDefined) return;
+    tid->llvmDefined = true;
+
+    Logger::println("* DtoDefineTypeInfo(%s)", tid->toChars());
+    LOG_SCOPE;
+
+    assert(0);
+}
+
 /* ========================================================================= */
 
 void TypeInfoDeclaration::toDt(dt_t **pdt)
@@ -279,9 +327,10 @@
     LOG_SCOPE;
 
     ClassDeclaration* base = Type::typeinfotypedef;
-    base->toObjFile();
+    DtoForceConstInitDsymbol(base);
 
     const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
+    Logger::cout() << "got stype: " << *stype << '\n';
 
     std::vector<llvm::Constant*> sinits;
     sinits.push_back(base->llvmVtbl);
@@ -295,10 +344,13 @@
     //sinits.push_back(llvm::ConstantPointerNull::get(basept));
     Logger::println("generating base typeinfo");
     //sd->basetype = sd->basetype->merge();
+
     sd->basetype->getTypeInfo(NULL);        // generate vtinfo
     assert(sd->basetype->vtinfo);
     if (!sd->basetype->vtinfo->llvmValue)
-        sd->basetype->vtinfo->toObjFile();
+        DtoForceConstInitDsymbol(sd->basetype->vtinfo);
+
+    assert(sd->basetype->vtinfo->llvmValue);
     assert(llvm::isa<llvm::Constant>(sd->basetype->vtinfo->llvmValue));
     llvm::Constant* castbase = llvm::cast<llvm::Constant>(sd->basetype->vtinfo->llvmValue);
     castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1));
@@ -341,7 +393,7 @@
     LOG_SCOPE;
 
     ClassDeclaration* base = Type::typeinfoenum;
-    base->toObjFile();
+    DtoForceConstInitDsymbol(base);
 
     const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
 
@@ -357,10 +409,12 @@
     //sinits.push_back(llvm::ConstantPointerNull::get(basept));
     Logger::println("generating base typeinfo");
     //sd->basetype = sd->basetype->merge();
+
     sd->memtype->getTypeInfo(NULL);        // generate vtinfo
     assert(sd->memtype->vtinfo);
     if (!sd->memtype->vtinfo->llvmValue)
-        sd->memtype->vtinfo->toObjFile();
+        DtoForceConstInitDsymbol(sd->memtype->vtinfo);
+
     assert(llvm::isa<llvm::Constant>(sd->memtype->vtinfo->llvmValue));
     llvm::Constant* castbase = llvm::cast<llvm::Constant>(sd->memtype->vtinfo->llvmValue);
     castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1));
@@ -401,7 +455,7 @@
 static llvm::Constant* LLVM_D_Create_TypeInfoBase(Type* basetype, TypeInfoDeclaration* tid, ClassDeclaration* cd)
 {
     ClassDeclaration* base = cd;
-    base->toObjFile();
+    DtoForceConstInitDsymbol(base);
 
     const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
 
@@ -413,7 +467,7 @@
     basetype->getTypeInfo(NULL);
     assert(basetype->vtinfo);
     if (!basetype->vtinfo->llvmValue)
-        basetype->vtinfo->toObjFile();
+        DtoForceConstInitDsymbol(basetype->vtinfo);
     assert(llvm::isa<llvm::Constant>(basetype->vtinfo->llvmValue));
     llvm::Constant* castbase = llvm::cast<llvm::Constant>(basetype->vtinfo->llvmValue);
     castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1));
@@ -533,11 +587,10 @@
     assert(tinfo->ty == Tstruct);
     TypeStruct *tc = (TypeStruct *)tinfo;
     StructDeclaration *sd = tc->sym;
-    sd->toObjFile();
-    DtoConstInitStruct(sd);
+    DtoForceConstInitDsymbol(sd);
 
     ClassDeclaration* base = Type::typeinfostruct;
-    base->toObjFile();
+    DtoForceConstInitDsymbol(base);
 
     const llvm::StructType* stype = isaStruct(((TypeClass*)base->type)->llvmType->get());