X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Faddr2line.c;h=846720fc81886dae7896c7aed38baeb49293c560;hb=1424c35d071e7d49a4a219c7dee8c88ffd60ddca;hp=008e62026e80bf5f961ca101c1a0ea9e67793f5d;hpb=bf2dd8d7cf4114b8a60dbb83b340f76b9b2474d1;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/addr2line.c b/binutils/addr2line.c index 008e62026e..846720fc81 100644 --- a/binutils/addr2line.c +++ b/binutils/addr2line.c @@ -1,5 +1,5 @@ /* addr2line.c -- convert addresses to line number and function name - Copyright (C) 1997-2018 Free Software Foundation, Inc. + Copyright (C) 1997-2020 Free Software Foundation, Inc. Contributed by Ulrich Lauther This file is part of GNU Binutils. @@ -45,6 +45,9 @@ 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. */ +/* Flags passed to the name demangler. */ +static int demangle_flags = DMGL_PARAMS | DMGL_ANSI; + static int naddr; /* Number of addresses to process. */ static char **addr; /* Hex addresses to process. */ @@ -59,6 +62,10 @@ static struct option long_options[] = {"functions", no_argument, NULL, 'f'}, {"inlines", no_argument, NULL, 'i'}, {"pretty-print", no_argument, NULL, 'p'}, + {"recurse-limit", no_argument, NULL, 'R'}, + {"recursion-limit", no_argument, NULL, 'R'}, + {"no-recurse-limit", no_argument, NULL, 'r'}, + {"no-recursion-limit", no_argument, NULL, 'r'}, {"section", required_argument, NULL, 'j'}, {"target", required_argument, NULL, 'b'}, {"help", no_argument, NULL, 'H'}, @@ -91,6 +98,8 @@ usage (FILE *stream, int status) -s --basenames Strip directory names\n\ -f --functions Show function names\n\ -C --demangle[=style] Demangle function names\n\ + -R --recurse-limit Enable a limit on recursion whilst demangling. [Default]\n\ + -r --no-recurse-limit Disable a limit on recursion whilst demangling\n\ -h --help Display this information\n\ -v --version Display the program's version\n\ \n")); @@ -173,14 +182,14 @@ find_address_in_section (bfd *abfd, asection *section, if (found) return; - if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0) + if ((bfd_section_flags (section) & SEC_ALLOC) == 0) return; - vma = bfd_get_section_vma (abfd, section); + vma = bfd_section_vma (section); if (pc < vma) return; - size = bfd_get_section_size (section); + size = bfd_section_size (section); if (pc >= vma + size) return; @@ -199,10 +208,10 @@ find_offset_in_section (bfd *abfd, asection *section) if (found) return; - if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0) + if ((bfd_section_flags (section) & SEC_ALLOC) == 0) return; - size = bfd_get_section_size (section); + size = bfd_section_size (section); if (pc >= size) return; @@ -289,7 +298,7 @@ translate_addresses (bfd *abfd, asection *section) name = "??"; else if (do_demangle) { - alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS); + alloc = bfd_demangle (abfd, name, demangle_flags); if (alloc != NULL) name = alloc; } @@ -305,8 +314,7 @@ translate_addresses (bfd *abfd, asection *section) else printf ("\n"); - if (alloc != NULL) - free (alloc); + free (alloc); } if (base_names && filename != NULL) @@ -401,11 +409,8 @@ process_file (const char *file_name, const char *section_name, translate_addresses (abfd, section); - if (syms != NULL) - { - free (syms); - syms = NULL; - } + free (syms); + syms = NULL; bfd_close (abfd); @@ -442,7 +447,7 @@ main (int argc, char **argv) file_name = NULL; section_name = NULL; target = NULL; - while ((c = getopt_long (argc, argv, "ab:Ce:sfHhij:pVv", long_options, (int *) 0)) + while ((c = getopt_long (argc, argv, "ab:Ce:rRsfHhij:pVv", long_options, (int *) 0)) != EOF) { switch (c) @@ -469,6 +474,12 @@ main (int argc, char **argv) cplus_demangle_set_style (style); } break; + case 'r': + demangle_flags |= DMGL_NO_RECURSE_LIMIT; + break; + case 'R': + demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT; + break; case 'e': file_name = optarg; break;