Esempio n. 1
0
cg_name CgMakeDup(              // MAKE A DUPLICATE
    cg_name *orig,              // - original
    cg_type cgtype )            // - and its type
{
    temp_handle handle;         // - dup. handle
    cg_name dup;                // - duplicated node

    dup = CgSaveAsTemp( &handle, *orig, cgtype );
    dup = CgFetchType( dup, cgtype );
    *orig = CgFetchTemp( handle, cgtype );
    // returned cg_name must be emitted before
    // any sequence points that use *orig
    // (i.e., returned cg_name sets up the duplicate value)
    return dup;
}
Esempio n. 2
0
cg_name CgMakeTwoDups(          // MAKE TWO DUPLICATES
    cg_name *orig,              // - original and destination for first dup
    cg_name *second,            // - destination for second dup
    cg_type cgtype )            // - original type
{
    temp_handle handle;         // - dup. handle
    cg_name dup;                // - duplicated node

    dup = CgSaveAsTemp( &handle, *orig, cgtype );
    dup = CgFetchType( dup, cgtype );
    *orig = CgFetchTemp( handle, cgtype );
    *second = CgFetchTemp( handle, cgtype );
    // returned cg_name must be emitted before
    // any sequence points that use *orig or *second
    // (i.e., returned cg_name sets up the duplicate value)
    return dup;
}
Esempio n. 3
0
SE* DtorForDelBeg(              // DTORING AREA TO BE DELETED: start
    FN_CTL* fctl,               // - function information
    target_size_t elem_size,    // - size of one element in area
    unsigned dlt1,              // - entry type when one arg
    unsigned dlt2,              // - entry type when two args
    SYMBOL op_del )             // - operator delete to be used
{
    SE* se_dlt;                 // - entry allocated
    SYMBOL var;                 // - var containing address of delete area
    cg_name top_expr;           // - top expression
    cg_type top_type;           // - type of top expression
    cg_name emit;               // - expression for state update
    patch_handle patch;         // - patch handle for area

    if( DtmTabular( fctl ) ) {
        if( 2 == SymFuncArgList( op_del )->num_args ) {
            se_dlt = SeAlloc( dlt2 );
            se_dlt->del_2_array.size = elem_size;
        } else {
            se_dlt = SeAlloc( dlt1 );
        }
        se_dlt->del_1_array.op_del = op_del;
        var = CgVarRw( TY_POINTER, SC_AUTO );
        if( se_dlt->base.gen ) {
            AutoRelRegister( var, &se_dlt->del_1_array.offset );
        }
        top_expr = CgExprPopType( &top_type );
        top_expr = CGLVAssign( CgSymbol( var ), top_expr, top_type );
        top_expr = CgFetchType( top_expr, top_type );
        emit = emitPatch( &patch );
        top_expr = emitPatchCallBack( top_expr
                                    , emit
                                    , top_type
                                    , &patchForDtorDelBeg
                                    , patch
                                    , se_dlt );
        CgExprPush( top_expr, top_type );
        DbgSetState( "patchForDtorDelBeg", se_dlt );
    } else {
        se_dlt = NULL;
    }
    return se_dlt;
}
Esempio n. 4
0
cg_name CgRtCallExec(           // EXECUTE R/T CALL
    RT_DEF *def )               // - definition for call
{
    CgBackCallGened( def->handle );
    return CgFetchType( CGCall( def->handle ), def->type );
}
Esempio n. 5
0
cg_name CgFetchSym(             // FETCH A SYMBOL
    SYMBOL sym )                // - symbol
{

    return CgFetchType( CgSymbol( sym ), CgTypeSym( sym ) );
}
Esempio n. 6
0
cg_name CgFetchTemp(            // FETCH A TEMPORARY
    temp_handle handle,         // - handle for temporary
    cg_type type )              // - type of temp
{
    return CgFetchType( CGTempName( handle, type ), type );
}
Esempio n. 7
0
cg_name CgFetchPtr(             // FETCH A POINTER
    cg_name operand )           // - operand to be fetched
{
    return CgFetchType( operand, TY_POINTER );
}