1 /* Scan linker error messages for missing template instantiations and provide
4 Copyright (C) 1995-2013 Free Software Foundation, Inc.
5 Contributed by Jason Merrill (jason@cygnus.com).
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
25 #include "coretypes.h"
32 #include "filenames.h"
33 #include "diagnostic-core.h"
36 /* TARGET_64BIT may be defined to use driver specific functionality. */
38 #define TARGET_64BIT TARGET_64BIT_DEFAULT
40 #define MAX_ITERATIONS 17
42 /* Defined in the automatically-generated underscore.c. */
43 extern int prepends_underscore
;
45 static int tlink_verbose
;
47 static char *initial_cwd
;
49 /* Hash table boilerplate for working with htab_t. We have hash tables
50 for symbol names, file names, and demangled symbols. */
52 typedef struct symbol_hash_entry
55 struct file_hash_entry
*file
;
61 typedef struct file_hash_entry
70 typedef const char *str
;
72 typedef struct demangled_hash_entry
78 /* Hash and comparison functions for these hash tables. */
80 static int hash_string_eq (const void *, const void *);
81 static hashval_t
hash_string_hash (const void *);
84 hash_string_eq (const void *s1_p
, const void *s2_p
)
86 const char *const *s1
= (const char *const *) s1_p
;
87 const char *s2
= (const char *) s2_p
;
88 return strcmp (*s1
, s2
) == 0;
92 hash_string_hash (const void *s_p
)
94 const char *const *s
= (const char *const *) s_p
;
95 return (*htab_hash_string
) (*s
);
98 static htab_t symbol_table
;
100 static struct symbol_hash_entry
* symbol_hash_lookup (const char *, int);
101 static struct file_hash_entry
* file_hash_lookup (const char *);
102 static struct demangled_hash_entry
*demangled_hash_lookup (const char *, int);
103 static void symbol_push (symbol
*);
104 static symbol
* symbol_pop (void);
105 static void file_push (file
*);
106 static file
* file_pop (void);
107 static void tlink_init (void);
108 static int tlink_execute (const char *, char **, const char *, const char *);
109 static char * frob_extension (const char *, const char *);
110 static char * obstack_fgets (FILE *, struct obstack
*);
111 static char * tfgets (FILE *);
112 static char * pfgets (FILE *);
113 static void freadsym (FILE *, file
*, int);
114 static void read_repo_file (file
*);
115 static void maybe_tweak (char *, file
*);
116 static int recompile_files (void);
117 static int read_repo_files (char **);
118 static void demangle_new_symbols (void);
119 static int scan_linker_output (const char *);
121 /* Look up an entry in the symbol hash table. */
123 static struct symbol_hash_entry
*
124 symbol_hash_lookup (const char *string
, int create
)
127 e
= htab_find_slot_with_hash (symbol_table
, string
,
128 (*htab_hash_string
) (string
),
129 create
? INSERT
: NO_INSERT
);
134 struct symbol_hash_entry
*v
;
135 *e
= v
= XCNEW (struct symbol_hash_entry
);
136 v
->key
= xstrdup (string
);
138 return (struct symbol_hash_entry
*) *e
;
141 static htab_t file_table
;
143 /* Look up an entry in the file hash table. */
145 static struct file_hash_entry
*
146 file_hash_lookup (const char *string
)
149 e
= htab_find_slot_with_hash (file_table
, string
,
150 (*htab_hash_string
) (string
),
154 struct file_hash_entry
*v
;
155 *e
= v
= XCNEW (struct file_hash_entry
);
156 v
->key
= xstrdup (string
);
158 return (struct file_hash_entry
*) *e
;
161 static htab_t demangled_table
;
163 /* Look up an entry in the demangled name hash table. */
165 static struct demangled_hash_entry
*
166 demangled_hash_lookup (const char *string
, int create
)
169 e
= htab_find_slot_with_hash (demangled_table
, string
,
170 (*htab_hash_string
) (string
),
171 create
? INSERT
: NO_INSERT
);
176 struct demangled_hash_entry
*v
;
177 *e
= v
= XCNEW (struct demangled_hash_entry
);
178 v
->key
= xstrdup (string
);
180 return (struct demangled_hash_entry
*) *e
;
185 struct symbol_stack_entry
188 struct symbol_stack_entry
*next
;
190 struct obstack symbol_stack_obstack
;
191 struct symbol_stack_entry
*symbol_stack
;
193 struct file_stack_entry
196 struct file_stack_entry
*next
;
198 struct obstack file_stack_obstack
;
199 struct file_stack_entry
*file_stack
;
202 symbol_push (symbol
*p
)
204 struct symbol_stack_entry
*ep
205 = XOBNEW (&symbol_stack_obstack
, struct symbol_stack_entry
);
207 ep
->next
= symbol_stack
;
214 struct symbol_stack_entry
*ep
= symbol_stack
;
219 symbol_stack
= ep
->next
;
220 obstack_free (&symbol_stack_obstack
, ep
);
227 struct file_stack_entry
*ep
;
232 ep
= XOBNEW (&file_stack_obstack
, struct file_stack_entry
);
234 ep
->next
= file_stack
;
242 struct file_stack_entry
*ep
= file_stack
;
247 file_stack
= ep
->next
;
248 obstack_free (&file_stack_obstack
, ep
);
253 /* Other machinery. */
255 /* Initialize the tlink machinery. Called from do_tlink. */
262 symbol_table
= htab_create (500, hash_string_hash
, hash_string_eq
,
264 file_table
= htab_create (500, hash_string_hash
, hash_string_eq
,
266 demangled_table
= htab_create (500, hash_string_hash
, hash_string_eq
,
269 obstack_begin (&symbol_stack_obstack
, 0);
270 obstack_begin (&file_stack_obstack
, 0);
272 p
= getenv ("TLINK_VERBOSE");
274 tlink_verbose
= atoi (p
);
284 initial_cwd
= getpwd ();
288 tlink_execute (const char *prog
, char **argv
, const char *outname
,
293 pex
= collect_execute (prog
, argv
, outname
, errname
, PEX_LAST
| PEX_SEARCH
);
294 return collect_wait (prog
, pex
);
298 frob_extension (const char *s
, const char *ext
)
302 p
= strrchr (lbasename (s
), '.');
306 obstack_grow (&temporary_obstack
, s
, p
- s
);
307 return (char *) obstack_copy0 (&temporary_obstack
, ext
, strlen (ext
));
311 obstack_fgets (FILE *stream
, struct obstack
*ob
)
314 while ((c
= getc (stream
)) != EOF
&& c
!= '\n')
315 obstack_1grow (ob
, c
);
316 if (obstack_object_size (ob
) == 0)
318 obstack_1grow (ob
, '\0');
319 return XOBFINISH (ob
, char *);
323 tfgets (FILE *stream
)
325 return obstack_fgets (stream
, &temporary_obstack
);
329 pfgets (FILE *stream
)
331 return xstrdup (tfgets (stream
));
334 /* Real tlink code. */
336 /* Subroutine of read_repo_file. We are reading the repo file for file F,
337 which is coming in on STREAM, and the symbol that comes next in STREAM
338 is offered, chosen or provided if CHOSEN is 0, 1 or 2, respectively.
340 XXX "provided" is unimplemented, both here and in the compiler. */
343 freadsym (FILE *stream
, file
*f
, int chosen
)
348 const char *name
= tfgets (stream
);
349 sym
= symbol_hash_lookup (name
, true);
352 if (sym
->file
== NULL
)
354 /* We didn't have this symbol already, so we choose this file. */
358 sym
->chosen
= chosen
;
362 /* We want this file; cast aside any pretender. */
364 if (sym
->chosen
&& sym
->file
!= f
)
366 if (sym
->chosen
== 1)
367 file_push (sym
->file
);
372 chosen
= sym
->chosen
;
376 sym
->chosen
= chosen
;
380 /* Read in the repo file denoted by F, and record all its information. */
383 read_repo_file (file
*f
)
386 FILE *stream
= fopen (f
->key
, "r");
388 if (tlink_verbose
>= 2)
389 fprintf (stderr
, _("collect: reading %s\n"), f
->key
);
391 while (fscanf (stream
, "%c ", &c
) == 1)
396 f
->args
= pfgets (stream
);
399 f
->dir
= pfgets (stream
);
402 f
->main
= pfgets (stream
);
405 freadsym (stream
, f
, 2);
408 freadsym (stream
, f
, 1);
411 freadsym (stream
, f
, 0);
414 obstack_free (&temporary_obstack
, temporary_firstobj
);
418 f
->args
= getenv ("COLLECT_GCC_OPTIONS");
423 /* We might want to modify LINE, which is a symbol line from file F. We do
424 this if either we saw an error message referring to the symbol in
425 question, or we have already allocated the symbol to another file and
426 this one wants to emit it as well. */
429 maybe_tweak (char *line
, file
*f
)
431 symbol
*sym
= symbol_hash_lookup (line
+ 2, false);
433 if ((sym
->file
== f
&& sym
->tweaking
)
434 || (sym
->file
!= f
&& line
[0] == 'C'))
452 /* Update the repo files for each of the object files we have adjusted and
456 recompile_files (void)
460 putenv (xstrdup ("COMPILER_PATH="));
461 putenv (xstrdup ("LIBRARY_PATH="));
463 while ((f
= file_pop ()) != NULL
)
468 struct obstack arg_stack
;
469 FILE *stream
= fopen (f
->key
, "r");
470 const char *const outname
= frob_extension (f
->key
, ".rnw");
471 FILE *output
= fopen (outname
, "w");
473 while ((line
= tfgets (stream
)) != NULL
)
479 maybe_tweak (line
, f
);
481 fprintf (output
, "%s\n", line
);
485 /* On Windows "rename" returns -1 and sets ERRNO to EACCESS if
486 the new file name already exists. Therefore, we explicitly
487 remove the old file first. */
488 if (remove (f
->key
) == -1)
489 fatal_error ("removing .rpo file: %m");
490 if (rename (outname
, f
->key
) == -1)
491 fatal_error ("renaming .rpo file: %m");
495 error ("repository file '%s' does not contain command-line "
496 "arguments", f
->key
);
500 /* Build a null-terminated argv array suitable for
501 tlink_execute(). Manipulate arguments on the arg_stack while
502 building argv on the temporary_obstack. */
504 obstack_init (&arg_stack
);
505 obstack_ptr_grow (&temporary_obstack
, c_file_name
);
507 for (p
= f
->args
; *p
!= '\0'; p
= q
+ 1)
509 /* Arguments are delimited by single-quotes. Find the
511 p
= strchr (p
, '\'');
515 /* Find the closing quote. */
516 q
= strchr (p
+ 1, '\'');
520 obstack_grow (&arg_stack
, p
+ 1, q
- (p
+ 1));
522 /* Replace '\'' with '. This is how set_collect_gcc_options
523 encodes a single-quote. */
524 while (q
[1] == '\\' && q
[2] == '\'' && q
[3] == '\'')
528 r
= strchr (q
+ 4, '\'');
532 obstack_grow (&arg_stack
, q
+ 3, r
- (q
+ 3));
536 obstack_1grow (&arg_stack
, '\0');
537 obstack_ptr_grow (&temporary_obstack
, obstack_finish (&arg_stack
));
540 obstack_ptr_grow (&temporary_obstack
, f
->main
);
541 obstack_ptr_grow (&temporary_obstack
, NULL
);
542 argv
= XOBFINISH (&temporary_obstack
, char **);
545 fprintf (stderr
, _("collect: recompiling %s\n"), f
->main
);
547 if (chdir (f
->dir
) != 0
548 || tlink_execute (c_file_name
, argv
, NULL
, NULL
) != 0
549 || chdir (initial_cwd
) != 0)
554 obstack_free (&arg_stack
, NULL
);
555 obstack_free (&temporary_obstack
, temporary_firstobj
);
560 /* The first phase of processing: determine which object files have
561 .rpo files associated with them, and read in the information. */
564 read_repo_files (char **object_lst
)
566 char **object
= object_lst
;
568 for (; *object
; object
++)
573 /* Don't bother trying for ld flags. */
574 if (*object
[0] == '-')
577 p
= frob_extension (*object
, ".rpo");
579 if (! file_exists (p
))
582 f
= file_hash_lookup (p
);
587 if (file_stack
!= NULL
&& ! recompile_files ())
590 return (symbol_stack
!= NULL
);
593 /* Add the demangled forms of any new symbols to the hash table. */
596 demangle_new_symbols (void)
600 while ((sym
= symbol_pop ()) != NULL
)
603 const char *p
= cplus_demangle (sym
->key
, DMGL_PARAMS
| DMGL_ANSI
);
608 dem
= demangled_hash_lookup (p
, true);
609 dem
->mangled
.safe_push (sym
->key
);
613 /* We want to tweak symbol SYM. Return true if all is well, false on
617 start_tweaking (symbol
*sym
)
619 if (sym
&& sym
->tweaked
)
621 error ("'%s' was assigned to '%s', but was not defined "
622 "during recompilation, or vice versa",
623 sym
->key
, sym
->file
->key
);
626 if (sym
&& !sym
->tweaking
)
628 if (tlink_verbose
>= 2)
629 fprintf (stderr
, _("collect: tweaking %s in %s\n"),
630 sym
->key
, sym
->file
->key
);
632 file_push (sym
->file
);
637 /* Step through the output of the linker, in the file named FNAME, and
638 adjust the settings for each symbol encountered. */
641 scan_linker_output (const char *fname
)
643 FILE *stream
= fopen (fname
, "r");
645 int skip_next_in_line
= 0;
647 while ((line
= tfgets (stream
)) != NULL
)
657 /* On darwin9, we might have to skip " in " lines as well. */
658 if (skip_next_in_line
659 && strstr (p
, " in "))
661 skip_next_in_line
= 0;
663 while (*p
&& ISSPACE ((unsigned char) *p
))
669 for (q
= p
; *q
&& ! ISSPACE ((unsigned char) *q
); ++q
)
672 /* Try the first word on the line. */
675 if (!strncmp (p
, USER_LABEL_PREFIX
, strlen (USER_LABEL_PREFIX
)))
676 p
+= strlen (USER_LABEL_PREFIX
);
680 sym
= symbol_hash_lookup (p
, false);
682 /* Some SVR4 linkers produce messages like
683 ld: 0711-317 ERROR: Undefined symbol: .g__t3foo1Zi
685 if (! sym
&& ! end
&& strstr (q
+ 1, "Undefined symbol: "))
687 char *p
= strrchr (q
+ 1, ' ');
691 if (!strncmp (p
, USER_LABEL_PREFIX
, strlen (USER_LABEL_PREFIX
)))
692 p
+= strlen (USER_LABEL_PREFIX
);
693 sym
= symbol_hash_lookup (p
, false);
697 /* Try a mangled name in quotes. */
702 /* On darwin9, we look for "foo" referenced from:\n\(.* in .*\n\)* */
703 if (strcmp (oldq
, "referenced from:") == 0)
705 /* We have to remember that we found a symbol to tweak. */
708 /* We actually want to start from the first word on the
712 /* Since the format is multiline, we have to skip
713 following lines with " in ". */
714 skip_next_in_line
= 1;
717 /* First try `GNU style'. */
718 p
= strchr (oldq
, '`');
720 p
++, q
= strchr (p
, '\'');
721 /* Then try "double quotes". */
722 else if (p
= strchr (oldq
, '"'), p
)
723 p
++, q
= strchr (p
, '"');
724 /* Then try 'single quotes'. */
725 else if (p
= strchr (oldq
, '\''), p
)
726 p
++, q
= strchr (p
, '\'');
728 /* Then try entire line. */
729 q
= strchr (oldq
, 0);
736 /* Don't let the strstr's below see the demangled name; we
737 might get spurious matches. */
740 /* powerpc64-linux references .foo when calling function foo. */
745 /* We need to check for certain error keywords here, or we would
746 mistakenly use GNU ld's "In function `foo':" message. */
748 || strstr (oldq
, "ndefined")
749 || strstr (oldq
, "nresolved")
750 || strstr (oldq
, "nsatisfied")
751 || strstr (oldq
, "ultiple")))
754 dem
= demangled_hash_lookup (p
, false);
757 if (!strncmp (p
, USER_LABEL_PREFIX
,
758 strlen (USER_LABEL_PREFIX
)))
759 p
+= strlen (USER_LABEL_PREFIX
);
760 sym
= symbol_hash_lookup (p
, false);
767 /* We found a demangled name. If this is the name of a
768 constructor or destructor, there can be several mangled names
769 that match it, so choose or unchoose all of them. If some are
770 chosen and some not, leave the later ones that don't match
771 alone for now; either this will cause the link to suceed, or
772 on the next attempt we will switch all of them the other way
773 and that will cause it to succeed. */
775 int len
= dem
->mangled
.length ();
777 FOR_EACH_VEC_ELT (dem
->mangled
, ix
, s
)
779 sym
= symbol_hash_lookup (s
, false);
781 chosen
= sym
->chosen
;
782 else if (sym
->chosen
!= chosen
)
785 /* Avoid an error about re-tweaking when we guess wrong in
786 the case of mismatch. */
788 sym
->tweaked
= false;
789 ok
= start_tweaking (sym
);
793 ok
= start_tweaking (sym
);
795 obstack_free (&temporary_obstack
, temporary_firstobj
);
805 return (file_stack
!= NULL
);
808 /* Entry point for tlink. Called from main in collect2.c.
810 Iteratively try to provide definitions for all the unresolved symbols
811 mentioned in the linker error messages.
813 LD_ARGV is an array of arguments for the linker.
814 OBJECT_LST is an array of object files that we may be able to recompile
815 to provide missing definitions. Currently ignored. */
818 do_tlink (char **ld_argv
, char **object_lst ATTRIBUTE_UNUSED
)
820 int exit
= tlink_execute ("ld", ld_argv
, ldout
, lderrout
);
828 /* Until collect does a better job of figuring out which are object
829 files, assume that everything on the command line could be. */
830 if (read_repo_files (ld_argv
))
831 while (exit
&& i
++ < MAX_ITERATIONS
)
833 if (tlink_verbose
>= 3)
835 dump_ld_file (ldout
, stdout
);
836 dump_ld_file (lderrout
, stderr
);
838 demangle_new_symbols ();
839 if (! scan_linker_output (ldout
)
840 && ! scan_linker_output (lderrout
))
842 if (! recompile_files ())
845 fprintf (stderr
, _("collect: relinking\n"));
846 exit
= tlink_execute ("ld", ld_argv
, ldout
, lderrout
);
850 dump_ld_file (ldout
, stdout
);
852 dump_ld_file (lderrout
, stderr
);
856 error ("ld returned %d exit status", exit
);
861 /* We have just successfully produced an output file, so assume that we
862 may unlink it if need be for now on. */
863 may_unlink_output_file
= true;