void TypeInfoTypedefDeclaration::llvmDefine() { Logger::println("TypeInfoTypedefDeclaration::llvmDefine() %s", toChars()); LOG_SCOPE; RTTIBuilder b(Type::typeinfotypedef); assert(tinfo->ty == Ttypedef); TypeTypedef *tc = static_cast<TypeTypedef *>(tinfo); TypedefDeclaration *sd = tc->sym; // TypeInfo base sd->basetype = sd->basetype->merge(); // dmd does it ... why? b.push_typeinfo(sd->basetype); // char[] name b.push_string(sd->toPrettyChars()); // void[] init // emit null array if we should use the basetype, or if the basetype // uses default initialization. if (tinfo->isZeroInit(0) || !sd->init) { b.push_null_void_array(); } // otherwise emit a void[] with the default initializer else { LLConstant* C = DtoConstInitializer(sd->loc, sd->basetype, sd->init); b.push_void_array(C, sd->basetype, sd); } // finish b.finalize(ir.irGlobal); }
void visit(TypeInfoTypedefDeclaration *d) { //printf("TypeInfoTypedefDeclaration::toDt() %s\n", toChars()); verifyStructSize(Type::typeinfotypedef, 7 * Target::ptrsize); dtxoff(pdt, Type::typeinfotypedef->toVtblSymbol(), 0); // vtbl for TypeInfo_Typedef dtsize_t(pdt, 0); // monitor assert( d->tinfo->ty == Ttypedef); TypeTypedef *tc = (TypeTypedef *)d->tinfo; TypedefDeclaration *sd = tc->sym; //printf("basetype = %s\n", sd->basetype->toChars()); /* Put out: * TypeInfo base; * char[] name; * void[] m_init; */ sd->basetype = sd->basetype->merge(); sd->basetype->genTypeInfo(NULL); // generate vtinfo assert(sd->basetype->vtinfo); dtxoff(pdt, sd->basetype->vtinfo->toSymbol(), 0); // TypeInfo for basetype const char *name = sd->toPrettyChars(); size_t namelen = strlen(name); dtsize_t(pdt, namelen); dtabytes(pdt, 0, namelen + 1, name); // void[] init; if (d->tinfo->isZeroInit() || !sd->init) { // 0 initializer, or the same as the base type dtsize_t(pdt, 0); // init.length dtsize_t(pdt, 0); // init.ptr } else { dtsize_t(pdt, sd->type->size()); // init.length dtxoff(pdt, sd->toInitializer(), 0); // init.ptr } }