changeset 290:ebaf65fc4726 trunk

[svn r311] Fixed: structs no longer output two static typeinfos. Updated the DtoTypeInfoOf helper a bit after figuring out how it worked.
author lindquist
date Sat, 21 Jun 2008 17:57:36 +0200
parents 17d3b3236334
children 068cb3c60afb
files gen/llvmhelpers.cpp gen/typinf.cpp
diffstat 2 files changed, 5 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/gen/llvmhelpers.cpp	Sat Jun 21 16:22:29 2008 +0200
+++ b/gen/llvmhelpers.cpp	Sat Jun 21 17:57:36 2008 +0200
@@ -1085,17 +1085,16 @@
 
 LLConstant* DtoTypeInfoOf(Type* type, bool base)
 {
-    type = type->merge(); // seems like this is needed in some cases with templates.
-    const LLType* typeinfotype = DtoType(Type::typeinfo->type);
-    if (!type->vtinfo)
-        type->getTypeInfo(NULL);
+    type = type->merge(); // needed.. getTypeInfo does the same
+    type->getTypeInfo(NULL);
     TypeInfoDeclaration* tidecl = type->vtinfo;
+    assert(tidecl);
     DtoForceDeclareDsymbol(tidecl);
     assert(tidecl->ir.irGlobal != NULL);
     LLConstant* c = isaConstant(tidecl->ir.irGlobal->value);
     assert(c != NULL);
     if (base)
-        return llvm::ConstantExpr::getBitCast(c, typeinfotype);
+        return llvm::ConstantExpr::getBitCast(c, DtoType(Type::typeinfo->type));
     return c;
 }
 
--- a/gen/typinf.cpp	Sat Jun 21 16:22:29 2008 +0200
+++ b/gen/typinf.cpp	Sat Jun 21 17:57:36 2008 +0200
@@ -383,6 +383,7 @@
     TypedefDeclaration *sd = tc->sym;
 
     // TypeInfo base
+    sd->basetype = sd->basetype->merge(); // DMD does this!
     LLConstant* castbase = DtoTypeInfoOf(sd->basetype, true);
     assert(castbase->getType() == stype->getElementType(2));
     sinits.push_back(castbase);
@@ -962,8 +963,6 @@
 
     // create the symbol
     LLConstant* tiInit = llvm::ConstantStruct::get(stype, sinits);
-    llvm::GlobalVariable* gvar = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,tiInit,toChars(),gIR->module);
-
     isaGlobalVar(this->ir.irGlobal->value)->setInitializer(tiInit);
 }