/* * 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 */
/* Current flags: * 1 - do disassembly * 2 - dump line number table */ void dump_prog (program_t * prog, const char * fn, int flags) { const char *fname; FILE *f; int i, j; int num_funcs_total; fname = check_valid_path(fn, current_object, "dumpallobj", 1); if (!fname) { error("Invalid path '%s' for writing.\n", fn); return; } f = fopen(fname, "w"); if (!f) { error("Unable to open '/%s' for writing.\n", fname); return; } fprintf(f, "NAME: /%s\n", prog->filename); fprintf(f, "INHERITS:\n"); fprintf(f, "\tname fio vio\n"); fprintf(f, "\t---------------- --- ---\n"); for (i = 0; i < prog->num_inherited; i++) fprintf(f, "\t%-20s %5d %5d\n", prog->inherit[i].prog->filename, prog->inherit[i].function_index_offset, prog->inherit[i].variable_index_offset ); fprintf(f, "PROGRAM:"); for (i = 0; i < prog->program_size; i++) { if (i % 16 == 0) fprintf(f, "\n\t%04x: ", (unsigned int) i); fprintf(f, "%02d ", (unsigned char) prog->program[i]); } fputc('\n', f); fprintf(f, "FUNCTIONS:\n"); fprintf(f, " name offset flags fio # locals # args\n"); fprintf(f, " --------------------- ------ ------- --- -------- ------\n"); num_funcs_total = prog->last_inherited + prog->num_functions_defined; for (i = 0; i < num_funcs_total; i++) { char sflags[8]; int flags; int runtime_index; function_t *func_entry = find_func_entry(prog, i); register int low, high, mid; flags = prog->function_flags[i]; if (flags & FUNC_ALIAS) { runtime_index = flags & ~FUNC_ALIAS; sflags[4] = 'a'; } else { runtime_index = i; sflags[4] = '-'; } flags = prog->function_flags[runtime_index]; sflags[0] = (flags & FUNC_INHERITED) ? 'i' : '-'; sflags[1] = (flags & FUNC_UNDEFINED) ? 'u' : '-'; sflags[2] = (flags & FUNC_STRICT_TYPES) ? 's' : '-'; sflags[3] = (flags & FUNC_PROTOTYPE) ? 'p' : '-'; sflags[5] = (flags & FUNC_TRUE_VARARGS) ? 'V' : '-'; sflags[6] = (flags & FUNC_VARARGS) ? 'v' : '-'; sflags[7] = '\0'; if (flags & FUNC_INHERITED) { low = 0; high = prog->num_inherited - 1; while (high > low) { mid = (low + high + 1)/2; if (prog->inherit[mid].function_index_offset > runtime_index) high = mid -1; else low = mid; } fprintf(f, "%4d: %-20s %5d %7s %5d\n", i, func_entry->funcname, low, sflags, runtime_index - prog->inherit[low].function_index_offset); } else { fprintf(f, "%4d: %-20s %5d %7s %7d %5d\n", i, func_entry->funcname, runtime_index - prog->last_inherited ,sflags, func_entry->num_arg, func_entry->num_local); } } fprintf(f, "VARIABLES:\n"); for (i = 0; i < prog->num_variables_defined; i++) fprintf(f, "%4d: %-12s\n", i, prog->variable_table[i]); fprintf(f, "STRINGS:\n"); for (i = 0; i < prog->num_strings; i++) { fprintf(f, "%4d: ", i); for (j = 0; j < 32; j++) { char c; if (!(c = prog->strings[i][j])) break; else if (c == '\n') fprintf(f, "\\n"); else fputc(c, f); } fputc('\n', f); } if (flags & 1) { fprintf(f, "\n;;; *** Disassembly ***\n"); disassemble(f, prog->program, 0, prog->program_size, prog); } if (flags & 2) { fprintf(f, "\n;;; *** Line Number Info ***\n"); dump_line_numbers(f, prog); } fclose(f); }