diff gen/toobj.cpp @ 89:ccca1c13e13a trunk

[svn r93] a few fixes, some phobos additions. some very rough groundwork for moduleinfo and classinfo support
author lindquist
date Wed, 07 Nov 2007 02:45:47 +0100
parents 058d3925950e
children 61615fa85940
line wrap: on
line diff
--- a/gen/toobj.cpp	Tue Nov 06 10:03:14 2007 +0100
+++ b/gen/toobj.cpp	Wed Nov 07 02:45:47 2007 +0100
@@ -91,6 +91,9 @@
         dsym->toObjFile();
     }
 
+    // generate ModuleInfo
+    genmoduleinfo();
+
     gTargetData = 0;
 
     // emit the llvm main function if necessary
@@ -139,6 +142,152 @@
 
 void Module::genmoduleinfo()
 {
+//      The layout is:
+//        {
+//         void **vptr;
+//         monitor_t monitor;
+//         char[] name;        // class name
+//         ModuleInfo importedModules[];
+//         ClassInfo localClasses[];
+//         uint flags;         // initialization state
+//         void *ctor;
+//         void *dtor;
+//         void *unitTest;
+//        }
+
+    if (moduleinfo) {
+        Logger::println("moduleinfo");
+    }
+    if (vmoduleinfo) {
+        Logger::println("vmoduleinfo");
+    }
+    if (needModuleInfo()) {
+        Logger::println("**** ATTENTION: module info is needed but skipped");
+    }
+
+
+    /*
+    Symbol *msym = toSymbol();
+    unsigned offset;
+    unsigned sizeof_ModuleInfo = 12 * PTRSIZE;
+
+    //////////////////////////////////////////////
+
+    csym->Sclass = SCglobal;
+    csym->Sfl = FLdata;
+
+//      The layout is:
+//        {
+//         void **vptr;
+//         monitor_t monitor;
+//         char[] name;        // class name
+//         ModuleInfo importedModules[];
+//         ClassInfo localClasses[];
+//         uint flags;         // initialization state
+//         void *ctor;
+//         void *dtor;
+//         void *unitTest;
+//        }
+    dt_t *dt = NULL;
+
+    if (moduleinfo)
+    dtxoff(&dt, moduleinfo->toVtblSymbol(), 0, TYnptr); // vtbl for ModuleInfo
+    else
+    dtdword(&dt, 0);        // BUG: should be an assert()
+    dtdword(&dt, 0);            // monitor
+
+    // name[]
+    char *name = toPrettyChars();
+    size_t namelen = strlen(name);
+    dtdword(&dt, namelen);
+    dtabytes(&dt, TYnptr, 0, namelen + 1, name);
+
+    ClassDeclarations aclasses;
+    int i;
+
+    //printf("members->dim = %d\n", members->dim);
+    for (i = 0; i < members->dim; i++)
+    {
+    Dsymbol *member;
+
+    member = (Dsymbol *)members->data[i];
+    //printf("\tmember '%s'\n", member->toChars());
+    member->addLocalClass(&aclasses);
+    }
+
+    // importedModules[]
+    int aimports_dim = aimports.dim;
+    for (i = 0; i < aimports.dim; i++)
+    {   Module *m = (Module *)aimports.data[i];
+    if (!m->needModuleInfo())
+        aimports_dim--;
+    }
+    dtdword(&dt, aimports_dim);
+    if (aimports.dim)
+    dtxoff(&dt, csym, sizeof_ModuleInfo, TYnptr);
+    else
+    dtdword(&dt, 0);
+
+    // localClasses[]
+    dtdword(&dt, aclasses.dim);
+    if (aclasses.dim)
+    dtxoff(&dt, csym, sizeof_ModuleInfo + aimports_dim * PTRSIZE, TYnptr);
+    else
+    dtdword(&dt, 0);
+
+    if (needmoduleinfo)
+    dtdword(&dt, 0);        // flags (4 means MIstandalone)
+    else
+    dtdword(&dt, 4);        // flags (4 means MIstandalone)
+
+    if (sctor)
+    dtxoff(&dt, sctor, 0, TYnptr);
+    else
+    dtdword(&dt, 0);
+
+    if (sdtor)
+    dtxoff(&dt, sdtor, 0, TYnptr);
+    else
+    dtdword(&dt, 0);
+
+    if (stest)
+    dtxoff(&dt, stest, 0, TYnptr);
+    else
+    dtdword(&dt, 0);
+
+    //////////////////////////////////////////////
+
+    for (i = 0; i < aimports.dim; i++)
+    {
+    Module *m;
+
+    m = (Module *)aimports.data[i];
+    if (m->needModuleInfo())
+    {   Symbol *s = m->toSymbol();
+        s->Sflags |= SFLweak;
+        dtxoff(&dt, s, 0, TYnptr);
+    }
+    }
+
+    for (i = 0; i < aclasses.dim; i++)
+    {
+    ClassDeclaration *cd;
+
+    cd = (ClassDeclaration *)aclasses.data[i];
+    dtxoff(&dt, cd->toSymbol(), 0, TYnptr);
+    }
+
+    csym->Sdt = dt;
+#if ELFOBJ
+    // Cannot be CONST because the startup code sets flag bits in it
+    csym->Sseg = DATA;
+#endif
+    outdata(csym);
+
+    //////////////////////////////////////////////
+
+    obj_moduleinfo(msym);
+    */
 }
 
 /* ================================================================== */
@@ -553,6 +702,9 @@
     gIR->structs.pop_back();
 
     llvmInProgress = false;
+
+    //     if (ClassDeclaration::classinfo != this)
+    //         DtoClassInfo(this);
 }
 
 /******************************************