Beispiel #1
0
static void CLISeek( dw_sectnum sect, long offs, uint type )
/**********************************************************/
{
    sect_info           *curr;
    long_offset         from;
    segment_id          old;

    from = 0;
    curr = &DwarfSegs[sect];
    old = SetOP( curr->seg );
    switch( type ) {
    case DW_SEEK_CUR:
        from = AskBigLocation();
        break;
    case DW_SEEK_SET:
        from = 0;
        break;
    case DW_SEEK_END:
        from = AskBigMaxSize();
        break;
    }
    offs += from;
    SetBigLocation( offs );
    SetOP( old );
}
Beispiel #2
0
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 );
}
Beispiel #3
0
static void BuffPatchSet( segment_id segid, dbg_patch *dpatch )
/*************************************************************/
{
    long_offset         off;
    segment_id          old_segid;

    old_segid = SetOP( segid );
    off = AskBigLocation();
    SetOP( old_segid );
    dpatch->segid = segid;
    dpatch->offset = off;
}
Beispiel #4
0
static long CLITell( dw_sectnum sect )
/************************************/
{
    sect_info           *curr;
    long_offset         off;
    segment_id          old;

   curr = &DwarfSegs[sect];
   old = SetOP( curr->seg );
   off = AskBigLocation();
   SetOP( old );
   return( off );
}
Beispiel #5
0
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 );
}
Beispiel #6
0
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 );
}