示例#1
0
文件: typinf.cpp 项目: alexrp/ldc
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);
}
示例#2
0
文件: typinf.c 项目: AndroidMarv/dmd
    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
        }
    }