void CVRtnEnd( dbg_rtn *rtn, offset lc ) /*****************************************/ { cv_out out[1]; fsize proc_length; fsize debug_end; dbg_patch *dpatch; long_offset here; segment_id old_segid; dpatch = RtnPatch; old_segid = SetOP( dpatch->segid ); here = AskBigLocation(); SetBigLocation( dpatch->offset + offsetof( s_gproc, f.proc_length ) ); proc_length = lc - rtn->rtn_blk->start; DataBytes( sizeof( proc_length ), &proc_length ); SetBigLocation( dpatch->offset + offsetof( s_gproc, f.debug_end ) ); debug_end = rtn->epi_start - rtn->rtn_blk->start; DataBytes( sizeof( debug_end ), &debug_end ); SetBigLocation( here ); SetOP( old_segid ); NewBuff( out, CVSyms ); StartSym( out, SG_END ); EndSym( out ); buffEnd( out ); }
static void buffEnd( cv_out *out ) /************************************/ { unsigned len; segment_id old_segid; len = out->ptr - out->beg; old_segid = SetOP( out->segid ); DataBytes( len, out->beg ); SetOP( old_segid ); }
static void BuffWrite( cv_out *out, void *to ) /************************************************/ { unsigned len; segment_id old_segid; len = (byte *)to - out->beg; old_segid = SetOP( out->segid ); DataBytes( len, out->beg ); out->beg = to; SetOP( old_segid ); }
static void CLIWrite( dw_sectnum sect, const void *block, size_t size ) /*********************************************************************/ { sect_info *curr; segment_id old; // long_offset off; curr = &DwarfSegs[sect]; old = SetOP( curr->seg ); // off = AskBigLocation(); DataBytes( size, block ); SetOP( old ); }
void CVBlkEnd( dbg_block *blk, offset lc ) /*******************************************/ { fsize length; long_offset here; segment_id old_segid; dbg_patch *dpatch; cv_out out[1]; dpatch = &blk->patches->patch; old_segid = SetOP( dpatch->segid ); here = AskBigLocation(); SetBigLocation( dpatch->offset + offsetof( s_block, f.length ) ); length = lc - blk->start; DataBytes( sizeof( length ), &length ); SetBigLocation( here ); SetOP( old_segid ); NewBuff( out, CVSyms ); StartSym( out, SG_END ); EndSym( out ); buffEnd( out ); CGFree( blk->patches ); }
static void CLIReloc( dw_sectnum sect, dw_relocs reloc_type, ... ){ /******************************************************/ static uint_32 const zero = 0; sect_info *curr; dw_sym_handle sym; dw_sym_handle bck; loc_range *low; loc_range *high; dw_sectnum section; va_list args; segment_id old; // long_offset off; va_start( args, reloc_type ); curr = &DwarfSegs[sect]; old = SetOP( curr->seg ); // off = AskBigLocation(); switch( reloc_type ) { case DW_W_LOW_PC: if( Pc_Low != NULL ){ DoLblReloc( Pc_Low, 0 ); }else{ Zoiks( ZOIKS_107 ); /* No Low PC */ } break; case DW_W_HIGH_PC: if( Pc_High != NULL ){ DoLblReloc( Pc_High, 0 ); }else{ Zoiks( ZOIKS_107 ); /* No High PC */ } break; case DW_W_STATIC: sym = va_arg( args, dw_sym_handle ); DoReloc( sym, 0 ); break; case DW_W_LABEL: bck = va_arg( args, dw_sym_handle ); DoLblReloc( (back_handle)bck, 0 ); break; case DW_W_SEGMENT: sym = va_arg( args, dw_sym_handle ); DoSegReloc( sym ); break; case DW_W_LABEL_SEG: bck = va_arg( args, dw_sym_handle ); DoSegLblReloc( (back_handle)bck ); break; case DW_W_LOC_RANGE: low = va_arg( args, loc_range* ); high = va_arg( args, loc_range* ); DoLblReloc( low->bck, low->disp ); DoLblReloc( high->bck, high->disp ); break; case DW_W_DEFAULT_FUNCTION: break; case DW_W_ARANGE_ADDR: DoLblReloc( ARange, 0 ); #if _TARGET & ( _TARG_IAPX86 | _TARG_80386 ) if( _IsntTargetModel( FLAT_MODEL ) ) { DoSegLblReloc( ARange ); } #endif break; case DW_W_UNIT_SIZE: UnitSize->segment = curr->seg; UnitSize->offset = AskBigLocation(); DataBytes( sizeof( zero ), &zero ); break; case DW_W_SECTION_POS: section = va_arg( args, uint ); DoSectOffset( section ); break; case DW_W_EXT_REF: { long_offset disp; sym = va_arg( args, dw_sym_handle ); disp = va_arg( args, dw_addr_offset ); DoReloc( sym, disp ); // DFFEPtrRef( (cg_sym_handle)sym, disp ); break; } default: abort(); break; } SetOP( old ); }