Exemple #1
0
void CgExprDtored(              // DTOR CG EXPRESSION
    cg_name expr,               // - expression
    cg_type type,               // - expression type
    DGRP_FLAGS pop_type,        // - type of popping destruction
    FN_CTL* fctl )              // - function control
{
#if 0
    cg_type type;               // - expression type

    switch( CgExprStackSize() ) {
      case 0 :
        break;
      case 1 :
      { boolean temp_dtoring = fctl->temp_dtoring;
        SYMBOL temp = getExprTempSym( &type, fctl, pop_type );
        if( temp_dtoring ) {
            if( fctl->ctor_test ) {
                pop_type |= DGRP_CTOR;
            }
            CgDestructExprTemps( pop_type, fctl );
            if( NULL != temp ) {
                CgExprPush( CgFetchSym( temp ), type );
            }
        }
      } break;
      DbgDefault( "CgExprDtored -- too many temps" );
    }
#else
    SYMBOL temp;                // - NULL or copied temp

    DbgVerify( 0 == CgExprStackSize(), "CgExprDtored -- more than one expr" );
    if( expr != NULL ) {
        if( pop_type & DGRP_DONE ) {
            CGDone( expr );
            temp = NULL;
        } else if( pop_type & DGRP_TRASH ) {
            CGTrash( expr );
            temp = NULL;
        } else if( fctl->temp_dtoring ) {
            temp = CgVarTempTyped( type );
            CGDone( CGLVAssign( CgSymbol( temp ), expr, type ) );
        } else {
            CgExprPush( expr, type );
            temp = NULL;
        }
        if( fctl->temp_dtoring ) {
            fctl->temp_dtoring = FALSE;
            if( fctl->ctor_test ) {
                pop_type |= DGRP_CTOR;
            }
            CgDestructExprTemps( pop_type, fctl );
            if( NULL != temp ) {
                CgExprPush( CgFetchSym( temp ), type );
            }
        }
    }
#endif
}
Exemple #2
0
static call_handle initDtorCall( // INITIALIZE DTOR CALL
    SYMBOL dtor )                // - DTOR to be called
{
    cg_name dtor_name;
    call_handle h;

    dtor_name = CgSymbol( dtor );
    h = CGInitCall( dtor_name, CgFuncRetnType( dtor ), (cg_sym_handle)dtor );
    return( h );
}
Exemple #3
0
void CgRtCallInit(              // SET UP A R/T CALL
    RT_DEF *def,                // - definition for call
    RTF rt_code )               // - code for run/time call
{
    SYMBOL sym;                 // - symbol for run/time call

    sym = RunTimeCallSymbol( rt_code );
    def->type = CgTypeOutput( SymFuncReturnType( sym ) );
    def->handle = CGInitCall( CgSymbol( sym )
                            , def->type
                            , (cg_sym_handle)sym );
}
Exemple #4
0
void CgFunRegister(             // REGISTER A FUNCTION
    FN_CTL* fctl,               // - function information
    SYMBOL rw,                  // - symbol for R/W block
    SYMBOL ro )                 // - symbol for R/O block
{
    SE* se;                     // - current position

#if _CPU == _AXP
    CgAssignPtr( CgSymbolPlusOffset( rw, 0 ), CgAddrSymbol( ro ) );
    CompFlags.inline_fun_reg = TRUE;
#else
    RT_DEF def;                 // - R/T call control
    cg_name opt_thr;            // - optimized expression for addr[THREAD_CTL]

    DbgVerify( CompFlags.rw_registration, "not R/W Registration" );
    if( CompFlags.fs_registration ) {
        CompFlags.inline_fun_reg = TRUE;
        CgRtCallInit( &def, RTF_FS_PUSH );
        CgRtParamAddrSym( &def, rw );
        CgRtCallExecDone( &def );
        rw = registerHandler( rw, RTF_FS_HANDLER );
    } else {
        opt_thr = pointOptSym( &optFuncReg );
        if( opt_thr == NULL ) {
            rtRegister( rw, ro );
        } else {
            CompFlags.inline_fun_reg = TRUE;
            CgAssignPtr( CgSymbolPlusOffset( rw, 0 )
                       , CgFetchPtr( opt_thr ) );
            CgAssignPtr( CgSymbol( optFuncReg.sym )
                       , CgAddrSymbol( rw ) );
            rw = registerHandler( rw, RTF_FS_HANDLER_RTN );
        }
    }
    CgAssignPtr( CgSymbolPlusOffset
                    ( rw, CgbkInfo.size_data_ptr + CgbkInfo.size_fs_hand )
               , CgAddrSymbol( ro ) );
#endif
    if( fctl->is_dtor ) {
        se = BlkPosnCurr();
    } else {
        se = NULL;
    }
    FstabAssignStateVar( se );
}
Exemple #5
0
static cg_name pointOptSym(     // POINT AT OPTIMIZED SYMBOL, IF OPTIMIZABLE
    OPT_DEFN *odef )            // - optimization definition
{
    cg_name expr;               // - optimized expression

    if( CompFlags.target_multi_thread ) {
        expr = NULL;
    } else {
        if( odef->sym == NULL ) {
            lookupOptSym( odef );
            if( odef->sym == NULL ) {
                defineOptSym( odef );
            }
        }
        expr = CgSymbol( odef->sym );
    }
    return expr;
}
Exemple #6
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;
}
Exemple #7
0
static SYMBOL getExprTempSym(   // EMIT CGDone, CGTrash, OR COPY TO TEMP
    cg_name expr,               // - expression
    cg_type type,               // - type of expression
    FN_CTL* fctl,               // - function control
    DGRP_FLAGS pop_type )       // - type of popping destruction
{
    SYMBOL temp;                // - NULL or copied temp

    if( pop_type & DGRP_DONE ) {
        CGDone( expr );
        temp = NULL;
    } else if( pop_type & DGRP_TRASH ) {
        CGTrash( expr );
        temp = NULL;
    } else if( fctl->temp_dtoring ) {
        temp = CgVarTemp( BETypeLength( type ) );
        CGDone( CGLVAssign( CgSymbol( temp ), expr, type ) );
    } else {
        temp = NULL;
    }
    fctl->temp_dtoring = FALSE;
    return temp;
}
Exemple #8
0
cg_name ThrowRo(                // CREATE/ACCESS THROW R/O BLOCK
    TYPE type )                 // - type being thrown
{
    return( CgSymbol( throwRoGet( type )->sym ) );
}
Exemple #9
0
cg_name CgFetchSym(             // FETCH A SYMBOL
    SYMBOL sym )                // - symbol
{

    return CgFetchType( CgSymbol( sym ), CgTypeSym( sym ) );
}