Example #1
0
void CgFrontRetnOptEnd(         // COMPLETE BRACKETTING FOR RETURN OPT.
    void )
{
    if( FnRetnOpt() ) {
        CgFrontCode( IC_RETNOPT_END );
    }
}
Example #2
0
unsigned StaticInitFuncBeg(     // START INITIALIZATION OF STATIC IN FUNCTION
    void )
{
    CGLABEL init_label;         // - label #
    INIT_VAR *init_var;

    CgFrontStatInit();
    init_var = FunctionBodyGetInit( NULL );
    if( init_var->var == NULL ) {
        init_var->var = staticInitFuncVar();
    } else {
        init_var->mask <<= 1;
        if( init_var->mask >= 0x100 ) {
            ++init_var->var->sym_type->u.a.array_size;
            init_var->mask = 1;
        }
    }
    if( CompFlags.bm_switch_used ) {
        SYMBOL rtf;
        rtf = RunTimeCallSymbol( RTF_STATIC_INIT );
        CgFrontSymbol( rtf );
        CgSetType( GetBasicType( TYP_SINT ) );
        CgFrontCodePtr( IC_CALL_SETUP, rtf );
        CgSetType( GetBasicType( TYP_SINT ) );
        CgFrontCodeUint( IC_LEAF_CONST_INT, init_var->mask );
        CgFrontCode( IC_CALL_PARM );
        moduleInitVar( init_var->var, false );
        CgFrontCode( IC_CALL_PARM );
        CgFrontCode( IC_CALL_EXEC );
    } else {
        moduleInitVar( init_var->var, true );
        CgFrontCodeUint( IC_OPR_UNARY, CO_FETCH );
        CgFrontCodeUint( IC_LEAF_CONST_INT, init_var->mask );
        CgFrontCodeUint( IC_OPR_BINARY, CO_AND );
    }
    CgFrontCodeUint( IC_LEAF_CONST_INT, 0 );
    CgFrontCodeUint( IC_OPR_BINARY, CO_NE );
    init_label = CgFrontLabelCs();
    CgFrontGotoNear( IC_LABEL_CS, O_IF_TRUE, init_label );
    if( !CompFlags.bm_switch_used ) {
        moduleInitVar( init_var->var, true );
        CgFrontCodeUint( IC_LEAF_CONST_INT, init_var->mask );
        CgFrontCodeUint( IC_OPR_BINARY, CO_OR_EQUAL );
        CgFrontCode( IC_EXPR_DONE );
    }
    return( init_label );
}
Example #3
0
void CgFrontSwitchDefault(      // DEFAULT STATEMENT IN SWITCH STATEMENT
    SCOPE scope_sw,             // - scope for switch jump
    boolean deadcode,           // - dead-code state
    TOKEN_LOCN *posn )          // - source-file position
{
    CGFILE_GEN *gen;            // - generation data

    gen = getGenData();
    emitSourcePosn( gen, posn );
    CgFrontCode( IC_SWITCH_DEFAULT );
    LabelSwitchLabel( scope_sw, deadcode );
    cgfront_debug( "default" );
}
Example #4
0
void CgFrontFuncClose(          // CLOSE A FUNCTION (AND ITS FILE)
    SYMBOL func )               // - symbol for function
{
    CgFrontCode( IC_FUNCTION_CLOSE );
    if( FnRetnOpt() ) {
        SYMBOL opt_sym = FnRetnOptSym();
        if( opt_sym != NULL ) {
            codeCGFILE->opt_retn = opt_sym;
            switch( ObjModelFunctionReturn( func->sym_type ) ) {
              case OMR_CLASS_REF :
                codeCGFILE->s.opt_retn_ref = TRUE;
                break;
              case OMR_CLASS_VAL :
              case OMR_SCALAR :
                codeCGFILE->s.opt_retn_val = TRUE;
                break;
            }
        }
    }
    CgioCloseOutputFile( codeCGFILE );
    codeCGFILE = NULL;
}
Example #5
0
CGFILE_INS CgFrontFuncOpen(     // OPEN A FUNCTION (AND ITS FILE)
    SYMBOL func,                // - symbol for function
    TOKEN_LOCN *posn )          // - source position
{
    CGFILE_GEN *gen;            // - generation data
    DT_METHOD dtm;              // - destruction method for function
    CGFILE_INS reg;             // - position to zap for function registration

    codeCGFILE = CgioCreateFile( func );
    if( posn != NULL ) {
        codeCGFILE->defined = *posn;
    }
    gen = getGenData();
    if( posn != NULL ) {
        emitSourcePosn( gen, posn );
    }
    CgFrontCodePtr( IC_FUNCTION_OPEN, func );
    CgFrontCodePtr( IC_FUNCTION_ARGS, GetCurrScope() );
    dtm = CompInfo.dt_method_speced;
    if( ! SymIsDtor( func ) ) {
        switch( dtm ) {
          case DTM_DIRECT_SMALL :
            dtm = DTM_DIRECT;
            break;
          case DTM_TABLE_SMALL :
            dtm = DTM_TABLE;
            break;
        }
    }
    CompInfo.dt_method = dtm;
    CgFrontCodeUint( IC_FUNCTION_DTM, dtm );
    CgFrontCode( IC_NO_OP );    // - may be zapped to IC_FUNCTION_STAB
    reg = CgioLastWrite( codeCGFILE );
    gen->emit_line_no.src_file = NULL;
    if( posn != NULL ) {
        emitSourcePosn( gen, posn );
    }
    return reg;
}
Example #6
0
static PTREE addPtIc(           // DECORATE TREE WITH PT_IC NODE
    PTREE tree,                 // - tree
    PTREE node )                // - IC node
{
    PTREE *a_expr;              // - expression for side-effect

    if( tree == NULL ) {
        CgFrontCodePtr( node->u.ic.opcode, node->u.ic.value.pvalue );
        CgFrontCode( IC_EXPR_TRASH );
        PTreeFree( node );
        tree = NULL;
    } else {
        PTREE dup = tree;
        if( NodeIsUnaryOp( tree, CO_EXPR_DONE ) ) {
            a_expr = &dup->u.subtree[0];
        } else {
            a_expr = &dup;
        }
        *a_expr = NodeAddSideEffect( node, *a_expr );
        tree = dup;
    }
    return tree;
}
Example #7
0
void CgFrontSwitchBeg(          // START A SWITCH STATEMENT
    void )
{
    CgFrontCode( IC_SWITCH_BEG );
}