1 /* Scan linker error messages for missing template instantiations and provide
4 Copyright (C) 1995, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007, 2008,
5 2009, 2010, 2011 Free Software Foundation, Inc.
6 Contributed by Jason Merrill (jason@cygnus.com).
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
26 #include "coretypes.h"
33 #include "filenames.h"
34 #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 struct demangled_hash_entry
76 /* Hash and comparison functions for these hash tables. */
78 static int hash_string_eq (const void *, const void *);
79 static hashval_t
hash_string_hash (const void *);
82 hash_string_eq (const void *s1_p
, const void *s2_p
)
84 const char *const *s1
= (const char *const *) s1_p
;
85 const char *s2
= (const char *) s2_p
;
86 return strcmp (*s1
, s2
) == 0;
90 hash_string_hash (const void *s_p
)
92 const char *const *s
= (const char *const *) s_p
;
93 return (*htab_hash_string
) (*s
);
96 static htab_t symbol_table
;
98 static struct symbol_hash_entry
* symbol_hash_lookup (const char *, int);
99 static struct file_hash_entry
* file_hash_lookup (const char *);
100 static struct demangled_hash_entry
*demangled_hash_lookup (const char *, int);
101 static void symbol_push (symbol
*);
102 static symbol
* symbol_pop (void);
103 static void file_push (file
*);
104 static file
* file_pop (void);
105 static void tlink_init (void);
106 static int tlink_execute (const char *, char **, const char *, const char *);
107 static char * frob_extension (const char *, const char *);
108 static char * obstack_fgets (FILE *, struct obstack
*);
109 static char * tfgets (FILE *);
110 static char * pfgets (FILE *);
111 static void freadsym (FILE *, file
*, int);
112 static void read_repo_file (file
*);
113 static void maybe_tweak (char *, file
*);
114 static int recompile_files (void);
115 static int read_repo_files (char **);
116 static void demangle_new_symbols (void);
117 static int scan_linker_output (const char *);
119 /* Look up an entry in the symbol hash table. */
121 static struct symbol_hash_entry
*
122 symbol_hash_lookup (const char *string
, int create
)
125 e
= htab_find_slot_with_hash (symbol_table
, string
,
126 (*htab_hash_string
) (string
),
127 create
? INSERT
: NO_INSERT
);
132 struct symbol_hash_entry
*v
;
133 *e
= v
= XCNEW (struct symbol_hash_entry
);
134 v
->key
= xstrdup (string
);
136 return (struct symbol_hash_entry
*) *e
;
139 static htab_t file_table
;
141 /* Look up an entry in the file hash table. */
143 static struct file_hash_entry
*
144 file_hash_lookup (const char *string
)
147 e
= htab_find_slot_with_hash (file_table
, string
,
148 (*htab_hash_string
) (string
),
152 struct file_hash_entry
*v
;
153 *e
= v
= XCNEW (struct file_hash_entry
);
154 v
->key
= xstrdup (string
);
156 return (struct file_hash_entry
*) *e
;
159 static htab_t demangled_table
;
161 /* Look up an entry in the demangled name hash table. */
163 static struct demangled_hash_entry
*
164 demangled_hash_lookup (const char *string
, int create
)
167 e
= htab_find_slot_with_hash (demangled_table
, string
,
168 (*htab_hash_string
) (string
),
169 create
? INSERT
: NO_INSERT
);
174 struct demangled_hash_entry
*v
;
175 *e
= v
= XCNEW (struct demangled_hash_entry
);
176 v
->key
= xstrdup (string
);
178 return (struct demangled_hash_entry
*) *e
;
183 struct symbol_stack_entry
186 struct symbol_stack_entry
*next
;
188 struct obstack symbol_stack_obstack
;
189 struct symbol_stack_entry
*symbol_stack
;
191 struct file_stack_entry
194 struct file_stack_entry
*next
;
196 struct obstack file_stack_obstack
;
197 struct file_stack_entry
*file_stack
;
200 symbol_push (symbol
*p
)
202 struct symbol_stack_entry
*ep
203 = XOBNEW (&symbol_stack_obstack
, struct symbol_stack_entry
);
205 ep
->next
= symbol_stack
;
212 struct symbol_stack_entry
*ep
= symbol_stack
;
217 symbol_stack
= ep
->next
;
218 obstack_free (&symbol_stack_obstack
, ep
);
225 struct file_stack_entry
*ep
;
230 ep
= XOBNEW (&file_stack_obstack
, struct file_stack_entry
);
232 ep
->next
= file_stack
;
240 struct file_stack_entry
*ep
= file_stack
;
245 file_stack
= ep
->next
;
246 obstack_free (&file_stack_obstack
, ep
);
251 /* Other machinery. */
253 /* Initialize the tlink machinery. Called from do_tlink. */
260 symbol_table
= htab_create (500, hash_string_hash
, hash_string_eq
,
262 file_table
= htab_create (500, hash_string_hash
, hash_string_eq
,
264 demangled_table
= htab_create (500, hash_string_hash
, hash_string_eq
,
267 obstack_begin (&symbol_stack_obstack
, 0);
268 obstack_begin (&file_stack_obstack
, 0);
270 p
= getenv ("TLINK_VERBOSE");
272 tlink_verbose
= atoi (p
);
282 initial_cwd
= getpwd ();
286 tlink_execute (const char *prog
, char **argv
, const char *outname
,
291 pex
= collect_execute (prog
, argv
, outname
, errname
, PEX_LAST
| PEX_SEARCH
);
292 return collect_wait (prog
, pex
);
296 frob_extension (const char *s
, const char *ext
)
300 p
= strrchr (lbasename (s
), '.');
304 obstack_grow (&temporary_obstack
, s
, p
- s
);
305 return (char *) obstack_copy0 (&temporary_obstack
, ext
, strlen (ext
));
309 obstack_fgets (FILE *stream
, struct obstack
*ob
)
312 while ((c
= getc (stream
)) != EOF
&& c
!= '\n')
313 obstack_1grow (ob
, c
);
314 if (obstack_object_size (ob
) == 0)
316 obstack_1grow (ob
, '\0');
317 return XOBFINISH (ob
, char *);
321 tfgets (FILE *stream
)
323 return obstack_fgets (stream
, &temporary_obstack
);
327 pfgets (FILE *stream
)
329 return xstrdup (tfgets (stream
));
332 /* Real tlink code. */
334 /* Subroutine of read_repo_file. We are reading the repo file for file F,
335 which is coming in on STREAM, and the symbol that comes next in STREAM
336 is offered, chosen or provided if CHOSEN is 0, 1 or 2, respectively.
338 XXX "provided" is unimplemented, both here and in the compiler. */
341 freadsym (FILE *stream
, file
*f
, int chosen
)
346 const char *name
= tfgets (stream
);
347 sym
= symbol_hash_lookup (name
, true);
350 if (sym
->file
== NULL
)
352 /* We didn't have this symbol already, so we choose this file. */
356 sym
->chosen
= chosen
;
360 /* We want this file; cast aside any pretender. */
362 if (sym
->chosen
&& sym
->file
!= f
)
364 if (sym
->chosen
== 1)
365 file_push (sym
->file
);
370 chosen
= sym
->chosen
;
374 sym
->chosen
= chosen
;
378 /* Read in the repo file denoted by F, and record all its information. */
381 read_repo_file (file
*f
)
384 FILE *stream
= fopen (f
->key
, "r");
386 if (tlink_verbose
>= 2)
387 fprintf (stderr
, _("collect: reading %s\n"), f
->key
);
389 while (fscanf (stream
, "%c ", &c
) == 1)
394 f
->args
= pfgets (stream
);
397 f
->dir
= pfgets (stream
);
400 f
->main
= pfgets (stream
);
403 freadsym (stream
, f
, 2);
406 freadsym (stream
, f
, 1);
409 freadsym (stream
, f
, 0);
412 obstack_free (&temporary_obstack
, temporary_firstobj
);
416 f
->args
= getenv ("COLLECT_GCC_OPTIONS");
421 /* We might want to modify LINE, which is a symbol line from file F. We do
422 this if either we saw an error message referring to the symbol in
423 question, or we have already allocated the symbol to another file and
424 this one wants to emit it as well. */
427 maybe_tweak (char *line
, file
*f
)
429 symbol
*sym
= symbol_hash_lookup (line
+ 2, false);
431 if ((sym
->file
== f
&& sym
->tweaking
)
432 || (sym
->file
!= f
&& line
[0] == 'C'))
444 /* Update the repo files for each of the object files we have adjusted and
448 recompile_files (void)
452 putenv (xstrdup ("COMPILER_PATH="));
453 putenv (xstrdup ("LIBRARY_PATH="));
455 while ((f
= file_pop ()) != NULL
)
460 struct obstack arg_stack
;
461 FILE *stream
= fopen (f
->key
, "r");
462 const char *const outname
= frob_extension (f
->key
, ".rnw");
463 FILE *output
= fopen (outname
, "w");
465 while ((line
= tfgets (stream
)) != NULL
)
471 maybe_tweak (line
, f
);
473 fprintf (output
, "%s\n", line
);
477 /* On Windows "rename" returns -1 and sets ERRNO to EACCESS if
478 the new file name already exists. Therefore, we explicitly
479 remove the old file first. */
480 if (remove (f
->key
) == -1)
481 fatal_error ("removing .rpo file: %m");
482 if (rename (outname
, f
->key
) == -1)
483 fatal_error ("renaming .rpo file: %m");
487 error ("repository file '%s' does not contain command-line "
488 "arguments", f
->key
);
492 /* Build a null-terminated argv array suitable for
493 tlink_execute(). Manipulate arguments on the arg_stack while
494 building argv on the temporary_obstack. */
496 obstack_init (&arg_stack
);
497 obstack_ptr_grow (&temporary_obstack
, c_file_name
);
499 for (p
= f
->args
; *p
!= '\0'; p
= q
+ 1)
501 /* Arguments are delimited by single-quotes. Find the
503 p
= strchr (p
, '\'');
507 /* Find the closing quote. */
508 q
= strchr (p
+ 1, '\'');
512 obstack_grow (&arg_stack
, p
+ 1, q
- (p
+ 1));
514 /* Replace '\'' with '. This is how set_collect_gcc_options
515 encodes a single-quote. */
516 while (q
[1] == '\\' && q
[2] == '\'' && q
[3] == '\'')
520 r
= strchr (q
+ 4, '\'');
524 obstack_grow (&arg_stack
, q
+ 3, r
- (q
+ 3));
528 obstack_1grow (&arg_stack
, '\0');
529 obstack_ptr_grow (&temporary_obstack
, obstack_finish (&arg_stack
));
532 obstack_ptr_grow (&temporary_obstack
, f
->main
);
533 obstack_ptr_grow (&temporary_obstack
, NULL
);
534 argv
= XOBFINISH (&temporary_obstack
, char **);
537 fprintf (stderr
, _("collect: recompiling %s\n"), f
->main
);
539 if (chdir (f
->dir
) != 0
540 || tlink_execute (c_file_name
, argv
, NULL
, NULL
) != 0
541 || chdir (initial_cwd
) != 0)
546 obstack_free (&arg_stack
, NULL
);
547 obstack_free (&temporary_obstack
, temporary_firstobj
);
552 /* The first phase of processing: determine which object files have
553 .rpo files associated with them, and read in the information. */
556 read_repo_files (char **object_lst
)
558 char **object
= object_lst
;
560 for (; *object
; object
++)
565 /* Don't bother trying for ld flags. */
566 if (*object
[0] == '-')
569 p
= frob_extension (*object
, ".rpo");
571 if (! file_exists (p
))
574 f
= file_hash_lookup (p
);
579 if (file_stack
!= NULL
&& ! recompile_files ())
582 return (symbol_stack
!= NULL
);
585 /* Add the demangled forms of any new symbols to the hash table. */
588 demangle_new_symbols (void)
592 while ((sym
= symbol_pop ()) != NULL
)
595 const char *p
= cplus_demangle (sym
->key
, DMGL_PARAMS
| DMGL_ANSI
);
600 dem
= demangled_hash_lookup (p
, true);
601 dem
->mangled
= sym
->key
;
605 /* Step through the output of the linker, in the file named FNAME, and
606 adjust the settings for each symbol encountered. */
609 scan_linker_output (const char *fname
)
611 FILE *stream
= fopen (fname
, "r");
613 int skip_next_in_line
= 0;
615 while ((line
= tfgets (stream
)) != NULL
)
622 /* On darwin9, we might have to skip " in " lines as well. */
623 if (skip_next_in_line
624 && strstr (p
, " in "))
626 skip_next_in_line
= 0;
628 while (*p
&& ISSPACE ((unsigned char) *p
))
634 for (q
= p
; *q
&& ! ISSPACE ((unsigned char) *q
); ++q
)
637 /* Try the first word on the line. */
640 if (!strncmp (p
, USER_LABEL_PREFIX
, strlen (USER_LABEL_PREFIX
)))
641 p
+= strlen (USER_LABEL_PREFIX
);
645 sym
= symbol_hash_lookup (p
, false);
647 /* Some SVR4 linkers produce messages like
648 ld: 0711-317 ERROR: Undefined symbol: .g__t3foo1Zi
650 if (! sym
&& ! end
&& strstr (q
+ 1, "Undefined symbol: "))
652 char *p
= strrchr (q
+ 1, ' ');
656 if (!strncmp (p
, USER_LABEL_PREFIX
, strlen (USER_LABEL_PREFIX
)))
657 p
+= strlen (USER_LABEL_PREFIX
);
658 sym
= symbol_hash_lookup (p
, false);
662 /* Try a mangled name in quotes. */
668 /* On darwin9, we look for "foo" referenced from:\n\(.* in .*\n\)* */
669 if (strcmp (oldq
, "referenced from:") == 0)
671 /* We have to remember that we found a symbol to tweak. */
674 /* We actually want to start from the first word on the
678 /* Since the format is multiline, we have to skip
679 following lines with " in ". */
680 skip_next_in_line
= 1;
683 /* First try `GNU style'. */
684 p
= strchr (oldq
, '`');
686 p
++, q
= strchr (p
, '\'');
687 /* Then try "double quotes". */
688 else if (p
= strchr (oldq
, '"'), p
)
689 p
++, q
= strchr (p
, '"');
690 /* Then try 'single quotes'. */
691 else if (p
= strchr (oldq
, '\''), p
)
692 p
++, q
= strchr (p
, '\'');
694 /* Then try entire line. */
695 q
= strchr (oldq
, 0);
702 /* Don't let the strstr's below see the demangled name; we
703 might get spurious matches. */
706 /* powerpc64-linux references .foo when calling function foo. */
711 /* We need to check for certain error keywords here, or we would
712 mistakenly use GNU ld's "In function `foo':" message. */
714 || strstr (oldq
, "ndefined")
715 || strstr (oldq
, "nresolved")
716 || strstr (oldq
, "nsatisfied")
717 || strstr (oldq
, "ultiple")))
720 dem
= demangled_hash_lookup (p
, false);
722 sym
= symbol_hash_lookup (dem
->mangled
, false);
725 if (!strncmp (p
, USER_LABEL_PREFIX
,
726 strlen (USER_LABEL_PREFIX
)))
727 p
+= strlen (USER_LABEL_PREFIX
);
728 sym
= symbol_hash_lookup (p
, false);
733 if (sym
&& sym
->tweaked
)
735 error ("'%s' was assigned to '%s', but was not defined "
736 "during recompilation, or vice versa",
737 sym
->key
, sym
->file
->key
);
741 if (sym
&& !sym
->tweaking
)
743 if (tlink_verbose
>= 2)
744 fprintf (stderr
, _("collect: tweaking %s in %s\n"),
745 sym
->key
, sym
->file
->key
);
747 file_push (sym
->file
);
750 obstack_free (&temporary_obstack
, temporary_firstobj
);
754 return (file_stack
!= NULL
);
757 /* Entry point for tlink. Called from main in collect2.c.
759 Iteratively try to provide definitions for all the unresolved symbols
760 mentioned in the linker error messages.
762 LD_ARGV is an array of arguments for the linker.
763 OBJECT_LST is an array of object files that we may be able to recompile
764 to provide missing definitions. Currently ignored. */
767 do_tlink (char **ld_argv
, char **object_lst ATTRIBUTE_UNUSED
)
769 int exit
= tlink_execute ("ld", ld_argv
, ldout
, lderrout
);
777 /* Until collect does a better job of figuring out which are object
778 files, assume that everything on the command line could be. */
779 if (read_repo_files (ld_argv
))
780 while (exit
&& i
++ < MAX_ITERATIONS
)
782 if (tlink_verbose
>= 3)
784 dump_file (ldout
, stdout
);
785 dump_file (lderrout
, stderr
);
787 demangle_new_symbols ();
788 if (! scan_linker_output (ldout
)
789 && ! scan_linker_output (lderrout
))
791 if (! recompile_files ())
794 fprintf (stderr
, _("collect: relinking\n"));
795 exit
= tlink_execute ("ld", ld_argv
, ldout
, lderrout
);
799 dump_file (ldout
, stdout
);
801 dump_file (lderrout
, stderr
);
805 error ("ld returned %d exit status", exit
);