Exemplo n.º 1
0
Arquivo: s2ir.c Projeto: Rayerd/dmd
void AsmStatement::toIR(IRState *irs)
{
    block *bpre;
    block *basm;
    Declaration *d;
    Symbol *s;
    Blockx *blx = irs->blx;

    //printf("AsmStatement::toIR(asmcode = %x)\n", asmcode);
    bpre = blx->curblock;
    block_next(blx,BCgoto,NULL);
    basm = blx->curblock;
    list_append(&bpre->Bsucc, basm);
    basm->Bcode = asmcode;
    basm->Balign = asmalign;
#if 0
    if (label)
    {   block *b;

        b = labelToBlock(loc, blx, label);
        printf("AsmStatement::toIR() %p\n", b);
        if (b)
            list_append(&basm->Bsucc, b);
    }
#endif
    // Loop through each instruction, fixing Dsymbols into Symbol's
    for (code *c = asmcode; c; c = c->next)
    {   LabelDsymbol *label;
        block *b;

        switch (c->IFL1)
        {
        case FLblockoff:
        case FLblock:
            // FLblock and FLblockoff have LabelDsymbol's - convert to blocks
            label = c->IEVlsym1;
            b = labelToBlock(loc, blx, label);
            list_append(&basm->Bsucc, b);
            c->IEV1.Vblock = b;
            break;

        case FLdsymbol:
        case FLfunc:
            s = c->IEVdsym1->toSymbol();
            if (s->Sclass == SCauto && s->Ssymnum == -1)
                symbol_add(s);
            c->IEVsym1 = s;
            c->IFL1 = s->Sfl ? s->Sfl : FLauto;
            break;
        }

        // Repeat for second operand
        switch (c->IFL2)
        {
        case FLblockoff:
        case FLblock:
            label = c->IEVlsym2;
            b = labelToBlock(loc, blx, label);
            list_append(&basm->Bsucc, b);
            c->IEV2.Vblock = b;
            break;

        case FLdsymbol:
        case FLfunc:
            d = c->IEVdsym2;
            s = d->toSymbol();
            if (s->Sclass == SCauto && s->Ssymnum == -1)
                symbol_add(s);
            c->IEVsym2 = s;
            c->IFL2 = s->Sfl ? s->Sfl : FLauto;
            if (d->isDataseg())
                s->Sflags |= SFLlivexit;
            break;
        }
        //c->print();
    }

    basm->bIasmrefparam = refparam;             // are parameters reference?
    basm->usIasmregs = regs;                    // registers modified

    block_next(blx,BCasm, NULL);
    list_prepend(&basm->Bsucc, blx->curblock);

    if (naked)
    {
        blx->funcsym->Stype->Tty |= mTYnaked;
    }
}