[PATCH][gdb] Print user/includes fields for maint commands
Simon Marchi
simark@simark.ca
Tue Mar 24 22:41:54 GMT 2020
On 2020-03-24 6:28 p.m., Tom de Vries wrote:
> On 24-03-2020 18:04, Simon Marchi wrote:
>
> Hi,
>
> thanks for the review, I've followed up on all the comments.
>
> Updated patch attached below.
>
> Thanks,
> - Tom
>
>
> 0001-gdb-Print-user-includes-fields-for-maint-commands.patch
>
> [gdb] Print user/includes fields for maint commands
>
> The type struct compunit_symtab contains two fields (disregarding field next)
> that express relations with other compunit_symtabs: user and includes.
>
> These fields are currently not printed with "maint info symtabs" and
> "maint print symbols".
>
> Fix this such that for "maint info symtabs" we print:
> ...
> { ((struct compunit_symtab *) 0x23e8450)
> debugformat DWARF 2
> producer (null)
> dirname (null)
> blockvector ((struct blockvector *) 0x23e8590)
> + user ((struct compunit_symtab *) 0x2336280)
> + ( includes
> + ((struct compunit_symtab *) 0x23e85e0)
> + ((struct compunit_symtab *) 0x23e8960)
> + )
> { symtab <unknown> ((struct symtab *) 0x23e85b0)
> fullname (null)
> linetable ((struct linetable *) 0x0)
> }
> }
> ...
>
> And for "maint print symbols" we print:
> ...
> -Symtab for file <unknown>
> +Symtab for file <unknown> at 0x23e85b0
> Read from object file /data/gdb_versions/devel/a.out (0x233ccf0)
> Language: c
>
> Blockvector:
>
> block #000, object at 0x23e8530, 0 syms/buckets in 0x0..0x0
> block #001, object at 0x23e84d0 under 0x23e8530, 0 syms/buckets in 0x0..0x0
>
> +Compunit user: 0x2336300
> +Compunit include: 0x23e8900
> +Compunit include: 0x23dd970
> ...
> Note: for user and includes we don't list the actual compunit_symtab address,
> but instead the corresponding symtab address, which allows us to find that
> symtab elsewhere in the output (given that we also now print the address of
> symtabs).
>
> gdb/ChangeLog:
>
> 2020-03-24 Tom de Vries <tdevries@suse.de>
>
> * symtab.h (is_main_symtab_of_compunit_symtab): New function.
> * symmisc.c (dump_symtab_1): Print user and includes fields.
> (maintenance_info_symtabs): Same.
>
> ---
> gdb/symmisc.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++---
> gdb/symtab.h | 7 +++++++
> 2 files changed, 56 insertions(+), 3 deletions(-)
>
> diff --git a/gdb/symmisc.c b/gdb/symmisc.c
> index 3df526bddb..6ee1b5edfd 100644
> --- a/gdb/symmisc.c
> +++ b/gdb/symmisc.c
> @@ -279,8 +279,10 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile)
> const struct block *b;
> int depth;
>
> - fprintf_filtered (outfile, "\nSymtab for file %s\n",
> - symtab_to_filename_for_display (symtab));
> + fprintf_filtered (outfile, "\nSymtab for file %s at %s\n",
> + symtab_to_filename_for_display (symtab),
> + host_address_to_string (symtab));
> +
> if (SYMTAB_DIRNAME (symtab) != NULL)
> fprintf_filtered (outfile, "Compilation directory is %s\n",
> SYMTAB_DIRNAME (symtab));
> @@ -308,7 +310,7 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile)
> }
> /* Now print the block info, but only for compunit symtabs since we will
> print lots of duplicate info otherwise. */
> - if (symtab == COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab)))
> + if (is_main_symtab_of_compunit_symtab (symtab))
> {
> fprintf_filtered (outfile, "\nBlockvector:\n\n");
> bv = SYMTAB_BLOCKVECTOR (symtab);
> @@ -371,6 +373,28 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile)
> "\nBlockvector same as owning compunit: %s\n\n",
> compunit_filename);
> }
> +
> + if (is_main_symtab_of_compunit_symtab (symtab))
> + {
Hmm, if this is the exact same condition as the previous `if`, what's the point of
having a separate `if`?
Now that I read this code a bit more, I realize that it's written in this way because
it dates from the time where there wasn't a distinction between compunit_symtabs and
symtabs. Nowadays, it would probably be preferable to print the compunit_symtab
information at some level higher, in maintenance_print_symbols. If you want to take the
time to do things right, you can try do to that, otherwise I'm also fine with this
patch (one the question above about the `if` is answered).
Simon
More information about the Gdb-patches
mailing list