Add function and function pointer tests for i386
[external/binutils.git] / ld / ldmisc.c
1 /* ldmisc.c
2    Copyright (C) 1991-2014 Free Software Foundation, Inc.
3    Written by Steve Chamberlain of Cygnus Support.
4
5    This file is part of the GNU Binutils.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "bfdlink.h"
25 #include "libiberty.h"
26 #include "filenames.h"
27 #include "demangle.h"
28 #include <stdarg.h>
29 #include "ld.h"
30 #include "ldmisc.h"
31 #include "ldexp.h"
32 #include "ldlang.h"
33 #include <ldgram.h>
34 #include "ldlex.h"
35 #include "ldmain.h"
36 #include "ldfile.h"
37 #include "elf-bfd.h"
38
39 /*
40  %% literal %
41  %A section name from a section
42  %B filename from a bfd
43  %C clever filename:linenumber with function
44  %D like %C, but no function name
45  %E current bfd error or errno
46  %F error is fatal
47  %G like %D, but only function name
48  %H like %C but in addition emit section+offset
49  %I filename from a lang_input_statement_type
50  %P print program name
51  %R info about a relent
52  %S print script file and linenumber from etree_type.
53  %T symbol name
54  %V hex bfd_vma
55  %W hex bfd_vma with 0x with no leading zeros taking up 8 spaces
56  %X no object output, fail return
57  %d integer, like printf
58  %ld long, like printf
59  %lu unsigned long, like printf
60  %p native (host) void* pointer, like printf
61  %s arbitrary string, like printf
62  %u integer, like printf
63  %v hex bfd_vma, no leading zeros
64 */
65
66 void
67 vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning)
68 {
69   bfd_boolean fatal = FALSE;
70
71   while (*fmt != '\0')
72     {
73       const char *str = fmt;
74       while (*fmt != '%' && *fmt != '\0')
75         fmt++;
76       if (fmt != str)
77         if (fwrite (str, 1, fmt - str, fp))
78           {
79             /* Ignore.  */
80           }
81
82       if (*fmt == '%')
83         {
84           fmt++;
85           switch (*fmt++)
86             {
87             case '%':
88               /* literal % */
89               putc ('%', fp);
90               break;
91
92             case 'X':
93               /* no object output, fail return */
94               config.make_executable = FALSE;
95               break;
96
97             case 'V':
98               /* hex bfd_vma */
99               {
100                 bfd_vma value = va_arg (arg, bfd_vma);
101                 fprintf_vma (fp, value);
102               }
103               break;
104
105             case 'v':
106               /* hex bfd_vma, no leading zeros */
107               {
108                 char buf[100];
109                 char *p = buf;
110                 bfd_vma value = va_arg (arg, bfd_vma);
111                 sprintf_vma (p, value);
112                 while (*p == '0')
113                   p++;
114                 if (!*p)
115                   p--;
116                 fputs (p, fp);
117               }
118               break;
119
120             case 'W':
121               /* hex bfd_vma with 0x with no leading zeroes taking up
122                  8 spaces.  */
123               {
124                 char buf[100];
125                 bfd_vma value;
126                 char *p;
127                 int len;
128
129                 value = va_arg (arg, bfd_vma);
130                 sprintf_vma (buf, value);
131                 for (p = buf; *p == '0'; ++p)
132                   ;
133                 if (*p == '\0')
134                   --p;
135                 len = strlen (p);
136                 while (len < 8)
137                   {
138                     putc (' ', fp);
139                     ++len;
140                   }
141                 fprintf (fp, "0x%s", p);
142               }
143               break;
144
145             case 'T':
146               /* Symbol name.  */
147               {
148                 const char *name = va_arg (arg, const char *);
149
150                 if (name == NULL || *name == 0)
151                   {
152                     fprintf (fp, _("no symbol"));
153                     break;
154                   }
155                 else if (demangling)
156                   {
157                     char *demangled;
158
159                     demangled = bfd_demangle (link_info.output_bfd, name,
160                                               DMGL_ANSI | DMGL_PARAMS);
161                     if (demangled != NULL)
162                       {
163                         fprintf (fp, "%s", demangled);
164                         free (demangled);
165                         break;
166                       }
167                   }
168                 fprintf (fp, "%s", name);
169               }
170               break;
171
172             case 'A':
173               /* section name from a section */
174               {
175                 asection *sec = va_arg (arg, asection *);
176                 bfd *abfd = sec->owner;
177                 const char *group = NULL;
178                 struct coff_comdat_info *ci;
179
180                 fprintf (fp, "%s", sec->name);
181                 if (abfd != NULL
182                     && bfd_get_flavour (abfd) == bfd_target_elf_flavour
183                     && elf_next_in_group (sec) != NULL
184                     && (sec->flags & SEC_GROUP) == 0)
185                   group = elf_group_name (sec);
186                 else if (abfd != NULL
187                          && bfd_get_flavour (abfd) == bfd_target_coff_flavour
188                          && (ci = bfd_coff_get_comdat_section (sec->owner,
189                                                                sec)) != NULL)
190                   group = ci->name;
191                 if (group != NULL)
192                   fprintf (fp, "[%s]", group);
193               }
194               break;
195
196             case 'B':
197               /* filename from a bfd */
198               {
199                 bfd *abfd = va_arg (arg, bfd *);
200
201                 if (abfd == NULL)
202                   fprintf (fp, "%s generated", program_name);
203                 else if (abfd->my_archive)
204                   fprintf (fp, "%s(%s)", abfd->my_archive->filename,
205                            abfd->filename);
206                 else
207                   fprintf (fp, "%s", abfd->filename);
208               }
209               break;
210
211             case 'F':
212               /* Error is fatal.  */
213               fatal = TRUE;
214               break;
215
216             case 'P':
217               /* Print program name.  */
218               fprintf (fp, "%s", program_name);
219               break;
220
221             case 'E':
222               /* current bfd error or errno */
223               fprintf (fp, "%s", bfd_errmsg (bfd_get_error ()));
224               break;
225
226             case 'I':
227               /* filename from a lang_input_statement_type */
228               {
229                 lang_input_statement_type *i;
230
231                 i = va_arg (arg, lang_input_statement_type *);
232                 if (bfd_my_archive (i->the_bfd) != NULL)
233                   fprintf (fp, "(%s)",
234                            bfd_get_filename (bfd_my_archive (i->the_bfd)));
235                 fprintf (fp, "%s", i->local_sym_name);
236                 if (bfd_my_archive (i->the_bfd) == NULL
237                     && filename_cmp (i->local_sym_name, i->filename) != 0)
238                   fprintf (fp, " (%s)", i->filename);
239               }
240               break;
241
242             case 'S':
243               /* Print script file and linenumber.  */
244               {
245                 etree_type node;
246                 etree_type *tp = va_arg (arg, etree_type *);
247
248                 if (tp == NULL)
249                   {
250                     tp = &node;
251                     tp->type.filename = ldlex_filename ();
252                     tp->type.lineno = lineno;
253                   }
254                 if (tp->type.filename != NULL)
255                   fprintf (fp, "%s:%u", tp->type.filename, tp->type.lineno);
256               }
257               break;
258
259             case 'R':
260               /* Print all that's interesting about a relent.  */
261               {
262                 arelent *relent = va_arg (arg, arelent *);
263
264                 lfinfo (fp, "%s+0x%v (type %s)",
265                         (*(relent->sym_ptr_ptr))->name,
266                         relent->addend,
267                         relent->howto->name);
268               }
269               break;
270
271             case 'C':
272             case 'D':
273             case 'G':
274             case 'H':
275               /* Clever filename:linenumber with function name if possible.
276                  The arguments are a BFD, a section, and an offset.  */
277               {
278                 static bfd *last_bfd;
279                 static char *last_file = NULL;
280                 static char *last_function = NULL;
281                 bfd *abfd;
282                 asection *section;
283                 bfd_vma offset;
284                 asymbol **asymbols = NULL;
285                 const char *filename;
286                 const char *functionname;
287                 unsigned int linenumber;
288                 bfd_boolean discard_last;
289                 bfd_boolean done;
290
291                 abfd = va_arg (arg, bfd *);
292                 section = va_arg (arg, asection *);
293                 offset = va_arg (arg, bfd_vma);
294
295                 if (abfd != NULL)
296                   {
297                     if (!bfd_generic_link_read_symbols (abfd))
298                       einfo (_("%B%F: could not read symbols: %E\n"), abfd);
299
300                     asymbols = bfd_get_outsymbols (abfd);
301                   }
302
303                 /* The GNU Coding Standard requires that error messages
304                    be of the form:
305
306                      source-file-name:lineno: message
307
308                    We do not always have a line number available so if
309                    we cannot find them we print out the section name and
310                    offset instead.  */
311                 discard_last = TRUE;
312                 if (abfd != NULL
313                     && bfd_find_nearest_line (abfd, section, asymbols, offset,
314                                               &filename, &functionname,
315                                               &linenumber))
316                   {
317                     if (functionname != NULL
318                         && (fmt[-1] == 'C' || fmt[-1] == 'H'))
319                       {
320                         /* Detect the case where we are printing out a
321                            message for the same function as the last
322                            call to vinfo ("%C").  In this situation do
323                            not print out the ABFD filename or the
324                            function name again.  Note - we do still
325                            print out the source filename, as this will
326                            allow programs that parse the linker's output
327                            (eg emacs) to correctly locate multiple
328                            errors in the same source file.  */
329                         if (last_bfd == NULL
330                             || last_file == NULL
331                             || last_function == NULL
332                             || last_bfd != abfd
333                             || (filename != NULL
334                                 && filename_cmp (last_file, filename) != 0)
335                             || strcmp (last_function, functionname) != 0)
336                           {
337                             lfinfo (fp, _("%B: In function `%T':\n"),
338                                     abfd, functionname);
339
340                             last_bfd = abfd;
341                             if (last_file != NULL)
342                               free (last_file);
343                             last_file = NULL;
344                             if (filename)
345                               last_file = xstrdup (filename);
346                             if (last_function != NULL)
347                               free (last_function);
348                             last_function = xstrdup (functionname);
349                           }
350                         discard_last = FALSE;
351                       }
352                     else
353                       lfinfo (fp, "%B:", abfd);
354
355                     if (filename != NULL)
356                       fprintf (fp, "%s:", filename);
357
358                     done = fmt[-1] != 'H';
359                     if (functionname != NULL && fmt[-1] == 'G')
360                       lfinfo (fp, "%T", functionname);
361                     else if (filename != NULL && linenumber != 0)
362                       fprintf (fp, "%u%s", linenumber, done ? "" : ":");
363                     else
364                       done = FALSE;
365                   }
366                 else
367                   {
368                     lfinfo (fp, "%B:", abfd);
369                     done = FALSE;
370                   }
371                 if (!done)
372                   lfinfo (fp, "(%A+0x%v)", section, offset);
373
374                 if (discard_last)
375                   {
376                     last_bfd = NULL;
377                     if (last_file != NULL)
378                       {
379                         free (last_file);
380                         last_file = NULL;
381                       }
382                     if (last_function != NULL)
383                       {
384                         free (last_function);
385                         last_function = NULL;
386                       }
387                   }
388               }
389               break;
390
391             case 'p':
392               /* native (host) void* pointer, like printf */
393               fprintf (fp, "%p", va_arg (arg, void *));
394               break;
395
396             case 's':
397               /* arbitrary string, like printf */
398               fprintf (fp, "%s", va_arg (arg, char *));
399               break;
400
401             case 'd':
402               /* integer, like printf */
403               fprintf (fp, "%d", va_arg (arg, int));
404               break;
405
406             case 'u':
407               /* unsigned integer, like printf */
408               fprintf (fp, "%u", va_arg (arg, unsigned int));
409               break;
410
411             case 'l':
412               if (*fmt == 'd')
413                 {
414                   fprintf (fp, "%ld", va_arg (arg, long));
415                   ++fmt;
416                   break;
417                 }
418               else if (*fmt == 'u')
419                 {
420                   fprintf (fp, "%lu", va_arg (arg, unsigned long));
421                   ++fmt;
422                   break;
423                 }
424               /* Fall thru */
425
426             default:
427               fprintf (fp, "%%%c", fmt[-1]);
428               break;
429             }
430         }
431     }
432
433   if (is_warning && config.fatal_warnings)
434     config.make_executable = FALSE;
435
436   if (fatal)
437     xexit (1);
438 }
439
440 /* Format info message and print on stdout.  */
441
442 /* (You would think this should be called just "info", but then you
443    would be hosed by LynxOS, which defines that name in its libc.)  */
444
445 void
446 info_msg (const char *fmt, ...)
447 {
448   va_list arg;
449
450   va_start (arg, fmt);
451   vfinfo (stdout, fmt, arg, FALSE);
452   va_end (arg);
453 }
454
455 /* ('e' for error.) Format info message and print on stderr.  */
456
457 void
458 einfo (const char *fmt, ...)
459 {
460   va_list arg;
461
462   fflush (stdout);
463   va_start (arg, fmt);
464   vfinfo (stderr, fmt, arg, TRUE);
465   va_end (arg);
466   fflush (stderr);
467 }
468
469 void
470 info_assert (const char *file, unsigned int line)
471 {
472   einfo (_("%F%P: internal error %s %d\n"), file, line);
473 }
474
475 /* ('m' for map) Format info message and print on map.  */
476
477 void
478 minfo (const char *fmt, ...)
479 {
480   if (config.map_file != NULL)
481     {
482       va_list arg;
483
484       va_start (arg, fmt);
485       if (fmt[0] == '%' && fmt[1] == '!' && fmt[2] == 0)
486         {
487           /* Stash info about --as-needed shared libraries.  Print
488              later so they don't appear intermingled with archive
489              library info.  */
490           struct asneeded_minfo *m = xmalloc (sizeof *m);
491
492           m->next = NULL;
493           m->soname = va_arg (arg, const char *);
494           m->ref = va_arg (arg, bfd *);
495           m->name = va_arg (arg, const char *);
496           *asneeded_list_tail = m;
497           asneeded_list_tail = &m->next;
498         }
499       else
500         vfinfo (config.map_file, fmt, arg, FALSE);
501       va_end (arg);
502     }
503 }
504
505 void
506 lfinfo (FILE *file, const char *fmt, ...)
507 {
508   va_list arg;
509
510   va_start (arg, fmt);
511   vfinfo (file, fmt, arg, FALSE);
512   va_end (arg);
513 }
514 \f
515 /* Functions to print the link map.  */
516
517 void
518 print_space (void)
519 {
520   fprintf (config.map_file, " ");
521 }
522
523 void
524 print_nl (void)
525 {
526   fprintf (config.map_file, "\n");
527 }
528
529 /* A more or less friendly abort message.  In ld.h abort is defined to
530    call this function.  */
531
532 void
533 ld_abort (const char *file, int line, const char *fn)
534 {
535   if (fn != NULL)
536     einfo (_("%P: internal error: aborting at %s line %d in %s\n"),
537            file, line, fn);
538   else
539     einfo (_("%P: internal error: aborting at %s line %d\n"),
540            file, line);
541   einfo (_("%P%F: please report this bug\n"));
542   xexit (1);
543 }