diff options
author | Tristan Gingold <gingold@adacore.com> | 2009-12-10 16:12:33 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2009-12-10 16:12:33 +0000 |
commit | 68cdf72f1e56a9ff8261c8236dad44ea1e572aca (patch) | |
tree | 3bfca48c3136aef159a1f20af53f5ca3996823b1 /binutils/addr2line.c | |
parent | e7e2196da3f0157573acc1b4fa2f7a87da9f044f (diff) | |
download | gdb-68cdf72f1e56a9ff8261c8236dad44ea1e572aca.zip gdb-68cdf72f1e56a9ff8261c8236dad44ea1e572aca.tar.gz gdb-68cdf72f1e56a9ff8261c8236dad44ea1e572aca.tar.bz2 |
2009-12-10 Tristan Gingold <gingold@adacore.com>
* addr2line.c (pretty_print): New variable.
(long_options): Add an entry for -p/--pretty-print.
(usage): Document -p/--pretty-print.
(translate_addresses): Handle pretty_print. Reindent.
(main): Handle option -p.
* doc/binutils.texi (addr2line): Document -p/--pretty-print.
* NEWS: Mention new feature.
Diffstat (limited to 'binutils/addr2line.c')
-rw-r--r-- | binutils/addr2line.c | 98 |
1 files changed, 58 insertions, 40 deletions
diff --git a/binutils/addr2line.c b/binutils/addr2line.c index 2ecdbfa..b49c43a 100644 --- a/binutils/addr2line.c +++ b/binutils/addr2line.c @@ -42,6 +42,7 @@ static bfd_boolean unwind_inlines; /* -i, unwind inlined functions. */ static bfd_boolean with_addresses; /* -a, show addresses. */ static bfd_boolean with_functions; /* -f, show function names. */ static bfd_boolean do_demangle; /* -C, demangle names. */ +static bfd_boolean pretty_print; /* -p, print on one line. */ static bfd_boolean base_names; /* -s, strip directory names. */ static int naddr; /* Number of addresses to process. */ @@ -57,6 +58,7 @@ static struct option long_options[] = {"exe", required_argument, NULL, 'e'}, {"functions", no_argument, NULL, 'f'}, {"inlines", no_argument, NULL, 'i'}, + {"pretty-print", no_argument, NULL, 'p'}, {"section", required_argument, NULL, 'j'}, {"target", required_argument, NULL, 'b'}, {"help", no_argument, NULL, 'H'}, @@ -85,6 +87,7 @@ usage (FILE *stream, int status) -e --exe=<executable> Set the input file name (default is a.out)\n\ -i --inlines Unwind inlined functions\n\ -j --section=<name> Read section-relative offsets instead of addresses\n\ + -p --pretty-print Make the output easier to read for humans\n\ -s --basenames Strip directory names\n\ -f --functions Show function names\n\ -C --demangle[=style] Demangle function names\n\ @@ -216,7 +219,11 @@ translate_addresses (bfd *abfd, asection *section) { printf ("0x"); bfd_printf_vma (abfd, pc); - printf ("\n"); + + if (pretty_print) + printf (": "); + else + printf ("\n"); } found = FALSE; @@ -233,44 +240,52 @@ translate_addresses (bfd *abfd, asection *section) } else { - do { - if (with_functions) - { - const char *name; - char *alloc = NULL; - - name = functionname; - if (name == NULL || *name == '\0') - name = "??"; - else if (do_demangle) - { - alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS); - if (alloc != NULL) - name = alloc; - } - - printf ("%s\n", name); - - if (alloc != NULL) - free (alloc); - } - - if (base_names && filename != NULL) - { - char *h; - - h = strrchr (filename, '/'); - if (h != NULL) - filename = h + 1; - } - - printf ("%s:%u\n", filename ? filename : "??", line); - if (!unwind_inlines) - found = FALSE; - else - found = bfd_find_inliner_info (abfd, &filename, &functionname, &line); - } while (found); - + while (1) + { + if (with_functions) + { + const char *name; + char *alloc = NULL; + + name = functionname; + if (name == NULL || *name == '\0') + name = "??"; + else if (do_demangle) + { + alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS); + if (alloc != NULL) + name = alloc; + } + + printf ("%s", name); + if (pretty_print) + printf (_(" at ")); + else + printf ("\n"); + + if (alloc != NULL) + free (alloc); + } + + if (base_names && filename != NULL) + { + char *h; + + h = strrchr (filename, '/'); + if (h != NULL) + filename = h + 1; + } + + printf ("%s:%u\n", filename ? filename : "??", line); + if (!unwind_inlines) + found = FALSE; + else + found = bfd_find_inliner_info (abfd, &filename, &functionname, &line); + if (! found) + break; + if (pretty_print) + printf (_(" (inlined by) ")); + } } /* fflush() is essential for using this command as a server @@ -364,7 +379,7 @@ main (int argc, char **argv) file_name = NULL; section_name = NULL; target = NULL; - while ((c = getopt_long (argc, argv, "ab:Ce:sfHhij:Vv", long_options, (int *) 0)) + while ((c = getopt_long (argc, argv, "ab:Ce:sfHhij:pVv", long_options, (int *) 0)) != EOF) { switch (c) @@ -400,6 +415,9 @@ main (int argc, char **argv) case 'f': with_functions = TRUE; break; + case 'p': + pretty_print = TRUE; + break; case 'v': case 'V': print_version ("addr2line"); |