This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [RFA] new command: 'maintenance info lines'
- From: Michael Snyder <msnyder at redhat dot com>
- To: Josef Ezra <jezra at emc dot com>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Tue, 18 Jun 2002 14:19:09 -0700
- Subject: Re: [RFA] new command: 'maintenance info lines'
- Organization: Red Hat, Inc.
- References: <02ea01c1e6eb$65f850c0$ad219fa8@lss.emc.com> <3CBEFC88.37807AEF@redhat.com> <3D08D15E.7030805@emc.com> <3D08DB87.A8119A1D@redhat.com> <3D0E39E6.5060701@emc.com>
Josef Ezra wrote:
>
> Michael Snyder wrote:
> >
> > I like it as maybe a maintainer command (or even a user one, if
> > you think users might gain something from it.
> >
> > I don't like the name, though -- "info orientation" doesn't say
> > anything to me. Maybe "info lines"? Or, as a maintainer command,
> > "info sal"?
> >
>
> Following the line of 'maintenance info breakpoints / sections /
> sol-threads' commands, I'd like to suggest 'maintenance info lines' for
> this line-address dump.
Works for me.
>
> - jezra
>
> * printcmd.c (maintenance_info_lines): created
> (_initialize_printcmd): add command
>
> ------------------------------------------------------------------------
> 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) ;
>
> }