cg_name CgMakeDup( // MAKE A DUPLICATE cg_name *orig, // - original cg_type cgtype ) // - and its type { temp_handle handle; // - dup. handle cg_name dup; // - duplicated node dup = CgSaveAsTemp( &handle, *orig, cgtype ); dup = CgFetchType( dup, cgtype ); *orig = CgFetchTemp( handle, cgtype ); // returned cg_name must be emitted before // any sequence points that use *orig // (i.e., returned cg_name sets up the duplicate value) return dup; }
cg_name CgMakeTwoDups( // MAKE TWO DUPLICATES cg_name *orig, // - original and destination for first dup cg_name *second, // - destination for second dup cg_type cgtype ) // - original type { temp_handle handle; // - dup. handle cg_name dup; // - duplicated node dup = CgSaveAsTemp( &handle, *orig, cgtype ); dup = CgFetchType( dup, cgtype ); *orig = CgFetchTemp( handle, cgtype ); *second = CgFetchTemp( handle, cgtype ); // returned cg_name must be emitted before // any sequence points that use *orig or *second // (i.e., returned cg_name sets up the duplicate value) return dup; }
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; }
cg_name CgRtCallExec( // EXECUTE R/T CALL RT_DEF *def ) // - definition for call { CgBackCallGened( def->handle ); return CgFetchType( CGCall( def->handle ), def->type ); }
cg_name CgFetchSym( // FETCH A SYMBOL SYMBOL sym ) // - symbol { return CgFetchType( CgSymbol( sym ), CgTypeSym( sym ) ); }
cg_name CgFetchTemp( // FETCH A TEMPORARY temp_handle handle, // - handle for temporary cg_type type ) // - type of temp { return CgFetchType( CGTempName( handle, type ), type ); }
cg_name CgFetchPtr( // FETCH A POINTER cg_name operand ) // - operand to be fetched { return CgFetchType( operand, TY_POINTER ); }