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 }
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 ); }
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 ); }
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 ); }
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; }
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; }
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; }
cg_name ThrowRo( // CREATE/ACCESS THROW R/O BLOCK TYPE type ) // - type being thrown { return( CgSymbol( throwRoGet( type )->sym ) ); }
cg_name CgFetchSym( // FETCH A SYMBOL SYMBOL sym ) // - symbol { return CgFetchType( CgSymbol( sym ), CgTypeSym( sym ) ); }