void CgFrontScopeCall( // GENERATE IC_SCOPE_CALL, IF REQ'D SYMBOL fun, // - function called SYMBOL dtor, // - dtor, when function is ctor DTOR_KIND kind ) // - kind of dtoring { boolean keep_scope; // - TRUE ==> keep the current scope keep_scope = FALSE; if( dtor != NULL ) { switch( kind ) { case DTORING_SCOPE : CgFrontCodePtr( IC_SCOPE_CALL_BDTOR, dtor ); keep_scope = TRUE; break; case DTORING_TEMP : CgFrontCodePtr( IC_SCOPE_CALL_TDTOR, dtor ); break; case DTORING_COMPONENT : CgFrontCodePtr( IC_SCOPE_CALL_CDTOR, dtor ); keep_scope = TRUE; break; DbgDefault( "CgFrontScopeCall -- bad DTOR_KIND" ); } } if( fun != NULL && ( fun->flag & SF_NO_LONGJUMP ) ) { fun = NULL; } if( fun != NULL || dtor != NULL ) { CgFrontCodePtr( IC_SCOPE_CALL_FUN, fun ); } if( keep_scope ) { ScopeKeep( GetCurrScope() ); } }
void CgFrontSymbol( // EMIT A SYMBOL SYMBOL sym ) // - the symbol { CGFILE_GEN *gen; // - generation data gen = getGenData(); gen->emit_type = sym->sym_type; CgSetType( sym->sym_type ); CgFrontCodePtr( IC_LEAF_NAME_FRONT, sym ); }
boolean CgFrontRetnOptVar( // START BRACKETTING FOR VAR. (RETURN OPT>) SYMBOL var ) // - the symbol { boolean retn; // - return: TRUE ==> bracketting started if( FnRetnOptimizable( var ) ) { CgFrontCodePtr( IC_RETNOPT_VAR, var ); retn = TRUE; } else { retn = FALSE; } return retn; }
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; }
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 ); }
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 TypeSigReferenced( // EMIT CODE NOTING A TYPE-SIGNATURE REFERENCE TYPE_SIG *sig ) // - type signature { CgFrontCodePtr( IC_EXPR_TS, sig->type ); }
void CgFrontReturnSymbol( // SET RETURN SYMBOL SYMBOL return_operand ) // - the symbol { LabelReturn(); CgFrontCodePtr( IC_PROC_RETURN, return_operand ); }