void DtoDeclareTypeInfo(TypeInfoDeclaration* tid) { DtoResolveTypeInfo(tid); if (tid->ir.declared) return; tid->ir.declared = true; Logger::println("DtoDeclareTypeInfo(%s)", tid->toChars()); LOG_SCOPE; if (Logger::enabled()) { std::string mangled(tid->mangle()); Logger::println("type = '%s'", tid->tinfo->toChars()); Logger::println("typeinfo mangle: %s", mangled.c_str()); } IrGlobal* irg = tid->ir.irGlobal; assert(irg->value != NULL); // this is a declaration of a builtin __initZ var if (tid->tinfo->builtinTypeInfo()) { LLGlobalVariable* g = isaGlobalVar(irg->value); g->setLinkage(llvm::GlobalValue::ExternalLinkage); return; } // define custom typedef tid->llvmDefine(); }
void RTTIBuilder::finalize(IrGlobal* tid) { // create the inititalizer LLConstant* tiInit = LLConstantStruct::get(gIR->context(), &inits[0], inits.size(), false); // refine global type llvm::cast<llvm::OpaqueType>(tid->type.get())->refineAbstractTypeTo(tiInit->getType()); // set the initializer isaGlobalVar(tid->value)->setInitializer(tiInit); }
void RTTIBuilder::finalize(LLType* type, LLValue* value) { llvm::ArrayRef<LLConstant*> inits = llvm::makeArrayRef(this->inits); LLStructType *st = isaStruct(type); assert(st); // set struct body if (st->isOpaque()) { std::vector<LLType*> types; for (int i = 0, n = inits.size(); i < n; ++i) types.push_back(inits[i]->getType()); st->setBody(types); } // create the inititalizer LLConstant* tiInit = LLConstantStruct::get(st, inits); // set the initializer isaGlobalVar(value)->setInitializer(tiInit); }