void CgFrontRetnOptEnd( // COMPLETE BRACKETTING FOR RETURN OPT. void ) { if( FnRetnOpt() ) { CgFrontCode( IC_RETNOPT_END ); } }
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 ); }
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" ); }
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; }
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; }
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; }
void CgFrontSwitchBeg( // START A SWITCH STATEMENT void ) { CgFrontCode( IC_SWITCH_BEG ); }