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 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 "libiberty.h"
35 #define MAX_ITERATIONS 17
37 /* Defined in the automatically-generated underscore.c. */
38 extern int prepends_underscore
;
40 static int tlink_verbose
;
42 static char *initial_cwd
;
44 /* Hash table boilerplate for working with htab_t. We have hash tables
45 for symbol names, file names, and demangled symbols. */
47 typedef struct symbol_hash_entry
50 struct file_hash_entry
*file
;
56 typedef struct file_hash_entry
65 typedef struct demangled_hash_entry
71 /* Hash and comparison functions for these hash tables. */
73 static int hash_string_eq (const void *, const void *);
74 static hashval_t
hash_string_hash (const void *);
77 hash_string_eq (const void *s1_p
, const void *s2_p
)
79 const char *const *s1
= (const char *const *) s1_p
;
80 const char *s2
= (const char *) s2_p
;
81 return strcmp (*s1
, s2
) == 0;
85 hash_string_hash (const void *s_p
)
87 const char *const *s
= (const char *const *) s_p
;
88 return (*htab_hash_string
) (*s
);
91 static htab_t symbol_table
;
93 static struct symbol_hash_entry
* symbol_hash_lookup (const char *, int);
94 static struct file_hash_entry
* file_hash_lookup (const char *);
95 static struct demangled_hash_entry
*demangled_hash_lookup (const char *, int);
96 static void symbol_push (symbol
*);
97 static symbol
* symbol_pop (void);
98 static void file_push (file
*);
99 static file
* file_pop (void);
100 static void tlink_init (void);
101 static int tlink_execute (const char *, char **, const char *, const char *);
102 static char * frob_extension (const char *, const char *);
103 static char * obstack_fgets (FILE *, struct obstack
*);
104 static char * tfgets (FILE *);
105 static char * pfgets (FILE *);
106 static void freadsym (FILE *, file
*, int);
107 static void read_repo_file (file
*);
108 static void maybe_tweak (char *, file
*);
109 static int recompile_files (void);
110 static int read_repo_files (char **);
111 static void demangle_new_symbols (void);
112 static int scan_linker_output (const char *);
114 /* Look up an entry in the symbol hash table. */
116 static struct symbol_hash_entry
*
117 symbol_hash_lookup (const char *string
, int create
)
120 e
= htab_find_slot_with_hash (symbol_table
, string
,
121 (*htab_hash_string
) (string
),
122 create
? INSERT
: NO_INSERT
);
127 struct symbol_hash_entry
*v
;
128 *e
= v
= XCNEW (struct symbol_hash_entry
);
129 v
->key
= xstrdup (string
);
131 return (struct symbol_hash_entry
*) *e
;
134 static htab_t file_table
;
136 /* Look up an entry in the file hash table. */
138 static struct file_hash_entry
*
139 file_hash_lookup (const char *string
)
142 e
= htab_find_slot_with_hash (file_table
, string
,
143 (*htab_hash_string
) (string
),
147 struct file_hash_entry
*v
;
148 *e
= v
= XCNEW (struct file_hash_entry
);
149 v
->key
= xstrdup (string
);
151 return (struct file_hash_entry
*) *e
;
154 static htab_t demangled_table
;
156 /* Look up an entry in the demangled name hash table. */
158 static struct demangled_hash_entry
*
159 demangled_hash_lookup (const char *string
, int create
)
162 e
= htab_find_slot_with_hash (demangled_table
, string
,
163 (*htab_hash_string
) (string
),
164 create
? INSERT
: NO_INSERT
);
169 struct demangled_hash_entry
*v
;
170 *e
= v
= XCNEW (struct demangled_hash_entry
);
171 v
->key
= xstrdup (string
);
173 return (struct demangled_hash_entry
*) *e
;
178 struct symbol_stack_entry
181 struct symbol_stack_entry
*next
;
183 struct obstack symbol_stack_obstack
;
184 struct symbol_stack_entry
*symbol_stack
;
186 struct file_stack_entry
189 struct file_stack_entry
*next
;
191 struct obstack file_stack_obstack
;
192 struct file_stack_entry
*file_stack
;
195 symbol_push (symbol
*p
)
197 struct symbol_stack_entry
*ep
198 = XOBNEW (&symbol_stack_obstack
, struct symbol_stack_entry
);
200 ep
->next
= symbol_stack
;
207 struct symbol_stack_entry
*ep
= symbol_stack
;
212 symbol_stack
= ep
->next
;
213 obstack_free (&symbol_stack_obstack
, ep
);
220 struct file_stack_entry
*ep
;
225 ep
= XOBNEW (&file_stack_obstack
, struct file_stack_entry
);
227 ep
->next
= file_stack
;
235 struct file_stack_entry
*ep
= file_stack
;
240 file_stack
= ep
->next
;
241 obstack_free (&file_stack_obstack
, ep
);
246 /* Other machinery. */
248 /* Initialize the tlink machinery. Called from do_tlink. */
255 symbol_table
= htab_create (500, hash_string_hash
, hash_string_eq
,
257 file_table
= htab_create (500, hash_string_hash
, hash_string_eq
,
259 demangled_table
= htab_create (500, hash_string_hash
, hash_string_eq
,
262 obstack_begin (&symbol_stack_obstack
, 0);
263 obstack_begin (&file_stack_obstack
, 0);
265 p
= getenv ("TLINK_VERBOSE");
267 tlink_verbose
= atoi (p
);
277 initial_cwd
= getpwd ();
281 tlink_execute (const char *prog
, char **argv
, const char *outname
,
286 pex
= collect_execute (prog
, argv
, outname
, errname
);
287 return collect_wait (prog
, pex
);
291 frob_extension (const char *s
, const char *ext
)
293 const char *p
= strrchr (s
, '/');
296 p
= strrchr (p
, '.');
300 obstack_grow (&temporary_obstack
, s
, p
- s
);
301 return (char *) obstack_copy0 (&temporary_obstack
, ext
, strlen (ext
));
305 obstack_fgets (FILE *stream
, struct obstack
*ob
)
308 while ((c
= getc (stream
)) != EOF
&& c
!= '\n')
309 obstack_1grow (ob
, c
);
310 if (obstack_object_size (ob
) == 0)
312 obstack_1grow (ob
, '\0');
313 return XOBFINISH (ob
, char *);
317 tfgets (FILE *stream
)
319 return obstack_fgets (stream
, &temporary_obstack
);
323 pfgets (FILE *stream
)
325 return xstrdup (tfgets (stream
));
328 /* Real tlink code. */
330 /* Subroutine of read_repo_file. We are reading the repo file for file F,
331 which is coming in on STREAM, and the symbol that comes next in STREAM
332 is offered, chosen or provided if CHOSEN is 0, 1 or 2, respectively.
334 XXX "provided" is unimplemented, both here and in the compiler. */
337 freadsym (FILE *stream
, file
*f
, int chosen
)
342 const char *name
= tfgets (stream
);
343 sym
= symbol_hash_lookup (name
, true);
346 if (sym
->file
== NULL
)
348 /* We didn't have this symbol already, so we choose this file. */
352 sym
->chosen
= chosen
;
356 /* We want this file; cast aside any pretender. */
358 if (sym
->chosen
&& sym
->file
!= f
)
360 if (sym
->chosen
== 1)
361 file_push (sym
->file
);
366 chosen
= sym
->chosen
;
370 sym
->chosen
= chosen
;
374 /* Read in the repo file denoted by F, and record all its information. */
377 read_repo_file (file
*f
)
380 FILE *stream
= fopen (f
->key
, "r");
382 if (tlink_verbose
>= 2)
383 fprintf (stderr
, _("collect: reading %s\n"), f
->key
);
385 while (fscanf (stream
, "%c ", &c
) == 1)
390 f
->args
= pfgets (stream
);
393 f
->dir
= pfgets (stream
);
396 f
->main
= pfgets (stream
);
399 freadsym (stream
, f
, 2);
402 freadsym (stream
, f
, 1);
405 freadsym (stream
, f
, 0);
408 obstack_free (&temporary_obstack
, temporary_firstobj
);
412 f
->args
= getenv ("COLLECT_GCC_OPTIONS");
417 /* We might want to modify LINE, which is a symbol line from file F. We do
418 this if either we saw an error message referring to the symbol in
419 question, or we have already allocated the symbol to another file and
420 this one wants to emit it as well. */
423 maybe_tweak (char *line
, file
*f
)
425 symbol
*sym
= symbol_hash_lookup (line
+ 2, false);
427 if ((sym
->file
== f
&& sym
->tweaking
)
428 || (sym
->file
!= f
&& line
[0] == 'C'))
440 /* Update the repo files for each of the object files we have adjusted and
444 recompile_files (void)
448 putenv (xstrdup ("COMPILER_PATH="));
449 putenv (xstrdup ("LIBRARY_PATH="));
451 while ((f
= file_pop ()) != NULL
)
456 struct obstack arg_stack
;
457 FILE *stream
= fopen (f
->key
, "r");
458 const char *const outname
= frob_extension (f
->key
, ".rnw");
459 FILE *output
= fopen (outname
, "w");
461 while ((line
= tfgets (stream
)) != NULL
)
467 maybe_tweak (line
, f
);
469 fprintf (output
, "%s\n", line
);
473 /* On Windows "rename" returns -1 and sets ERRNO to EACCESS if
474 the new file name already exists. Therefore, we explicitly
475 remove the old file first. */
476 if (remove (f
->key
) == -1)
477 fatal_perror ("removing .rpo file");
478 if (rename (outname
, f
->key
) == -1)
479 fatal_perror ("renaming .rpo file");
483 error ("repository file '%s' does not contain command-line "
484 "arguments", f
->key
);
488 /* Build a null-terminated argv array suitable for
489 tlink_execute(). Manipulate arguments on the arg_stack while
490 building argv on the temporary_obstack. */
492 obstack_init (&arg_stack
);
493 obstack_ptr_grow (&temporary_obstack
, c_file_name
);
495 for (p
= f
->args
; *p
!= '\0'; p
= q
+ 1)
497 /* Arguments are delimited by single-quotes. Find the
499 p
= strchr (p
, '\'');
503 /* Find the closing quote. */
504 q
= strchr (p
+ 1, '\'');
508 obstack_grow (&arg_stack
, p
+ 1, q
- (p
+ 1));
510 /* Replace '\'' with '. This is how set_collect_gcc_options
511 encodes a single-quote. */
512 while (q
[1] == '\\' && q
[2] == '\'' && q
[3] == '\'')
516 r
= strchr (q
+ 4, '\'');
520 obstack_grow (&arg_stack
, q
+ 3, r
- (q
+ 3));
524 obstack_1grow (&arg_stack
, '\0');
525 obstack_ptr_grow (&temporary_obstack
, obstack_finish (&arg_stack
));
528 obstack_ptr_grow (&temporary_obstack
, f
->main
);
529 obstack_ptr_grow (&temporary_obstack
, NULL
);
530 argv
= XOBFINISH (&temporary_obstack
, char **);
533 fprintf (stderr
, _("collect: recompiling %s\n"), f
->main
);
535 if (chdir (f
->dir
) != 0
536 || tlink_execute (c_file_name
, argv
, NULL
, NULL
) != 0
537 || chdir (initial_cwd
) != 0)
542 obstack_free (&arg_stack
, NULL
);
543 obstack_free (&temporary_obstack
, temporary_firstobj
);
548 /* The first phase of processing: determine which object files have
549 .rpo files associated with them, and read in the information. */
552 read_repo_files (char **object_lst
)
554 char **object
= object_lst
;
556 for (; *object
; object
++)
561 /* Don't bother trying for ld flags. */
562 if (*object
[0] == '-')
565 p
= frob_extension (*object
, ".rpo");
567 if (! file_exists (p
))
570 f
= file_hash_lookup (p
);
575 if (file_stack
!= NULL
&& ! recompile_files ())
578 return (symbol_stack
!= NULL
);
581 /* Add the demangled forms of any new symbols to the hash table. */
584 demangle_new_symbols (void)
588 while ((sym
= symbol_pop ()) != NULL
)
591 const char *p
= cplus_demangle (sym
->key
, DMGL_PARAMS
| DMGL_ANSI
);
596 dem
= demangled_hash_lookup (p
, true);
597 dem
->mangled
= sym
->key
;
601 /* Step through the output of the linker, in the file named FNAME, and
602 adjust the settings for each symbol encountered. */
605 scan_linker_output (const char *fname
)
607 FILE *stream
= fopen (fname
, "r");
609 int skip_next_in_line
= 0;
611 while ((line
= tfgets (stream
)) != NULL
)
618 /* On darwin9, we might have to skip " in " lines as well. */
619 if (skip_next_in_line
620 && strstr (p
, " in "))
622 skip_next_in_line
= 0;
624 while (*p
&& ISSPACE ((unsigned char) *p
))
630 for (q
= p
; *q
&& ! ISSPACE ((unsigned char) *q
); ++q
)
633 /* Try the first word on the line. */
636 if (!strncmp (p
, USER_LABEL_PREFIX
, strlen (USER_LABEL_PREFIX
)))
637 p
+= strlen (USER_LABEL_PREFIX
);
641 sym
= symbol_hash_lookup (p
, false);
643 /* Some SVR4 linkers produce messages like
644 ld: 0711-317 ERROR: Undefined symbol: .g__t3foo1Zi
646 if (! sym
&& ! end
&& strstr (q
+ 1, "Undefined symbol: "))
648 char *p
= strrchr (q
+ 1, ' ');
652 if (!strncmp (p
, USER_LABEL_PREFIX
, strlen (USER_LABEL_PREFIX
)))
653 p
+= strlen (USER_LABEL_PREFIX
);
654 sym
= symbol_hash_lookup (p
, false);
658 /* Try a mangled name in quotes. */
664 /* On darwin9, we look for "foo" referenced from:\n\(.* in .*\n\)* */
665 if (strcmp (oldq
, "referenced from:") == 0)
667 /* We have to remember that we found a symbol to tweak. */
670 /* We actually want to start from the first word on the
674 /* Since the format is multiline, we have to skip
675 following lines with " in ". */
676 skip_next_in_line
= 1;
679 /* First try `GNU style'. */
680 p
= strchr (oldq
, '`');
682 p
++, q
= strchr (p
, '\'');
683 /* Then try "double quotes". */
684 else if (p
= strchr (oldq
, '"'), p
)
685 p
++, q
= strchr (p
, '"');
686 /* Then try 'single quotes'. */
687 else if (p
= strchr (oldq
, '\''), p
)
688 p
++, q
= strchr (p
, '\'');
690 /* Then try entire line. */
691 q
= strchr (oldq
, 0);
698 /* Don't let the strstr's below see the demangled name; we
699 might get spurious matches. */
702 /* powerpc64-linux references .foo when calling function foo. */
707 /* We need to check for certain error keywords here, or we would
708 mistakenly use GNU ld's "In function `foo':" message. */
710 || strstr (oldq
, "ndefined")
711 || strstr (oldq
, "nresolved")
712 || strstr (oldq
, "nsatisfied")
713 || strstr (oldq
, "ultiple")))
716 dem
= demangled_hash_lookup (p
, false);
718 sym
= symbol_hash_lookup (dem
->mangled
, false);
721 if (!strncmp (p
, USER_LABEL_PREFIX
,
722 strlen (USER_LABEL_PREFIX
)))
723 p
+= strlen (USER_LABEL_PREFIX
);
724 sym
= symbol_hash_lookup (p
, false);
729 if (sym
&& sym
->tweaked
)
731 error ("'%s' was assigned to '%s', but was not defined "
732 "during recompilation, or vice versa",
733 sym
->key
, sym
->file
->key
);
737 if (sym
&& !sym
->tweaking
)
739 if (tlink_verbose
>= 2)
740 fprintf (stderr
, _("collect: tweaking %s in %s\n"),
741 sym
->key
, sym
->file
->key
);
743 file_push (sym
->file
);
746 obstack_free (&temporary_obstack
, temporary_firstobj
);
750 return (file_stack
!= NULL
);
753 /* Entry point for tlink. Called from main in collect2.c.
755 Iteratively try to provide definitions for all the unresolved symbols
756 mentioned in the linker error messages.
758 LD_ARGV is an array of arguments for the linker.
759 OBJECT_LST is an array of object files that we may be able to recompile
760 to provide missing definitions. Currently ignored. */
763 do_tlink (char **ld_argv
, char **object_lst ATTRIBUTE_UNUSED
)
765 int exit
= tlink_execute ("ld", ld_argv
, ldout
, lderrout
);
773 /* Until collect does a better job of figuring out which are object
774 files, assume that everything on the command line could be. */
775 if (read_repo_files (ld_argv
))
776 while (exit
&& i
++ < MAX_ITERATIONS
)
778 if (tlink_verbose
>= 3)
780 dump_file (ldout
, stdout
);
781 dump_file (lderrout
, stderr
);
783 demangle_new_symbols ();
784 if (! scan_linker_output (ldout
)
785 && ! scan_linker_output (lderrout
))
787 if (! recompile_files ())
790 fprintf (stderr
, _("collect: relinking\n"));
791 exit
= tlink_execute ("ld", ld_argv
, ldout
, lderrout
);
795 dump_file (ldout
, stdout
);
797 dump_file (lderrout
, stderr
);
801 error ("ld returned %d exit status", exit
);