Make host_address_to_string/gdb_print_host_address cast parameter to 'void *'
[deliverable/binutils-gdb.git] / ld / ldmisc.c
index bdae82e4ae90c8adb2f715ae4d4c8aa2fa67ff6d..465992157816ca850077fe9d597b254a93e374f6 100644 (file)
@@ -1,7 +1,5 @@
 /* ldmisc.c
 /* ldmisc.c
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-   Free Software Foundation, Inc.
+   Copyright (C) 1991-2015 Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support.
 
    This file is part of the GNU Binutils.
    Written by Steve Chamberlain of Cygnus Support.
 
    This file is part of the GNU Binutils.
@@ -25,6 +23,7 @@
 #include "bfd.h"
 #include "bfdlink.h"
 #include "libiberty.h"
 #include "bfd.h"
 #include "bfdlink.h"
 #include "libiberty.h"
+#include "filenames.h"
 #include "demangle.h"
 #include <stdarg.h>
 #include "ld.h"
 #include "demangle.h"
 #include <stdarg.h>
 #include "ld.h"
@@ -36,6 +35,7 @@
 #include "ldmain.h"
 #include "ldfile.h"
 #include "elf-bfd.h"
 #include "ldmain.h"
 #include "ldfile.h"
 #include "elf-bfd.h"
+#include "coff-bfd.h"
 
 /*
  %% literal %
 
 /*
  %% literal %
  %E current bfd error or errno
  %F error is fatal
  %G like %D, but only function name
  %E current bfd error or errno
  %F error is fatal
  %G like %D, but only function name
+ %H like %C but in addition emit section+offset
  %I filename from a lang_input_statement_type
  %P print program name
  %R info about a relent
  %I filename from a lang_input_statement_type
  %P print program name
  %R info about a relent
- %S print script file and linenumber
+ %S print script file and linenumber from etree_type.
  %T symbol name
  %V hex bfd_vma
  %W hex bfd_vma with 0x with no leading zeros taking up 8 spaces
  %T symbol name
  %V hex bfd_vma
  %W hex bfd_vma with 0x with no leading zeros taking up 8 spaces
  %d integer, like printf
  %ld long, like printf
  %lu unsigned long, like printf
  %d integer, like printf
  %ld long, like printf
  %lu unsigned long, like printf
+ %p native (host) void* pointer, like printf
  %s arbitrary string, like printf
  %u integer, like printf
  %v hex bfd_vma, no leading zeros
 */
 
  %s arbitrary string, like printf
  %u integer, like printf
  %v hex bfd_vma, no leading zeros
 */
 
-static void
+void
 vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
 {
   bfd_boolean fatal = FALSE;
 
   while (*fmt != '\0')
     {
 vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
 {
   bfd_boolean fatal = FALSE;
 
   while (*fmt != '\0')
     {
+      const char *str = fmt;
       while (*fmt != '%' && *fmt != '\0')
       while (*fmt != '%' && *fmt != '\0')
-       {
-         putc (*fmt, fp);
-         fmt++;
-       }
+       fmt++;
+      if (fmt != str)
+       if (fwrite (str, 1, fmt - str, fp))
+         {
+           /* Ignore.  */
+         }
 
       if (*fmt == '%')
        {
 
       if (*fmt == '%')
        {
@@ -230,19 +235,26 @@ vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
                           bfd_get_filename (bfd_my_archive (i->the_bfd)));
                fprintf (fp, "%s", i->local_sym_name);
                if (bfd_my_archive (i->the_bfd) == NULL
                           bfd_get_filename (bfd_my_archive (i->the_bfd)));
                fprintf (fp, "%s", i->local_sym_name);
                if (bfd_my_archive (i->the_bfd) == NULL
-                   && strcmp (i->local_sym_name, i->filename) != 0)
+                   && filename_cmp (i->local_sym_name, i->filename) != 0)
                  fprintf (fp, " (%s)", i->filename);
              }
              break;
 
            case 'S':
              /* Print script file and linenumber.  */
                  fprintf (fp, " (%s)", i->filename);
              }
              break;
 
            case 'S':
              /* Print script file and linenumber.  */
-             if (parsing_defsym)
-               fprintf (fp, "--defsym %s", lex_string);
-             else if (ldfile_input_filename != NULL)
-               fprintf (fp, "%s:%u", ldfile_input_filename, lineno);
-             else
-               fprintf (fp, _("built in linker script:%u"), lineno);
+             {
+               etree_type node;
+               etree_type *tp = va_arg (arg, etree_type *);
+
+               if (tp == NULL)
+                 {
+                   tp = &node;
+                   tp->type.filename = ldlex_filename ();
+                   tp->type.lineno = lineno;
+                 }
+               if (tp->type.filename != NULL)
+                 fprintf (fp, "%s:%u", tp->type.filename, tp->type.lineno);
+             }
              break;
 
            case 'R':
              break;
 
            case 'R':
@@ -260,6 +272,7 @@ vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
            case 'C':
            case 'D':
            case 'G':
            case 'C':
            case 'D':
            case 'G':
+           case 'H':
              /* Clever filename:linenumber with function name if possible.
                 The arguments are a BFD, a section, and an offset.  */
              {
              /* Clever filename:linenumber with function name if possible.
                 The arguments are a BFD, a section, and an offset.  */
              {
@@ -269,63 +282,41 @@ vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
                bfd *abfd;
                asection *section;
                bfd_vma offset;
                bfd *abfd;
                asection *section;
                bfd_vma offset;
-               lang_input_statement_type *entry;
-               asymbol **asymbols;
+               asymbol **asymbols = NULL;
                const char *filename;
                const char *functionname;
                unsigned int linenumber;
                bfd_boolean discard_last;
                const char *filename;
                const char *functionname;
                unsigned int linenumber;
                bfd_boolean discard_last;
+               bfd_boolean done;
 
                abfd = va_arg (arg, bfd *);
                section = va_arg (arg, asection *);
                offset = va_arg (arg, bfd_vma);
 
 
                abfd = va_arg (arg, bfd *);
                section = va_arg (arg, asection *);
                offset = va_arg (arg, bfd_vma);
 
-               if (abfd == NULL)
+               if (abfd != NULL)
                  {
                  {
-                   entry = NULL;
-                   asymbols = NULL;
-                 }
-               else
-                 {
-                   entry = (lang_input_statement_type *) abfd->usrdata;
-                   if (entry != (lang_input_statement_type *) NULL
-                       && entry->asymbols != (asymbol **) NULL)
-                     asymbols = entry->asymbols;
-                   else
-                     {
-                       long symsize;
-                       long sym_count;
-
-                       symsize = bfd_get_symtab_upper_bound (abfd);
-                       if (symsize < 0)
-                         einfo (_("%B%F: could not read symbols\n"), abfd);
-                       asymbols = xmalloc (symsize);
-                       sym_count = bfd_canonicalize_symtab (abfd, asymbols);
-                       if (sym_count < 0)
-                         einfo (_("%B%F: could not read symbols\n"), abfd);
-                       if (entry != (lang_input_statement_type *) NULL)
-                         {
-                           entry->asymbols = asymbols;
-                           entry->symbol_count = sym_count;
-                         }
-                     }
+                   if (!bfd_generic_link_read_symbols (abfd))
+                     einfo (_("%B%F: could not read symbols: %E\n"), abfd);
+
+                   asymbols = bfd_get_outsymbols (abfd);
                  }
 
                /* The GNU Coding Standard requires that error messages
                   be of the form:
                  }
 
                /* The GNU Coding Standard requires that error messages
                   be of the form:
-                  
+
                     source-file-name:lineno: message
 
                   We do not always have a line number available so if
                   we cannot find them we print out the section name and
                     source-file-name:lineno: message
 
                   We do not always have a line number available so if
                   we cannot find them we print out the section name and
-                  offset instread.  */
+                  offset instead.  */
                discard_last = TRUE;
                if (abfd != NULL
                    && bfd_find_nearest_line (abfd, section, asymbols, offset,
                                              &filename, &functionname,
                                              &linenumber))
                  {
                discard_last = TRUE;
                if (abfd != NULL
                    && bfd_find_nearest_line (abfd, section, asymbols, offset,
                                              &filename, &functionname,
                                              &linenumber))
                  {
-                   if (functionname != NULL && fmt[-1] == 'C')
+                   if (functionname != NULL
+                       && (fmt[-1] == 'C' || fmt[-1] == 'H'))
                      {
                        /* Detect the case where we are printing out a
                           message for the same function as the last
                      {
                        /* Detect the case where we are printing out a
                           message for the same function as the last
@@ -341,7 +332,7 @@ vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
                            || last_function == NULL
                            || last_bfd != abfd
                            || (filename != NULL
                            || last_function == NULL
                            || last_bfd != abfd
                            || (filename != NULL
-                               && strcmp (last_file, filename) != 0)
+                               && filename_cmp (last_file, filename) != 0)
                            || strcmp (last_function, functionname) != 0)
                          {
                            lfinfo (fp, _("%B: In function `%T':\n"),
                            || strcmp (last_function, functionname) != 0)
                          {
                            lfinfo (fp, _("%B: In function `%T':\n"),
@@ -365,18 +356,21 @@ vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
                    if (filename != NULL)
                      fprintf (fp, "%s:", filename);
 
                    if (filename != NULL)
                      fprintf (fp, "%s:", filename);
 
+                   done = fmt[-1] != 'H';
                    if (functionname != NULL && fmt[-1] == 'G')
                      lfinfo (fp, "%T", functionname);
                    else if (filename != NULL && linenumber != 0)
                    if (functionname != NULL && fmt[-1] == 'G')
                      lfinfo (fp, "%T", functionname);
                    else if (filename != NULL && linenumber != 0)
-                     fprintf (fp, "%u", linenumber);
+                     fprintf (fp, "%u%s", linenumber, done ? "" : ":");
                    else
                    else
-                     lfinfo (fp, "(%A+0x%v)", section, offset);
+                     done = FALSE;
                  }
                else
                  }
                else
-                 lfinfo (fp, "%B:(%A+0x%v)", abfd, section, offset);
-
-               if (asymbols != NULL && entry == NULL)
-                 free (asymbols);
+                 {
+                   lfinfo (fp, "%B:", abfd);
+                   done = FALSE;
+                 }
+               if (!done)
+                 lfinfo (fp, "(%A+0x%v)", section, offset);
 
                if (discard_last)
                  {
 
                if (discard_last)
                  {
@@ -395,6 +389,11 @@ vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
              }
              break;
 
              }
              break;
 
+           case 'p':
+             /* native (host) void* pointer, like printf */
+             fprintf (fp, "%p", va_arg (arg, void *));
+             break;
+
            case 's':
              /* arbitrary string, like printf */
              fprintf (fp, "%s", va_arg (arg, char *));
            case 's':
              /* arbitrary string, like printf */
              fprintf (fp, "%s", va_arg (arg, char *));
@@ -461,9 +460,11 @@ einfo (const char *fmt, ...)
 {
   va_list arg;
 
 {
   va_list arg;
 
+  fflush (stdout);
   va_start (arg, fmt);
   vfinfo (stderr, fmt, arg, TRUE);
   va_end (arg);
   va_start (arg, fmt);
   vfinfo (stderr, fmt, arg, TRUE);
   va_end (arg);
+  fflush (stderr);
 }
 
 void
 }
 
 void
@@ -482,7 +483,22 @@ minfo (const char *fmt, ...)
       va_list arg;
 
       va_start (arg, fmt);
       va_list arg;
 
       va_start (arg, fmt);
-      vfinfo (config.map_file, fmt, arg, FALSE);
+      if (fmt[0] == '%' && fmt[1] == '!' && fmt[2] == 0)
+       {
+         /* Stash info about --as-needed shared libraries.  Print
+            later so they don't appear intermingled with archive
+            library info.  */
+         struct asneeded_minfo *m = xmalloc (sizeof *m);
+
+         m->next = NULL;
+         m->soname = va_arg (arg, const char *);
+         m->ref = va_arg (arg, bfd *);
+         m->name = va_arg (arg, const char *);
+         *asneeded_list_tail = m;
+         asneeded_list_tail = &m->next;
+       }
+      else
+       vfinfo (config.map_file, fmt, arg, FALSE);
       va_end (arg);
     }
 }
       va_end (arg);
     }
 }
@@ -518,10 +534,10 @@ void
 ld_abort (const char *file, int line, const char *fn)
 {
   if (fn != NULL)
 ld_abort (const char *file, int line, const char *fn)
 {
   if (fn != NULL)
-    einfo (_("%P: internal error: aborting at %s line %d in %s\n"),
+    einfo (_("%P: internal error: aborting at %s:%d in %s\n"),
           file, line, fn);
   else
           file, line, fn);
   else
-    einfo (_("%P: internal error: aborting at %s line %d\n"),
+    einfo (_("%P: internal error: aborting at %s:%d\n"),
           file, line);
   einfo (_("%P%F: please report this bug\n"));
   xexit (1);
           file, line);
   einfo (_("%P%F: please report this bug\n"));
   xexit (1);
This page took 0.027217 seconds and 4 git commands to generate.