dumpwv.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 990 行 · 第 1/2 页
C
990 行
Wdputslc( "\n" );
ptr = Get_type_index( ptr, &index );
Wdputs( " procedure type: " );
Putdec( index );
Wdputslc( "\n" );
Wdputs( " return location: " );
ptr = Dump_location_expression( ptr, " " );
num_parms = *ptr++;
for( i = 0; i < num_parms; i++ ) {
Wdputs( " Parm " );
Putdec( i );
Wdputs( ": " );
ptr = Dump_location_expression( ptr, " " );
}
Get_local_name( name, ptr, buff );
Wdputs( " Name = \"" );
Wdputs( name );
Wdputslc( "\"\n" );
} /* dump_rtn */
/*
* dump_rtn386 - dump a near or far routine defn (386)
*/
static void dump_rtn386( char *buff )
/***********************************/
{
int pro,epi;
unsigned_32 ret_off;
char *ptr;
int num_parms;
unsigned_16 index;
char name[256];
int i;
dump_block( buff, TRUE );
ptr = buff + sizeof( block_386 );
pro = *ptr++;
epi = *ptr++;
Wdputs( " prologue size = " );
Putdec( pro );
Wdputs( ", epilogue size = " );
Putdec( epi );
Wdputslc( "\n" );
ret_off = *(unsigned_32 *) ptr;
ptr += sizeof( unsigned_32 );
Wdputs( " return address offset (from bp) = " );
Puthex( ret_off, 8 );
Wdputslc( "\n" );
ptr = Get_type_index( ptr, &index );
Wdputs( " return type: " );
Putdec( index );
Wdputslc( "\n" );
Wdputs( " return value: " );
ptr = Dump_location_expression( ptr, " " );
num_parms = *ptr++;
for( i = 0; i < num_parms; i++ ) {
Wdputs( " Parm " );
Putdec( i );
Wdputs( ": " );
ptr = Dump_location_expression( ptr, " " );
}
Get_local_name( name, ptr, buff );
Wdputs( " Name = \"" );
Wdputs( name );
Wdputslc( "\"\n" );
} /* dump_rtn386 */
/*
* dump_locals - dump all local variable information
*/
static void dump_locals( mod_info *mi )
/*************************************/
{
int i;
unsigned_32 *offs;
int cnt;
unsigned_32 coff;
char buff[256];
char name[256];
set_base *sb;
set_base386 *sb386;
char *ptr;
addr32_ptr *p32;
addr48_ptr *p48;
unsigned_16 index;
cnt = mi->di[DMND_LOCALS].u.entries;
if( cnt == 0 ) {
return;
}
Wdputslc( "\n" );
Wdputslc( " *** Locals ***\n" );
Wdputslc( " ==============\n" );
offs = alloca( (cnt+1) * sizeof( unsigned_32 ) );
if( offs == NULL ) {
Wdputslc( "Error! Not enough stack.\n" );
longjmp( Se_env, 1 );
}
Wlseek( Curr_sectoff + mi->di[DMND_LOCALS].info_off );
Wread( offs, (cnt+1) * sizeof( unsigned_32 ) );
for( i = 0; i < cnt; i++ ) {
coff = 0;
Wdputs( " Data " );
Putdec( i );
Wdputs( ": offset " );
Puthex( offs[i], 8 );
Wdputslc( "\n" );
while( 1 ) {
Wlseek( coff + Curr_sectoff + offs[i] );
Wread( buff, sizeof( buff ) );
Wdputs( " " );
Puthex( coff, 4 );
Wdputs( ": " );
switch( buff[1] ) {
case MODULE:
Wdputslc( "MODULE\n" );
ptr = buff+2;
p32 = (addr32_ptr *)ptr;
ptr += sizeof( addr32_ptr );
ptr = Get_type_index( ptr, &index );
Get_local_name( name, ptr, buff );
Wdputs( " \"" );
Wdputs( name );
Wdputs( "\" addr = " );
Puthex( p32->segment, 4 );
Wdputc( ':' );
Puthex( p32->offset, 4 );
Wdputs( ", type = " );
Putdec( index );
Wdputslc( "\n" );
break;
case LOCAL:
Wdputslc( "LOCAL\n" );
ptr = buff+2;
Wdputs( " address: " );
ptr = Dump_location_expression( ptr, " " );
ptr = Get_type_index( ptr, &index );
Get_local_name( name, ptr, buff );
Wdputs( " name = \"" );
Wdputs( name );
Wdputs( "\", type = " );
Putdec( index );
Wdputslc( "\n" );
break;
case MODULE_386:
Wdputslc( "MODULE_386\n" );
ptr = buff+2;
p48 = (addr48_ptr *)ptr;
ptr += sizeof( addr48_ptr );
ptr = Get_type_index( ptr, &index );
Get_local_name( name, ptr, buff );
Wdputs( " \"" );
Wdputs( name );
Wdputs( "\" addr = " );
Puthex( p48->segment, 4 );
Wdputc( ':' );
Puthex( p48->offset, 8 );
Wdputs( ", type = " );
Putdec( index );
Wdputslc( "\n" );
break;
case MODULE_LOC:
Wdputslc( "MODULE_LOC\n" );
ptr = buff+2;
Wdputs( " address: " );
ptr = Dump_location_expression( ptr, " " );
ptr = Get_type_index( ptr, &index );
Get_local_name( name, ptr, buff );
Wdputs( " name = \"" );
Wdputs( name );
Wdputs( "\", type = " );
Putdec( index );
Wdputslc( "\n" );
break;
case BLOCK:
Wdputslc( "BLOCK\n" );
dump_block( buff, FALSE );
break;
case NEAR_RTN:
Wdputslc( "NEAR_RTN\n" );
dump_rtn( buff );
break;
case FAR_RTN:
Wdputslc( "FAR_RTN\n" );
dump_rtn( buff );
break;
case BLOCK_386:
Wdputslc( "BLOCK_386\n" );
dump_block( buff, TRUE );
break;
case NEAR_RTN_386:
Wdputslc( "NEAR_RTN_386\n" );
dump_rtn386( buff );
break;
case FAR_RTN_386:
Wdputslc( "FAR_RTN_386\n" );
dump_rtn386( buff );
break;
case MEMBER_SCOPE:
Wdputslc( "MEMBER_SCOPE\n" );
index = 5;
ptr = buff+2;
Wdputs( " parent offset = " );
Puthex( *ptr, 4 );
ptr += 2;
if( *ptr & 0x80 ) {
index = 6;
}
Wdputs( " class type = " );
ptr = Get_type_index( ptr, &index );
Putdec( index );
if( buff[0] > index ) {
Wdputslc( "\n object ptr type = " );
Puthex( *ptr++, 2 );
Wdputs( " object loc = " );
Dump_location_expression( ptr, " " );
}
Wdputslc( "\n" );
break;
case ADD_PREV_SEG:
Wdputslc( "ADD_PREV_SEG\n" );
Wdputs( " segment increment = " );
Puthex( *(buff+2), 4 );
Wdputslc( "\n" );
break;
case SET_BASE:
Wdputslc( "SET_BASE\n" );
sb = (set_base *) buff;
Wdputs( " base = " );
Puthex( sb->seg, 4 );
Wdputc( ':' );
Puthex( sb->off, 4 );
Wdputslc( "\n" );
break;
case SET_BASE_386:
Wdputslc( "SET_BASE_386\n" );
sb386 = (set_base386 *) buff;
Wdputs( " base = " );
Puthex( sb386->seg, 4 );
Wdputc( ':' );
Puthex( sb386->off, 8 );
Wdputslc( "\n" );
break;
}
coff += buff[0];
if( coff >= (offs[i+1] - offs[i]) ) {
break;
}
}
}
} /* dump_locals */
/*
* dump_types - dump all typing information
*/
static void dump_types( mod_info *mi )
/************************************/
{
unsigned_32 *offs;
int cnt;
cnt = mi->di[DMND_TYPES].u.entries;
if( cnt == 0 ) {
return;
}
Wdputslc( "\n" );
Wdputslc( " *** Types ***\n" );
Wdputslc( " =============\n" );
offs = alloca( (cnt+1) * sizeof( unsigned_32 ) );
if( offs == NULL ) {
Wdputslc( "Error! Not enough stack.\n" );
longjmp( Se_env, 1 );
}
Wlseek( Curr_sectoff + mi->di[DMND_TYPES].info_off );
Wread( offs, (cnt+1) * sizeof( unsigned_32 ) );
Dmp_type( cnt, offs );
}
/*
* dump_module_info - dump module info
*/
static void dump_module_info( section_dbg_header *sdh )
/*****************************************************/
{
unsigned_32 bytes_read;
mod_info *mi;
unsigned_32 total_bytes;
long cpos;
char name[256];
unsigned_16 index;
mod_info *tmi;
total_bytes = sdh->gbl_offset - sdh->mod_offset;
print_info_title( "Module" );
bytes_read = 0;
mi = (mod_info *) Wbuff;
tmi = alloca( sizeof( mod_info ) + 255 );
if( tmi == NULL ) {
Wdputslc( "Error! Not enough stack.\n" );
longjmp( Se_env, 1 );
}
cpos = Curr_sectoff + sdh->mod_offset;
index = 0;
while( bytes_read < total_bytes ) {
Wlseek( cpos );
Wread( Wbuff, sizeof( mod_info ) + 255 );
bytes_read += sizeof( mod_info ) + mi->name[0];
cpos += sizeof( mod_info ) + mi->name[0];
get_len_prefix_string( name, mi->name );
Putdecl( index, 3 );
Wdputs( ") Name: ");
Wdputs( name );
Wdputslc( "\n" );
Wdputs( " Language is " );
Wdputs( &Lang_lst[ mi->language ] );
Wdputslc( "\n" );
Wdputs( " Locals: num = " );
Putdec( mi->di[DMND_LOCALS].u.entries );
Wdputs( ", offset = " );
Puthex( mi->di[DMND_LOCALS].info_off, 8 );
Wdputslc( "H\n" );
Wdputs( " Types: num = " );
Putdec( mi->di[DMND_TYPES].u.entries );
Wdputs( ", offset = " );
Puthex( mi->di[DMND_TYPES].info_off, 8 );
Wdputslc( "H\n" );
Wdputs( " Lines: num = " );
Putdec( mi->di[DMND_LINES].u.entries );
Wdputs( ", offset = " );
Puthex( mi->di[DMND_LINES].info_off, 8 );
Wdputslc( "H\n" );
memcpy( tmi, mi, sizeof( mod_info ) + mi->name[0] );
if( Debug_options & LOCALS ) {
dump_locals( tmi );
}
if( Debug_options & LINE_NUMS ) {
dump_line_numbers( tmi );
}
if( Debug_options & TYPES ) {
dump_types( tmi );
}
Wdputslc( "\n" );
index++;
}
} /* dump_module_info */
/*
* dump_global_info - dump out global info
*/
static void dump_global_info( section_dbg_header *sdh )
/*****************************************************/
{
unsigned_32 total_bytes;
unsigned_32 bytes_read;
v3_gbl_info *gi;
long cpos;
char name[256];
total_bytes = sdh->addr_offset - sdh->gbl_offset;
print_info_title( "Global" );
bytes_read = 0;
gi = (v3_gbl_info *) Wbuff;
cpos = Curr_sectoff + sdh->gbl_offset;
while( bytes_read < total_bytes ) {
Wlseek( cpos );
Wread( Wbuff, sizeof( v3_gbl_info ) + 255 );
bytes_read += sizeof( v3_gbl_info ) + gi->name[0];
cpos += sizeof( v3_gbl_info ) + gi->name[0];
get_len_prefix_string( name, gi->name );
Wdputs( " Name: " );
Wdputs( name );
Wdputslc( "\n" );
Wdputs( " address = " );
Puthex( gi->addr.segment, 4 );
Wdputc( ':' );
Puthex( gi->addr.offset, 8 );
Wdputslc( "\n" );
Wdputs( " module index = " );
Putdec( gi->mod );
Wdputslc( "\n" );
Wdputs( " kind: " );
if( gi->kind & GBL_KIND_STATIC ) {
Wdputs( " (static pubdef)" );
}
if( gi->kind & GBL_KIND_CODE ) {
Wdputs( " (code)" );
}
if( gi->kind & GBL_KIND_DATA ) {
Wdputs( " (data)" );
}
Wdputslc( "\n" );
}
Wdputslc( "\n" );
} /* dump_global_info */
/*
* dump_addr_info - dump out address info
*/
static void dump_addr_info( section_dbg_header *sdh )
/***************************************************/
{
unsigned_32 total_bytes;
unsigned_32 bytes_read;
seg_info *si;
long cpos;
long basepos;
unsigned_32 len;
int i;
unsigned_32 seg_off;
total_bytes = sdh->section_size - sdh->addr_offset;
print_info_title( "Addr" );
bytes_read = 0;
si = (seg_info *) Wbuff;
basepos = cpos = Curr_sectoff + sdh->addr_offset;
while( bytes_read < total_bytes ) {
Wlseek( cpos );
Wread( Wbuff, sizeof( seg_info ) );
Wlseek( cpos );
len = sizeof( seg_info ) + (si->num-1) * sizeof( addr_info );
Wread( Wbuff, len );
Wdputs( " Base: fileoff = " );
Puthex( cpos-basepos, 8 );
Wdputs( "H seg = " );
Puthex( si->base.segment, 4 );
Wdputs( "H, off = " );
Puthex( si->base.offset, 8 );
Wdputslc( "H\n" );
seg_off = si->base.offset;
for( i = 0; i < si->num; i++ ) {
Putdecl( i, 6 );
Wdputs( ") fileoff = " );
Puthex( (long) cpos - basepos + sizeof( seg_info) +
i * sizeof( addr_info ) - sizeof( addr_info ), 8 );
Wdputs( "H, Size = " );
Puthex( si->addr[i].size, 8 );
Wdputs( "H @" );
Puthex( seg_off, 8 );
Wdputs( "H, mod_index = " );
Putdec( si->addr[i].mod );
Wdputslc( "\n" );
seg_off += si->addr[i].size;
}
cpos += len;
bytes_read += len;
}
} /* dump_addr_info */
/*
* dump_section - dump the current section
*/
void Dump_section( void )
/***********************/
{
section_dbg_header sdh;
Wread( &sdh, sizeof( section_dbg_header ) );
Wdputs( "Section " );
Putdec( sdh.section_id );
Wdputs( " (off=" );
Puthex( Curr_sectoff, 8 );
Wdputslc( ")\n" );
Wdputslc( "=========================\n" );
Dump_header( (char *)&sdh.mod_offset, sdh_msg );
Wdputslc( "\n" );
currSect = sdh.section_id;
if( Debug_options & MODULE_INFO ) {
dump_module_info( &sdh );
}
if( Debug_options & GLOBAL_INFO ) {
dump_global_info( &sdh );
}
if( Debug_options & ADDR_INFO ) {
dump_addr_info( &sdh );
}
} /* dump_section */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?