Index: printcmd.c =================================================================== RCS file: /cvs/src/src/gdb/printcmd.c,v retrieving revision 1.39 diff -u -5 -r1.39 printcmd.c --- printcmd.c 11 May 2002 23:48:23 -0000 1.39 +++ printcmd.c 17 Jun 2002 18:36:58 -0000 @@ -2383,10 +2383,79 @@ return TARGET_PRINT_INSN (memaddr, TARGET_PRINT_INSN_INFO); } +/* + 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) { struct cmd_list_element *c; @@ -2561,7 +2630,13 @@ examine_b_type = init_type (TYPE_CODE_INT, 1, 0, "examine_b_type", NULL); 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) ; }