示例#1
0
/*
 * 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 */
示例#2
0
/* 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);
}