PR c++/91921 - stray warning with -Woverloaded-virtual.
[official-gcc.git] / lto-plugin / lto-plugin.c
blob556e3ebcf769b34abd78b60c1ef8a9f8671f1281
1 /* LTO plugin for gold and/or GNU ld.
2 Copyright (C) 2009-2019 Free Software Foundation, Inc.
3 Contributed by Rafael Avila de Espindola (espindola@google.com).
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3, or (at your option)
8 any later version.
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; see the file COPYING3. If not see
17 <http://www.gnu.org/licenses/>. */
19 /* The plugin has only one external function: onload. Gold passes it an array of
20 function that the plugin uses to communicate back to gold.
22 With the functions provided by gold, the plugin can be notified when
23 gold first analyzes a file and pass a symbol table back to gold. The plugin
24 is also notified when all symbols have been read and it is time to generate
25 machine code for the necessary symbols.
27 More information at http://gcc.gnu.org/wiki/whopr/driver.
29 This plugin should be passed the lto-wrapper options and will forward them.
30 It also has options at his own:
31 -debug: Print the command line used to run lto-wrapper.
32 -nop: Instead of running lto-wrapper, pass the original to the plugin. This
33 only works if the input files are hybrid.
34 -linker-output-known: Do not determine linker output
35 -sym-style={none,win32,underscore|uscore}
36 -pass-through */
38 #ifdef HAVE_CONFIG_H
39 #include "config.h"
40 #endif
41 #if HAVE_STDINT_H
42 #include <stdint.h>
43 #endif
44 #include <stdbool.h>
45 #include <assert.h>
46 #include <errno.h>
47 #include <string.h>
48 #include <stdlib.h>
49 #include <stdio.h>
50 #include <inttypes.h>
51 #include <sys/stat.h>
52 #include <unistd.h>
53 #include <fcntl.h>
54 #include <sys/types.h>
55 #ifdef HAVE_SYS_WAIT_H
56 #include <sys/wait.h>
57 #endif
58 #ifndef WIFEXITED
59 #define WIFEXITED(S) (((S) & 0xff) == 0)
60 #endif
61 #ifndef WEXITSTATUS
62 #define WEXITSTATUS(S) (((S) & 0xff00) >> 8)
63 #endif
64 #include <libiberty.h>
65 #include <hashtab.h>
66 #include "../gcc/lto/common.h"
67 #include "simple-object.h"
68 #include "plugin-api.h"
70 /* We need to use I64 instead of ll width-specifier on native Windows.
71 The reason for this is that older MS-runtimes don't support the ll. */
72 #ifdef __MINGW32__
73 #define PRI_LL "I64"
74 #else
75 #define PRI_LL "ll"
76 #endif
78 /* Handle opening elf files on hosts, such as Windows, that may use
79 text file handling that will break binary access. */
80 #ifndef O_BINARY
81 # define O_BINARY 0
82 #endif
84 /* Segment name for LTO sections. This is only used for Mach-O.
85 FIXME: This needs to be kept in sync with darwin.c. */
87 #define LTO_SEGMENT_NAME "__GNU_LTO"
89 /* LTO magic section name. */
91 #define LTO_SECTION_PREFIX ".gnu.lto_.symtab"
92 #define LTO_SECTION_PREFIX_LEN (sizeof (LTO_SECTION_PREFIX) - 1)
93 #define OFFLOAD_SECTION ".gnu.offload_lto_.opts"
94 #define OFFLOAD_SECTION_LEN (sizeof (OFFLOAD_SECTION) - 1)
96 /* The part of the symbol table the plugin has to keep track of. Note that we
97 must keep SYMS until all_symbols_read is called to give the linker time to
98 copy the symbol information.
99 The id must be 64bit to minimze collisions. */
101 struct sym_aux
103 uint32_t slot;
104 unsigned long long id;
105 unsigned next_conflict;
108 struct plugin_symtab
110 int nsyms;
111 struct sym_aux *aux;
112 struct ld_plugin_symbol *syms;
113 unsigned long long id;
116 /* Encapsulates object file data during symbol scan. */
117 struct plugin_objfile
119 int found;
120 int offload;
121 simple_object_read *objfile;
122 struct plugin_symtab *out;
123 const struct ld_plugin_input_file *file;
126 /* All that we have to remember about a file. */
128 struct plugin_file_info
130 char *name;
131 void *handle;
132 struct plugin_symtab symtab;
133 struct plugin_symtab conflicts;
136 /* List item with name of the file with offloading. */
138 struct plugin_offload_file
140 char *name;
141 struct plugin_offload_file *next;
144 /* Until ASM_OUTPUT_LABELREF can be hookized and decoupled from
145 stdio file streams, we do simple label translation here. */
147 enum symbol_style
149 ss_none, /* No underscore prefix. */
150 ss_win32, /* Underscore prefix any symbol not beginning with '@'. */
151 ss_uscore, /* Underscore prefix all symbols. */
154 static char *arguments_file_name;
155 static ld_plugin_register_claim_file register_claim_file;
156 static ld_plugin_register_all_symbols_read register_all_symbols_read;
157 static ld_plugin_get_symbols get_symbols, get_symbols_v2;
158 static ld_plugin_register_cleanup register_cleanup;
159 static ld_plugin_add_input_file add_input_file;
160 static ld_plugin_add_input_library add_input_library;
161 static ld_plugin_message message;
162 static ld_plugin_add_symbols add_symbols;
164 static struct plugin_file_info *claimed_files = NULL;
165 static unsigned int num_claimed_files = 0;
166 static unsigned int non_claimed_files = 0;
168 /* List of files with offloading. */
169 static struct plugin_offload_file *offload_files;
170 /* Last file in the list. */
171 static struct plugin_offload_file *offload_files_last;
172 /* Last non-archive file in the list. */
173 static struct plugin_offload_file *offload_files_last_obj;
174 /* Last LTO file in the list. */
175 static struct plugin_offload_file *offload_files_last_lto;
176 /* Total number of files with offloading. */
177 static unsigned num_offload_files;
179 static char **output_files = NULL;
180 static unsigned int num_output_files = 0;
182 static char **lto_wrapper_argv;
183 static int lto_wrapper_num_args;
185 static char **pass_through_items = NULL;
186 static unsigned int num_pass_through_items;
188 static bool debug;
189 static bool save_temps;
190 static bool verbose;
191 static char nop;
192 static char *resolution_file = NULL;
193 static enum ld_plugin_output_file_type linker_output;
194 static int linker_output_set;
195 static int linker_output_known;
196 static const char *link_output_name = NULL;
198 /* The version of gold being used, or -1 if not gold. The number is
199 MAJOR * 100 + MINOR. */
200 static int gold_version = -1;
202 /* Not used by default, but can be overridden at runtime
203 by using -plugin-opt=-sym-style={none,win32,underscore|uscore}
204 (in fact, only first letter of style arg is checked.) */
205 static enum symbol_style sym_style = ss_none;
207 static void
208 check_1 (int gate, enum ld_plugin_level level, const char *text)
210 if (gate)
211 return;
213 if (message)
214 message (level, text);
215 else
217 /* If there is no nicer way to inform the user, fallback to stderr. */
218 fprintf (stderr, "%s\n", text);
219 if (level == LDPL_FATAL)
220 abort ();
224 /* This little wrapper allows check to be called with a non-integer
225 first argument, such as a pointer that must be non-NULL. We can't
226 use c99 bool type to coerce it into range, so we explicitly test. */
227 #define check(GATE, LEVEL, TEXT) check_1 (((GATE) != 0), (LEVEL), (TEXT))
229 /* Parse an entry of the IL symbol table. The data to be parsed is pointed
230 by P and the result is written in ENTRY. The slot number is stored in SLOT.
231 Returns the address of the next entry. */
233 static char *
234 parse_table_entry (char *p, struct ld_plugin_symbol *entry,
235 struct sym_aux *aux)
237 unsigned char t;
238 enum ld_plugin_symbol_kind translate_kind[] =
240 LDPK_DEF,
241 LDPK_WEAKDEF,
242 LDPK_UNDEF,
243 LDPK_WEAKUNDEF,
244 LDPK_COMMON
247 enum ld_plugin_symbol_visibility translate_visibility[] =
249 LDPV_DEFAULT,
250 LDPV_PROTECTED,
251 LDPV_INTERNAL,
252 LDPV_HIDDEN
255 switch (sym_style)
257 case ss_win32:
258 if (p[0] == '@')
260 /* cf. Duff's device. */
261 case ss_none:
262 entry->name = xstrdup (p);
263 break;
265 /* FALL-THROUGH. */
266 case ss_uscore:
267 entry->name = concat ("_", p, NULL);
268 break;
269 default:
270 check (0, LDPL_FATAL, "invalid symbol style requested");
271 break;
273 while (*p)
274 p++;
275 p++;
277 entry->version = NULL;
279 entry->comdat_key = p;
280 while (*p)
281 p++;
282 p++;
284 if (strlen (entry->comdat_key) == 0)
285 entry->comdat_key = NULL;
286 else
287 entry->comdat_key = xstrdup (entry->comdat_key);
289 t = *p;
290 check (t <= 4, LDPL_FATAL, "invalid symbol kind found");
291 entry->def = translate_kind[t];
292 p++;
294 t = *p;
295 check (t <= 3, LDPL_FATAL, "invalid symbol visibility found");
296 entry->visibility = translate_visibility[t];
297 p++;
299 memcpy (&entry->size, p, sizeof (uint64_t));
300 p += 8;
302 memcpy (&aux->slot, p, sizeof (uint32_t));
303 p += 4;
305 entry->resolution = LDPR_UNKNOWN;
307 aux->next_conflict = -1;
309 return p;
312 /* Translate the IL symbol table located between DATA and END. Append the
313 slots and symbols to OUT. */
315 static void
316 translate (char *data, char *end, struct plugin_symtab *out)
318 struct sym_aux *aux;
319 struct ld_plugin_symbol *syms = NULL;
320 int n, len;
322 /* This overestimates the output buffer sizes, but at least
323 the algorithm is O(1) now. */
325 len = (end - data)/8 + out->nsyms + 1;
326 syms = xrealloc (out->syms, len * sizeof (struct ld_plugin_symbol));
327 aux = xrealloc (out->aux, len * sizeof (struct sym_aux));
329 for (n = out->nsyms; data < end; n++)
331 aux[n].id = out->id;
332 data = parse_table_entry (data, &syms[n], &aux[n]);
335 assert(n < len);
337 out->nsyms = n;
338 out->syms = syms;
339 out->aux = aux;
342 /* Free all memory that is no longer needed after writing the symbol
343 resolution. */
345 static void
346 free_1 (struct plugin_file_info *files, unsigned num_files)
348 unsigned int i;
349 for (i = 0; i < num_files; i++)
351 struct plugin_file_info *info = &files[i];
352 struct plugin_symtab *symtab = &info->symtab;
353 unsigned int j;
354 for (j = 0; j < symtab->nsyms; j++)
356 struct ld_plugin_symbol *s = &symtab->syms[j];
357 free (s->name);
358 free (s->comdat_key);
360 free (symtab->syms);
361 symtab->syms = NULL;
365 /* Free all remaining memory. */
367 static void
368 free_2 (void)
370 unsigned int i;
371 for (i = 0; i < num_claimed_files; i++)
373 struct plugin_file_info *info = &claimed_files[i];
374 struct plugin_symtab *symtab = &info->symtab;
375 free (symtab->aux);
376 free (info->name);
379 for (i = 0; i < num_output_files; i++)
380 free (output_files[i]);
381 free (output_files);
383 free (claimed_files);
384 claimed_files = NULL;
385 num_claimed_files = 0;
387 while (offload_files)
389 struct plugin_offload_file *ofld = offload_files;
390 offload_files = offload_files->next;
391 free (ofld);
393 num_offload_files = 0;
395 free (arguments_file_name);
396 arguments_file_name = NULL;
399 /* Dump SYMTAB to resolution file F. */
401 static void
402 dump_symtab (FILE *f, struct plugin_symtab *symtab)
404 unsigned j;
406 for (j = 0; j < symtab->nsyms; j++)
408 uint32_t slot = symtab->aux[j].slot;
409 unsigned int resolution = symtab->syms[j].resolution;
411 assert (resolution != LDPR_UNKNOWN);
413 fprintf (f, "%u %" PRI_LL "x %s %s\n",
414 (unsigned int) slot, symtab->aux[j].id,
415 lto_resolution_str[resolution],
416 symtab->syms[j].name);
420 /* Finish the conflicts' resolution information after the linker resolved
421 the original symbols */
423 static void
424 finish_conflict_resolution (struct plugin_symtab *symtab,
425 struct plugin_symtab *conflicts)
427 int i, j;
429 if (conflicts->nsyms == 0)
430 return;
432 for (i = 0; i < symtab->nsyms; i++)
434 int resolution = LDPR_UNKNOWN;
436 if (symtab->aux[i].next_conflict == -1)
437 continue;
439 switch (symtab->syms[i].def)
441 case LDPK_DEF:
442 case LDPK_COMMON: /* ??? */
443 resolution = LDPR_RESOLVED_IR;
444 break;
445 case LDPK_WEAKDEF:
446 resolution = LDPR_PREEMPTED_IR;
447 break;
448 case LDPK_UNDEF:
449 case LDPK_WEAKUNDEF:
450 resolution = symtab->syms[i].resolution;
451 break;
452 default:
453 assert (0);
456 assert (resolution != LDPR_UNKNOWN);
458 for (j = symtab->aux[i].next_conflict;
459 j != -1;
460 j = conflicts->aux[j].next_conflict)
461 conflicts->syms[j].resolution = resolution;
465 /* Free symbol table SYMTAB. */
467 static void
468 free_symtab (struct plugin_symtab *symtab)
470 free (symtab->syms);
471 symtab->syms = NULL;
472 free (symtab->aux);
473 symtab->aux = NULL;
476 /* Writes the relocations to disk. */
478 static void
479 write_resolution (void)
481 unsigned int i;
482 FILE *f;
484 check (resolution_file, LDPL_FATAL, "resolution file not specified");
485 f = fopen (resolution_file, "w");
486 check (f, LDPL_FATAL, "could not open file");
488 fprintf (f, "%d\n", num_claimed_files);
490 for (i = 0; i < num_claimed_files; i++)
492 struct plugin_file_info *info = &claimed_files[i];
493 struct plugin_symtab *symtab = &info->symtab;
494 struct ld_plugin_symbol *syms = symtab->syms;
496 /* Version 2 of API supports IRONLY_EXP resolution that is
497 accepted by GCC-4.7 and newer. */
498 if (get_symbols_v2)
499 get_symbols_v2 (info->handle, symtab->nsyms, syms);
500 else
501 get_symbols (info->handle, symtab->nsyms, syms);
503 finish_conflict_resolution (symtab, &info->conflicts);
505 fprintf (f, "%s %d\n", info->name, symtab->nsyms + info->conflicts.nsyms);
506 dump_symtab (f, symtab);
507 if (info->conflicts.nsyms)
509 dump_symtab (f, &info->conflicts);
510 free_symtab (&info->conflicts);
513 fclose (f);
516 /* Pass files generated by the lto-wrapper to the linker. FD is lto-wrapper's
517 stdout. */
519 static void
520 add_output_files (FILE *f)
522 for (;;)
524 const unsigned piece = 32;
525 char *buf, *s = xmalloc (piece);
526 size_t len;
528 buf = s;
529 cont:
530 if (!fgets (buf, piece, f))
532 free (s);
533 break;
535 len = strlen (s);
536 if (s[len - 1] != '\n')
538 s = xrealloc (s, len + piece);
539 buf = s + len;
540 goto cont;
542 s[len - 1] = '\0';
544 num_output_files++;
545 output_files
546 = xrealloc (output_files, num_output_files * sizeof (char *));
547 output_files[num_output_files - 1] = s;
548 add_input_file (output_files[num_output_files - 1]);
552 /* Execute the lto-wrapper. ARGV[0] is the binary. The rest of ARGV is the
553 argument list. */
555 static void
556 exec_lto_wrapper (char *argv[])
558 int t, i;
559 int status;
560 char *at_args;
561 FILE *args;
562 FILE *wrapper_output;
563 char *new_argv[3];
564 struct pex_obj *pex;
565 const char *errmsg;
567 /* Write argv to a file to avoid a command line that is too long
568 Save the file locally on save-temps. */
569 if (save_temps && link_output_name)
571 arguments_file_name = (char *) xmalloc (strlen (link_output_name)
572 + sizeof (".lto_wrapper_args") + 1);
573 strcpy (arguments_file_name, link_output_name);
574 strcat (arguments_file_name, ".lto_wrapper_args");
576 else
577 arguments_file_name = make_temp_file (".lto_wrapper_args");
578 check (arguments_file_name, LDPL_FATAL,
579 "Failed to generate a temorary file name");
581 args = fopen (arguments_file_name, "w");
582 check (args, LDPL_FATAL, "could not open arguments file");
584 t = writeargv (&argv[1], args);
585 check (t == 0, LDPL_FATAL, "could not write arguments");
586 t = fclose (args);
587 check (t == 0, LDPL_FATAL, "could not close arguments file");
589 at_args = concat ("@", arguments_file_name, NULL);
590 check (at_args, LDPL_FATAL, "could not allocate");
592 for (i = 1; argv[i]; i++)
594 char *a = argv[i];
595 /* Check the input argument list for a verbose marker too. */
596 if (a[0] == '-' && a[1] == 'v' && a[2] == '\0')
598 verbose = true;
599 break;
603 if (verbose)
605 for (i = 0; argv[i]; i++)
606 fprintf (stderr, "%s ", argv[i]);
607 fprintf (stderr, "\n");
610 new_argv[0] = argv[0];
611 new_argv[1] = at_args;
612 new_argv[2] = NULL;
614 if (debug)
616 for (i = 0; new_argv[i]; i++)
617 fprintf (stderr, "%s ", new_argv[i]);
618 fprintf (stderr, "\n");
621 pex = pex_init (PEX_USE_PIPES, "lto-wrapper", NULL);
622 check (pex != NULL, LDPL_FATAL, "could not pex_init lto-wrapper");
624 errmsg = pex_run (pex, 0, new_argv[0], new_argv, NULL, NULL, &t);
625 check (errmsg == NULL, LDPL_FATAL, "could not run lto-wrapper");
626 check (t == 0, LDPL_FATAL, "could not run lto-wrapper");
628 wrapper_output = pex_read_output (pex, 0);
629 check (wrapper_output, LDPL_FATAL, "could not read lto-wrapper output");
631 add_output_files (wrapper_output);
633 t = pex_get_status (pex, 1, &status);
634 check (t == 1, LDPL_FATAL, "could not get lto-wrapper exit status");
635 check (WIFEXITED (status) && WEXITSTATUS (status) == 0, LDPL_FATAL,
636 "lto-wrapper failed");
638 pex_free (pex);
640 free (at_args);
643 /* Pass the original files back to the linker. */
645 static void
646 use_original_files (void)
648 unsigned i;
649 for (i = 0; i < num_claimed_files; i++)
651 struct plugin_file_info *info = &claimed_files[i];
652 add_input_file (info->name);
657 /* Called by the linker once all symbols have been read. */
659 static enum ld_plugin_status
660 all_symbols_read_handler (void)
662 unsigned i;
663 unsigned num_lto_args = num_claimed_files + lto_wrapper_num_args + 2
664 + !linker_output_known;
665 char **lto_argv;
666 const char *linker_output_str = NULL;
667 const char **lto_arg_ptr;
668 if (num_claimed_files + num_offload_files == 0)
669 return LDPS_OK;
671 if (nop)
673 use_original_files ();
674 return LDPS_OK;
677 lto_argv = (char **) xcalloc (sizeof (char *), num_lto_args);
678 lto_arg_ptr = (const char **) lto_argv;
679 assert (lto_wrapper_argv);
681 write_resolution ();
683 free_1 (claimed_files, num_claimed_files);
685 for (i = 0; i < lto_wrapper_num_args; i++)
686 *lto_arg_ptr++ = lto_wrapper_argv[i];
688 if (!linker_output_known)
690 assert (linker_output_set);
691 switch (linker_output)
693 case LDPO_REL:
694 if (non_claimed_files)
696 message (LDPL_WARNING, "incremental linking of LTO and non-LTO "
697 "objects; using -flinker-output=nolto-rel which will "
698 "bypass whole program optimization");
699 linker_output_str = "-flinker-output=nolto-rel";
701 else
702 linker_output_str = "-flinker-output=rel";
703 break;
704 case LDPO_DYN:
705 linker_output_str = "-flinker-output=dyn";
706 break;
707 case LDPO_PIE:
708 linker_output_str = "-flinker-output=pie";
709 break;
710 case LDPO_EXEC:
711 linker_output_str = "-flinker-output=exec";
712 break;
713 default:
714 message (LDPL_FATAL, "unsupported linker output %i", linker_output);
715 break;
717 *lto_arg_ptr++ = xstrdup (linker_output_str);
720 if (num_offload_files > 0)
722 FILE *f;
723 char *arg;
724 char *offload_objects_file_name;
725 struct plugin_offload_file *ofld;
727 offload_objects_file_name = make_temp_file (".ofldlist");
728 check (offload_objects_file_name, LDPL_FATAL,
729 "Failed to generate a temporary file name");
730 f = fopen (offload_objects_file_name, "w");
731 check (f, LDPL_FATAL, "could not open file with offload objects");
732 fprintf (f, "%u\n", num_offload_files);
734 /* Skip the dummy item at the start of the list. */
735 ofld = offload_files->next;
736 while (ofld)
738 fprintf (f, "%s\n", ofld->name);
739 ofld = ofld->next;
741 fclose (f);
743 arg = concat ("-foffload-objects=", offload_objects_file_name, NULL);
744 check (arg, LDPL_FATAL, "could not allocate");
745 *lto_arg_ptr++ = arg;
748 for (i = 0; i < num_claimed_files; i++)
750 struct plugin_file_info *info = &claimed_files[i];
752 *lto_arg_ptr++ = info->name;
755 *lto_arg_ptr++ = NULL;
756 exec_lto_wrapper (lto_argv);
758 free (lto_argv);
760 /* --pass-through is not needed when using gold 1.11 or later. */
761 if (pass_through_items && gold_version < 111)
763 unsigned int i;
764 for (i = 0; i < num_pass_through_items; i++)
766 if (strncmp (pass_through_items[i], "-l", 2) == 0)
767 add_input_library (pass_through_items[i] + 2);
768 else
769 add_input_file (pass_through_items[i]);
770 free (pass_through_items[i]);
771 pass_through_items[i] = NULL;
773 free (pass_through_items);
774 pass_through_items = NULL;
777 return LDPS_OK;
780 /* Helper, as used in collect2. */
781 static int
782 file_exists (const char *name)
784 return access (name, R_OK) == 0;
787 /* Unlink FILE unless we have save-temps set.
788 Note that we're saving files if verbose output is set. */
790 static void
791 maybe_unlink (const char *file)
793 if (save_temps && file_exists (file))
795 if (verbose)
796 fprintf (stderr, "[Leaving %s]\n", file);
797 return;
800 unlink_if_ordinary (file);
803 /* Remove temporary files at the end of the link. */
805 static enum ld_plugin_status
806 cleanup_handler (void)
808 unsigned int i;
810 if (debug)
811 return LDPS_OK;
813 if (arguments_file_name)
814 maybe_unlink (arguments_file_name);
816 for (i = 0; i < num_output_files; i++)
817 maybe_unlink (output_files[i]);
819 free_2 ();
820 return LDPS_OK;
823 #define SWAP(type, a, b) \
824 do { type tmp_; tmp_ = (a); (a) = (b); (b) = tmp_; } while(0)
826 /* Compare two hash table entries */
828 static int eq_sym (const void *a, const void *b)
830 const struct ld_plugin_symbol *as = (const struct ld_plugin_symbol *)a;
831 const struct ld_plugin_symbol *bs = (const struct ld_plugin_symbol *)b;
833 return !strcmp (as->name, bs->name);
836 /* Hash a symbol */
838 static hashval_t hash_sym (const void *a)
840 const struct ld_plugin_symbol *as = (const struct ld_plugin_symbol *)a;
842 return htab_hash_string (as->name);
845 /* Determine how strong a symbol is */
847 static int symbol_strength (struct ld_plugin_symbol *s)
849 switch (s->def)
851 case LDPK_UNDEF:
852 case LDPK_WEAKUNDEF:
853 return 0;
854 case LDPK_WEAKDEF:
855 return 1;
856 default:
857 return 2;
861 /* In the ld -r case we can get dups in the LTO symbol tables, where
862 the same symbol can have different resolutions (e.g. undefined and defined).
864 We have to keep that in the LTO symbol tables, but the dups confuse
865 gold and then finally gcc by supplying incorrect resolutions.
867 Problem is that the main gold symbol table doesn't know about subids
868 and does not distingush the same symbols in different states.
870 So we drop duplicates from the linker visible symbol table
871 and keep them in a private table. Then later do own symbol
872 resolution for the duplicated based on the results for the
873 originals.
875 Then when writing out the resolution file readd the dropped symbols.
877 XXX how to handle common? */
879 static void
880 resolve_conflicts (struct plugin_symtab *t, struct plugin_symtab *conflicts)
882 htab_t symtab = htab_create (t->nsyms, hash_sym, eq_sym, NULL);
883 int i;
884 int out;
885 int outlen;
887 outlen = t->nsyms;
888 conflicts->syms = xmalloc (sizeof (struct ld_plugin_symbol) * outlen);
889 conflicts->aux = xmalloc (sizeof (struct sym_aux) * outlen);
891 /* Move all duplicate symbols into the auxiliary conflicts table. */
892 out = 0;
893 for (i = 0; i < t->nsyms; i++)
895 struct ld_plugin_symbol *s = &t->syms[i];
896 struct sym_aux *aux = &t->aux[i];
897 void **slot;
899 slot = htab_find_slot (symtab, s, INSERT);
900 if (*slot != NULL)
902 int cnf;
903 struct ld_plugin_symbol *orig = (struct ld_plugin_symbol *)*slot;
904 struct sym_aux *orig_aux = &t->aux[orig - t->syms];
906 /* Always let the linker resolve the strongest symbol */
907 if (symbol_strength (orig) < symbol_strength (s))
909 SWAP (struct ld_plugin_symbol, *orig, *s);
910 SWAP (uint32_t, orig_aux->slot, aux->slot);
911 SWAP (unsigned long long, orig_aux->id, aux->id);
912 /* Don't swap conflict chain pointer */
915 /* Move current symbol into the conflicts table */
916 cnf = conflicts->nsyms++;
917 conflicts->syms[cnf] = *s;
918 conflicts->aux[cnf] = *aux;
919 aux = &conflicts->aux[cnf];
921 /* Update conflicts chain of the original symbol */
922 aux->next_conflict = orig_aux->next_conflict;
923 orig_aux->next_conflict = cnf;
925 continue;
928 /* Remove previous duplicates in the main table */
929 if (out < i)
931 t->syms[out] = *s;
932 t->aux[out] = *aux;
935 /* Put original into the hash table */
936 *slot = &t->syms[out];
937 out++;
940 assert (conflicts->nsyms <= outlen);
941 assert (conflicts->nsyms + out == t->nsyms);
943 t->nsyms = out;
944 htab_delete (symtab);
947 /* Process one section of an object file. */
949 static int
950 process_symtab (void *data, const char *name, off_t offset, off_t length)
952 struct plugin_objfile *obj = (struct plugin_objfile *)data;
953 char *s;
954 char *secdatastart, *secdata;
956 if (strncmp (name, LTO_SECTION_PREFIX, LTO_SECTION_PREFIX_LEN) != 0)
957 return 1;
959 s = strrchr (name, '.');
960 if (s)
961 sscanf (s, ".%" PRI_LL "x", &obj->out->id);
962 secdata = secdatastart = xmalloc (length);
963 offset += obj->file->offset;
964 if (offset != lseek (obj->file->fd, offset, SEEK_SET))
965 goto err;
969 ssize_t got = read (obj->file->fd, secdata, length);
970 if (got == 0)
971 break;
972 else if (got > 0)
974 secdata += got;
975 length -= got;
977 else if (errno != EINTR)
978 goto err;
980 while (length > 0);
981 if (length > 0)
982 goto err;
984 translate (secdatastart, secdata, obj->out);
985 obj->found++;
986 free (secdatastart);
987 return 1;
989 err:
990 if (message)
991 message (LDPL_FATAL, "%s: corrupt object file", obj->file->name);
992 /* Force claim_file_handler to abandon this file. */
993 obj->found = 0;
994 free (secdatastart);
995 return 0;
998 /* Find an offload section of an object file. */
1000 static int
1001 process_offload_section (void *data, const char *name, off_t offset, off_t len)
1003 if (!strncmp (name, OFFLOAD_SECTION, OFFLOAD_SECTION_LEN))
1005 struct plugin_objfile *obj = (struct plugin_objfile *) data;
1006 obj->offload = 1;
1007 return 0;
1010 return 1;
1013 /* Callback used by gold to check if the plugin will claim FILE. Writes
1014 the result in CLAIMED. */
1016 static enum ld_plugin_status
1017 claim_file_handler (const struct ld_plugin_input_file *file, int *claimed)
1019 enum ld_plugin_status status;
1020 struct plugin_objfile obj;
1021 struct plugin_file_info lto_file;
1022 int err;
1023 const char *errmsg;
1025 memset (&lto_file, 0, sizeof (struct plugin_file_info));
1027 if (file->offset != 0)
1029 /* We pass the offset of the actual file, not the archive header.
1030 Can't use PRIx64, because that's C99, so we have to print the
1031 64-bit hex int as two 32-bit ones. Use xasprintf instead of
1032 asprintf because asprintf doesn't work as expected on some older
1033 mingw32 hosts. */
1034 int lo, hi;
1035 lo = file->offset & 0xffffffff;
1036 hi = ((int64_t)file->offset >> 32) & 0xffffffff;
1037 lto_file.name = hi ? xasprintf ("%s@0x%x%08x", file->name, hi, lo)
1038 : xasprintf ("%s@0x%x", file->name, lo);
1040 else
1042 lto_file.name = xstrdup (file->name);
1044 lto_file.handle = file->handle;
1046 *claimed = 0;
1047 obj.file = file;
1048 obj.found = 0;
1049 obj.offload = 0;
1050 obj.out = &lto_file.symtab;
1051 errmsg = NULL;
1052 obj.objfile = simple_object_start_read (file->fd, file->offset, LTO_SEGMENT_NAME,
1053 &errmsg, &err);
1054 /* No file, but also no error code means unrecognized format; just skip it. */
1055 if (!obj.objfile && !err)
1056 goto err;
1058 if (obj.objfile)
1059 errmsg = simple_object_find_sections (obj.objfile, process_symtab, &obj, &err);
1061 if (!obj.objfile || errmsg)
1063 if (err && message)
1064 message (LDPL_FATAL, "%s: %s: %s", file->name, errmsg,
1065 xstrerror (err));
1066 else if (message)
1067 message (LDPL_FATAL, "%s: %s", file->name, errmsg);
1068 goto err;
1071 if (obj.objfile)
1072 simple_object_find_sections (obj.objfile, process_offload_section,
1073 &obj, &err);
1075 if (obj.found == 0 && obj.offload == 0)
1076 goto err;
1078 if (obj.found > 1)
1079 resolve_conflicts (&lto_file.symtab, &lto_file.conflicts);
1081 if (obj.found > 0)
1083 status = add_symbols (file->handle, lto_file.symtab.nsyms,
1084 lto_file.symtab.syms);
1085 check (status == LDPS_OK, LDPL_FATAL, "could not add symbols");
1087 num_claimed_files++;
1088 claimed_files =
1089 xrealloc (claimed_files,
1090 num_claimed_files * sizeof (struct plugin_file_info));
1091 claimed_files[num_claimed_files - 1] = lto_file;
1093 *claimed = 1;
1096 if (offload_files == NULL)
1098 /* Add dummy item to the start of the list. */
1099 offload_files = xmalloc (sizeof (struct plugin_offload_file));
1100 offload_files->name = NULL;
1101 offload_files->next = NULL;
1102 offload_files_last = offload_files;
1105 /* If this is an LTO file without offload, and it is the first LTO file, save
1106 the pointer to the last offload file in the list. Further offload LTO
1107 files will be inserted after it, if any. */
1108 if (*claimed && obj.offload == 0 && offload_files_last_lto == NULL)
1109 offload_files_last_lto = offload_files_last;
1111 if (obj.offload == 1)
1113 /* Add file to the list. The order must be exactly the same as the final
1114 order after recompilation and linking, otherwise host and target tables
1115 with addresses wouldn't match. If a static library contains both LTO
1116 and non-LTO objects, ld and gold link them in a different order. */
1117 struct plugin_offload_file *ofld
1118 = xmalloc (sizeof (struct plugin_offload_file));
1119 ofld->name = lto_file.name;
1120 ofld->next = NULL;
1122 if (*claimed && offload_files_last_lto == NULL && file->offset != 0
1123 && gold_version == -1)
1125 /* ld only: insert first LTO file from the archive after the last real
1126 object file immediately preceding the archive, or at the begin of
1127 the list if there was no real objects before archives. */
1128 if (offload_files_last_obj != NULL)
1130 ofld->next = offload_files_last_obj->next;
1131 offload_files_last_obj->next = ofld;
1133 else
1135 ofld->next = offload_files->next;
1136 offload_files->next = ofld;
1139 else if (*claimed && offload_files_last_lto != NULL)
1141 /* Insert LTO file after the last LTO file in the list. */
1142 ofld->next = offload_files_last_lto->next;
1143 offload_files_last_lto->next = ofld;
1145 else
1146 /* Add non-LTO file or first non-archive LTO file to the end of the
1147 list. */
1148 offload_files_last->next = ofld;
1150 if (ofld->next == NULL)
1151 offload_files_last = ofld;
1152 if (file->offset == 0)
1153 offload_files_last_obj = ofld;
1154 if (*claimed)
1155 offload_files_last_lto = ofld;
1156 num_offload_files++;
1159 goto cleanup;
1161 err:
1162 non_claimed_files++;
1163 free (lto_file.name);
1165 cleanup:
1166 if (obj.objfile)
1167 simple_object_release_read (obj.objfile);
1169 return LDPS_OK;
1172 /* Parse the plugin options. */
1174 static void
1175 process_option (const char *option)
1177 if (strcmp (option, "-linker-output-known") == 0)
1178 linker_output_known = 1;
1179 if (strcmp (option, "-debug") == 0)
1180 debug = true;
1181 else if ((strcmp (option, "-v") == 0)
1182 || (strcmp (option, "--verbose") == 0))
1183 verbose = true;
1184 else if (strcmp (option, "-save-temps") == 0)
1185 save_temps = true;
1186 else if (strcmp (option, "-nop") == 0)
1187 nop = 1;
1188 else if (!strncmp (option, "-pass-through=", strlen("-pass-through=")))
1190 num_pass_through_items++;
1191 pass_through_items = xrealloc (pass_through_items,
1192 num_pass_through_items * sizeof (char *));
1193 pass_through_items[num_pass_through_items - 1] =
1194 xstrdup (option + strlen ("-pass-through="));
1196 else if (!strncmp (option, "-sym-style=", sizeof ("-sym-style=") - 1))
1198 switch (option[sizeof ("-sym-style=") - 1])
1200 case 'w':
1201 sym_style = ss_win32;
1202 break;
1203 case 'u':
1204 sym_style = ss_uscore;
1205 break;
1206 default:
1207 sym_style = ss_none;
1208 break;
1211 else
1213 int size;
1214 char *opt = xstrdup (option);
1215 lto_wrapper_num_args += 1;
1216 size = lto_wrapper_num_args * sizeof (char *);
1217 lto_wrapper_argv = (char **) xrealloc (lto_wrapper_argv, size);
1218 lto_wrapper_argv[lto_wrapper_num_args - 1] = opt;
1219 if (strncmp (option, "-fresolution=", sizeof ("-fresolution=") - 1) == 0)
1220 resolution_file = opt + sizeof ("-fresolution=") - 1;
1222 save_temps = save_temps || debug;
1223 verbose = verbose || debug;
1226 /* Called by gold after loading the plugin. TV is the transfer vector. */
1228 enum ld_plugin_status
1229 onload (struct ld_plugin_tv *tv)
1231 struct ld_plugin_tv *p;
1232 enum ld_plugin_status status;
1234 p = tv;
1235 while (p->tv_tag)
1237 switch (p->tv_tag)
1239 case LDPT_MESSAGE:
1240 message = p->tv_u.tv_message;
1241 break;
1242 case LDPT_REGISTER_CLAIM_FILE_HOOK:
1243 register_claim_file = p->tv_u.tv_register_claim_file;
1244 break;
1245 case LDPT_ADD_SYMBOLS:
1246 add_symbols = p->tv_u.tv_add_symbols;
1247 break;
1248 case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK:
1249 register_all_symbols_read = p->tv_u.tv_register_all_symbols_read;
1250 break;
1251 case LDPT_GET_SYMBOLS_V2:
1252 get_symbols_v2 = p->tv_u.tv_get_symbols;
1253 break;
1254 case LDPT_GET_SYMBOLS:
1255 get_symbols = p->tv_u.tv_get_symbols;
1256 break;
1257 case LDPT_REGISTER_CLEANUP_HOOK:
1258 register_cleanup = p->tv_u.tv_register_cleanup;
1259 break;
1260 case LDPT_ADD_INPUT_FILE:
1261 add_input_file = p->tv_u.tv_add_input_file;
1262 break;
1263 case LDPT_ADD_INPUT_LIBRARY:
1264 add_input_library = p->tv_u.tv_add_input_library;
1265 break;
1266 case LDPT_OPTION:
1267 process_option (p->tv_u.tv_string);
1268 break;
1269 case LDPT_GOLD_VERSION:
1270 gold_version = p->tv_u.tv_val;
1271 break;
1272 case LDPT_LINKER_OUTPUT:
1273 linker_output = (enum ld_plugin_output_file_type) p->tv_u.tv_val;
1274 linker_output_set = 1;
1275 break;
1276 case LDPT_OUTPUT_NAME:
1277 /* We only use this to make user-friendly temp file names. */
1278 link_output_name = p->tv_u.tv_string;
1279 break;
1280 default:
1281 break;
1283 p++;
1286 check (register_claim_file, LDPL_FATAL, "register_claim_file not found");
1287 check (add_symbols, LDPL_FATAL, "add_symbols not found");
1288 status = register_claim_file (claim_file_handler);
1289 check (status == LDPS_OK, LDPL_FATAL,
1290 "could not register the claim_file callback");
1292 if (register_cleanup)
1294 status = register_cleanup (cleanup_handler);
1295 check (status == LDPS_OK, LDPL_FATAL,
1296 "could not register the cleanup callback");
1299 if (register_all_symbols_read)
1301 check (get_symbols, LDPL_FATAL, "get_symbols not found");
1302 status = register_all_symbols_read (all_symbols_read_handler);
1303 check (status == LDPS_OK, LDPL_FATAL,
1304 "could not register the all_symbols_read callback");
1307 char *collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
1308 if (collect_gcc_options)
1310 /* Support -fno-use-linker-plugin by failing to load the plugin
1311 for the case where it is auto-loaded by BFD. */
1312 if (strstr (collect_gcc_options, "'-fno-use-linker-plugin'"))
1313 return LDPS_ERR;
1315 if ( strstr (collect_gcc_options, "'-save-temps'"))
1316 save_temps = true;
1318 if (strstr (collect_gcc_options, "'-v'")
1319 || strstr (collect_gcc_options, "'--verbose'"))
1320 verbose = true;
1323 return LDPS_OK;