diff gen/typinf.cpp @ 100:5071469303d4 trunk

[svn r104] TONS OF FIXES. Split up declaration, constant initializer gen and definition for globals, structs, classes and functions. Improved ClassInfo support (not complete), not in vtable yet. Fixed a bunch of forward reference problems. Much more. Major commit! :)
author lindquist
date Fri, 16 Nov 2007 08:21:47 +0100
parents 6789050b5ad1
children 027b8d8b71ec
line wrap: on
line diff
--- a/gen/typinf.cpp	Thu Nov 15 00:24:44 2007 +0100
+++ b/gen/typinf.cpp	Fri Nov 16 08:21:47 2007 +0100
@@ -32,6 +32,7 @@
 #include "gen/runtime.h"
 #include "gen/tollvm.h"
 #include "gen/arrays.h"
+#include "gen/structs.h"
 
 /*******************************************
  * Get a canonicalized form of the TypeInfo for use with the internal
@@ -258,6 +259,7 @@
     }
     // custom typedef
     else {
+        // emit globals
         toDt(NULL);
     }
 }
@@ -279,12 +281,10 @@
     ClassDeclaration* base = Type::typeinfotypedef;
     base->toObjFile();
 
-    llvm::Constant* initZ = base->llvmInitZ;
-    assert(initZ);
-    const llvm::StructType* stype = isaStruct(initZ->getType());
+    const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
 
     std::vector<llvm::Constant*> sinits;
-    sinits.push_back(initZ->getOperand(0));
+    sinits.push_back(base->llvmVtbl);
 
     assert(tinfo->ty == Ttypedef);
     TypeTypedef *tc = (TypeTypedef *)tinfo;
@@ -301,13 +301,13 @@
         sd->basetype->vtinfo->toObjFile();
     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, initZ->getOperand(1)->getType());
+    castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1));
     sinits.push_back(castbase);
 
     // char[] name
     char *name = sd->toPrettyChars();
     sinits.push_back(DtoConstString(name));
-    assert(sinits.back()->getType() == initZ->getOperand(2)->getType());
+    assert(sinits.back()->getType() == stype->getElementType(2));
 
     // void[] init
     const llvm::PointerType* initpt = llvm::PointerType::get(llvm::Type::Int8Ty);
@@ -343,12 +343,10 @@
     ClassDeclaration* base = Type::typeinfoenum;
     base->toObjFile();
 
-    llvm::Constant* initZ = base->llvmInitZ;
-    assert(initZ);
-    const llvm::StructType* stype = isaStruct(initZ->getType());
+    const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
 
     std::vector<llvm::Constant*> sinits;
-    sinits.push_back(initZ->getOperand(0));
+    sinits.push_back(base->llvmVtbl);
 
     assert(tinfo->ty == Tenum);
     TypeEnum *tc = (TypeEnum *)tinfo;
@@ -365,13 +363,13 @@
         sd->memtype->vtinfo->toObjFile();
     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, initZ->getOperand(1)->getType());
+    castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1));
     sinits.push_back(castbase);
 
     // char[] name
     char *name = sd->toPrettyChars();
     sinits.push_back(DtoConstString(name));
-    assert(sinits.back()->getType() == initZ->getOperand(2)->getType());
+    assert(sinits.back()->getType() == stype->getElementType(2));
 
     // void[] init
     const llvm::PointerType* initpt = llvm::PointerType::get(llvm::Type::Int8Ty);
@@ -405,12 +403,10 @@
     ClassDeclaration* base = cd;
     base->toObjFile();
 
-    llvm::Constant* initZ = base->llvmInitZ;
-    assert(initZ);
-    const llvm::StructType* stype = isaStruct(initZ->getType());
+    const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
 
     std::vector<llvm::Constant*> sinits;
-    sinits.push_back(initZ->getOperand(0));
+    sinits.push_back(base->llvmVtbl);
 
     // TypeInfo base
     Logger::println("generating base typeinfo");
@@ -420,7 +416,7 @@
         basetype->vtinfo->toObjFile();
     assert(llvm::isa<llvm::Constant>(basetype->vtinfo->llvmValue));
     llvm::Constant* castbase = llvm::cast<llvm::Constant>(basetype->vtinfo->llvmValue);
-    castbase = llvm::ConstantExpr::getBitCast(castbase, initZ->getOperand(1)->getType());
+    castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1));
     sinits.push_back(castbase);
 
     // create the symbol
@@ -538,11 +534,12 @@
     TypeStruct *tc = (TypeStruct *)tinfo;
     StructDeclaration *sd = tc->sym;
     sd->toObjFile();
+    DtoConstInitStruct(sd);
 
     ClassDeclaration* base = Type::typeinfostruct;
     base->toObjFile();
 
-    const llvm::StructType* stype = isaStruct(base->llvmType);
+    const llvm::StructType* stype = isaStruct(((TypeClass*)base->type)->llvmType->get());
 
     std::vector<llvm::Constant*> sinits;
     sinits.push_back(base->llvmVtbl);
@@ -562,7 +559,7 @@
     else
     {
         assert(sd->llvmInitZ);
-        size_t cisize = gTargetData->getTypeSize(tc->llvmType);
+        size_t cisize = gTargetData->getTypeSize(tc->llvmType->get());
         llvm::Constant* cicast = llvm::ConstantExpr::getBitCast(tc->llvmInit, initpt);
         sinits.push_back(DtoConstSlice(DtoConstSize_t(cisize), cicast));
     }
@@ -778,131 +775,3 @@
     dtxoff(pdt, s, 0, TYnptr);          // elements.ptr
     */
 }
-
-/* ========================================================================= */
-/* ========================================================================= */
-/*                           CLASS INFO STUFF                                */
-/* ========================================================================= */
-/* ========================================================================= */
-
-void DtoClassInfo(ClassDeclaration* cd)
-{
-//     The layout is:
-//        {
-//         void **vptr;
-//         monitor_t monitor;
-//         byte[] initializer;     // static initialization data
-//         char[] name;        // class name
-//         void *[] vtbl;
-//         Interface[] interfaces;
-//         ClassInfo *base;        // base class
-//         void *destructor;
-//         void *invariant;        // class invariant
-//         uint flags;
-//         void *deallocator;
-//         OffsetTypeInfo[] offTi;
-//         void *defaultConstructor;
-//        }
-
-    // holds the list of initializers for llvm
-    std::vector<llvm::Constant*> inits;
-
-    ClassDeclaration* cinfo = ClassDeclaration::classinfo;
-    assert(cinfo);
-    Logger::println("cinfo toObj");
-    cinfo->toObjFile();
-    
-    Logger::println("cinfo toObj done");
-    assert(cinfo->type->ty == Tclass);
-    TypeClass* tc = (TypeClass*)cinfo->type;
-    //assert(tc->llvmInit);
-    //assert(cinfo->llvmInitZ);
-
-    cinfo = ClassDeclaration::classinfo;
-    assert(cinfo->llvmInitZ);
-
-    /*
-    llvm::Constant* c;
-
-    // own vtable
-    c = cinfo->llvmInitZ->getOperand(0);
-    assert(c);
-    inits.push_back(c);
-
-    // monitor
-    // TODO no monitors yet
-
-    // initializer
-    c = cinfo->llvmInitZ->getOperand(1);
-    inits.push_back(c);
-
-    // class name
-    // from dmd
-    char *name = cd->ident->toChars();
-    size_t namelen = strlen(name);
-    if (!(namelen > 9 && memcmp(name, "TypeInfo_", 9) == 0))
-    {
-        name = cd->toPrettyChars();
-        namelen = strlen(name);
-    }
-    c = DtoConstString(name);
-    inits.push_back(c);
-
-    // vtbl array
-    c = cinfo->llvmInitZ->getOperand(3);
-    inits.push_back(c);
-
-    // interfaces array
-    c = cinfo->llvmInitZ->getOperand(4);
-    inits.push_back(c);
-
-    // base classinfo
-    c = cinfo->llvmInitZ->getOperand(5);
-    inits.push_back(c);
-
-    // destructor
-    c = cinfo->llvmInitZ->getOperand(5);
-    inits.push_back(c);
-
-    // invariant
-    c = cinfo->llvmInitZ->getOperand(6);
-    inits.push_back(c);
-
-    // flags
-    c = cinfo->llvmInitZ->getOperand(7);
-    inits.push_back(c);
-
-    // allocator
-    c = cinfo->llvmInitZ->getOperand(8);
-    inits.push_back(c);
-
-    // offset typeinfo
-    c = cinfo->llvmInitZ->getOperand(9);
-    inits.push_back(c);
-
-    // default constructor
-    c = cinfo->llvmInitZ->getOperand(10);
-    inits.push_back(c);
-
-    // build the initializer
-    const llvm::StructType* st = isaStruct(cinfo->llvmInitZ->getType());
-    llvm::Constant* finalinit = llvm::ConstantStruct::get(st, inits);
-    Logger::cout() << "built the classinfo initializer:\n" << *finalinit <<'\n';
-
-    assert(0);
-    */
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-