Mercurial > projects > ldc
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); +}