1 /* LTO plugin for gold and/or GNU ld.
2 Copyright (C) 2009, 2010 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)
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 2 options of its 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. */
49 #include <sys/types.h>
50 #ifdef HAVE_SYS_WAIT_H
53 #include <libiberty.h>
55 #include "../gcc/lto/common.h"
56 #include "simple-object.h"
57 #include "plugin-api.h"
59 /* Handle opening elf files on hosts, such as Windows, that may use
60 text file handling that will break binary access. */
65 /* Segment name for LTO sections. This is only used for Mach-O.
66 FIXME: This needs to be kept in sync with darwin.c. */
68 #define LTO_SEGMENT_NAME "__GNU_LTO"
70 /* LTO magic section name. */
72 #define LTO_SECTION_PREFIX ".gnu.lto_.symtab"
73 #define LTO_SECTION_PREFIX_LEN (sizeof (LTO_SECTION_PREFIX) - 1)
75 /* The part of the symbol table the plugin has to keep track of. Note that we
76 must keep SYMS until all_symbols_read is called to give the linker time to
77 copy the symbol information. */
83 unsigned next_conflict;
90 struct ld_plugin_symbol *syms;
94 /* Encapsulates object file data during symbol scan. */
98 simple_object_read *objfile;
99 struct plugin_symtab *out;
100 const struct ld_plugin_input_file *file;
103 /* All that we have to remember about a file. */
105 struct plugin_file_info
109 struct plugin_symtab symtab;
110 struct plugin_symtab conflicts;
113 /* Until ASM_OUTPUT_LABELREF can be hookized and decoupled from
114 stdio file streams, we do simple label translation here. */
118 ss_none, /* No underscore prefix. */
119 ss_win32, /* Underscore prefix any symbol not beginning with '@'. */
120 ss_uscore, /* Underscore prefix all symbols. */
123 static char *arguments_file_name;
124 static ld_plugin_register_claim_file register_claim_file;
125 static ld_plugin_register_all_symbols_read register_all_symbols_read;
126 static ld_plugin_get_symbols get_symbols;
127 static ld_plugin_register_cleanup register_cleanup;
128 static ld_plugin_add_input_file add_input_file;
129 static ld_plugin_add_input_library add_input_library;
130 static ld_plugin_message message;
131 static ld_plugin_add_symbols add_symbols;
133 static struct plugin_file_info *claimed_files = NULL;
134 static unsigned int num_claimed_files = 0;
136 static char **output_files = NULL;
137 static unsigned int num_output_files = 0;
139 static char **lto_wrapper_argv;
140 static int lto_wrapper_num_args;
142 static char **pass_through_items = NULL;
143 static unsigned int num_pass_through_items;
147 static char *resolution_file = NULL;
149 /* Set by default from configure.ac, but can be overridden at runtime
150 by using -plugin-opt=-sym-style={none,win32,underscore|uscore}
151 (in fact, only first letter of style arg is checked.) */
152 static enum symbol_style sym_style = SYM_STYLE;
155 check_1 (int gate, enum ld_plugin_level level, const char *text)
161 message (level, text);
164 /* If there is no nicer way to inform the user, fallback to stderr. */
165 fprintf (stderr, "%s\n", text);
166 if (level == LDPL_FATAL)
171 /* This little wrapper allows check to be called with a non-integer
172 first argument, such as a pointer that must be non-NULL. We can't
173 use c99 bool type to coerce it into range, so we explicitly test. */
174 #define check(GATE, LEVEL, TEXT) check_1 (((GATE) != 0), (LEVEL), (TEXT))
176 /* Parse an entry of the IL symbol table. The data to be parsed is pointed
177 by P and the result is written in ENTRY. The slot number is stored in SLOT.
178 Returns the address of the next entry. */
181 parse_table_entry (char *p, struct ld_plugin_symbol *entry,
185 enum ld_plugin_symbol_kind translate_kind[] =
194 enum ld_plugin_symbol_visibility translate_visibility[] =
207 /* cf. Duff's device. */
209 entry->name = xstrdup (p);
214 entry->name = concat ("_", p, NULL);
217 check (0, LDPL_FATAL, "invalid symbol style requested");
224 entry->version = NULL;
226 entry->comdat_key = p;
231 if (strlen (entry->comdat_key) == 0)
232 entry->comdat_key = NULL;
234 entry->comdat_key = xstrdup (entry->comdat_key);
237 check (t <= 4, LDPL_FATAL, "invalid symbol kind found");
238 entry->def = translate_kind[t];
242 check (t <= 3, LDPL_FATAL, "invalid symbol visibility found");
243 entry->visibility = translate_visibility[t];
246 entry->size = *(uint64_t *) p;
249 aux->slot = *(uint32_t *) p;
252 entry->resolution = LDPR_UNKNOWN;
254 aux->next_conflict = -1;
259 /* Translate the IL symbol table located between DATA and END. Append the
260 slots and symbols to OUT. */
263 translate (char *data, char *end, struct plugin_symtab *out)
266 struct ld_plugin_symbol *syms = NULL;
269 /* This overestimates the output buffer sizes, but at least
270 the algorithm is O(1) now. */
272 len = (end - data)/8 + out->nsyms + 1;
273 syms = xrealloc (out->syms, len * sizeof (struct ld_plugin_symbol));
274 aux = xrealloc (out->aux, len * sizeof (struct sym_aux));
276 for (n = out->nsyms; data < end; n++)
279 data = parse_table_entry (data, &syms[n], &aux[n]);
289 /* Free all memory that is no longer needed after writing the symbol
296 for (i = 0; i < num_claimed_files; i++)
298 struct plugin_file_info *info = &claimed_files[i];
299 struct plugin_symtab *symtab = &info->symtab;
301 for (j = 0; j < symtab->nsyms; j++)
303 struct ld_plugin_symbol *s = &symtab->syms[j];
306 free (s->comdat_key);
313 /* Free all remaining memory. */
319 for (i = 0; i < num_claimed_files; i++)
321 struct plugin_file_info *info = &claimed_files[i];
322 struct plugin_symtab *symtab = &info->symtab;
327 for (i = 0; i < num_output_files; i++)
328 free (output_files[i]);
331 free (claimed_files);
332 claimed_files = NULL;
333 num_claimed_files = 0;
335 if (arguments_file_name)
336 free (arguments_file_name);
337 arguments_file_name = NULL;
340 /* Dump SYMTAB to resolution file F. */
343 dump_symtab (FILE *f, struct plugin_symtab *symtab)
347 for (j = 0; j < symtab->nsyms; j++)
349 uint32_t slot = symtab->aux[j].slot;
350 unsigned int resolution = symtab->syms[j].resolution;
352 assert (resolution != LDPR_UNKNOWN);
354 fprintf (f, "%u %x %s %s\n", (unsigned int) slot, symtab->aux[j].id,
355 lto_resolution_str[resolution],
356 symtab->syms[j].name);
360 /* Finish the conflicts' resolution information after the linker resolved
361 the original symbols */
364 finish_conflict_resolution (struct plugin_symtab *symtab,
365 struct plugin_symtab *conflicts)
369 if (conflicts->nsyms == 0)
372 for (i = 0; i < symtab->nsyms; i++)
374 int resolution = LDPR_UNKNOWN;
376 if (symtab->aux[i].next_conflict == -1)
379 switch (symtab->syms[i].def)
382 case LDPK_COMMON: /* ??? */
383 resolution = LDPR_RESOLVED_IR;
386 resolution = LDPR_PREEMPTED_IR;
390 resolution = symtab->syms[i].resolution;
396 assert (resolution != LDPR_UNKNOWN);
398 for (j = symtab->aux[i].next_conflict;
400 j = conflicts->aux[j].next_conflict)
401 conflicts->syms[j].resolution = resolution;
405 /* Free symbol table SYMTAB. */
408 free_symtab (struct plugin_symtab *symtab)
416 /* Writes the relocations to disk. */
419 write_resolution (void)
424 check (resolution_file, LDPL_FATAL, "resolution file not specified");
425 f = fopen (resolution_file, "w");
426 check (f, LDPL_FATAL, "could not open file");
428 fprintf (f, "%d\n", num_claimed_files);
430 for (i = 0; i < num_claimed_files; i++)
432 struct plugin_file_info *info = &claimed_files[i];
433 struct plugin_symtab *symtab = &info->symtab;
434 struct ld_plugin_symbol *syms = symtab->syms;
436 get_symbols (info->handle, symtab->nsyms, syms);
438 finish_conflict_resolution (symtab, &info->conflicts);
440 fprintf (f, "%s %d\n", info->name, symtab->nsyms + info->conflicts.nsyms);
441 dump_symtab (f, symtab);
442 if (info->conflicts.nsyms)
444 dump_symtab (f, &info->conflicts);
445 free_symtab (&info->conflicts);
451 /* Pass files generated by the lto-wrapper to the linker. FD is lto-wrapper's
455 add_output_files (FILE *f)
459 const unsigned piece = 32;
460 char *buf, *s = xmalloc (piece);
465 if (!fgets (buf, piece, f))
471 if (s[len - 1] != '\n')
473 s = xrealloc (s, len + piece);
481 = xrealloc (output_files, num_output_files * sizeof (char *));
482 output_files[num_output_files - 1] = s;
483 add_input_file (output_files[num_output_files - 1]);
487 /* Execute the lto-wrapper. ARGV[0] is the binary. The rest of ARGV is the
491 exec_lto_wrapper (char *argv[])
497 FILE *wrapper_output;
502 /* Write argv to a file to avoid a command line that is too long. */
503 arguments_file_name = make_temp_file ("");
504 check (arguments_file_name, LDPL_FATAL,
505 "Failed to generate a temorary file name");
507 args = fopen (arguments_file_name, "w");
508 check (args, LDPL_FATAL, "could not open arguments file");
510 t = writeargv (&argv[1], args);
511 check (t == 0, LDPL_FATAL, "could not write arguments");
513 check (t == 0, LDPL_FATAL, "could not close arguments file");
515 at_args = concat ("@", arguments_file_name, NULL);
516 check (at_args, LDPL_FATAL, "could not allocate");
518 for (i = 1; argv[i]; i++)
521 if (a[0] == '-' && a[1] == 'v' && a[2] == '\0')
523 for (i = 0; argv[i]; i++)
524 fprintf (stderr, "%s ", argv[i]);
525 fprintf (stderr, "\n");
530 new_argv[0] = argv[0];
531 new_argv[1] = at_args;
536 for (i = 0; new_argv[i]; i++)
537 fprintf (stderr, "%s ", new_argv[i]);
538 fprintf (stderr, "\n");
542 pex = pex_init (PEX_USE_PIPES, "lto-wrapper", NULL);
543 check (pex != NULL, LDPL_FATAL, "could not pex_init lto-wrapper");
545 errmsg = pex_run (pex, 0, new_argv[0], new_argv, NULL, NULL, &t);
546 check (errmsg == NULL, LDPL_FATAL, "could not run lto-wrapper");
547 check (t == 0, LDPL_FATAL, "could not run lto-wrapper");
549 wrapper_output = pex_read_output (pex, 0);
550 check (wrapper_output, LDPL_FATAL, "could not read lto-wrapper output");
552 add_output_files (wrapper_output);
554 t = pex_get_status (pex, 1, &status);
555 check (t == 1, LDPL_FATAL, "could not get lto-wrapper exit status");
556 check (WIFEXITED (status) && WEXITSTATUS (status) == 0, LDPL_FATAL,
557 "lto-wrapper failed");
564 /* Pass the original files back to the linker. */
567 use_original_files (void)
570 for (i = 0; i < num_claimed_files; i++)
572 struct plugin_file_info *info = &claimed_files[i];
573 add_input_file (info->name);
578 /* Called by the linker once all symbols have been read. */
580 static enum ld_plugin_status
581 all_symbols_read_handler (void)
584 unsigned num_lto_args = num_claimed_files + lto_wrapper_num_args + 1;
586 const char **lto_arg_ptr;
587 if (num_claimed_files == 0)
592 use_original_files ();
596 lto_argv = (char **) xcalloc (sizeof (char *), num_lto_args);
597 lto_arg_ptr = (const char **) lto_argv;
598 assert (lto_wrapper_argv);
604 for (i = 0; i < lto_wrapper_num_args; i++)
605 *lto_arg_ptr++ = lto_wrapper_argv[i];
607 for (i = 0; i < num_claimed_files; i++)
609 struct plugin_file_info *info = &claimed_files[i];
611 *lto_arg_ptr++ = info->name;
614 *lto_arg_ptr++ = NULL;
615 exec_lto_wrapper (lto_argv);
619 if (pass_through_items)
622 for (i = 0; i < num_pass_through_items; i++)
624 if (strncmp (pass_through_items[i], "-l", 2) == 0)
625 add_input_library (pass_through_items[i] + 2);
627 add_input_file (pass_through_items[i]);
628 free (pass_through_items[i]);
629 pass_through_items[i] = NULL;
631 free (pass_through_items);
632 pass_through_items = NULL;
638 /* Remove temporary files at the end of the link. */
640 static enum ld_plugin_status
641 cleanup_handler (void)
649 if (arguments_file_name)
651 t = unlink (arguments_file_name);
652 check (t == 0, LDPL_FATAL, "could not unlink arguments file");
655 for (i = 0; i < num_output_files; i++)
657 t = unlink (output_files[i]);
658 check (t == 0, LDPL_FATAL, "could not unlink output file");
665 #define SWAP(type, a, b) \
666 do { type tmp_; tmp_ = (a); (a) = (b); (b) = tmp_; } while(0)
668 /* Compare two hash table entries */
670 static int eq_sym (const void *a, const void *b)
672 const struct ld_plugin_symbol *as = (const struct ld_plugin_symbol *)a;
673 const struct ld_plugin_symbol *bs = (const struct ld_plugin_symbol *)b;
675 return !strcmp (as->name, bs->name);
680 static hashval_t hash_sym (const void *a)
682 const struct ld_plugin_symbol *as = (const struct ld_plugin_symbol *)a;
684 return htab_hash_string (as->name);
687 /* Determine how strong a symbol is */
689 static int symbol_strength (struct ld_plugin_symbol *s)
703 /* In the ld -r case we can get dups in the LTO symbol tables, where
704 the same symbol can have different resolutions (e.g. undefined and defined).
706 We have to keep that in the LTO symbol tables, but the dups confuse
707 gold and then finally gcc by supplying incorrect resolutions.
709 Problem is that the main gold symbol table doesn't know about subids
710 and does not distingush the same symbols in different states.
712 So we drop duplicates from the linker visible symbol table
713 and keep them in a private table. Then later do own symbol
714 resolution for the duplicated based on the results for the
717 Then when writing out the resolution file readd the dropped symbols.
719 XXX how to handle common? */
722 resolve_conflicts (struct plugin_symtab *t, struct plugin_symtab *conflicts)
724 htab_t symtab = htab_create (t->nsyms, hash_sym, eq_sym, NULL);
730 conflicts->syms = xmalloc (sizeof (struct ld_plugin_symbol) * outlen);
731 conflicts->aux = xmalloc (sizeof (struct sym_aux) * outlen);
733 /* Move all duplicate symbols into the auxillary conflicts table. */
735 for (i = 0; i < t->nsyms; i++)
737 struct ld_plugin_symbol *s = &t->syms[i];
738 struct sym_aux *aux = &t->aux[i];
741 slot = htab_find_slot (symtab, s, INSERT);
745 struct ld_plugin_symbol *orig = (struct ld_plugin_symbol *)*slot;
746 struct sym_aux *orig_aux = &t->aux[orig - t->syms];
748 /* Always let the linker resolve the strongest symbol */
749 if (symbol_strength (orig) < symbol_strength (s))
751 SWAP (struct ld_plugin_symbol, *orig, *s);
752 SWAP (uint32_t, orig_aux->slot, aux->slot);
753 SWAP (unsigned, orig_aux->id, aux->id);
754 /* Don't swap conflict chain pointer */
757 /* Move current symbol into the conflicts table */
758 cnf = conflicts->nsyms++;
759 conflicts->syms[cnf] = *s;
760 conflicts->aux[cnf] = *aux;
761 aux = &conflicts->aux[cnf];
763 /* Update conflicts chain of the original symbol */
764 aux->next_conflict = orig_aux->next_conflict;
765 orig_aux->next_conflict = cnf;
770 /* Remove previous duplicates in the main table */
777 /* Put original into the hash table */
778 *slot = &t->syms[out];
782 assert (conflicts->nsyms <= outlen);
783 assert (conflicts->nsyms + out == t->nsyms);
786 htab_delete (symtab);
789 /* Process one section of an object file. */
792 process_symtab (void *data, const char *name, off_t offset, off_t length)
794 struct plugin_objfile *obj = (struct plugin_objfile *)data;
798 if (strncmp (name, LTO_SECTION_PREFIX, LTO_SECTION_PREFIX_LEN) != 0)
801 s = strrchr (name, '.');
803 sscanf (s, ".%x", &obj->out->id);
804 secdata = xmalloc (length);
805 offset += obj->file->offset;
806 if (offset != lseek (obj->file->fd, offset, SEEK_SET)
807 || length != read (obj->file->fd, secdata, length))
810 message (LDPL_FATAL, "%s: corrupt object file", obj->file->name);
811 /* Force claim_file_handler to abandon this file. */
817 translate (secdata, secdata + length, obj->out);
823 /* Callback used by gold to check if the plugin will claim FILE. Writes
824 the result in CLAIMED. */
826 static enum ld_plugin_status
827 claim_file_handler (const struct ld_plugin_input_file *file, int *claimed)
829 enum ld_plugin_status status;
830 struct plugin_objfile obj;
831 struct plugin_file_info lto_file;
835 memset (<o_file, 0, sizeof (struct plugin_file_info));
837 if (file->offset != 0)
840 /* We pass the offset of the actual file, not the archive header.
841 Can't use PRIx64, because that's C99, so we have to print the
842 64-bit hex int as two 32-bit ones. */
844 lo = file->offset & 0xffffffff;
845 hi = ((int64_t)file->offset >> 32) & 0xffffffff;
846 int t = hi ? asprintf (&objname, "%s@0x%x%08x", file->name, lo, hi)
847 : asprintf (&objname, "%s@0x%x", file->name, lo);
848 check (t >= 0, LDPL_FATAL, "asprintf failed");
849 lto_file.name = objname;
853 lto_file.name = xstrdup (file->name);
855 lto_file.handle = file->handle;
860 obj.out = <o_file.symtab;
862 obj.objfile = simple_object_start_read (file->fd, file->offset, LTO_SEGMENT_NAME,
864 /* No file, but also no error code means unrecognized format; just skip it. */
865 if (!obj.objfile && !err)
869 errmsg = simple_object_find_sections (obj.objfile, process_symtab, &obj, &err);
871 if (!obj.objfile || errmsg)
874 message (LDPL_FATAL, "%s: %s: %s", file->name, errmsg,
877 message (LDPL_FATAL, "%s: %s", file->name, errmsg);
885 resolve_conflicts (<o_file.symtab, <o_file.conflicts);
887 status = add_symbols (file->handle, lto_file.symtab.nsyms,
888 lto_file.symtab.syms);
889 check (status == LDPS_OK, LDPL_FATAL, "could not add symbols");
894 xrealloc (claimed_files,
895 num_claimed_files * sizeof (struct plugin_file_info));
896 claimed_files[num_claimed_files - 1] = lto_file;
901 free (lto_file.name);
905 simple_object_release_read (obj.objfile);
910 /* Parse the plugin options. */
913 process_option (const char *option)
915 if (strcmp (option, "-debug") == 0)
917 else if (strcmp (option, "-nop") == 0)
919 else if (!strncmp (option, "-pass-through=", strlen("-pass-through=")))
921 num_pass_through_items++;
922 pass_through_items = xrealloc (pass_through_items,
923 num_pass_through_items * sizeof (char *));
924 pass_through_items[num_pass_through_items - 1] =
925 xstrdup (option + strlen ("-pass-through="));
927 else if (!strncmp (option, "-sym-style=", sizeof ("-sym-style=") - 1))
929 switch (option[sizeof ("-sym-style=") - 1])
932 sym_style = ss_win32;
935 sym_style = ss_uscore;
945 char *opt = xstrdup (option);
946 lto_wrapper_num_args += 1;
947 size = lto_wrapper_num_args * sizeof (char *);
948 lto_wrapper_argv = (char **) xrealloc (lto_wrapper_argv, size);
949 lto_wrapper_argv[lto_wrapper_num_args - 1] = opt;
950 if (strncmp (option, "-fresolution=", sizeof ("-fresolution=") - 1) == 0)
951 resolution_file = opt + sizeof ("-fresolution=") - 1;
955 /* Called by gold after loading the plugin. TV is the transfer vector. */
957 enum ld_plugin_status
958 onload (struct ld_plugin_tv *tv)
960 struct ld_plugin_tv *p;
961 enum ld_plugin_status status;
969 message = p->tv_u.tv_message;
971 case LDPT_REGISTER_CLAIM_FILE_HOOK:
972 register_claim_file = p->tv_u.tv_register_claim_file;
974 case LDPT_ADD_SYMBOLS:
975 add_symbols = p->tv_u.tv_add_symbols;
977 case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK:
978 register_all_symbols_read = p->tv_u.tv_register_all_symbols_read;
980 case LDPT_GET_SYMBOLS:
981 get_symbols = p->tv_u.tv_get_symbols;
983 case LDPT_REGISTER_CLEANUP_HOOK:
984 register_cleanup = p->tv_u.tv_register_cleanup;
986 case LDPT_ADD_INPUT_FILE:
987 add_input_file = p->tv_u.tv_add_input_file;
989 case LDPT_ADD_INPUT_LIBRARY:
990 add_input_library = p->tv_u.tv_add_input_library;
993 process_option (p->tv_u.tv_string);
1001 check (register_claim_file, LDPL_FATAL, "register_claim_file not found");
1002 check (add_symbols, LDPL_FATAL, "add_symbols not found");
1003 status = register_claim_file (claim_file_handler);
1004 check (status == LDPS_OK, LDPL_FATAL,
1005 "could not register the claim_file callback");
1007 if (register_cleanup)
1009 status = register_cleanup (cleanup_handler);
1010 check (status == LDPS_OK, LDPL_FATAL,
1011 "could not register the cleanup callback");
1014 if (register_all_symbols_read)
1016 check (get_symbols, LDPL_FATAL, "get_symbols not found");
1017 status = register_all_symbols_read (all_symbols_read_handler);
1018 check (status == LDPS_OK, LDPL_FATAL,
1019 "could not register the all_symbols_read callback");