From 5dbccdbeba148960ff97a96088894ec46add70c6 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sun, 28 Jun 2009 14:48:02 -0700 Subject: readelf: Add -N option, speeds up DWARF printing without address->name lookups. --- src/ChangeLog | 6 ++++++ src/readelf.c | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/ChangeLog b/src/ChangeLog index f74b31d5..a1078ab6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2009-06-28 Roland McGrath + + * readelf.c (print_address_names): New static variable. + (options, parse_opt): Grok -N/--numeric-addresses to clear it. + (format_dwarf_addr): Don't look up name if !print_address_names. + 2009-06-13 Ulrich Drepper * ldgeneric.c: Don't use deprecated libelf functions. diff --git a/src/readelf.c b/src/readelf.c index ca9772e4..2ab2ab58 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -100,6 +100,8 @@ static const struct argp_option options[] = 0 }, { NULL, 0, NULL, 0, N_("Output control:"), 0 }, + { "numeric-addresses", 'N', NULL, 0, + N_("Do not find symbol names for addresses in DWARF data"), 0 }, { NULL, 0, NULL, 0, NULL, 0 } }; @@ -165,6 +167,9 @@ static bool print_archive_index; /* True if any of the control options except print_archive_index is set. */ static bool any_control_option; +/* True if we should print addresses from DWARF in symbolic form. */ +static bool print_address_names = true; + /* Select printing of debugging sections. */ static enum section_e { @@ -406,6 +411,9 @@ parse_opt (int key, char *arg, add_dump_section (arg); any_control_option = true; break; + case 'N': + print_address_names = false; + break; case ARGP_KEY_NO_ARGS: fputs (gettext ("Missing file name.\n"), stderr); goto do_argp_help; @@ -3061,7 +3069,8 @@ format_dwarf_addr (Dwfl_Module *dwflmod, { /* See if there is a name we can give for this address. */ GElf_Sym sym; - const char *name = dwfl_module_addrsym (dwflmod, address, &sym, NULL); + const char *name = print_address_names + ? dwfl_module_addrsym (dwflmod, address, &sym, NULL) : NULL; if (name != NULL) sym.st_value = address - sym.st_value; -- cgit v1.2.3 From 86b6dd408847a6fe651aaed75f3a9c8bc0f670f2 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sun, 28 Jun 2009 18:51:38 -0700 Subject: Use a separate tracker for subtree comparisons inside reference_match. --- src/dwarfcmp.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/dwarfcmp.cc b/src/dwarfcmp.cc index ecadfd52..c779fc49 100644 --- a/src/dwarfcmp.cc +++ b/src/dwarfcmp.cc @@ -128,6 +128,7 @@ template struct talker : public dwarf_ref_tracker { typedef dwarf_tracker_base _base; + typedef dwarf_ref_tracker _tracker; typedef typename _base::cu1 cu1; typedef typename _base::cu2 cu2; typedef typename _base::die1 die1; @@ -138,7 +139,17 @@ struct talker : public dwarf_ref_tracker const typename dwarf1::debug_info_entry *a_; const typename dwarf2::debug_info_entry *b_; - inline talker () : a_ (NULL), b_ (NULL) {} + inline talker () + : a_ (NULL), b_ (NULL) + {} + + inline talker (const talker &proto, + const typename _tracker::left_context_type &l, const die1 &a, + const typename _tracker::right_context_type &r, const die2 &b) + : _tracker (static_cast (proto), l, a, r, b), + a_ (NULL), b_ (NULL) + { + } inline ostream &location () const { -- cgit v1.2.3 From 0dd9f27d6c68a147de29ade2eade4b4c29fe7bc3 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 1 Jul 2009 20:06:17 -0700 Subject: Major revamp of ref tracker for efficiency and to handle circular reference chains. --- src/ChangeLog | 4 ++++ src/dwarfcmp.cc | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/ChangeLog b/src/ChangeLog index 65dff1bc..190a33d7 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2009-07-01 Roland McGrath + + * dwarfcmp.cc (talker): Update constructor parameters. + 2009-06-19 Roland McGrath * dwarfcmp.cc: Revamp using dwarf_comparator. diff --git a/src/dwarfcmp.cc b/src/dwarfcmp.cc index c779fc49..4deff59d 100644 --- a/src/dwarfcmp.cc +++ b/src/dwarfcmp.cc @@ -143,10 +143,10 @@ struct talker : public dwarf_ref_tracker : a_ (NULL), b_ (NULL) {} - inline talker (const talker &proto, + inline talker (const talker &proto, typename _tracker::reference_match &m, const typename _tracker::left_context_type &l, const die1 &a, const typename _tracker::right_context_type &r, const die2 &b) - : _tracker (static_cast (proto), l, a, r, b), + : _tracker (static_cast (proto), m, l, a, r, b), a_ (NULL), b_ (NULL) { } -- cgit v1.2.3 From 0bce6cec0568c7aa36c8e5998cb2fd709f3ee1de Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 1 Jul 2009 22:25:13 -0700 Subject: Rejigger dwarf_data constructors. --- src/dwarfcmp.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/dwarfcmp.cc b/src/dwarfcmp.cc index e29d2d8c..677a5beb 100644 --- a/src/dwarfcmp.cc +++ b/src/dwarfcmp.cc @@ -325,8 +325,10 @@ main (int argc, char *argv[]) if (test_writer) { - dwarf_edit edit1 (file1); - dwarf_edit edit2 (file2); + dwarf_ref_tracker t1; + dwarf_ref_tracker t2; + dwarf_edit edit1 (file1, &t1); + dwarf_edit edit2 (file2, &t2); test_classes (file1, file2, edit1, edit2, same); { -- cgit v1.2.3