static void rtRegister( // REGISTER A FUNCTION BY R/T CALL SYMBOL rw, // - symbol for R/W block SYMBOL ro ) // - symbol for R/O block { RT_DEF def; // - R/T call control CgRtCallInit( &def, RTF_REG_FUN ); CgRtParamAddrSym( &def, ro ); CgRtParamAddrSym( &def, rw ); CgRtCallExecDone( &def ); }
cg_name CgDtorStatic( // DTOR STATIC OBJECT SYMBOL sym ) // - object symbol { STAB_CTL sctl; // - state-table instance STAB_DEFN dctl; // - state-table definition RT_DEF def; // - control for run-time call SE* se; // - state entry segment_id old_seg; // - old segment StabCtlInit( &sctl, &dctl ); StabDefnInit( &dctl, DTRG_STATIC_INITLS ); #ifndef NDEBUG if( PragDbgToggle.dump_stab ) { printf( "State Table for static object: %p\n", &dctl.state_table ); } #endif sctl.rw = CgVarRw( CgbkInfo.size_rw_base + CgbkInfo.size_data_ptr, SC_STATIC ); dctl.ro = CgVarRo( 1, SC_STATIC, NULL ); se = SeAlloc( DTC_SYM_STATIC ); se->base.gen = true; se->sym_static.sym = sym; se->sym_static.dtor = RoDtorFind( sym ); se = StateTableAdd( se, &sctl ); StabGenerate( &sctl ); old_seg = DgSetSegSym( sctl.rw ); CgBackGenLabelInternal( sctl.rw ); DgInitBytes( CgbkInfo.size_data_ptr, 0 ); DgPtrSymData( dctl.ro ); DgOffset( 1 ); DgPtrSymData( sym ); BESetSeg( old_seg ); CgRtCallInit( &def, RTF_REG_LCL ); CgRtParamAddrSym( &def, sctl.rw ); return( CgRtCallExec( &def ) ); }
void CgDtorAll( // DTOR ALL IN FUNCTION void ) { RT_DEF def; // - call definition CgRtCallInit( &def, RTF_DTOR_ALL ); #if _CPU == _AXP CgRtParamAddrSym( &def, FstabExcRw() ); #endif CgRtCallExecDone( &def ); }
void CgDtorSe( // DTOR UNTIL SE ENTRY SE* bound ) // - bounding entry { RT_DEF def; // - call definition CgRtCallInit( &def, RTF_DTOR ); CgRtParamConstOffset( &def, SeStateOptimal( bound ) ); #if _CPU == _AXP CgRtParamAddrSym( &def, FstabExcRw() ); #endif CgRtCallExecDone( &def ); }
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 ); }