* config.gcc (c_target_objs)[i?86-*-pe|i?86-*-cygwin*]: Don't add
[official-gcc.git] / gcc / tlink.c
blob7b589832b06ce799fde99fec725666e764e36e22
1 /* Scan linker error messages for missing template instantiations and provide
2 them.
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
13 version.
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
18 for more details.
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/>. */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "intl.h"
29 #include "obstack.h"
30 #include "hashtab.h"
31 #include "demangle.h"
32 #include "collect2.h"
33 #include "libiberty.h"
35 /* TARGET_64BIT may be defined to use driver specific functionality. */
36 #undef TARGET_64BIT
37 #define TARGET_64BIT TARGET_64BIT_DEFAULT
39 #define MAX_ITERATIONS 17
41 /* Defined in the automatically-generated underscore.c. */
42 extern int prepends_underscore;
44 static int tlink_verbose;
46 static char *initial_cwd;
48 /* Hash table boilerplate for working with htab_t. We have hash tables
49 for symbol names, file names, and demangled symbols. */
51 typedef struct symbol_hash_entry
53 const char *key;
54 struct file_hash_entry *file;
55 int chosen;
56 int tweaking;
57 int tweaked;
58 } symbol;
60 typedef struct file_hash_entry
62 const char *key;
63 const char *args;
64 const char *dir;
65 const char *main;
66 int tweaking;
67 } file;
69 typedef struct demangled_hash_entry
71 const char *key;
72 const char *mangled;
73 } demangled;
75 /* Hash and comparison functions for these hash tables. */
77 static int hash_string_eq (const void *, const void *);
78 static hashval_t hash_string_hash (const void *);
80 static int
81 hash_string_eq (const void *s1_p, const void *s2_p)
83 const char *const *s1 = (const char *const *) s1_p;
84 const char *s2 = (const char *) s2_p;
85 return strcmp (*s1, s2) == 0;
88 static hashval_t
89 hash_string_hash (const void *s_p)
91 const char *const *s = (const char *const *) s_p;
92 return (*htab_hash_string) (*s);
95 static htab_t symbol_table;
97 static struct symbol_hash_entry * symbol_hash_lookup (const char *, int);
98 static struct file_hash_entry * file_hash_lookup (const char *);
99 static struct demangled_hash_entry *demangled_hash_lookup (const char *, int);
100 static void symbol_push (symbol *);
101 static symbol * symbol_pop (void);
102 static void file_push (file *);
103 static file * file_pop (void);
104 static void tlink_init (void);
105 static int tlink_execute (const char *, char **, const char *, const char *);
106 static char * frob_extension (const char *, const char *);
107 static char * obstack_fgets (FILE *, struct obstack *);
108 static char * tfgets (FILE *);
109 static char * pfgets (FILE *);
110 static void freadsym (FILE *, file *, int);
111 static void read_repo_file (file *);
112 static void maybe_tweak (char *, file *);
113 static int recompile_files (void);
114 static int read_repo_files (char **);
115 static void demangle_new_symbols (void);
116 static int scan_linker_output (const char *);
118 /* Look up an entry in the symbol hash table. */
120 static struct symbol_hash_entry *
121 symbol_hash_lookup (const char *string, int create)
123 void **e;
124 e = htab_find_slot_with_hash (symbol_table, string,
125 (*htab_hash_string) (string),
126 create ? INSERT : NO_INSERT);
127 if (e == NULL)
128 return NULL;
129 if (*e == NULL)
131 struct symbol_hash_entry *v;
132 *e = v = XCNEW (struct symbol_hash_entry);
133 v->key = xstrdup (string);
135 return (struct symbol_hash_entry *) *e;
138 static htab_t file_table;
140 /* Look up an entry in the file hash table. */
142 static struct file_hash_entry *
143 file_hash_lookup (const char *string)
145 void **e;
146 e = htab_find_slot_with_hash (file_table, string,
147 (*htab_hash_string) (string),
148 INSERT);
149 if (*e == NULL)
151 struct file_hash_entry *v;
152 *e = v = XCNEW (struct file_hash_entry);
153 v->key = xstrdup (string);
155 return (struct file_hash_entry *) *e;
158 static htab_t demangled_table;
160 /* Look up an entry in the demangled name hash table. */
162 static struct demangled_hash_entry *
163 demangled_hash_lookup (const char *string, int create)
165 void **e;
166 e = htab_find_slot_with_hash (demangled_table, string,
167 (*htab_hash_string) (string),
168 create ? INSERT : NO_INSERT);
169 if (e == NULL)
170 return NULL;
171 if (*e == NULL)
173 struct demangled_hash_entry *v;
174 *e = v = XCNEW (struct demangled_hash_entry);
175 v->key = xstrdup (string);
177 return (struct demangled_hash_entry *) *e;
180 /* Stack code. */
182 struct symbol_stack_entry
184 symbol *value;
185 struct symbol_stack_entry *next;
187 struct obstack symbol_stack_obstack;
188 struct symbol_stack_entry *symbol_stack;
190 struct file_stack_entry
192 file *value;
193 struct file_stack_entry *next;
195 struct obstack file_stack_obstack;
196 struct file_stack_entry *file_stack;
198 static void
199 symbol_push (symbol *p)
201 struct symbol_stack_entry *ep
202 = XOBNEW (&symbol_stack_obstack, struct symbol_stack_entry);
203 ep->value = p;
204 ep->next = symbol_stack;
205 symbol_stack = ep;
208 static symbol *
209 symbol_pop (void)
211 struct symbol_stack_entry *ep = symbol_stack;
212 symbol *p;
213 if (ep == NULL)
214 return NULL;
215 p = ep->value;
216 symbol_stack = ep->next;
217 obstack_free (&symbol_stack_obstack, ep);
218 return p;
221 static void
222 file_push (file *p)
224 struct file_stack_entry *ep;
226 if (p->tweaking)
227 return;
229 ep = XOBNEW (&file_stack_obstack, struct file_stack_entry);
230 ep->value = p;
231 ep->next = file_stack;
232 file_stack = ep;
233 p->tweaking = 1;
236 static file *
237 file_pop (void)
239 struct file_stack_entry *ep = file_stack;
240 file *p;
241 if (ep == NULL)
242 return NULL;
243 p = ep->value;
244 file_stack = ep->next;
245 obstack_free (&file_stack_obstack, ep);
246 p->tweaking = 0;
247 return p;
250 /* Other machinery. */
252 /* Initialize the tlink machinery. Called from do_tlink. */
254 static void
255 tlink_init (void)
257 const char *p;
259 symbol_table = htab_create (500, hash_string_hash, hash_string_eq,
260 NULL);
261 file_table = htab_create (500, hash_string_hash, hash_string_eq,
262 NULL);
263 demangled_table = htab_create (500, hash_string_hash, hash_string_eq,
264 NULL);
266 obstack_begin (&symbol_stack_obstack, 0);
267 obstack_begin (&file_stack_obstack, 0);
269 p = getenv ("TLINK_VERBOSE");
270 if (p)
271 tlink_verbose = atoi (p);
272 else
274 tlink_verbose = 1;
275 if (vflag)
276 tlink_verbose = 2;
277 if (debug)
278 tlink_verbose = 3;
281 initial_cwd = getpwd ();
284 static int
285 tlink_execute (const char *prog, char **argv, const char *outname,
286 const char *errname)
288 struct pex_obj *pex;
290 pex = collect_execute (prog, argv, outname, errname, PEX_LAST | PEX_SEARCH);
291 return collect_wait (prog, pex);
294 static char *
295 frob_extension (const char *s, const char *ext)
297 const char *p = strrchr (s, '/');
298 if (! p)
299 p = s;
300 p = strrchr (p, '.');
301 if (! p)
302 p = s + strlen (s);
304 obstack_grow (&temporary_obstack, s, p - s);
305 return (char *) obstack_copy0 (&temporary_obstack, ext, strlen (ext));
308 static char *
309 obstack_fgets (FILE *stream, struct obstack *ob)
311 int c;
312 while ((c = getc (stream)) != EOF && c != '\n')
313 obstack_1grow (ob, c);
314 if (obstack_object_size (ob) == 0)
315 return NULL;
316 obstack_1grow (ob, '\0');
317 return XOBFINISH (ob, char *);
320 static char *
321 tfgets (FILE *stream)
323 return obstack_fgets (stream, &temporary_obstack);
326 static char *
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. */
340 static void
341 freadsym (FILE *stream, file *f, int chosen)
343 symbol *sym;
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. */
354 symbol_push (sym);
355 sym->file = f;
356 sym->chosen = chosen;
358 else if (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);
366 else
368 file_push (f);
369 f = sym->file;
370 chosen = sym->chosen;
373 sym->file = f;
374 sym->chosen = chosen;
378 /* Read in the repo file denoted by F, and record all its information. */
380 static void
381 read_repo_file (file *f)
383 char c;
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)
391 switch (c)
393 case 'A':
394 f->args = pfgets (stream);
395 break;
396 case 'D':
397 f->dir = pfgets (stream);
398 break;
399 case 'M':
400 f->main = pfgets (stream);
401 break;
402 case 'P':
403 freadsym (stream, f, 2);
404 break;
405 case 'C':
406 freadsym (stream, f, 1);
407 break;
408 case 'O':
409 freadsym (stream, f, 0);
410 break;
412 obstack_free (&temporary_obstack, temporary_firstobj);
414 fclose (stream);
415 if (f->args == NULL)
416 f->args = getenv ("COLLECT_GCC_OPTIONS");
417 if (f->dir == NULL)
418 f->dir = ".";
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. */
426 static void
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'))
434 sym->tweaking = 0;
435 sym->tweaked = 1;
437 if (line[0] == 'O')
438 line[0] = 'C';
439 else
440 line[0] = 'O';
444 /* Update the repo files for each of the object files we have adjusted and
445 recompile. */
447 static int
448 recompile_files (void)
450 file *f;
452 putenv (xstrdup ("COMPILER_PATH="));
453 putenv (xstrdup ("LIBRARY_PATH="));
455 while ((f = file_pop ()) != NULL)
457 char *line;
458 const char *p, *q;
459 char **argv;
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)
467 switch (line[0])
469 case 'C':
470 case 'O':
471 maybe_tweak (line, f);
473 fprintf (output, "%s\n", line);
475 fclose (stream);
476 fclose (output);
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_perror ("removing .rpo file");
482 if (rename (outname, f->key) == -1)
483 fatal_perror ("renaming .rpo file");
485 if (!f->args)
487 error ("repository file '%s' does not contain command-line "
488 "arguments", f->key);
489 return 0;
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
502 opening quote. */
503 p = strchr (p, '\'');
504 if (!p)
505 goto done;
507 /* Find the closing quote. */
508 q = strchr (p + 1, '\'');
509 if (!q)
510 goto done;
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] == '\'')
518 const char *r;
520 r = strchr (q + 4, '\'');
521 if (!r)
522 goto done;
524 obstack_grow (&arg_stack, q + 3, r - (q + 3));
525 q = r;
528 obstack_1grow (&arg_stack, '\0');
529 obstack_ptr_grow (&temporary_obstack, obstack_finish (&arg_stack));
531 done:
532 obstack_ptr_grow (&temporary_obstack, f->main);
533 obstack_ptr_grow (&temporary_obstack, NULL);
534 argv = XOBFINISH (&temporary_obstack, char **);
536 if (tlink_verbose)
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)
542 return 0;
544 read_repo_file (f);
546 obstack_free (&arg_stack, NULL);
547 obstack_free (&temporary_obstack, temporary_firstobj);
549 return 1;
552 /* The first phase of processing: determine which object files have
553 .rpo files associated with them, and read in the information. */
555 static int
556 read_repo_files (char **object_lst)
558 char **object = object_lst;
560 for (; *object; object++)
562 const char *p;
563 file *f;
565 /* Don't bother trying for ld flags. */
566 if (*object[0] == '-')
567 continue;
569 p = frob_extension (*object, ".rpo");
571 if (! file_exists (p))
572 continue;
574 f = file_hash_lookup (p);
576 read_repo_file (f);
579 if (file_stack != NULL && ! recompile_files ())
580 return 0;
582 return (symbol_stack != NULL);
585 /* Add the demangled forms of any new symbols to the hash table. */
587 static void
588 demangle_new_symbols (void)
590 symbol *sym;
592 while ((sym = symbol_pop ()) != NULL)
594 demangled *dem;
595 const char *p = cplus_demangle (sym->key, DMGL_PARAMS | DMGL_ANSI);
597 if (! p)
598 continue;
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. */
608 static int
609 scan_linker_output (const char *fname)
611 FILE *stream = fopen (fname, "r");
612 char *line;
613 int skip_next_in_line = 0;
615 while ((line = tfgets (stream)) != NULL)
617 char *p = line, *q;
618 symbol *sym;
619 int end;
620 int ok = 0;
622 /* On darwin9, we might have to skip " in " lines as well. */
623 if (skip_next_in_line
624 && strstr (p, " in "))
625 continue;
626 skip_next_in_line = 0;
628 while (*p && ISSPACE ((unsigned char) *p))
629 ++p;
631 if (! *p)
632 continue;
634 for (q = p; *q && ! ISSPACE ((unsigned char) *q); ++q)
637 /* Try the first word on the line. */
638 if (*p == '.')
639 ++p;
640 if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
641 p += strlen (USER_LABEL_PREFIX);
643 end = ! *q;
644 *q = 0;
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, ' ');
653 p++;
654 if (*p == '.')
655 p++;
656 if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
657 p += strlen (USER_LABEL_PREFIX);
658 sym = symbol_hash_lookup (p, false);
661 if (! sym && ! end)
662 /* Try a mangled name in quotes. */
664 char *oldq = q + 1;
665 demangled *dem = 0;
666 q = 0;
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. */
672 ok = 1;
674 /* We actually want to start from the first word on the
675 line. */
676 oldq = p;
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, '`');
685 if (p)
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, '\'');
693 else {
694 /* Then try entire line. */
695 q = strchr (oldq, 0);
696 if (q != oldq)
697 p = (char *)oldq;
700 if (p)
702 /* Don't let the strstr's below see the demangled name; we
703 might get spurious matches. */
704 p[-1] = '\0';
706 /* powerpc64-linux references .foo when calling function foo. */
707 if (*p == '.')
708 p++;
711 /* We need to check for certain error keywords here, or we would
712 mistakenly use GNU ld's "In function `foo':" message. */
713 if (q && (ok
714 || strstr (oldq, "ndefined")
715 || strstr (oldq, "nresolved")
716 || strstr (oldq, "nsatisfied")
717 || strstr (oldq, "ultiple")))
719 *q = 0;
720 dem = demangled_hash_lookup (p, false);
721 if (dem)
722 sym = symbol_hash_lookup (dem->mangled, false);
723 else
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);
738 fclose (stream);
739 return 0;
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);
746 sym->tweaking = 1;
747 file_push (sym->file);
750 obstack_free (&temporary_obstack, temporary_firstobj);
753 fclose (stream);
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. */
766 void
767 do_tlink (char **ld_argv, char **object_lst ATTRIBUTE_UNUSED)
769 int exit = tlink_execute ("ld", ld_argv, ldout, lderrout);
771 tlink_init ();
773 if (exit)
775 int i = 0;
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))
790 break;
791 if (! recompile_files ())
792 break;
793 if (tlink_verbose)
794 fprintf (stderr, _("collect: relinking\n"));
795 exit = tlink_execute ("ld", ld_argv, ldout, lderrout);
799 dump_file (ldout, stdout);
800 unlink (ldout);
801 dump_file (lderrout, stderr);
802 unlink (lderrout);
803 if (exit)
805 error ("ld returned %d exit status", exit);
806 collect_exit (exit);