diff gen/rttibuilder.cpp @ 1383:f15a2d131ceb

Update !ClassInfo generation to use !RTTIBuilder, slight update of !RTTIBuilder .
author Tomas Lindquist Olsen <tomas.l.olsen gmail com>
date Sun, 17 May 2009 16:27:01 +0200
parents a0a4d4dac1a4
children b6aa03164436
line wrap: on
line diff
--- a/gen/rttibuilder.cpp	Sun May 17 15:20:58 2009 +0200
+++ b/gen/rttibuilder.cpp	Sun May 17 16:27:01 2009 +0200
@@ -34,6 +34,11 @@
     inits.push_back(C);
 }
 
+void RTTIBuilder::push_null(Type* T)
+{
+    inits.push_back(getNullValue(DtoType(T)));
+}
+
 void RTTIBuilder::push_null_vp()
 {
     inits.push_back(getNullValue(getVoidPtrType()));
@@ -77,10 +82,7 @@
         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);
+    push_void_array(getTypePaddedSize(CI->getType()), G);
 }
 
 void RTTIBuilder::push_array(llvm::Constant * CI, uint64_t dim, Type* valtype, Dsymbol * mangle_sym)
@@ -94,10 +96,12 @@
         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()))
-        ));
+    push_array(dim, DtoBitCast(G, DtoType(valtype->pointerTo())));
+}
+
+void RTTIBuilder::push_array(uint64_t dim, llvm::Constant * ptr)
+{
+    inits.push_back(DtoConstSlice(DtoConstSize_t(dim), ptr));
 }
 
 void RTTIBuilder::push_uint(unsigned u)
@@ -110,14 +114,20 @@
     inits.push_back(DtoConstSize_t(s));
 }
 
-void RTTIBuilder::push_funcptr(FuncDeclaration* fd)
+void RTTIBuilder::push_funcptr(FuncDeclaration* fd, Type* castto)
 {
     if (fd)
     {
         fd->codegen(Type::sir);
         LLConstant* F = fd->ir.irFunc->func;
+        if (castto)
+            F = DtoBitCast(F, DtoType(castto));
         inits.push_back(F);
     }
+    else if (castto)
+    {
+        push_null(castto);
+    }
     else
     {
         push_null_vp();
@@ -135,3 +145,9 @@
     // set the initializer
     isaGlobalVar(tid->value)->setInitializer(tiInit);
 }
+
+LLConstant* RTTIBuilder::get_constant()
+{
+    // just return the inititalizer
+    return llvm::ConstantStruct::get(&inits[0], inits.size(), false);
+}