diff gen/rttibuilder.cpp @ 1376:a5d0e04298a8

Cleaned up TypeInfo_Tuple generation.
author Tomas Lindquist Olsen <tomas.l.olsen gmail com>
date Sun, 17 May 2009 05:07:51 +0200
parents 63f4afd01036
children a0a4d4dac1a4
line wrap: on
line diff
--- a/gen/rttibuilder.cpp	Sun May 17 04:41:10 2009 +0200
+++ b/gen/rttibuilder.cpp	Sun May 17 05:07:51 2009 +0200
@@ -60,26 +60,46 @@
     inits.push_back(getNullValue(T));
 }
 
-void TypeInfoBuilder::push_void_array(size_t dim, llvm::Constant* ptr)
+void TypeInfoBuilder::push_void_array(uint64_t dim, llvm::Constant* ptr)
 {
     inits.push_back(DtoConstSlice(
         DtoConstSize_t(dim),
-        DtoBitCast(ptr, getVoidPtrType())));
+        DtoBitCast(ptr, getVoidPtrType())
+        ));
 }
 
-void TypeInfoBuilder::push_void_array(llvm::Constant* CI, Type* valtype, Dsymbol* sym)
+void TypeInfoBuilder::push_void_array(llvm::Constant* CI, Type* valtype, Dsymbol* mangle_sym)
 {
-    std::string initname(sym->mangle());
-    initname.append("13__defaultInitZ");
+    std::string initname(mangle_sym->mangle());
+    initname.append(".rtti.void[].data");
 
     LLGlobalVariable* G = new llvm::GlobalVariable(
         CI->getType(), true, TYPEINFO_LINKAGE_TYPE, CI, initname, gIR->module);
     G->setAlignment(valtype->alignsize());
 
     size_t dim = getTypePaddedSize(CI->getType());
+    LLConstant* ptr = DtoBitCast(CI, DtoType(valtype->pointerTo()));
+
     push_void_array(dim, G);
 }
 
+void TypeInfoBuilder::push_array(llvm::Constant * CI, uint64_t dim, Type* valtype, Dsymbol * mangle_sym)
+{
+    std::string initname(mangle_sym?mangle_sym->mangle():".ldc");
+    initname.append(".rtti.");
+    initname.append(valtype->arrayOf()->toChars());
+    initname.append(".data");
+
+    LLGlobalVariable* G = new llvm::GlobalVariable(
+        CI->getType(), true, TYPEINFO_LINKAGE_TYPE, CI, initname, gIR->module);
+    G->setAlignment(valtype->alignsize());
+
+    inits.push_back(DtoConstSlice(
+        DtoConstSize_t(dim),
+        DtoBitCast(CI, DtoType(valtype->pointerTo()))
+        ));
+}
+
 void TypeInfoBuilder::push_uint(unsigned u)
 {
     inits.push_back(DtoConstUint(u));