Use optab_libfunc to access sync_lock_test_and_set libfunc on hppa-linux.
[official-gcc.git] / lto-plugin / lto-plugin.c
blobb73483de9944f16bd1fb58b488a162a42a128666
1 /* LTO plugin for gold and/or GNU ld.
2 Copyright (C) 2009-2021 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 -linker-output-auto-nolto-rel: Switch from rel to nolto-rel mode without
36 warning. This is used on systems like VxWorks (kernel) where the link is
37 always partial and repeated incremental linking is generally not used.
38 -sym-style={none,win32,underscore|uscore}
39 -pass-through */
41 #ifdef HAVE_CONFIG_H
42 #include "config.h"
43 #endif
44 #if HAVE_STDINT_H
45 #include <stdint.h>
46 #endif
47 #include <stdbool.h>
48 #include <assert.h>
49 #include <errno.h>
50 #include <string.h>
51 #include <stdlib.h>
52 #include <stdio.h>
53 #include <inttypes.h>
54 #include <sys/stat.h>
55 #include <unistd.h>
56 #include <fcntl.h>
57 #include <sys/types.h>
58 #ifdef HAVE_SYS_WAIT_H
59 #include <sys/wait.h>
60 #endif
61 #ifndef WIFEXITED
62 #define WIFEXITED(S) (((S) & 0xff) == 0)
63 #endif
64 #ifndef WEXITSTATUS
65 #define WEXITSTATUS(S) (((S) & 0xff00) >> 8)
66 #endif
67 #include <libiberty.h>
68 #include <hashtab.h>
69 #include "../gcc/lto/common.h"
70 #include "simple-object.h"
71 #include "plugin-api.h"
73 /* We need to use I64 instead of ll width-specifier on native Windows.
74 The reason for this is that older MS-runtimes don't support the ll. */
75 #ifdef __MINGW32__
76 #define PRI_LL "I64"
77 #else
78 #define PRI_LL "ll"
79 #endif
81 /* Handle opening elf files on hosts, such as Windows, that may use
82 text file handling that will break binary access. */
83 #ifndef O_BINARY
84 # define O_BINARY 0
85 #endif
87 /* Segment name for LTO sections. This is only used for Mach-O.
88 FIXME: This needs to be kept in sync with darwin.c. */
90 #define LTO_SEGMENT_NAME "__GNU_LTO"
92 /* Return true if STR string starts with PREFIX. */
94 static inline bool
95 startswith (const char *str, const char *prefix)
97 return strncmp (str, prefix, strlen (prefix)) == 0;
100 /* The part of the symbol table the plugin has to keep track of. Note that we
101 must keep SYMS until all_symbols_read is called to give the linker time to
102 copy the symbol information.
103 The id must be 64bit to minimze collisions. */
105 struct sym_aux
107 uint32_t slot;
108 unsigned long long id;
109 unsigned next_conflict;
112 struct plugin_symtab
114 int nsyms;
115 int last_sym;
116 struct sym_aux *aux;
117 struct ld_plugin_symbol *syms;
118 unsigned long long id;
121 /* Encapsulates object file data during symbol scan. */
122 struct plugin_objfile
124 int found;
125 int offload;
126 simple_object_read *objfile;
127 struct plugin_symtab *out;
128 const struct ld_plugin_input_file *file;
131 /* All that we have to remember about a file. */
133 struct plugin_file_info
135 char *name;
136 void *handle;
137 struct plugin_symtab symtab;
138 struct plugin_symtab conflicts;
141 /* List item with name of the file with offloading. */
143 struct plugin_offload_file
145 char *name;
146 struct plugin_offload_file *next;
149 /* Until ASM_OUTPUT_LABELREF can be hookized and decoupled from
150 stdio file streams, we do simple label translation here. */
152 enum symbol_style
154 ss_none, /* No underscore prefix. */
155 ss_win32, /* Underscore prefix any symbol not beginning with '@'. */
156 ss_uscore, /* Underscore prefix all symbols. */
159 static char *arguments_file_name;
160 static ld_plugin_register_claim_file register_claim_file;
161 static ld_plugin_register_all_symbols_read register_all_symbols_read;
162 static ld_plugin_get_symbols get_symbols, get_symbols_v2;
163 static ld_plugin_register_cleanup register_cleanup;
164 static ld_plugin_add_input_file add_input_file;
165 static ld_plugin_add_input_library add_input_library;
166 static ld_plugin_message message;
167 static ld_plugin_add_symbols add_symbols, add_symbols_v2;
169 static struct plugin_file_info *claimed_files = NULL;
170 static unsigned int num_claimed_files = 0;
171 static unsigned int non_claimed_files = 0;
173 /* List of files with offloading. */
174 static struct plugin_offload_file *offload_files;
175 /* Last file in the list. */
176 static struct plugin_offload_file *offload_files_last;
177 /* Last non-archive file in the list. */
178 static struct plugin_offload_file *offload_files_last_obj;
179 /* Last LTO file in the list. */
180 static struct plugin_offload_file *offload_files_last_lto;
181 /* Total number of files with offloading. */
182 static unsigned num_offload_files;
184 static char **output_files = NULL;
185 static unsigned int num_output_files = 0;
187 static char **lto_wrapper_argv;
188 static int lto_wrapper_num_args;
190 static char **pass_through_items = NULL;
191 static unsigned int num_pass_through_items;
193 static char *ltrans_objects = NULL;
195 static bool debug;
196 static bool save_temps;
197 static bool verbose;
198 static char nop;
199 static char *resolution_file = NULL;
200 static enum ld_plugin_output_file_type linker_output;
201 static bool linker_output_set;
202 static bool linker_output_known;
203 static bool linker_output_auto_nolto_rel;
204 static const char *link_output_name = NULL;
206 /* This indicates link_output_name already contains the dot of the
207 suffix, so we can skip it in extensions. */
208 static int skip_in_suffix = 0;
210 /* The version of gold being used, or -1 if not gold. The number is
211 MAJOR * 100 + MINOR. */
212 static int gold_version = -1;
214 /* Not used by default, but can be overridden at runtime
215 by using -plugin-opt=-sym-style={none,win32,underscore|uscore}
216 (in fact, only first letter of style arg is checked.) */
217 static enum symbol_style sym_style = ss_none;
219 static void
220 check_1 (int gate, enum ld_plugin_level level, const char *text)
222 if (gate)
223 return;
225 if (message)
226 message (level, text);
227 else
229 /* If there is no nicer way to inform the user, fallback to stderr. */
230 fprintf (stderr, "%s\n", text);
231 if (level == LDPL_FATAL)
232 abort ();
236 /* This little wrapper allows check to be called with a non-integer
237 first argument, such as a pointer that must be non-NULL. We can't
238 use c99 bool type to coerce it into range, so we explicitly test. */
239 #define check(GATE, LEVEL, TEXT) check_1 (((GATE) != 0), (LEVEL), (TEXT))
241 /* Parse an entry of the IL symbol table. The data to be parsed is pointed
242 by P and the result is written in ENTRY. The slot number is stored in SLOT.
243 Returns the address of the next entry. */
245 static char *
246 parse_table_entry (char *p, struct ld_plugin_symbol *entry,
247 struct sym_aux *aux)
249 unsigned char t;
250 enum ld_plugin_symbol_kind translate_kind[] =
252 LDPK_DEF,
253 LDPK_WEAKDEF,
254 LDPK_UNDEF,
255 LDPK_WEAKUNDEF,
256 LDPK_COMMON
259 enum ld_plugin_symbol_visibility translate_visibility[] =
261 LDPV_DEFAULT,
262 LDPV_PROTECTED,
263 LDPV_INTERNAL,
264 LDPV_HIDDEN
267 switch (sym_style)
269 case ss_win32:
270 if (p[0] == '@')
272 /* cf. Duff's device. */
273 case ss_none:
274 entry->name = xstrdup (p);
275 break;
277 /* FALL-THROUGH. */
278 case ss_uscore:
279 entry->name = concat ("_", p, NULL);
280 break;
281 default:
282 check (0, LDPL_FATAL, "invalid symbol style requested");
283 break;
285 while (*p)
286 p++;
287 p++;
289 entry->version = NULL;
291 entry->comdat_key = p;
292 while (*p)
293 p++;
294 p++;
296 if (strlen (entry->comdat_key) == 0)
297 entry->comdat_key = NULL;
298 else
299 entry->comdat_key = xstrdup (entry->comdat_key);
301 entry->unused = entry->section_kind = entry->symbol_type = 0;
303 t = *p;
304 check (t <= 4, LDPL_FATAL, "invalid symbol kind found");
305 entry->def = translate_kind[t];
306 p++;
308 t = *p;
309 check (t <= 3, LDPL_FATAL, "invalid symbol visibility found");
310 entry->visibility = translate_visibility[t];
311 p++;
313 memcpy (&entry->size, p, sizeof (uint64_t));
314 p += 8;
316 memcpy (&aux->slot, p, sizeof (uint32_t));
317 p += 4;
319 entry->resolution = LDPR_UNKNOWN;
321 aux->next_conflict = -1;
323 return p;
326 /* Parse an entry of the IL symbol table. The data to be parsed is pointed
327 by P and the result is written in ENTRY. The slot number is stored in SLOT.
328 Returns the address of the next entry. */
330 static char *
331 parse_table_entry_extension (char *p, struct ld_plugin_symbol *entry)
333 unsigned char t;
334 enum ld_plugin_symbol_type symbol_types[] =
336 LDST_UNKNOWN,
337 LDST_FUNCTION,
338 LDST_VARIABLE,
341 t = *p;
342 check (t <= 2, LDPL_FATAL, "invalid symbol type found");
343 entry->symbol_type = symbol_types[t];
344 p++;
345 entry->section_kind = *p;
346 p++;
348 return p;
352 /* Translate the IL symbol table located between DATA and END. Append the
353 slots and symbols to OUT. */
355 static void
356 translate (char *data, char *end, struct plugin_symtab *out)
358 struct sym_aux *aux;
359 struct ld_plugin_symbol *syms = NULL;
360 int n, len;
362 /* This overestimates the output buffer sizes, but at least
363 the algorithm is O(1) now. */
365 len = (end - data)/8 + out->nsyms + 1;
366 syms = xrealloc (out->syms, len * sizeof (struct ld_plugin_symbol));
367 aux = xrealloc (out->aux, len * sizeof (struct sym_aux));
369 for (n = out->nsyms; data < end; n++)
371 aux[n].id = out->id;
372 data = parse_table_entry (data, &syms[n], &aux[n]);
375 assert(n < len);
377 out->nsyms = n;
378 out->syms = syms;
379 out->aux = aux;
382 static void
383 parse_symtab_extension (char *data, char *end, struct plugin_symtab *out)
385 unsigned long i;
386 unsigned char version;
388 if (data >= end)
389 /* FIXME: Issue an error ? */
390 return;
392 version = *data;
393 data++;
395 if (version != 1)
396 return;
398 /* Version 1 contains the following data per entry:
399 - symbol_type
400 - section_kind
401 . */
403 unsigned long nsyms = (end - data) / 2;
405 for (i = 0; i < nsyms; i++)
406 data = parse_table_entry_extension (data, out->syms + i + out->last_sym);
408 out->last_sym += nsyms;
411 /* Free all memory that is no longer needed after writing the symbol
412 resolution. */
414 static void
415 free_1 (struct plugin_file_info *files, unsigned num_files)
417 unsigned int i;
418 for (i = 0; i < num_files; i++)
420 struct plugin_file_info *info = &files[i];
421 struct plugin_symtab *symtab = &info->symtab;
422 unsigned int j;
423 for (j = 0; j < symtab->nsyms; j++)
425 struct ld_plugin_symbol *s = &symtab->syms[j];
426 free (s->name);
427 free (s->comdat_key);
429 free (symtab->syms);
430 symtab->syms = NULL;
434 /* Free all remaining memory. */
436 static void
437 free_2 (void)
439 unsigned int i;
440 for (i = 0; i < num_claimed_files; i++)
442 struct plugin_file_info *info = &claimed_files[i];
443 struct plugin_symtab *symtab = &info->symtab;
444 free (symtab->aux);
445 free (info->name);
448 for (i = 0; i < num_output_files; i++)
449 free (output_files[i]);
450 free (output_files);
452 free (claimed_files);
453 claimed_files = NULL;
454 num_claimed_files = 0;
456 while (offload_files)
458 struct plugin_offload_file *ofld = offload_files;
459 offload_files = offload_files->next;
460 free (ofld);
462 num_offload_files = 0;
464 free (arguments_file_name);
465 arguments_file_name = NULL;
468 /* Dump SYMTAB to resolution file F. */
470 static void
471 dump_symtab (FILE *f, struct plugin_symtab *symtab)
473 unsigned j;
475 for (j = 0; j < symtab->nsyms; j++)
477 uint32_t slot = symtab->aux[j].slot;
478 unsigned int resolution = symtab->syms[j].resolution;
480 assert (resolution != LDPR_UNKNOWN);
482 fprintf (f, "%u %" PRI_LL "x %s %s\n",
483 (unsigned int) slot, symtab->aux[j].id,
484 lto_resolution_str[resolution],
485 symtab->syms[j].name);
489 /* Finish the conflicts' resolution information after the linker resolved
490 the original symbols */
492 static void
493 finish_conflict_resolution (struct plugin_symtab *symtab,
494 struct plugin_symtab *conflicts)
496 int i, j;
498 if (conflicts->nsyms == 0)
499 return;
501 for (i = 0; i < symtab->nsyms; i++)
503 char resolution = LDPR_UNKNOWN;
505 if (symtab->aux[i].next_conflict == -1)
506 continue;
508 switch (symtab->syms[i].def)
510 case LDPK_DEF:
511 case LDPK_COMMON: /* ??? */
512 resolution = LDPR_RESOLVED_IR;
513 break;
514 case LDPK_WEAKDEF:
515 resolution = LDPR_PREEMPTED_IR;
516 break;
517 case LDPK_UNDEF:
518 case LDPK_WEAKUNDEF:
519 resolution = symtab->syms[i].resolution;
520 break;
521 default:
522 assert (0);
525 assert (resolution != LDPR_UNKNOWN);
527 for (j = symtab->aux[i].next_conflict;
528 j != -1;
529 j = conflicts->aux[j].next_conflict)
530 conflicts->syms[j].resolution = resolution;
534 /* Free symbol table SYMTAB. */
536 static void
537 free_symtab (struct plugin_symtab *symtab)
539 free (symtab->syms);
540 symtab->syms = NULL;
541 free (symtab->aux);
542 symtab->aux = NULL;
545 /* Writes the relocations to disk. */
547 static void
548 write_resolution (void)
550 unsigned int i;
551 FILE *f;
553 check (resolution_file, LDPL_FATAL, "resolution file not specified");
554 f = fopen (resolution_file, "w");
555 check (f, LDPL_FATAL, "could not open file");
557 fprintf (f, "%d\n", num_claimed_files);
559 for (i = 0; i < num_claimed_files; i++)
561 struct plugin_file_info *info = &claimed_files[i];
562 struct plugin_symtab *symtab = &info->symtab;
563 struct ld_plugin_symbol *syms = symtab->syms;
565 /* Version 2 of API supports IRONLY_EXP resolution that is
566 accepted by GCC-4.7 and newer. */
567 if (get_symbols_v2)
568 get_symbols_v2 (info->handle, symtab->nsyms, syms);
569 else
570 get_symbols (info->handle, symtab->nsyms, syms);
572 finish_conflict_resolution (symtab, &info->conflicts);
574 fprintf (f, "%s %d\n", info->name, symtab->nsyms + info->conflicts.nsyms);
575 dump_symtab (f, symtab);
576 if (info->conflicts.nsyms)
578 dump_symtab (f, &info->conflicts);
579 free_symtab (&info->conflicts);
582 fclose (f);
585 /* Pass files generated by the lto-wrapper to the linker. FD is lto-wrapper's
586 stdout. */
588 static void
589 add_output_files (FILE *f)
591 for (;;)
593 const unsigned piece = 32;
594 char *buf, *s = xmalloc (piece);
595 size_t len;
597 buf = s;
598 cont:
599 if (!fgets (buf, piece, f))
601 free (s);
602 break;
604 len = strlen (s);
605 if (s[len - 1] != '\n')
607 s = xrealloc (s, len + piece);
608 buf = s + len;
609 goto cont;
611 s[len - 1] = '\0';
613 num_output_files++;
614 output_files
615 = xrealloc (output_files, num_output_files * sizeof (char *));
616 output_files[num_output_files - 1] = s;
617 add_input_file (output_files[num_output_files - 1]);
621 /* Execute the lto-wrapper. ARGV[0] is the binary. The rest of ARGV is the
622 argument list. */
624 static void
625 exec_lto_wrapper (char *argv[])
627 int t, i;
628 int status;
629 char *at_args;
630 FILE *args;
631 FILE *wrapper_output;
632 char *new_argv[3];
633 struct pex_obj *pex;
634 const char *errmsg;
636 /* Write argv to a file to avoid a command line that is too long
637 Save the file locally on save-temps. */
638 const char *suffix = ".lto_wrapper_args";
639 suffix += skip_in_suffix;
640 if (save_temps && link_output_name)
641 arguments_file_name = concat (link_output_name, suffix, NULL);
642 else
643 arguments_file_name = make_temp_file (".lto_wrapper_args");
644 check (arguments_file_name, LDPL_FATAL,
645 "Failed to generate a temorary file name");
647 args = fopen (arguments_file_name, "w");
648 check (args, LDPL_FATAL, "could not open arguments file");
650 t = writeargv (&argv[1], args);
651 check (t == 0, LDPL_FATAL, "could not write arguments");
652 t = fclose (args);
653 check (t == 0, LDPL_FATAL, "could not close arguments file");
655 at_args = concat ("@", arguments_file_name, NULL);
656 check (at_args, LDPL_FATAL, "could not allocate");
658 for (i = 1; argv[i]; i++)
660 char *a = argv[i];
661 /* Check the input argument list for a verbose marker too. */
662 if (a[0] == '-' && a[1] == 'v' && a[2] == '\0')
664 verbose = true;
665 break;
669 if (verbose)
671 for (i = 0; argv[i]; i++)
672 fprintf (stderr, "%s ", argv[i]);
673 fprintf (stderr, "\n");
676 new_argv[0] = argv[0];
677 new_argv[1] = at_args;
678 new_argv[2] = NULL;
680 if (debug)
682 for (i = 0; new_argv[i]; i++)
683 fprintf (stderr, "%s ", new_argv[i]);
684 fprintf (stderr, "\n");
687 pex = pex_init (PEX_USE_PIPES, "lto-wrapper", NULL);
688 check (pex != NULL, LDPL_FATAL, "could not pex_init lto-wrapper");
690 errmsg = pex_run (pex, 0, new_argv[0], new_argv, NULL, NULL, &t);
691 check (errmsg == NULL, LDPL_FATAL, "could not run lto-wrapper");
692 check (t == 0, LDPL_FATAL, "could not run lto-wrapper");
694 wrapper_output = pex_read_output (pex, 0);
695 check (wrapper_output, LDPL_FATAL, "could not read lto-wrapper output");
697 add_output_files (wrapper_output);
699 t = pex_get_status (pex, 1, &status);
700 check (t == 1, LDPL_FATAL, "could not get lto-wrapper exit status");
701 check (WIFEXITED (status) && WEXITSTATUS (status) == 0, LDPL_FATAL,
702 "lto-wrapper failed");
704 pex_free (pex);
706 free (at_args);
709 /* Pass the original files back to the linker. */
711 static void
712 use_original_files (void)
714 unsigned i;
715 for (i = 0; i < num_claimed_files; i++)
717 struct plugin_file_info *info = &claimed_files[i];
718 add_input_file (info->name);
723 /* Called by the linker once all symbols have been read. */
725 static enum ld_plugin_status
726 all_symbols_read_handler (void)
728 const unsigned num_lto_args
729 = num_claimed_files + lto_wrapper_num_args + 2
730 + !linker_output_known + !linker_output_auto_nolto_rel;
731 unsigned i;
732 char **lto_argv;
733 const char *linker_output_str = NULL;
734 const char **lto_arg_ptr;
735 if (num_claimed_files + num_offload_files == 0)
736 return LDPS_OK;
738 if (nop)
740 use_original_files ();
741 return LDPS_OK;
744 if (ltrans_objects)
746 FILE *objs = fopen (ltrans_objects, "r");
747 add_output_files (objs);
748 fclose (objs);
749 return LDPS_OK;
752 lto_argv = (char **) xcalloc (sizeof (char *), num_lto_args);
753 lto_arg_ptr = (const char **) lto_argv;
754 assert (lto_wrapper_argv);
756 write_resolution ();
758 free_1 (claimed_files, num_claimed_files);
760 for (i = 0; i < lto_wrapper_num_args; i++)
761 *lto_arg_ptr++ = lto_wrapper_argv[i];
763 if (!linker_output_known)
765 assert (linker_output_set);
766 switch (linker_output)
768 case LDPO_REL:
769 if (non_claimed_files)
771 if (!linker_output_auto_nolto_rel)
772 message (LDPL_WARNING, "incremental linking of LTO and non-LTO"
773 " objects; using -flinker-output=nolto-rel which will"
774 " bypass whole program optimization");
775 linker_output_str = "-flinker-output=nolto-rel";
777 else
778 linker_output_str = "-flinker-output=rel";
779 break;
780 case LDPO_DYN:
781 linker_output_str = "-flinker-output=dyn";
782 break;
783 case LDPO_PIE:
784 linker_output_str = "-flinker-output=pie";
785 break;
786 case LDPO_EXEC:
787 linker_output_str = "-flinker-output=exec";
788 break;
789 default:
790 message (LDPL_FATAL, "unsupported linker output %i", linker_output);
791 break;
793 *lto_arg_ptr++ = xstrdup (linker_output_str);
796 if (num_offload_files > 0)
798 FILE *f;
799 char *arg;
800 char *offload_objects_file_name;
801 struct plugin_offload_file *ofld;
803 offload_objects_file_name = make_temp_file (".ofldlist");
804 check (offload_objects_file_name, LDPL_FATAL,
805 "Failed to generate a temporary file name");
806 f = fopen (offload_objects_file_name, "w");
807 check (f, LDPL_FATAL, "could not open file with offload objects");
808 fprintf (f, "%u\n", num_offload_files);
810 /* Skip the dummy item at the start of the list. */
811 ofld = offload_files->next;
812 while (ofld)
814 fprintf (f, "%s\n", ofld->name);
815 ofld = ofld->next;
817 fclose (f);
819 arg = concat ("-foffload-objects=", offload_objects_file_name, NULL);
820 check (arg, LDPL_FATAL, "could not allocate");
821 *lto_arg_ptr++ = arg;
824 for (i = 0; i < num_claimed_files; i++)
826 struct plugin_file_info *info = &claimed_files[i];
828 *lto_arg_ptr++ = info->name;
831 *lto_arg_ptr++ = NULL;
832 exec_lto_wrapper (lto_argv);
834 free (lto_argv);
836 /* --pass-through is not needed when using gold 1.11 or later. */
837 if (pass_through_items && gold_version < 111)
839 unsigned int i;
840 for (i = 0; i < num_pass_through_items; i++)
842 if (startswith (pass_through_items[i], "-l"))
843 add_input_library (pass_through_items[i] + 2);
844 else
845 add_input_file (pass_through_items[i]);
846 free (pass_through_items[i]);
847 pass_through_items[i] = NULL;
849 free (pass_through_items);
850 pass_through_items = NULL;
853 return LDPS_OK;
856 /* Helper, as used in collect2. */
857 static int
858 file_exists (const char *name)
860 return access (name, R_OK) == 0;
863 /* Unlink FILE unless we have save-temps set.
864 Note that we're saving files if verbose output is set. */
866 static void
867 maybe_unlink (const char *file)
869 if (save_temps && file_exists (file))
871 if (verbose)
872 fprintf (stderr, "[Leaving %s]\n", file);
873 return;
876 unlink_if_ordinary (file);
879 /* Remove temporary files at the end of the link. */
881 static enum ld_plugin_status
882 cleanup_handler (void)
884 unsigned int i;
886 if (debug)
887 return LDPS_OK;
889 if (arguments_file_name)
890 maybe_unlink (arguments_file_name);
892 for (i = 0; i < num_output_files; i++)
893 maybe_unlink (output_files[i]);
895 free_2 ();
896 return LDPS_OK;
899 #define SWAP(type, a, b) \
900 do { type tmp_; tmp_ = (a); (a) = (b); (b) = tmp_; } while(0)
902 /* Compare two hash table entries */
904 static int eq_sym (const void *a, const void *b)
906 const struct ld_plugin_symbol *as = (const struct ld_plugin_symbol *)a;
907 const struct ld_plugin_symbol *bs = (const struct ld_plugin_symbol *)b;
909 return !strcmp (as->name, bs->name);
912 /* Hash a symbol */
914 static hashval_t hash_sym (const void *a)
916 const struct ld_plugin_symbol *as = (const struct ld_plugin_symbol *)a;
918 return htab_hash_string (as->name);
921 /* Determine how strong a symbol is */
923 static int symbol_strength (struct ld_plugin_symbol *s)
925 switch (s->def)
927 case LDPK_UNDEF:
928 case LDPK_WEAKUNDEF:
929 return 0;
930 case LDPK_WEAKDEF:
931 return 1;
932 default:
933 return 2;
937 /* In the ld -r case we can get dups in the LTO symbol tables, where
938 the same symbol can have different resolutions (e.g. undefined and defined).
940 We have to keep that in the LTO symbol tables, but the dups confuse
941 gold and then finally gcc by supplying incorrect resolutions.
943 Problem is that the main gold symbol table doesn't know about subids
944 and does not distingush the same symbols in different states.
946 So we drop duplicates from the linker visible symbol table
947 and keep them in a private table. Then later do own symbol
948 resolution for the duplicated based on the results for the
949 originals.
951 Then when writing out the resolution file readd the dropped symbols.
953 XXX how to handle common? */
955 static void
956 resolve_conflicts (struct plugin_symtab *t, struct plugin_symtab *conflicts)
958 htab_t symtab = htab_create (t->nsyms, hash_sym, eq_sym, NULL);
959 int i;
960 int out;
961 int outlen;
963 outlen = t->nsyms;
964 conflicts->syms = xmalloc (sizeof (struct ld_plugin_symbol) * outlen);
965 conflicts->aux = xmalloc (sizeof (struct sym_aux) * outlen);
967 /* Move all duplicate symbols into the auxiliary conflicts table. */
968 out = 0;
969 for (i = 0; i < t->nsyms; i++)
971 struct ld_plugin_symbol *s = &t->syms[i];
972 struct sym_aux *aux = &t->aux[i];
973 void **slot;
975 slot = htab_find_slot (symtab, s, INSERT);
976 if (*slot != NULL)
978 int cnf;
979 struct ld_plugin_symbol *orig = (struct ld_plugin_symbol *)*slot;
980 struct sym_aux *orig_aux = &t->aux[orig - t->syms];
982 /* Always let the linker resolve the strongest symbol */
983 if (symbol_strength (orig) < symbol_strength (s))
985 SWAP (struct ld_plugin_symbol, *orig, *s);
986 SWAP (uint32_t, orig_aux->slot, aux->slot);
987 SWAP (unsigned long long, orig_aux->id, aux->id);
988 /* Don't swap conflict chain pointer */
991 /* Move current symbol into the conflicts table */
992 cnf = conflicts->nsyms++;
993 conflicts->syms[cnf] = *s;
994 conflicts->aux[cnf] = *aux;
995 aux = &conflicts->aux[cnf];
997 /* Update conflicts chain of the original symbol */
998 aux->next_conflict = orig_aux->next_conflict;
999 orig_aux->next_conflict = cnf;
1001 continue;
1004 /* Remove previous duplicates in the main table */
1005 if (out < i)
1007 t->syms[out] = *s;
1008 t->aux[out] = *aux;
1011 /* Put original into the hash table */
1012 *slot = &t->syms[out];
1013 out++;
1016 assert (conflicts->nsyms <= outlen);
1017 assert (conflicts->nsyms + out == t->nsyms);
1019 t->nsyms = out;
1020 htab_delete (symtab);
1023 /* Process one section of an object file. */
1025 static int
1026 process_symtab (void *data, const char *name, off_t offset, off_t length)
1028 struct plugin_objfile *obj = (struct plugin_objfile *)data;
1029 char *s;
1030 char *secdatastart, *secdata;
1032 if (!startswith (name, ".gnu.lto_.symtab"))
1033 return 1;
1035 s = strrchr (name, '.');
1036 if (s)
1037 sscanf (s, ".%" PRI_LL "x", &obj->out->id);
1038 secdata = secdatastart = xmalloc (length);
1039 offset += obj->file->offset;
1040 if (offset != lseek (obj->file->fd, offset, SEEK_SET))
1041 goto err;
1045 ssize_t got = read (obj->file->fd, secdata, length);
1046 if (got == 0)
1047 break;
1048 else if (got > 0)
1050 secdata += got;
1051 length -= got;
1053 else if (errno != EINTR)
1054 goto err;
1056 while (length > 0);
1057 if (length > 0)
1058 goto err;
1060 translate (secdatastart, secdata, obj->out);
1061 obj->found++;
1062 free (secdatastart);
1063 return 1;
1065 err:
1066 if (message)
1067 message (LDPL_FATAL, "%s: corrupt object file", obj->file->name);
1068 /* Force claim_file_handler to abandon this file. */
1069 obj->found = 0;
1070 free (secdatastart);
1071 return 0;
1074 /* Process one section of an object file. */
1076 static int
1077 process_symtab_extension (void *data, const char *name, off_t offset,
1078 off_t length)
1080 struct plugin_objfile *obj = (struct plugin_objfile *)data;
1081 char *s;
1082 char *secdatastart, *secdata;
1084 if (!startswith (name, ".gnu.lto_.ext_symtab"))
1085 return 1;
1087 s = strrchr (name, '.');
1088 if (s)
1089 sscanf (s, ".%" PRI_LL "x", &obj->out->id);
1090 secdata = secdatastart = xmalloc (length);
1091 offset += obj->file->offset;
1092 if (offset != lseek (obj->file->fd, offset, SEEK_SET))
1093 goto err;
1097 ssize_t got = read (obj->file->fd, secdata, length);
1098 if (got == 0)
1099 break;
1100 else if (got > 0)
1102 secdata += got;
1103 length -= got;
1105 else if (errno != EINTR)
1106 goto err;
1108 while (length > 0);
1109 if (length > 0)
1110 goto err;
1112 parse_symtab_extension (secdatastart, secdata, obj->out);
1113 obj->found++;
1114 free (secdatastart);
1115 return 1;
1117 err:
1118 if (message)
1119 message (LDPL_FATAL, "%s: corrupt object file", obj->file->name);
1120 /* Force claim_file_handler to abandon this file. */
1121 obj->found = 0;
1122 free (secdatastart);
1123 return 0;
1127 /* Find an offload section of an object file. */
1129 static int
1130 process_offload_section (void *data, const char *name, off_t offset, off_t len)
1132 if (startswith (name, ".gnu.offload_lto_.opts"))
1134 struct plugin_objfile *obj = (struct plugin_objfile *) data;
1135 obj->offload = 1;
1136 return 0;
1139 return 1;
1142 /* Callback used by gold to check if the plugin will claim FILE. Writes
1143 the result in CLAIMED. */
1145 static enum ld_plugin_status
1146 claim_file_handler (const struct ld_plugin_input_file *file, int *claimed)
1148 enum ld_plugin_status status;
1149 struct plugin_objfile obj;
1150 struct plugin_file_info lto_file;
1151 int err;
1152 const char *errmsg;
1154 memset (&lto_file, 0, sizeof (struct plugin_file_info));
1156 if (file->offset != 0)
1158 /* We pass the offset of the actual file, not the archive header.
1159 Can't use PRIx64, because that's C99, so we have to print the
1160 64-bit hex int as two 32-bit ones. Use xasprintf instead of
1161 asprintf because asprintf doesn't work as expected on some older
1162 mingw32 hosts. */
1163 int lo, hi;
1164 lo = file->offset & 0xffffffff;
1165 hi = ((int64_t)file->offset >> 32) & 0xffffffff;
1166 lto_file.name = hi ? xasprintf ("%s@0x%x%08x", file->name, hi, lo)
1167 : xasprintf ("%s@0x%x", file->name, lo);
1169 else
1171 lto_file.name = xstrdup (file->name);
1173 lto_file.handle = file->handle;
1175 *claimed = 0;
1176 obj.file = file;
1177 obj.found = 0;
1178 obj.offload = 0;
1179 obj.out = &lto_file.symtab;
1180 errmsg = NULL;
1181 obj.objfile = simple_object_start_read (file->fd, file->offset, LTO_SEGMENT_NAME,
1182 &errmsg, &err);
1183 /* No file, but also no error code means unrecognized format; just skip it. */
1184 if (!obj.objfile && !err)
1185 goto err;
1187 if (obj.objfile)
1189 errmsg = simple_object_find_sections (obj.objfile, process_symtab, &obj,
1190 &err);
1191 /* Parsing symtab extension should be done only for add_symbols_v2 and
1192 later versions. */
1193 if (!errmsg && add_symbols_v2 != NULL)
1195 obj.out->last_sym = 0;
1196 errmsg = simple_object_find_sections (obj.objfile,
1197 process_symtab_extension,
1198 &obj, &err);
1202 if (!obj.objfile || errmsg)
1204 if (err && message)
1205 message (LDPL_FATAL, "%s: %s: %s", file->name, errmsg,
1206 xstrerror (err));
1207 else if (message)
1208 message (LDPL_FATAL, "%s: %s", file->name, errmsg);
1209 goto err;
1212 if (obj.objfile)
1213 simple_object_find_sections (obj.objfile, process_offload_section,
1214 &obj, &err);
1216 if (obj.found == 0 && obj.offload == 0)
1217 goto err;
1219 if (obj.found > 1)
1220 resolve_conflicts (&lto_file.symtab, &lto_file.conflicts);
1222 if (obj.found > 0)
1224 if (add_symbols_v2)
1225 status = add_symbols_v2 (file->handle, lto_file.symtab.nsyms,
1226 lto_file.symtab.syms);
1227 else
1228 status = add_symbols (file->handle, lto_file.symtab.nsyms,
1229 lto_file.symtab.syms);
1230 check (status == LDPS_OK, LDPL_FATAL, "could not add symbols");
1232 num_claimed_files++;
1233 claimed_files =
1234 xrealloc (claimed_files,
1235 num_claimed_files * sizeof (struct plugin_file_info));
1236 claimed_files[num_claimed_files - 1] = lto_file;
1238 *claimed = 1;
1241 if (offload_files == NULL)
1243 /* Add dummy item to the start of the list. */
1244 offload_files = xmalloc (sizeof (struct plugin_offload_file));
1245 offload_files->name = NULL;
1246 offload_files->next = NULL;
1247 offload_files_last = offload_files;
1250 /* If this is an LTO file without offload, and it is the first LTO file, save
1251 the pointer to the last offload file in the list. Further offload LTO
1252 files will be inserted after it, if any. */
1253 if (*claimed && obj.offload == 0 && offload_files_last_lto == NULL)
1254 offload_files_last_lto = offload_files_last;
1256 if (obj.offload == 1)
1258 /* Add file to the list. The order must be exactly the same as the final
1259 order after recompilation and linking, otherwise host and target tables
1260 with addresses wouldn't match. If a static library contains both LTO
1261 and non-LTO objects, ld and gold link them in a different order. */
1262 struct plugin_offload_file *ofld
1263 = xmalloc (sizeof (struct plugin_offload_file));
1264 ofld->name = lto_file.name;
1265 ofld->next = NULL;
1267 if (*claimed && offload_files_last_lto == NULL && file->offset != 0
1268 && gold_version == -1)
1270 /* ld only: insert first LTO file from the archive after the last real
1271 object file immediately preceding the archive, or at the begin of
1272 the list if there was no real objects before archives. */
1273 if (offload_files_last_obj != NULL)
1275 ofld->next = offload_files_last_obj->next;
1276 offload_files_last_obj->next = ofld;
1278 else
1280 ofld->next = offload_files->next;
1281 offload_files->next = ofld;
1284 else if (*claimed && offload_files_last_lto != NULL)
1286 /* Insert LTO file after the last LTO file in the list. */
1287 ofld->next = offload_files_last_lto->next;
1288 offload_files_last_lto->next = ofld;
1290 else
1291 /* Add non-LTO file or first non-archive LTO file to the end of the
1292 list. */
1293 offload_files_last->next = ofld;
1295 if (ofld->next == NULL)
1296 offload_files_last = ofld;
1297 if (file->offset == 0)
1298 offload_files_last_obj = ofld;
1299 if (*claimed)
1300 offload_files_last_lto = ofld;
1301 num_offload_files++;
1304 goto cleanup;
1306 err:
1307 non_claimed_files++;
1308 free (lto_file.name);
1310 cleanup:
1311 if (obj.objfile)
1312 simple_object_release_read (obj.objfile);
1314 return LDPS_OK;
1317 /* Parse the plugin options. */
1319 static void
1320 process_option (const char *option)
1322 if (strcmp (option, "-linker-output-known") == 0)
1323 linker_output_known = true;
1324 /* Also accept "notlo" for backwards compatibility. */
1325 else if ((strcmp (option, "-linker-output-auto-nolto-rel") == 0)
1326 || (strcmp (option, "-linker-output-auto-notlo-rel") == 0))
1327 linker_output_auto_nolto_rel = true;
1328 else if (strcmp (option, "-debug") == 0)
1329 debug = true;
1330 else if ((strcmp (option, "-v") == 0)
1331 || (strcmp (option, "--verbose") == 0))
1332 verbose = true;
1333 else if (strcmp (option, "-save-temps") == 0)
1334 save_temps = true;
1335 else if (strcmp (option, "-nop") == 0)
1336 nop = 1;
1337 else if (startswith (option, "-pass-through="))
1339 num_pass_through_items++;
1340 pass_through_items = xrealloc (pass_through_items,
1341 num_pass_through_items * sizeof (char *));
1342 pass_through_items[num_pass_through_items - 1] =
1343 xstrdup (option + strlen ("-pass-through="));
1345 else if (startswith (option, "-sym-style="))
1347 switch (option[sizeof ("-sym-style=") - 1])
1349 case 'w':
1350 sym_style = ss_win32;
1351 break;
1352 case 'u':
1353 sym_style = ss_uscore;
1354 break;
1355 default:
1356 sym_style = ss_none;
1357 break;
1360 else if (startswith (option, "-ltrans-objects="))
1361 ltrans_objects = xstrdup (option + strlen ("-ltrans-objects="));
1362 else
1364 int size;
1365 char *opt = xstrdup (option);
1366 lto_wrapper_num_args += 1;
1367 size = lto_wrapper_num_args * sizeof (char *);
1368 lto_wrapper_argv = (char **) xrealloc (lto_wrapper_argv, size);
1369 lto_wrapper_argv[lto_wrapper_num_args - 1] = opt;
1370 if (startswith (option, "-fresolution="))
1371 resolution_file = opt + sizeof ("-fresolution=") - 1;
1373 save_temps = save_temps || debug;
1374 verbose = verbose || debug;
1377 /* Called by gold after loading the plugin. TV is the transfer vector. */
1379 enum ld_plugin_status
1380 onload (struct ld_plugin_tv *tv)
1382 struct ld_plugin_tv *p;
1383 enum ld_plugin_status status;
1385 p = tv;
1386 while (p->tv_tag)
1388 switch (p->tv_tag)
1390 case LDPT_MESSAGE:
1391 message = p->tv_u.tv_message;
1392 break;
1393 case LDPT_REGISTER_CLAIM_FILE_HOOK:
1394 register_claim_file = p->tv_u.tv_register_claim_file;
1395 break;
1396 case LDPT_ADD_SYMBOLS_V2:
1397 add_symbols_v2 = p->tv_u.tv_add_symbols;
1398 break;
1399 case LDPT_ADD_SYMBOLS:
1400 add_symbols = p->tv_u.tv_add_symbols;
1401 break;
1402 case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK:
1403 register_all_symbols_read = p->tv_u.tv_register_all_symbols_read;
1404 break;
1405 case LDPT_GET_SYMBOLS_V2:
1406 get_symbols_v2 = p->tv_u.tv_get_symbols;
1407 break;
1408 case LDPT_GET_SYMBOLS:
1409 get_symbols = p->tv_u.tv_get_symbols;
1410 break;
1411 case LDPT_REGISTER_CLEANUP_HOOK:
1412 register_cleanup = p->tv_u.tv_register_cleanup;
1413 break;
1414 case LDPT_ADD_INPUT_FILE:
1415 add_input_file = p->tv_u.tv_add_input_file;
1416 break;
1417 case LDPT_ADD_INPUT_LIBRARY:
1418 add_input_library = p->tv_u.tv_add_input_library;
1419 break;
1420 case LDPT_OPTION:
1421 process_option (p->tv_u.tv_string);
1422 break;
1423 case LDPT_GOLD_VERSION:
1424 gold_version = p->tv_u.tv_val;
1425 break;
1426 case LDPT_LINKER_OUTPUT:
1427 linker_output = (enum ld_plugin_output_file_type) p->tv_u.tv_val;
1428 linker_output_set = true;
1429 break;
1430 case LDPT_OUTPUT_NAME:
1431 /* We only use this to make user-friendly temp file names. */
1432 link_output_name = p->tv_u.tv_string;
1433 break;
1434 default:
1435 break;
1437 p++;
1440 check (register_claim_file, LDPL_FATAL, "register_claim_file not found");
1441 check (add_symbols, LDPL_FATAL, "add_symbols not found");
1442 status = register_claim_file (claim_file_handler);
1443 check (status == LDPS_OK, LDPL_FATAL,
1444 "could not register the claim_file callback");
1446 if (register_cleanup)
1448 status = register_cleanup (cleanup_handler);
1449 check (status == LDPS_OK, LDPL_FATAL,
1450 "could not register the cleanup callback");
1453 if (register_all_symbols_read)
1455 check (get_symbols, LDPL_FATAL, "get_symbols not found");
1456 status = register_all_symbols_read (all_symbols_read_handler);
1457 check (status == LDPS_OK, LDPL_FATAL,
1458 "could not register the all_symbols_read callback");
1461 char *collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
1462 if (collect_gcc_options)
1464 /* Support -fno-use-linker-plugin by failing to load the plugin
1465 for the case where it is auto-loaded by BFD. */
1466 if (strstr (collect_gcc_options, "'-fno-use-linker-plugin'"))
1467 return LDPS_ERR;
1469 if (strstr (collect_gcc_options, "'-save-temps'"))
1470 save_temps = true;
1472 if (strstr (collect_gcc_options, "'-v'")
1473 || strstr (collect_gcc_options, "'--verbose'"))
1474 verbose = true;
1476 const char *p;
1477 if ((p = strstr (collect_gcc_options, "'-dumpdir'")))
1479 p += sizeof ("'-dumpdir'");
1480 while (*p == ' ')
1481 p++;
1482 const char *start = p;
1483 int ticks = 0, escapes = 0;
1484 /* Count ticks (') and escaped (\.) characters. Stop at the
1485 end of the options or at a blank after an even number of
1486 ticks (not counting escaped ones. */
1487 for (p = start; *p; p++)
1489 if (*p == '\'')
1491 ticks++;
1492 continue;
1494 else if ((ticks % 2) != 0)
1496 if (*p == ' ')
1497 break;
1498 if (*p == '\\')
1500 if (*++p)
1501 escapes++;
1502 else
1503 p--;
1508 /* Now allocate a new link_output_name and decode dumpdir
1509 into it. The loop uses the same logic, except it counts
1510 ticks and escapes backwards (so ticks is adjusted if we
1511 find an odd number of them), and it copies characters
1512 that are escaped or not otherwise skipped. */
1513 int len = p - start - ticks - escapes + 1;
1514 char *q = xmalloc (len);
1515 link_output_name = q;
1516 int oddticks = (ticks % 2);
1517 ticks += oddticks;
1518 for (p = start; *p; p++)
1520 if (*p == '\'')
1522 ticks--;
1523 continue;
1525 else if ((ticks % 2) != 0)
1527 if (*p == ' ')
1528 break;
1529 if (*p == '\\')
1531 if (*++p)
1532 escapes--;
1533 else
1534 p--;
1537 *q++ = *p;
1539 *q = '\0';
1540 assert (escapes == 0);
1541 assert (ticks == oddticks);
1542 assert (q - link_output_name == len - 1);
1543 skip_in_suffix = 1;
1547 return LDPS_OK;