Index: doc/gdb.texinfo =================================================================== RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v retrieving revision 1.120 diff -u -3 -r1.120 gdb.texinfo --- doc/gdb.texinfo 5 Sep 2002 12:13:08 -0000 1.120 +++ doc/gdb.texinfo 5 Sep 2002 21:01:23 -0000 @@ -4362,6 +4362,13 @@ can set @var{instruction-set} to either @code{intel} or @code{att}. The default is @code{att}, the AT&T flavor used by default by Unix assemblers for x86-based targets. + +@kindex maint info lines +@item maint info lines +This command takes same parameters as @code{disassemble}, but only +dumps an @code{@var{address}:@var{line}} pairs. Every pair means: ``from this +@var{address} forward, the code was generated by that @var{line}''. + @end table Index: printcmd.c =================================================================== RCS file: /cvs/src/src/gdb/printcmd.c,v retrieving revision 1.40 diff -u -3 -r1.40 printcmd.c --- printcmd.c 11 Jul 2002 20:46:19 -0000 1.40 +++ printcmd.c 5 Sep 2002 21:01:23 -0000 @@ -2390,6 +2390,75 @@ } +/* + Print range as 'Address:Line' pairs. This command might be usefull + to associate sources and assembly commands. +*/ + +static void +maintenance_info_lines (char *arg, int from_tty) +{ + CORE_ADDR low, high; + { + char *name; + CORE_ADDR pc, pc_masked; + char *space_index; + name = NULL; + if (!arg) + { + if (!selected_frame) + error ("No frame selected.\n"); + + pc = get_frame_pc (selected_frame); + if (find_pc_partial_function (pc, &name, &low, &high) == 0) + error ("No function contains program counter for selected frame.\n"); + + low += FUNCTION_START_OFFSET; + } + else if (!(space_index = (char *) strchr (arg, ' '))) + { + /* One argument. */ + pc = parse_and_eval_address (arg); + if (find_pc_partial_function (pc, &name, &low, &high) == 0) + error ("No function contains specified address.\n"); + low += FUNCTION_START_OFFSET; + } + else + { + /* Two arguments. */ + *space_index = '\0'; + low = parse_and_eval_address (arg); + high = parse_and_eval_address (space_index + 1); + } + } + /* OK, we got the low-high range, what now? */ + { + struct symtab *symtab ; + struct linetable_entry *le ; + int i, nitems ; + symtab = find_pc_symtab (low ) ; + if (symtab && symtab->linetable) + { + + le = symtab->linetable->item ; + nitems = symtab->linetable->nitems ; + + /* skip to low */ + for (i = 0 ; + (i < nitems - 1) && (le[i + 1].pc < low) ; + i++ ) ; + + /* and print all the way to high */ + for (; (i < nitems -1) && (le[i].pc <= high); i++ ) + { + if (le[i].pc != le[i+1].pc ) + /* optimized line ? */ + printf_filtered ("0x%08x:%d\n", (unsigned) le[i].pc, le[i].line ) ; + } + } + } +} + void _initialize_printcmd (void) { @@ -2568,5 +2637,11 @@ examine_h_type = init_type (TYPE_CODE_INT, 2, 0, "examine_h_type", NULL); examine_w_type = init_type (TYPE_CODE_INT, 4, 0, "examine_w_type", NULL); examine_g_type = init_type (TYPE_CODE_INT, 8, 0, "examine_g_type", NULL); + add_cmd ( "lines", class_maintenance, maintenance_info_lines, + concat ("Dump a line-address table a specified section of memory.\n\ +Default is the function surrounding the pc of the selected frame.\n\ +With a single argument, the function surrounding that address is dumped.\n\ +Two arguments are taken as a range of memory to dump.", NULL ), + &maintenanceinfolist) ; }