X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Faddr2line.c;h=8a77c473badc9950bff4c363a3415589d61c222d;hb=92434a14b97bf07546701613a16aaf4d8a3b3eca;hp=bf396e3f9b93db95e3fe6134306592fa6ba280f5;hpb=6f2750feaf2827ef8a1a0a5b2f90c1e9a6cabbd1;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/addr2line.c b/binutils/addr2line.c index bf396e3f9b..8a77c473ba 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-2016 Free Software Foundation, Inc. + Copyright (C) 1997-2019 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")); @@ -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; } @@ -435,13 +444,14 @@ main (int argc, char **argv) expandargv (&argc, &argv); - bfd_init (); + if (bfd_init () != BFD_INIT_MAGIC) + fatal (_("fatal error: libbfd ABI mismatch")); set_default_bfd_target (); 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) @@ -468,6 +478,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;