]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - binutils/addr2line.c
Updated soruces in binutils/* to compile cleanly with -Wc++-compat.
[thirdparty/binutils-gdb.git] / binutils / addr2line.c
index 7cd67bc0a1b08e1b742537d4bf80c3f09f4849c0..542566455450ab3c4df1436704983b7a29884d43 100644 (file)
@@ -1,13 +1,13 @@
 /* addr2line.c -- convert addresses to line number and function name
-   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006
-   Free Software Foundation, Inc.
+   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+   2007, 2009  Free Software Foundation, Inc.
    Contributed by Ulrich Lauther <Ulrich.Lauther@mchp.siemens.de>
 
    This file is part of GNU Binutils.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -17,7 +17,9 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+   Foundation, 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
 
 /* Derived from objdump.c and nm.c by Ulrich.Lauther@mchp.siemens.de
 
    both forms write results to stdout, the second form reads addresses
    to be converted from stdin.  */
 
-#include "config.h"
-#include <string.h>
-
+#include "sysdep.h"
 #include "bfd.h"
 #include "getopt.h"
 #include "libiberty.h"
 #include "demangle.h"
 #include "bucomm.h"
-#include "budemang.h"
 
 static bfd_boolean unwind_inlines;     /* -i, unwind inlined functions. */
 static bfd_boolean with_functions;     /* -f, show function names.  */
@@ -68,7 +67,6 @@ static void slurp_symtab (bfd *);
 static void find_address_in_section (bfd *, asection *, void *);
 static void find_offset_in_section (bfd *, asection *);
 static void translate_addresses (bfd *, asection *);
-static void process_file (const char *, const char *, const char *);
 \f
 /* Print a usage message to STREAM and exit with STATUS.  */
 
@@ -92,7 +90,7 @@ usage (FILE *stream, int status)
 \n"));
 
   list_supported_targets (program_name, stream);
-  if (status == 0)
+  if (REPORT_BUGS_TO[0] && status == 0)
     fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
   exit (status);
 }
@@ -104,13 +102,14 @@ slurp_symtab (bfd *abfd)
 {
   long symcount;
   unsigned int size;
+  void *minisyms = &syms;
 
   if ((bfd_get_file_flags (abfd) & HAS_SYMS) == 0)
     return;
 
-  symcount = bfd_read_minisymbols (abfd, FALSE, (void *) &syms, &size);
+  symcount = bfd_read_minisymbols (abfd, FALSE, &minisyms, &size);
   if (symcount == 0)
-    symcount = bfd_read_minisymbols (abfd, TRUE /* dynamic */, (void *) &syms, &size);
+    symcount = bfd_read_minisymbols (abfd, TRUE /* dynamic */, &minisyms, &size);
 
   if (symcount < 0)
     bfd_fatal (bfd_get_filename (abfd));
@@ -225,8 +224,9 @@ translate_addresses (bfd *abfd, asection *section)
                  name = "??";
                else if (do_demangle)
                  {
-                   alloc = demangle (abfd, name);
-                   name = alloc;
+                   alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
+                   if (alloc != NULL)
+                     name = alloc;
                  }
 
                printf ("%s\n", name);
@@ -261,9 +261,9 @@ translate_addresses (bfd *abfd, asection *section)
     }
 }
 
-/* Process a file.  */
+/* Process a file.  Returns an exit value for main().  */
 
-static void
+static int
 process_file (const char *file_name, const char *section_name,
              const char *target)
 {
@@ -272,7 +272,7 @@ process_file (const char *file_name, const char *section_name,
   char **matching;
 
   if (get_file_size (file_name) < 1)
-    return;
+    return 1;
 
   abfd = bfd_openr (file_name, target);
   if (abfd == NULL)
@@ -312,6 +312,8 @@ process_file (const char *file_name, const char *section_name,
     }
 
   bfd_close (abfd);
+
+  return 0;
 }
 \f
 int
@@ -401,7 +403,5 @@ main (int argc, char **argv)
   addr = argv + optind;
   naddr = argc - optind;
 
-  process_file (file_name, section_name, target);
-
-  return 0;
+  return process_file (file_name, section_name, target);
 }