]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tlink.c
dwarf2out.c (dwarf2out_frame_finish): Honor DWARF2_FRAME_INFO defined and non-zero.
[thirdparty/gcc.git] / gcc / tlink.c
CommitLineData
aa32d841
JL
1/* Scan linker error messages for missing template instantiations and provide
2 them.
3
1fff69c9 4 Copyright (C) 1995, 1998, 1999, 2000, 2001, 2003, 2004, 2005
46c5ad27 5 Free Software Foundation, Inc.
aa32d841
JL
6 Contributed by Jason Merrill (jason@cygnus.com).
7
1322177d 8This file is part of GCC.
aa32d841 9
1322177d
LB
10GCC is free software; you can redistribute it and/or modify it under
11the terms of the GNU General Public License as published by the Free
12Software Foundation; either version 2, or (at your option) any later
13version.
aa32d841 14
1322177d
LB
15GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16WARRANTY; without even the implied warranty of MERCHANTABILITY or
17FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18for more details.
aa32d841
JL
19
20You should have received a copy of the GNU General Public License
1322177d
LB
21along with GCC; see the file COPYING. If not, write to the Free
22Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2302111-1307, USA. */
aa32d841 24
aa32d841 25#include "config.h"
670ee920 26#include "system.h"
4977bab6
ZW
27#include "coretypes.h"
28#include "tm.h"
993c790e 29#include "intl.h"
e2500fed
GK
30#include "obstack.h"
31#include "hashtab.h"
aa32d841 32#include "demangle.h"
2edfd4ee 33#include "collect2.h"
aa32d841
JL
34
35#define MAX_ITERATIONS 17
36
aa32d841
JL
37/* Defined in the automatically-generated underscore.c. */
38extern int prepends_underscore;
39
40static int tlink_verbose;
4185f1ce
AN
41
42static char initial_cwd[MAXPATHLEN + 1];
aa32d841 43\f
e2500fed 44/* Hash table boilerplate for working with htab_t. We have hash tables
eb686064 45 for symbol names, file names, and demangled symbols. */
aa32d841
JL
46
47typedef struct symbol_hash_entry
48{
e2500fed 49 const char *key;
aa32d841
JL
50 struct file_hash_entry *file;
51 int chosen;
52 int tweaking;
53 int tweaked;
54} symbol;
55
56typedef struct file_hash_entry
57{
e2500fed 58 const char *key;
aa32d841
JL
59 const char *args;
60 const char *dir;
61 const char *main;
62 int tweaking;
63} file;
64
65typedef struct demangled_hash_entry
66{
e2500fed 67 const char *key;
aa32d841
JL
68 const char *mangled;
69} demangled;
70
e2500fed
GK
71/* Hash and comparison functions for these hash tables. */
72
46c5ad27
AJ
73static int hash_string_eq (const void *, const void *);
74static hashval_t hash_string_hash (const void *);
e2500fed
GK
75
76static int
46c5ad27 77hash_string_eq (const void *s1_p, const void *s2_p)
e2500fed 78{
17fa74a2
KH
79 const char *const *s1 = (const char *const *) s1_p;
80 const char *s2 = (const char *) s2_p;
e2500fed
GK
81 return strcmp (*s1, s2) == 0;
82}
83
84static hashval_t
46c5ad27 85hash_string_hash (const void *s_p)
e2500fed 86{
17fa74a2 87 const char *const *s = (const char *const *) s_p;
e2500fed
GK
88 return (*htab_hash_string) (*s);
89}
90
91static htab_t symbol_table;
aa32d841 92
46c5ad27
AJ
93static struct symbol_hash_entry * symbol_hash_lookup (const char *, int);
94static struct file_hash_entry * file_hash_lookup (const char *);
95static struct demangled_hash_entry *demangled_hash_lookup (const char *, int);
96static void symbol_push (symbol *);
97static symbol * symbol_pop (void);
98static void file_push (file *);
99static file * file_pop (void);
100static void tlink_init (void);
101static int tlink_execute (const char *, char **, const char *);
102static char * frob_extension (const char *, const char *);
103static char * obstack_fgets (FILE *, struct obstack *);
104static char * tfgets (FILE *);
105static char * pfgets (FILE *);
106static void freadsym (FILE *, file *, int);
107static void read_repo_file (file *);
108static void maybe_tweak (char *, file *);
109static int recompile_files (void);
110static int read_repo_files (char **);
111static void demangle_new_symbols (void);
112static int scan_linker_output (const char *);
54ea1de9 113
eb686064
JM
114/* Look up an entry in the symbol hash table. */
115
aa32d841 116static struct symbol_hash_entry *
46c5ad27 117symbol_hash_lookup (const char *string, int create)
aa32d841 118{
fad205ff 119 void **e;
e2500fed 120 e = htab_find_slot_with_hash (symbol_table, string,
17fa74a2 121 (*htab_hash_string) (string),
e2500fed
GK
122 create ? INSERT : NO_INSERT);
123 if (e == NULL)
124 return NULL;
125 if (*e == NULL)
aa32d841 126 {
e2500fed
GK
127 struct symbol_hash_entry *v;
128 *e = v = xcalloc (1, sizeof (*v));
129 v->key = xstrdup (string);
aa32d841 130 }
e2500fed 131 return *e;
aa32d841
JL
132}
133
e2500fed
GK
134static htab_t file_table;
135
eb686064
JM
136/* Look up an entry in the file hash table. */
137
aa32d841 138static struct file_hash_entry *
46c5ad27 139file_hash_lookup (const char *string)
aa32d841 140{
fad205ff 141 void **e;
e2500fed 142 e = htab_find_slot_with_hash (file_table, string,
17fa74a2 143 (*htab_hash_string) (string),
e2500fed
GK
144 INSERT);
145 if (*e == NULL)
aa32d841 146 {
e2500fed
GK
147 struct file_hash_entry *v;
148 *e = v = xcalloc (1, sizeof (*v));
149 v->key = xstrdup (string);
aa32d841 150 }
e2500fed 151 return *e;
aa32d841
JL
152}
153
e2500fed
GK
154static htab_t demangled_table;
155
eb686064
JM
156/* Look up an entry in the demangled name hash table. */
157
aa32d841 158static struct demangled_hash_entry *
46c5ad27 159demangled_hash_lookup (const char *string, int create)
aa32d841 160{
fad205ff 161 void **e;
e2500fed 162 e = htab_find_slot_with_hash (demangled_table, string,
17fa74a2 163 (*htab_hash_string) (string),
e2500fed
GK
164 create ? INSERT : NO_INSERT);
165 if (e == NULL)
166 return NULL;
167 if (*e == NULL)
168 {
169 struct demangled_hash_entry *v;
170 *e = v = xcalloc (1, sizeof (*v));
171 v->key = xstrdup (string);
172 }
173 return *e;
aa32d841
JL
174}
175\f
176/* Stack code. */
177
178struct symbol_stack_entry
179{
180 symbol *value;
181 struct symbol_stack_entry *next;
182};
183struct obstack symbol_stack_obstack;
184struct symbol_stack_entry *symbol_stack;
185
186struct file_stack_entry
187{
188 file *value;
189 struct file_stack_entry *next;
190};
191struct obstack file_stack_obstack;
192struct file_stack_entry *file_stack;
193
194static void
46c5ad27 195symbol_push (symbol *p)
aa32d841 196{
703ad42b 197 struct symbol_stack_entry *ep = obstack_alloc
aa32d841
JL
198 (&symbol_stack_obstack, sizeof (struct symbol_stack_entry));
199 ep->value = p;
200 ep->next = symbol_stack;
201 symbol_stack = ep;
202}
203
204static symbol *
46c5ad27 205symbol_pop (void)
aa32d841
JL
206{
207 struct symbol_stack_entry *ep = symbol_stack;
208 symbol *p;
209 if (ep == NULL)
210 return NULL;
211 p = ep->value;
212 symbol_stack = ep->next;
213 obstack_free (&symbol_stack_obstack, ep);
214 return p;
215}
216
217static void
46c5ad27 218file_push (file *p)
aa32d841
JL
219{
220 struct file_stack_entry *ep;
221
222 if (p->tweaking)
223 return;
224
703ad42b 225 ep = obstack_alloc
aa32d841
JL
226 (&file_stack_obstack, sizeof (struct file_stack_entry));
227 ep->value = p;
228 ep->next = file_stack;
229 file_stack = ep;
230 p->tweaking = 1;
231}
232
233static file *
46c5ad27 234file_pop (void)
aa32d841
JL
235{
236 struct file_stack_entry *ep = file_stack;
237 file *p;
238 if (ep == NULL)
239 return NULL;
240 p = ep->value;
241 file_stack = ep->next;
242 obstack_free (&file_stack_obstack, ep);
243 p->tweaking = 0;
244 return p;
245}
246\f
247/* Other machinery. */
248
eb686064
JM
249/* Initialize the tlink machinery. Called from do_tlink. */
250
aa32d841 251static void
46c5ad27 252tlink_init (void)
aa32d841 253{
d4058195 254 const char *p;
aa32d841 255
e2500fed
GK
256 symbol_table = htab_create (500, hash_string_hash, hash_string_eq,
257 NULL);
258 file_table = htab_create (500, hash_string_hash, hash_string_eq,
259 NULL);
260 demangled_table = htab_create (500, hash_string_hash, hash_string_eq,
261 NULL);
46c5ad27 262
aa32d841
JL
263 obstack_begin (&symbol_stack_obstack, 0);
264 obstack_begin (&file_stack_obstack, 0);
265
266 p = getenv ("TLINK_VERBOSE");
267 if (p)
268 tlink_verbose = atoi (p);
269 else
270 {
271 tlink_verbose = 1;
272 if (vflag)
273 tlink_verbose = 2;
274 if (debug)
275 tlink_verbose = 3;
276 }
4185f1ce
AN
277
278 getcwd (initial_cwd, sizeof (initial_cwd));
aa32d841
JL
279}
280
281static int
46c5ad27 282tlink_execute (const char *prog, char **argv, const char *redir)
aa32d841 283{
1fff69c9
ILT
284 struct pex_obj *pex;
285
286 pex = collect_execute (prog, argv, redir);
287 return collect_wait (prog, pex);
d92b4486 288}
aa32d841
JL
289
290static char *
46c5ad27 291frob_extension (const char *s, const char *ext)
aa32d841 292{
9473c522 293 const char *p = strrchr (s, '/');
aa32d841
JL
294 if (! p)
295 p = s;
9473c522 296 p = strrchr (p, '.');
aa32d841
JL
297 if (! p)
298 p = s + strlen (s);
299
300 obstack_grow (&temporary_obstack, s, p - s);
301 return obstack_copy0 (&temporary_obstack, ext, strlen (ext));
302}
303
304static char *
46c5ad27 305obstack_fgets (FILE *stream, struct obstack *ob)
aa32d841
JL
306{
307 int c;
308 while ((c = getc (stream)) != EOF && c != '\n')
309 obstack_1grow (ob, c);
310 if (obstack_object_size (ob) == 0)
311 return NULL;
312 obstack_1grow (ob, '\0');
313 return obstack_finish (ob);
314}
315
316static char *
46c5ad27 317tfgets (FILE *stream)
aa32d841
JL
318{
319 return obstack_fgets (stream, &temporary_obstack);
320}
321
322static char *
46c5ad27 323pfgets (FILE *stream)
aa32d841 324{
6d9f628e 325 return xstrdup (tfgets (stream));
aa32d841
JL
326}
327\f
328/* Real tlink code. */
329
eb686064
JM
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
14b493d6 332 is offered, chosen or provided if CHOSEN is 0, 1 or 2, respectively.
eb686064
JM
333
334 XXX "provided" is unimplemented, both here and in the compiler. */
335
aa32d841 336static void
46c5ad27 337freadsym (FILE *stream, file *f, int chosen)
aa32d841
JL
338{
339 symbol *sym;
340
341 {
d4058195 342 const char *name = tfgets (stream);
aa32d841
JL
343 sym = symbol_hash_lookup (name, true);
344 }
345
346 if (sym->file == NULL)
347 {
eb686064
JM
348 /* We didn't have this symbol already, so we choose this file. */
349
aa32d841
JL
350 symbol_push (sym);
351 sym->file = f;
352 sym->chosen = chosen;
353 }
354 else if (chosen)
355 {
eb686064
JM
356 /* We want this file; cast aside any pretender. */
357
aa32d841
JL
358 if (sym->chosen && sym->file != f)
359 {
360 if (sym->chosen == 1)
361 file_push (sym->file);
362 else
363 {
364 file_push (f);
365 f = sym->file;
366 chosen = sym->chosen;
367 }
368 }
369 sym->file = f;
370 sym->chosen = chosen;
371 }
372}
373
eb686064
JM
374/* Read in the repo file denoted by F, and record all its information. */
375
aa32d841 376static void
46c5ad27 377read_repo_file (file *f)
aa32d841
JL
378{
379 char c;
e2500fed 380 FILE *stream = fopen (f->key, "r");
aa32d841
JL
381
382 if (tlink_verbose >= 2)
e2500fed 383 fprintf (stderr, _("collect: reading %s\n"), f->key);
aa32d841
JL
384
385 while (fscanf (stream, "%c ", &c) == 1)
386 {
387 switch (c)
388 {
389 case 'A':
390 f->args = pfgets (stream);
391 break;
392 case 'D':
393 f->dir = pfgets (stream);
394 break;
395 case 'M':
396 f->main = pfgets (stream);
397 break;
398 case 'P':
399 freadsym (stream, f, 2);
400 break;
401 case 'C':
402 freadsym (stream, f, 1);
403 break;
404 case 'O':
405 freadsym (stream, f, 0);
406 break;
407 }
408 obstack_free (&temporary_obstack, temporary_firstobj);
409 }
410 fclose (stream);
411 if (f->args == NULL)
412 f->args = getenv ("COLLECT_GCC_OPTIONS");
413 if (f->dir == NULL)
414 f->dir = ".";
415}
416
eb686064
JM
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. */
421
aa32d841 422static void
46c5ad27 423maybe_tweak (char *line, file *f)
aa32d841
JL
424{
425 symbol *sym = symbol_hash_lookup (line + 2, false);
426
427 if ((sym->file == f && sym->tweaking)
428 || (sym->file != f && line[0] == 'C'))
429 {
430 sym->tweaking = 0;
431 sym->tweaked = 1;
432
433 if (line[0] == 'O')
434 line[0] = 'C';
435 else
436 line[0] = 'O';
437 }
438}
439
eb686064 440/* Update the repo files for each of the object files we have adjusted and
4185f1ce 441 recompile. */
eb686064 442
aa32d841 443static int
46c5ad27 444recompile_files (void)
aa32d841
JL
445{
446 file *f;
447
e4d72771
KJ
448 putenv (xstrdup ("COMPILER_PATH="));
449 putenv (xstrdup ("LIBRARY_PATH="));
d92b4486 450
aa32d841
JL
451 while ((f = file_pop ()) != NULL)
452 {
4185f1ce
AN
453 char *line;
454 const char *p, *q;
455 char **argv;
456 struct obstack arg_stack;
e2500fed
GK
457 FILE *stream = fopen (f->key, "r");
458 const char *const outname = frob_extension (f->key, ".rnw");
aa32d841
JL
459 FILE *output = fopen (outname, "w");
460
461 while ((line = tfgets (stream)) != NULL)
462 {
463 switch (line[0])
464 {
465 case 'C':
466 case 'O':
467 maybe_tweak (line, f);
468 }
469 fprintf (output, "%s\n", line);
470 }
471 fclose (stream);
472 fclose (output);
2d8a7f23
DS
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");
aa32d841 480
4684cd27
MM
481 if (!f->args)
482 {
9e637a26 483 error ("repository file '%s' does not contain command-line "
4684cd27
MM
484 "arguments", f->key);
485 return 0;
486 }
4185f1ce
AN
487
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. */
491
492 obstack_init (&arg_stack);
493 obstack_ptr_grow (&temporary_obstack, c_file_name);
494
495 for (p = f->args; *p != '\0'; p = q + 1)
496 {
497 /* Arguments are delimited by single-quotes. Find the
498 opening quote. */
499 p = strchr (p, '\'');
500 if (!p)
501 goto done;
502
503 /* Find the closing quote. */
504 q = strchr (p + 1, '\'');
505 if (!q)
506 goto done;
507
508 obstack_grow (&arg_stack, p + 1, q - (p + 1));
509
510 /* Replace '\'' with '. This is how set_collect_gcc_options
511 encodes a single-quote. */
512 while (q[1] == '\\' && q[2] == '\'' && q[3] == '\'')
513 {
514 const char *r;
515
516 r = strchr (q + 4, '\'');
517 if (!r)
518 goto done;
519
520 obstack_grow (&arg_stack, q + 3, r - (q + 3));
521 q = r;
522 }
523
524 obstack_1grow (&arg_stack, '\0');
525 obstack_ptr_grow (&temporary_obstack, obstack_finish (&arg_stack));
526 }
527 done:
528 obstack_ptr_grow (&temporary_obstack, f->main);
529 obstack_ptr_grow (&temporary_obstack, NULL);
530 argv = obstack_finish (&temporary_obstack);
aa32d841
JL
531
532 if (tlink_verbose)
5e4adfba 533 fprintf (stderr, _("collect: recompiling %s\n"), f->main);
aa32d841 534
4185f1ce
AN
535 if (chdir (f->dir) != 0
536 || tlink_execute (c_file_name, argv, NULL) != 0
537 || chdir (initial_cwd) != 0)
aa32d841
JL
538 return 0;
539
540 read_repo_file (f);
541
4185f1ce 542 obstack_free (&arg_stack, NULL);
aa32d841
JL
543 obstack_free (&temporary_obstack, temporary_firstobj);
544 }
545 return 1;
546}
547
eb686064
JM
548/* The first phase of processing: determine which object files have
549 .rpo files associated with them, and read in the information. */
550
aa32d841 551static int
46c5ad27 552read_repo_files (char **object_lst)
aa32d841
JL
553{
554 char **object = object_lst;
555
556 for (; *object; object++)
557 {
2c561874 558 const char *p;
aa32d841
JL
559 file *f;
560
2c561874
JM
561 /* Don't bother trying for ld flags. */
562 if (*object[0] == '-')
563 continue;
564
565 p = frob_extension (*object, ".rpo");
566
aa32d841
JL
567 if (! file_exists (p))
568 continue;
569
570 f = file_hash_lookup (p);
571
572 read_repo_file (f);
573 }
574
575 if (file_stack != NULL && ! recompile_files ())
576 return 0;
577
578 return (symbol_stack != NULL);
579}
580
eb686064
JM
581/* Add the demangled forms of any new symbols to the hash table. */
582
aa32d841 583static void
46c5ad27 584demangle_new_symbols (void)
aa32d841
JL
585{
586 symbol *sym;
587
588 while ((sym = symbol_pop ()) != NULL)
589 {
590 demangled *dem;
e2500fed 591 const char *p = cplus_demangle (sym->key, DMGL_PARAMS | DMGL_ANSI);
aa32d841
JL
592
593 if (! p)
594 continue;
595
596 dem = demangled_hash_lookup (p, true);
e2500fed 597 dem->mangled = sym->key;
aa32d841
JL
598 }
599}
600
eb686064
JM
601/* Step through the output of the linker, in the file named FNAME, and
602 adjust the settings for each symbol encountered. */
603
aa32d841 604static int
46c5ad27 605scan_linker_output (const char *fname)
aa32d841
JL
606{
607 FILE *stream = fopen (fname, "r");
608 char *line;
609
610 while ((line = tfgets (stream)) != NULL)
611 {
612 char *p = line, *q;
613 symbol *sym;
614 int end;
d92b4486 615
17fa74a2 616 while (*p && ISSPACE ((unsigned char) *p))
aa32d841
JL
617 ++p;
618
619 if (! *p)
620 continue;
621
17fa74a2 622 for (q = p; *q && ! ISSPACE ((unsigned char) *q); ++q)
aa32d841
JL
623 ;
624
625 /* Try the first word on the line. */
626 if (*p == '.')
627 ++p;
3fd9d606
ZW
628 if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
629 p += strlen (USER_LABEL_PREFIX);
aa32d841
JL
630
631 end = ! *q;
632 *q = 0;
633 sym = symbol_hash_lookup (p, false);
634
644c7c4f
GK
635 /* Some SVR4 linkers produce messages like
636 ld: 0711-317 ERROR: Undefined symbol: .g__t3foo1Zi
637 */
17fa74a2 638 if (! sym && ! end && strstr (q + 1, "Undefined symbol: "))
644c7c4f 639 {
17fa74a2 640 char *p = strrchr (q + 1, ' ');
644c7c4f
GK
641 p++;
642 if (*p == '.')
643 p++;
3fd9d606
ZW
644 if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
645 p += strlen (USER_LABEL_PREFIX);
644c7c4f
GK
646 sym = symbol_hash_lookup (p, false);
647 }
648
aa32d841 649 if (! sym && ! end)
b4558b57 650 /* Try a mangled name in quotes. */
aa32d841 651 {
17fa74a2 652 const char *oldq = q + 1;
aa32d841 653 demangled *dem = 0;
aa32d841
JL
654 q = 0;
655
b4558b57 656 /* First try `GNU style'. */
9473c522 657 p = strchr (oldq, '`');
b4558b57 658 if (p)
9473c522 659 p++, q = strchr (p, '\'');
b4558b57 660 /* Then try "double quotes". */
9473c522
JM
661 else if (p = strchr (oldq, '"'), p)
662 p++, q = strchr (p, '"');
973a43f6
MS
663 else {
664 /* Then try entire line. */
665 q = strchr (oldq, 0);
666 if (q != oldq)
a7050d49 667 p = (char *)oldq;
973a43f6 668 }
aa32d841 669
6ff7fb95 670 if (p)
8ace9f18
AM
671 {
672 /* Don't let the strstr's below see the demangled name; we
673 might get spurious matches. */
674 p[-1] = '\0';
675
676 /* powerpc64-linux references .foo when calling function foo. */
677 if (*p == '.')
678 p++;
679 }
6ff7fb95 680
57be4e89
JM
681 /* We need to check for certain error keywords here, or we would
682 mistakenly use GNU ld's "In function `foo':" message. */
683 if (q && (strstr (oldq, "ndefined")
3f94eee6 684 || strstr (oldq, "nresolved")
eb20f668 685 || strstr (oldq, "nsatisfied")
57be4e89 686 || strstr (oldq, "ultiple")))
aa32d841 687 {
b4558b57
JM
688 *q = 0;
689 dem = demangled_hash_lookup (p, false);
690 if (dem)
691 sym = symbol_hash_lookup (dem->mangled, false);
692 else
d92b4486 693 {
3fd9d606
ZW
694 if (!strncmp (p, USER_LABEL_PREFIX,
695 strlen (USER_LABEL_PREFIX)))
696 p += strlen (USER_LABEL_PREFIX);
9c5b50b3
JM
697 sym = symbol_hash_lookup (p, false);
698 }
aa32d841 699 }
aa32d841
JL
700 }
701
702 if (sym && sym->tweaked)
7b6ffd11 703 {
9e637a26 704 error ("'%s' was assigned to '%s', but was not defined "
4684cd27
MM
705 "during recompilation, or vice versa",
706 sym->key, sym->file->key);
7b6ffd11
KI
707 fclose (stream);
708 return 0;
709 }
aa32d841
JL
710 if (sym && !sym->tweaking)
711 {
712 if (tlink_verbose >= 2)
5e4adfba 713 fprintf (stderr, _("collect: tweaking %s in %s\n"),
e2500fed 714 sym->key, sym->file->key);
aa32d841
JL
715 sym->tweaking = 1;
716 file_push (sym->file);
717 }
d92b4486 718
aa32d841
JL
719 obstack_free (&temporary_obstack, temporary_firstobj);
720 }
721
7b6ffd11 722 fclose (stream);
aa32d841
JL
723 return (file_stack != NULL);
724}
725
eb686064
JM
726/* Entry point for tlink. Called from main in collect2.c.
727
728 Iteratively try to provide definitions for all the unresolved symbols
729 mentioned in the linker error messages.
730
731 LD_ARGV is an array of arguments for the linker.
732 OBJECT_LST is an array of object files that we may be able to recompile
733 to provide missing definitions. Currently ignored. */
734
aa32d841 735void
46c5ad27 736do_tlink (char **ld_argv, char **object_lst ATTRIBUTE_UNUSED)
aa32d841
JL
737{
738 int exit = tlink_execute ("ld", ld_argv, ldout);
739
740 tlink_init ();
741
742 if (exit)
743 {
744 int i = 0;
745
746 /* Until collect does a better job of figuring out which are object
747 files, assume that everything on the command line could be. */
748 if (read_repo_files (ld_argv))
749 while (exit && i++ < MAX_ITERATIONS)
750 {
751 if (tlink_verbose >= 3)
752 dump_file (ldout);
753 demangle_new_symbols ();
754 if (! scan_linker_output (ldout))
755 break;
756 if (! recompile_files ())
757 break;
758 if (tlink_verbose)
5e4adfba 759 fprintf (stderr, _("collect: relinking\n"));
aa32d841
JL
760 exit = tlink_execute ("ld", ld_argv, ldout);
761 }
762 }
763
764 dump_file (ldout);
765 unlink (ldout);
766 if (exit)
767 {
768 error ("ld returned %d exit status", exit);
769 collect_exit (exit);
770 }
771}