diff gen/structs.cpp @ 133:44a95ac7368a trunk

[svn r137] Many fixes towards tango.io.Console working, but not quite there yet... In particular, assertions has been fixed to include file/line info, and much more!
author lindquist
date Mon, 14 Jan 2008 05:11:54 +0100
parents 1700239cab2e
children 0e28624814e8
line wrap: on
line diff
--- a/gen/structs.cpp	Fri Jan 11 17:57:40 2008 +0100
+++ b/gen/structs.cpp	Mon Jan 14 05:11:54 2008 +0100
@@ -27,11 +27,11 @@
 llvm::Value* DtoStructZeroInit(llvm::Value* v)
 {
     assert(gIR);
-    uint64_t n = gTargetData->getTypeSize(v->getType()->getContainedType(0));
-    //llvm::Type* sarrty = llvm::PointerType::get(llvm::ArrayType::get(llvm::Type::Int8Ty, n));
-    llvm::Type* sarrty = llvm::PointerType::get(llvm::Type::Int8Ty);
+    uint64_t n = getTypeStoreSize(v->getType()->getContainedType(0));
+    //llvm::Type* sarrty = getPtrToType(llvm::ArrayType::get(llvm::Type::Int8Ty, n));
+    const llvm::Type* sarrty = getPtrToType(llvm::Type::Int8Ty);
 
-    llvm::Value* sarr = new llvm::BitCastInst(v,sarrty,"tmp",gIR->scopebb());
+    llvm::Value* sarr = DtoBitCast(v, sarrty);
 
     llvm::Function* fn = LLVM_DeclareMemSet32();
     std::vector<llvm::Value*> llargs;
@@ -54,9 +54,9 @@
     assert(dst->getType() == src->getType());
     assert(gIR);
 
-    uint64_t n = gTargetData->getTypeSize(dst->getType()->getContainedType(0));
-    //llvm::Type* sarrty = llvm::PointerType::get(llvm::ArrayType::get(llvm::Type::Int8Ty, n));
-    llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty);
+    uint64_t n = getTypeStoreSize(dst->getType()->getContainedType(0));
+    //llvm::Type* sarrty = getPtrToType(llvm::ArrayType::get(llvm::Type::Int8Ty, n));
+    const llvm::Type* arrty = getPtrToType(llvm::Type::Int8Ty);
 
     llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb());
     llvm::Value* srcarr = new llvm::BitCastInst(src,arrty,"tmp",gIR->scopebb());
@@ -110,8 +110,8 @@
     if (idxs.empty())
         idxs.push_back(0);
 
-    const llvm::Type* llt = llvm::PointerType::get(DtoType(t));
-    const llvm::Type* st = llvm::PointerType::get(DtoType(sd->type));
+    const llvm::Type* llt = getPtrToType(DtoType(t));
+    const llvm::Type* st = getPtrToType(DtoType(sd->type));
     if (ptr->getType() != st) {
         assert(sd->llvmHasUnions);
         ptr = gIR->ir->CreateBitCast(ptr, st, "tmp");
@@ -139,15 +139,15 @@
                 Logger::println("has union field offset");
                 ptr = DtoGEP(ptr, idxs, "tmp");
                 if (ptr->getType() != llt)
-                    ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp");
+                    ptr = DtoBitCast(ptr, llt);
                 ptr = new llvm::GetElementPtrInst(ptr, DtoConstUint(vd->llvmFieldIndexOffset), "tmp", gIR->scopebb());
                 std::vector<unsigned> tmp;
                 return DtoIndexStruct(ptr, ssd, t, os-vd->offset, tmp);
             }
             else {
-                const llvm::Type* sty = llvm::PointerType::get(DtoType(vd->type));
+                const llvm::Type* sty = getPtrToType(DtoType(vd->type));
                 if (ptr->getType() != sty) {
-                    ptr = gIR->ir->CreateBitCast(ptr, sty, "tmp");
+                    ptr = DtoBitCast(ptr, sty);
                     std::vector<unsigned> tmp;
                     return DtoIndexStruct(ptr, ssd, t, os-vd->offset, tmp);
                 }
@@ -158,9 +158,9 @@
         }
     }
 
-    size_t llt_sz = gTargetData->getTypeSize(llt->getContainedType(0));
+    size_t llt_sz = getTypeStoreSize(llt->getContainedType(0));
     assert(os % llt_sz == 0);
-    ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp");
+    ptr = DtoBitCast(ptr, llt);
     return new llvm::GetElementPtrInst(ptr, DtoConstUint(os / llt_sz), "tmp", gIR->scopebb());
 }
 
@@ -180,12 +180,34 @@
     sd->llvmIRStruct = irstruct;
     gIR->structs.push_back(irstruct);
 
+    // fields
     Array* arr = &sd->fields;
     for (int k=0; k < arr->dim; k++) {
-        VarDeclaration* v = (VarDeclaration*)(arr->data[k]);
+        VarDeclaration* v = (VarDeclaration*)arr->data[k];
         v->toObjFile();
     }
 
+    bool thisModule = false;
+    if (sd->getModule() == gIR->dmodule)
+        thisModule = true;
+
+    // methods
+    arr = sd->members;
+    for (int k=0; k < arr->dim; k++) {
+        Dsymbol* s = (Dsymbol*)arr->data[k];
+        if (FuncDeclaration* fd = s->isFuncDeclaration()) {
+            if (thisModule || (fd->prot() != PROTprivate)) {
+                fd->toObjFile();
+            }
+        }
+        else if (s->isAttribDeclaration()) {
+            s->toObjFile();
+        }
+        else {
+            Logger::println("Ignoring dsymbol '%s' in this->members of kind '%s'", s->toPrettyChars(), s->kind());
+        }
+    }
+
     /*for (int k=0; k < sd->members->dim; k++) {
         Dsymbol* dsym = (Dsymbol*)(sd->members->data[k]);
         dsym->toObjFile();
@@ -218,12 +240,12 @@
                 assert(lastoffset == 0);
                 fieldtype = i->second.type;
                 fieldinit = i->second.var;
-                prevsize = gTargetData->getTypeSize(fieldtype);
+                prevsize = getABITypeSize(fieldtype);
                 i->second.var->llvmFieldIndex = idx;
             }
             // colliding offset?
             else if (lastoffset == i->first) {
-                size_t s = gTargetData->getTypeSize(i->second.type);
+                size_t s = getABITypeSize(i->second.type);
                 if (s > prevsize) {
                     fieldpad += s - prevsize;
                     prevsize = s;
@@ -233,7 +255,7 @@
             }
             // intersecting offset?
             else if (i->first < (lastoffset + prevsize)) {
-                size_t s = gTargetData->getTypeSize(i->second.type);
+                size_t s = getABITypeSize(i->second.type);
                 assert((i->first + s) <= (lastoffset + prevsize)); // this holds because all types are aligned to their size
                 sd->llvmHasUnions = true;
                 i->second.var->llvmFieldIndex = idx;
@@ -256,7 +278,7 @@
                 lastoffset = i->first;
                 fieldtype = i->second.type;
                 fieldinit = i->second.var;
-                prevsize = gTargetData->getTypeSize(fieldtype);
+                prevsize = getABITypeSize(fieldtype);
                 i->second.var->llvmFieldIndex = idx;
                 fieldpad = 0;
             }
@@ -420,7 +442,7 @@
         unsigned o = i->first;
         IRStruct::Offset* so = &i->second;
         const llvm::Type* ft = so->init->getType();
-        size_t sz = gTargetData->getTypeSize(ft);
+        size_t sz = getABITypeSize(ft);
         if (f == NULL) { // new field
             fields.push_back(DUnionField());
             f = &fields.back();
@@ -495,7 +517,7 @@
 
         if (ii < nin && fi == in[ii].idx)
         {
-            size_t s = gTargetData->getTypeSize(in[ii].c->getType());
+            size_t s = getABITypeSize(in[ii].c->getType());
             if (in[ii].idx == last)
             {
                 size_t nos = in[ii].idxos * s;