dumphll.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 639 行 · 第 1/2 页
C
639 行
dump_name( 0 );
Wdputslc( "\"\n" );
if( mod.cSeg ) {
while( --mod.cSeg ) {
if( !first ) {
Wdputslc( " ====\n" );
}
Wread( &seg, sizeof( seg ) );
Dump_header( &seg, cv_seg_msg );
first = FALSE;
}
}
Wdputslc( "\n" );
}
/*
* dump_hll_sstModules - dump HLL sstModules at 'offset' from 'base'
*/
static void dump_hll_sstModules( unsigned_32 base, unsigned_32 offset )
/*********************************************************************/
{
hll_debug_mod_32 mod;
hll_debug_seg_32 seg;
bool first = TRUE;
Wlseek( base + offset );
Wdputs( "==== sstModules at offset " );
Puthex( offset, 8 );
Wdputslc( "\n" );
Wread( &mod, sizeof( mod ) );
Dump_header( &mod, hll_sstModules_msg );
hll_level = mod.Version >> 8;
Wdputs( " module name: \"" );
dump_name( 0 );
Wdputslc( "\"\n" );
if( mod.cSeg ) {
while( --mod.cSeg ) {
if( !first ) {
Wdputslc( " ====\n" );
}
Wread( &seg, sizeof( seg ) );
Dump_header( &seg, hll_seg_msg );
first = FALSE;
}
}
Wdputslc( "\n" );
}
/*
* dump_cv_sstSrcLnSeg - dump sstSrcLnSeg at 'offset' from 'base'
*/
static void dump_cv_sstSrcLnSeg( unsigned_32 base, unsigned_32 offset )
/*********************************************************************/
{
cv_linnum_seg src_ln;
cv_srcln_off_16 lo_16;
Wlseek( base + offset );
Wdputs( "==== sstSrcLnSeg at offset " );
Puthex( offset, 8 );
Wdputslc( "\n" );
Wdputs( " source file: \"" );
dump_name( 2 );
Wdputslc( "\"\n" );
Wread( &src_ln, sizeof( src_ln ) );
Dump_header( &src_ln, cv_sstSrcLnSeg_msg );
while( src_ln.cPair-- ) {
Wread( &lo_16, sizeof( lo_16 ) );
Dump_header( &lo_16, cv_lnoff16_msg );
}
Wdputslc( "\n" );
}
/*
* dump_hll_sstHLLSrc - dump HLL sstHLLSrc at 'offset' from 'base'
* containing 'size' bytes
*/
static void dump_hll_sstHLLSrc( unsigned_32 base, unsigned_32 offset,
unsigned_32 size )
/*******************************************************************/
{
Wlseek( base + offset );
Wdputs( "==== sstHLLSrc at offset " );
Puthex( offset, 8 );
Wdputslc( "\n" );
if( hll_level >= 0x04 ) {
hl4_linnum_first first_entry;
unsigned_32 count = 0;
while( count < size ) {
Wread( &first_entry, sizeof( first_entry ) );
Dump_header( &first_entry, hl4_linnum_first_msg );
count += sizeof( first_entry );
if( first_entry.entryType == 0x03 ) {
hl4_filetab_entry ftab_entry;
unsigned_32 index;
Wread( &ftab_entry, sizeof( ftab_entry ) );
Dump_header( &ftab_entry, hl4_filetab_entry_msg );
count += sizeof( ftab_entry );
for( index = 0; index < ftab_entry.numFiles; ++index ) {
Wdputs( " file index: " );
Puthex( index, 4 );
Wdputs( "H name: \"" );
count += dump_name( 0 );
Wdputslc( "\"\n" );
}
Wdputslc( "\n" );
} else if( first_entry.entryType == 0x00 ) {
hll_linnum_entry lnum_entry;
unsigned_32 index;
for( index = 0; index < first_entry.numEntries; ++index ) {
Wread( &lnum_entry, sizeof( lnum_entry ) );
count += sizeof( lnum_entry );
Dump_header( &lnum_entry, hll_linnum_entry_msg );
}
Wdputslc( "\n" );
} else {
Wdputslc( "unsupported linnum table entry format\n" );
}
}
} else {
hl3_linnum_first first_entry;
unsigned_32 index;
Wread( &first_entry, sizeof( first_entry ) );
Dump_header( &first_entry, hl3_linnum_first_msg );
if( first_entry.entryType == 0x00 ) {
hl3_filetab_entry ftab_entry;
hll_linnum_entry lnum_entry;
for( index = 0; index < first_entry.numEntries; ++index ) {
Wread( &lnum_entry, sizeof( lnum_entry ) );
Dump_header( &lnum_entry, hll_linnum_entry_msg );
}
Wread( &ftab_entry, sizeof( ftab_entry ) );
Dump_header( &ftab_entry, hl3_filetab_entry_msg );
for( index = 0; index < ftab_entry.numFiles; ++index ) {
Wdputs( " file index: " );
Puthex( index, 4 );
Wdputs( "H name: \"" );
dump_name( 0 );
Wdputslc( "\"\n" );
}
Wdputslc( "\n" );
} else {
Wdputslc( "unsupported linnum table entry format\n" );
}
}
}
/*
* dump_cv_subsection - dump any CodeView subsection
*/
static void dump_cv_subsection( unsigned_32 base, cv3_directory_entry *dir )
/**************************************************************************/
{
hll_sst sst_index;
sst_index = dir->subsection;
switch( sst_index ) {
case hll_sstModules:
if( Debug_options & MODULE_INFO ) {
dump_cv_sstModules( base, dir->lfo );
}
break;
case hll_sstPublics:
if( Debug_options & GLOBAL_INFO ) {
dump_cv_sstPublics( base, dir->lfo, dir->cb );
}
break;
case hll_sstLibraries:
dump_cv_sstLibraries( base, dir->lfo, dir->cb );
break;
case hll_sstSrcLnSeg:
if( Debug_options & LINE_NUMS ) {
dump_cv_sstSrcLnSeg( base, dir->lfo );
}
break;
}
}
/*
* dump_hll_subsection - dump any HLL subsection
*/
static void dump_hll_subsection( unsigned_32 base, hll_debug_dir *dir )
/*********************************************************************/
{
hll_sst sst_index;
sst_index = dir->subsection;
switch( sst_index ) {
case hll_sstModules:
if( Debug_options & MODULE_INFO ) {
dump_hll_sstModules( base, dir->lfo );
}
break;
case hll_sstPublics:
if( Debug_options & GLOBAL_INFO ) {
dump_hll_sstPublics( base, dir->lfo, dir->cb );
}
break;
case hll_sstLibraries:
dump_cv_sstLibraries( base, dir->lfo, dir->cb );
break;
case hll_sstHLLSrc:
if( Debug_options & LINE_NUMS ) {
dump_hll_sstHLLSrc( base, dir->lfo, dir->cb );
}
break;
}
}
/*
* dump_cv - dump CV data at offset 'base' from start of file
*/
static void dump_cv( unsigned_32 base )
/*************************************/
{
hll_trailer header;
cv3_directory_entry sst_dir_entry;
unsigned_16 num_entries;
int i;
Wlseek( base );
Wread( &header, sizeof( header ) );
if( memcmp( header.sig, HLL_NB02, HLL_SIG_SIZE ) != 0 ) {
return;
}
Wlseek( base + header.offset );
Wread( &num_entries, sizeof( num_entries ) );
for( i = 0; i < num_entries; ++i ) {
Wlseek( base + header.offset + 2 + i * sizeof( sst_dir_entry ) );
Wread( &sst_dir_entry, sizeof( sst_dir_entry ) );
Dump_header( &sst_dir_entry, cv_dir_entry_msg );
Wdputslc( "\n" );
dump_cv_subsection( base, &sst_dir_entry );
}
}
/*
* dump_hll - dump HLL data at offset 'base' from start of file
*/
static void dump_hll( unsigned_32 base )
/**************************************/
{
hll_trailer header;
hll_debug_dirinfo dir_info;
hll_debug_dir dir_entry;
int i;
Wlseek( base );
Wread( &header, sizeof( header ) );
if( memcmp( header.sig, HLL_NB04, HLL_SIG_SIZE ) != 0 ) {
return;
}
Wlseek( base + header.offset );
Wread( &dir_info, sizeof( dir_info ) );
Dump_header( &dir_info , hll_debug_dirinfo_msg );
Wdputslc( "\n" );
for( i = 0; i < dir_info.cDir; ++i ) {
Wlseek( base + header.offset + dir_info.cbDirHeader + i * dir_info.cbDirEntry );
Wread( &dir_entry, sizeof( dir_entry ) );
Dump_header( &dir_entry, hll_debug_dir_msg );
Wdputslc( "\n" );
dump_hll_subsection( base, &dir_entry );
}
}
/*
* Dmp_hll_head - dump IBM HLL or MS CodeView debugging information
*/
bool Dmp_hll_head( void )
/**********************/
{
off_t end_off;
off_t dbg_off;
hll_trailer trailer;
end_off = lseek( Handle, 0, SEEK_END );
Wlseek( end_off - sizeof( trailer ) );
Wread( &trailer, sizeof( trailer ) );
dbg_off = end_off - trailer.offset;
if( memcmp( trailer.sig, HLL_NB04, HLL_SIG_SIZE ) == 0 ) {
Banner( "HLL NB04 debugging information" );
Wdputs( "debugging information base = " );
Puthex( dbg_off, 8 );
Wdputslc( "H\n" );
Wdputs( "subsection directory offset = " );
Puthex( trailer.offset, 8 );
Wdputslc( "H\n\n" );
dump_hll( dbg_off );
return( 1 );
} else if( memcmp( trailer.sig, HLL_NB02, HLL_SIG_SIZE ) == 0 ) {
Banner( "CodeView NB02 debugging information" );
Wdputs( "debugging information base = " );
Puthex( dbg_off, 8 );
Wdputslc( "H\n" );
Wdputs( "subsection directory offset = " );
Puthex( trailer.offset, 8 );
Wdputslc( "H\n\n" );
dump_cv( dbg_off );
return( 1 );
}
return( 0 );
} /* Dmp_hll_head */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?