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. */
50 #include <sys/types.h>
51 #ifdef HAVE_SYS_WAIT_H
55 #define WIFEXITED(S) (((S) & 0xff) == 0)
58 #define WEXITSTATUS(S) (((S) & 0xff00) >> 8)
60 #include <libiberty.h>
62 #include "../gcc/lto/common.h"
63 #include "simple-object.h"
64 #include "plugin-api.h"
66 /* We need to use I64 instead of ll width-specifier on native Windows.
67 The reason for this is that older MS-runtimes don't support the ll. */
74 /* Handle opening elf files on hosts, such as Windows, that may use
75 text file handling that will break binary access. */
80 /* Segment name for LTO sections. This is only used for Mach-O.
81 FIXME: This needs to be kept in sync with darwin.c. */
83 #define LTO_SEGMENT_NAME "__GNU_LTO"
85 /* LTO magic section name. */
87 #define LTO_SECTION_PREFIX ".gnu.lto_.symtab"
88 #define LTO_SECTION_PREFIX_LEN (sizeof (LTO_SECTION_PREFIX) - 1)
89 #define OFFLOAD_SECTION ".gnu.offload_lto_.opts"
90 #define OFFLOAD_SECTION_LEN (sizeof (OFFLOAD_SECTION) - 1)
92 /* The part of the symbol table the plugin has to keep track of. Note that we
93 must keep SYMS until all_symbols_read is called to give the linker time to
94 copy the symbol information.
95 The id must be 64bit to minimze collisions. */
100 unsigned long long id
;
101 unsigned next_conflict
;
108 struct ld_plugin_symbol
*syms
;
109 unsigned long long id
;
112 /* Encapsulates object file data during symbol scan. */
113 struct plugin_objfile
117 simple_object_read
*objfile
;
118 struct plugin_symtab
*out
;
119 const struct ld_plugin_input_file
*file
;
122 /* All that we have to remember about a file. */
124 struct plugin_file_info
128 struct plugin_symtab symtab
;
129 struct plugin_symtab conflicts
;
132 /* Until ASM_OUTPUT_LABELREF can be hookized and decoupled from
133 stdio file streams, we do simple label translation here. */
137 ss_none
, /* No underscore prefix. */
138 ss_win32
, /* Underscore prefix any symbol not beginning with '@'. */
139 ss_uscore
, /* Underscore prefix all symbols. */
142 static char *arguments_file_name
;
143 static ld_plugin_register_claim_file register_claim_file
;
144 static ld_plugin_register_all_symbols_read register_all_symbols_read
;
145 static ld_plugin_get_symbols get_symbols
, get_symbols_v2
;
146 static ld_plugin_register_cleanup register_cleanup
;
147 static ld_plugin_add_input_file add_input_file
;
148 static ld_plugin_add_input_library add_input_library
;
149 static ld_plugin_message message
;
150 static ld_plugin_add_symbols add_symbols
;
152 static struct plugin_file_info
*claimed_files
= NULL
;
153 static unsigned int num_claimed_files
= 0;
155 static struct plugin_file_info
*offload_files
= NULL
;
156 static unsigned int num_offload_files
= 0;
158 static char **output_files
= NULL
;
159 static unsigned int num_output_files
= 0;
161 static char **lto_wrapper_argv
;
162 static int lto_wrapper_num_args
;
164 static char **pass_through_items
= NULL
;
165 static unsigned int num_pass_through_items
;
169 static char *resolution_file
= NULL
;
171 /* The version of gold being used, or -1 if not gold. The number is
172 MAJOR * 100 + MINOR. */
173 static int gold_version
= -1;
175 /* Not used by default, but can be overridden at runtime
176 by using -plugin-opt=-sym-style={none,win32,underscore|uscore}
177 (in fact, only first letter of style arg is checked.) */
178 static enum symbol_style sym_style
= ss_none
;
181 check_1 (int gate
, enum ld_plugin_level level
, const char *text
)
187 message (level
, text
);
190 /* If there is no nicer way to inform the user, fallback to stderr. */
191 fprintf (stderr
, "%s\n", text
);
192 if (level
== LDPL_FATAL
)
197 /* This little wrapper allows check to be called with a non-integer
198 first argument, such as a pointer that must be non-NULL. We can't
199 use c99 bool type to coerce it into range, so we explicitly test. */
200 #define check(GATE, LEVEL, TEXT) check_1 (((GATE) != 0), (LEVEL), (TEXT))
202 /* Parse an entry of the IL symbol table. The data to be parsed is pointed
203 by P and the result is written in ENTRY. The slot number is stored in SLOT.
204 Returns the address of the next entry. */
207 parse_table_entry (char *p
, struct ld_plugin_symbol
*entry
,
211 enum ld_plugin_symbol_kind translate_kind
[] =
220 enum ld_plugin_symbol_visibility translate_visibility
[] =
233 /* cf. Duff's device. */
235 entry
->name
= xstrdup (p
);
240 entry
->name
= concat ("_", p
, NULL
);
243 check (0, LDPL_FATAL
, "invalid symbol style requested");
250 entry
->version
= NULL
;
252 entry
->comdat_key
= p
;
257 if (strlen (entry
->comdat_key
) == 0)
258 entry
->comdat_key
= NULL
;
260 entry
->comdat_key
= xstrdup (entry
->comdat_key
);
263 check (t
<= 4, LDPL_FATAL
, "invalid symbol kind found");
264 entry
->def
= translate_kind
[t
];
268 check (t
<= 3, LDPL_FATAL
, "invalid symbol visibility found");
269 entry
->visibility
= translate_visibility
[t
];
272 memcpy (&entry
->size
, p
, sizeof (uint64_t));
275 memcpy (&aux
->slot
, p
, sizeof (uint32_t));
278 entry
->resolution
= LDPR_UNKNOWN
;
280 aux
->next_conflict
= -1;
285 /* Translate the IL symbol table located between DATA and END. Append the
286 slots and symbols to OUT. */
289 translate (char *data
, char *end
, struct plugin_symtab
*out
)
292 struct ld_plugin_symbol
*syms
= NULL
;
295 /* This overestimates the output buffer sizes, but at least
296 the algorithm is O(1) now. */
298 len
= (end
- data
)/8 + out
->nsyms
+ 1;
299 syms
= xrealloc (out
->syms
, len
* sizeof (struct ld_plugin_symbol
));
300 aux
= xrealloc (out
->aux
, len
* sizeof (struct sym_aux
));
302 for (n
= out
->nsyms
; data
< end
; n
++)
305 data
= parse_table_entry (data
, &syms
[n
], &aux
[n
]);
315 /* Free all memory that is no longer needed after writing the symbol
319 free_1 (struct plugin_file_info
*files
, unsigned num_files
)
322 for (i
= 0; i
< num_files
; i
++)
324 struct plugin_file_info
*info
= &files
[i
];
325 struct plugin_symtab
*symtab
= &info
->symtab
;
327 for (j
= 0; j
< symtab
->nsyms
; j
++)
329 struct ld_plugin_symbol
*s
= &symtab
->syms
[j
];
331 free (s
->comdat_key
);
338 /* Free all remaining memory. */
344 for (i
= 0; i
< num_claimed_files
; i
++)
346 struct plugin_file_info
*info
= &claimed_files
[i
];
347 struct plugin_symtab
*symtab
= &info
->symtab
;
352 for (i
= 0; i
< num_offload_files
; i
++)
354 struct plugin_file_info
*info
= &offload_files
[i
];
355 struct plugin_symtab
*symtab
= &info
->symtab
;
360 for (i
= 0; i
< num_output_files
; i
++)
361 free (output_files
[i
]);
364 free (claimed_files
);
365 claimed_files
= NULL
;
366 num_claimed_files
= 0;
368 free (offload_files
);
369 offload_files
= NULL
;
370 num_offload_files
= 0;
372 free (arguments_file_name
);
373 arguments_file_name
= NULL
;
376 /* Dump SYMTAB to resolution file F. */
379 dump_symtab (FILE *f
, struct plugin_symtab
*symtab
)
383 for (j
= 0; j
< symtab
->nsyms
; j
++)
385 uint32_t slot
= symtab
->aux
[j
].slot
;
386 unsigned int resolution
= symtab
->syms
[j
].resolution
;
388 assert (resolution
!= LDPR_UNKNOWN
);
390 fprintf (f
, "%u %" PRI_LL
"x %s %s\n",
391 (unsigned int) slot
, symtab
->aux
[j
].id
,
392 lto_resolution_str
[resolution
],
393 symtab
->syms
[j
].name
);
397 /* Finish the conflicts' resolution information after the linker resolved
398 the original symbols */
401 finish_conflict_resolution (struct plugin_symtab
*symtab
,
402 struct plugin_symtab
*conflicts
)
406 if (conflicts
->nsyms
== 0)
409 for (i
= 0; i
< symtab
->nsyms
; i
++)
411 int resolution
= LDPR_UNKNOWN
;
413 if (symtab
->aux
[i
].next_conflict
== -1)
416 switch (symtab
->syms
[i
].def
)
419 case LDPK_COMMON
: /* ??? */
420 resolution
= LDPR_RESOLVED_IR
;
423 resolution
= LDPR_PREEMPTED_IR
;
427 resolution
= symtab
->syms
[i
].resolution
;
433 assert (resolution
!= LDPR_UNKNOWN
);
435 for (j
= symtab
->aux
[i
].next_conflict
;
437 j
= conflicts
->aux
[j
].next_conflict
)
438 conflicts
->syms
[j
].resolution
= resolution
;
442 /* Free symbol table SYMTAB. */
445 free_symtab (struct plugin_symtab
*symtab
)
453 /* Writes the relocations to disk. */
456 write_resolution (void)
461 check (resolution_file
, LDPL_FATAL
, "resolution file not specified");
462 f
= fopen (resolution_file
, "w");
463 check (f
, LDPL_FATAL
, "could not open file");
465 fprintf (f
, "%d\n", num_claimed_files
);
467 for (i
= 0; i
< num_claimed_files
; i
++)
469 struct plugin_file_info
*info
= &claimed_files
[i
];
470 struct plugin_symtab
*symtab
= &info
->symtab
;
471 struct ld_plugin_symbol
*syms
= symtab
->syms
;
473 /* Version 2 of API supports IRONLY_EXP resolution that is
474 accepted by GCC-4.7 and newer. */
476 get_symbols_v2 (info
->handle
, symtab
->nsyms
, syms
);
478 get_symbols (info
->handle
, symtab
->nsyms
, syms
);
480 finish_conflict_resolution (symtab
, &info
->conflicts
);
482 fprintf (f
, "%s %d\n", info
->name
, symtab
->nsyms
+ info
->conflicts
.nsyms
);
483 dump_symtab (f
, symtab
);
484 if (info
->conflicts
.nsyms
)
486 dump_symtab (f
, &info
->conflicts
);
487 free_symtab (&info
->conflicts
);
493 /* Pass files generated by the lto-wrapper to the linker. FD is lto-wrapper's
497 add_output_files (FILE *f
)
501 const unsigned piece
= 32;
502 char *buf
, *s
= xmalloc (piece
);
507 if (!fgets (buf
, piece
, f
))
513 if (s
[len
- 1] != '\n')
515 s
= xrealloc (s
, len
+ piece
);
523 = xrealloc (output_files
, num_output_files
* sizeof (char *));
524 output_files
[num_output_files
- 1] = s
;
525 add_input_file (output_files
[num_output_files
- 1]);
529 /* Execute the lto-wrapper. ARGV[0] is the binary. The rest of ARGV is the
533 exec_lto_wrapper (char *argv
[])
539 FILE *wrapper_output
;
544 /* Write argv to a file to avoid a command line that is too long. */
545 arguments_file_name
= make_temp_file ("");
546 check (arguments_file_name
, LDPL_FATAL
,
547 "Failed to generate a temorary file name");
549 args
= fopen (arguments_file_name
, "w");
550 check (args
, LDPL_FATAL
, "could not open arguments file");
552 t
= writeargv (&argv
[1], args
);
553 check (t
== 0, LDPL_FATAL
, "could not write arguments");
555 check (t
== 0, LDPL_FATAL
, "could not close arguments file");
557 at_args
= concat ("@", arguments_file_name
, NULL
);
558 check (at_args
, LDPL_FATAL
, "could not allocate");
560 for (i
= 1; argv
[i
]; i
++)
563 if (a
[0] == '-' && a
[1] == 'v' && a
[2] == '\0')
565 for (i
= 0; argv
[i
]; i
++)
566 fprintf (stderr
, "%s ", argv
[i
]);
567 fprintf (stderr
, "\n");
572 new_argv
[0] = argv
[0];
573 new_argv
[1] = at_args
;
578 for (i
= 0; new_argv
[i
]; i
++)
579 fprintf (stderr
, "%s ", new_argv
[i
]);
580 fprintf (stderr
, "\n");
584 pex
= pex_init (PEX_USE_PIPES
, "lto-wrapper", NULL
);
585 check (pex
!= NULL
, LDPL_FATAL
, "could not pex_init lto-wrapper");
587 errmsg
= pex_run (pex
, 0, new_argv
[0], new_argv
, NULL
, NULL
, &t
);
588 check (errmsg
== NULL
, LDPL_FATAL
, "could not run lto-wrapper");
589 check (t
== 0, LDPL_FATAL
, "could not run lto-wrapper");
591 wrapper_output
= pex_read_output (pex
, 0);
592 check (wrapper_output
, LDPL_FATAL
, "could not read lto-wrapper output");
594 add_output_files (wrapper_output
);
596 t
= pex_get_status (pex
, 1, &status
);
597 check (t
== 1, LDPL_FATAL
, "could not get lto-wrapper exit status");
598 check (WIFEXITED (status
) && WEXITSTATUS (status
) == 0, LDPL_FATAL
,
599 "lto-wrapper failed");
606 /* Pass the original files back to the linker. */
609 use_original_files (void)
612 for (i
= 0; i
< num_claimed_files
; i
++)
614 struct plugin_file_info
*info
= &claimed_files
[i
];
615 add_input_file (info
->name
);
620 /* Called by the linker once all symbols have been read. */
622 static enum ld_plugin_status
623 all_symbols_read_handler (void)
626 unsigned num_lto_args
627 = num_claimed_files
+ num_offload_files
+ lto_wrapper_num_args
+ 1;
629 const char **lto_arg_ptr
;
630 if (num_claimed_files
+ num_offload_files
== 0)
635 use_original_files ();
639 lto_argv
= (char **) xcalloc (sizeof (char *), num_lto_args
);
640 lto_arg_ptr
= (const char **) lto_argv
;
641 assert (lto_wrapper_argv
);
645 free_1 (claimed_files
, num_claimed_files
);
646 free_1 (offload_files
, num_offload_files
);
648 for (i
= 0; i
< lto_wrapper_num_args
; i
++)
649 *lto_arg_ptr
++ = lto_wrapper_argv
[i
];
651 for (i
= 0; i
< num_claimed_files
; i
++)
653 struct plugin_file_info
*info
= &claimed_files
[i
];
655 *lto_arg_ptr
++ = info
->name
;
658 for (i
= 0; i
< num_offload_files
; i
++)
660 struct plugin_file_info
*info
= &offload_files
[i
];
662 *lto_arg_ptr
++ = info
->name
;
665 *lto_arg_ptr
++ = NULL
;
666 exec_lto_wrapper (lto_argv
);
670 /* --pass-through is not needed when using gold 1.11 or later. */
671 if (pass_through_items
&& gold_version
< 111)
674 for (i
= 0; i
< num_pass_through_items
; i
++)
676 if (strncmp (pass_through_items
[i
], "-l", 2) == 0)
677 add_input_library (pass_through_items
[i
] + 2);
679 add_input_file (pass_through_items
[i
]);
680 free (pass_through_items
[i
]);
681 pass_through_items
[i
] = NULL
;
683 free (pass_through_items
);
684 pass_through_items
= NULL
;
690 /* Remove temporary files at the end of the link. */
692 static enum ld_plugin_status
693 cleanup_handler (void)
701 if (arguments_file_name
)
703 t
= unlink (arguments_file_name
);
704 check (t
== 0, LDPL_FATAL
, "could not unlink arguments file");
707 for (i
= 0; i
< num_output_files
; i
++)
709 t
= unlink (output_files
[i
]);
710 check (t
== 0, LDPL_FATAL
, "could not unlink output file");
717 #define SWAP(type, a, b) \
718 do { type tmp_; tmp_ = (a); (a) = (b); (b) = tmp_; } while(0)
720 /* Compare two hash table entries */
722 static int eq_sym (const void *a
, const void *b
)
724 const struct ld_plugin_symbol
*as
= (const struct ld_plugin_symbol
*)a
;
725 const struct ld_plugin_symbol
*bs
= (const struct ld_plugin_symbol
*)b
;
727 return !strcmp (as
->name
, bs
->name
);
732 static hashval_t
hash_sym (const void *a
)
734 const struct ld_plugin_symbol
*as
= (const struct ld_plugin_symbol
*)a
;
736 return htab_hash_string (as
->name
);
739 /* Determine how strong a symbol is */
741 static int symbol_strength (struct ld_plugin_symbol
*s
)
755 /* In the ld -r case we can get dups in the LTO symbol tables, where
756 the same symbol can have different resolutions (e.g. undefined and defined).
758 We have to keep that in the LTO symbol tables, but the dups confuse
759 gold and then finally gcc by supplying incorrect resolutions.
761 Problem is that the main gold symbol table doesn't know about subids
762 and does not distingush the same symbols in different states.
764 So we drop duplicates from the linker visible symbol table
765 and keep them in a private table. Then later do own symbol
766 resolution for the duplicated based on the results for the
769 Then when writing out the resolution file readd the dropped symbols.
771 XXX how to handle common? */
774 resolve_conflicts (struct plugin_symtab
*t
, struct plugin_symtab
*conflicts
)
776 htab_t symtab
= htab_create (t
->nsyms
, hash_sym
, eq_sym
, NULL
);
782 conflicts
->syms
= xmalloc (sizeof (struct ld_plugin_symbol
) * outlen
);
783 conflicts
->aux
= xmalloc (sizeof (struct sym_aux
) * outlen
);
785 /* Move all duplicate symbols into the auxiliary conflicts table. */
787 for (i
= 0; i
< t
->nsyms
; i
++)
789 struct ld_plugin_symbol
*s
= &t
->syms
[i
];
790 struct sym_aux
*aux
= &t
->aux
[i
];
793 slot
= htab_find_slot (symtab
, s
, INSERT
);
797 struct ld_plugin_symbol
*orig
= (struct ld_plugin_symbol
*)*slot
;
798 struct sym_aux
*orig_aux
= &t
->aux
[orig
- t
->syms
];
800 /* Always let the linker resolve the strongest symbol */
801 if (symbol_strength (orig
) < symbol_strength (s
))
803 SWAP (struct ld_plugin_symbol
, *orig
, *s
);
804 SWAP (uint32_t, orig_aux
->slot
, aux
->slot
);
805 SWAP (unsigned long long, orig_aux
->id
, aux
->id
);
806 /* Don't swap conflict chain pointer */
809 /* Move current symbol into the conflicts table */
810 cnf
= conflicts
->nsyms
++;
811 conflicts
->syms
[cnf
] = *s
;
812 conflicts
->aux
[cnf
] = *aux
;
813 aux
= &conflicts
->aux
[cnf
];
815 /* Update conflicts chain of the original symbol */
816 aux
->next_conflict
= orig_aux
->next_conflict
;
817 orig_aux
->next_conflict
= cnf
;
822 /* Remove previous duplicates in the main table */
829 /* Put original into the hash table */
830 *slot
= &t
->syms
[out
];
834 assert (conflicts
->nsyms
<= outlen
);
835 assert (conflicts
->nsyms
+ out
== t
->nsyms
);
838 htab_delete (symtab
);
841 /* Process one section of an object file. */
844 process_symtab (void *data
, const char *name
, off_t offset
, off_t length
)
846 struct plugin_objfile
*obj
= (struct plugin_objfile
*)data
;
848 char *secdatastart
, *secdata
;
850 if (strncmp (name
, LTO_SECTION_PREFIX
, LTO_SECTION_PREFIX_LEN
) != 0)
853 s
= strrchr (name
, '.');
855 sscanf (s
, ".%" PRI_LL
"x", &obj
->out
->id
);
856 secdata
= secdatastart
= xmalloc (length
);
857 offset
+= obj
->file
->offset
;
858 if (offset
!= lseek (obj
->file
->fd
, offset
, SEEK_SET
))
863 ssize_t got
= read (obj
->file
->fd
, secdata
, length
);
871 else if (errno
!= EINTR
)
878 translate (secdatastart
, secdata
, obj
->out
);
885 message (LDPL_FATAL
, "%s: corrupt object file", obj
->file
->name
);
886 /* Force claim_file_handler to abandon this file. */
892 /* Find an offload section of an object file. */
895 process_offload_section (void *data
, const char *name
, off_t offset
, off_t len
)
897 if (!strncmp (name
, OFFLOAD_SECTION
, OFFLOAD_SECTION_LEN
))
899 struct plugin_objfile
*obj
= (struct plugin_objfile
*) data
;
907 /* Callback used by gold to check if the plugin will claim FILE. Writes
908 the result in CLAIMED. */
910 static enum ld_plugin_status
911 claim_file_handler (const struct ld_plugin_input_file
*file
, int *claimed
)
913 enum ld_plugin_status status
;
914 struct plugin_objfile obj
;
915 struct plugin_file_info lto_file
;
919 memset (<o_file
, 0, sizeof (struct plugin_file_info
));
921 if (file
->offset
!= 0)
924 /* We pass the offset of the actual file, not the archive header.
925 Can't use PRIx64, because that's C99, so we have to print the
926 64-bit hex int as two 32-bit ones. */
928 lo
= file
->offset
& 0xffffffff;
929 hi
= ((int64_t)file
->offset
>> 32) & 0xffffffff;
930 t
= hi
? asprintf (&objname
, "%s@0x%x%08x", file
->name
, lo
, hi
)
931 : asprintf (&objname
, "%s@0x%x", file
->name
, lo
);
932 check (t
>= 0, LDPL_FATAL
, "asprintf failed");
933 lto_file
.name
= objname
;
937 lto_file
.name
= xstrdup (file
->name
);
939 lto_file
.handle
= file
->handle
;
945 obj
.out
= <o_file
.symtab
;
947 obj
.objfile
= simple_object_start_read (file
->fd
, file
->offset
, LTO_SEGMENT_NAME
,
949 /* No file, but also no error code means unrecognized format; just skip it. */
950 if (!obj
.objfile
&& !err
)
954 errmsg
= simple_object_find_sections (obj
.objfile
, process_symtab
, &obj
, &err
);
956 if (!obj
.objfile
|| errmsg
)
959 message (LDPL_FATAL
, "%s: %s: %s", file
->name
, errmsg
,
962 message (LDPL_FATAL
, "%s: %s", file
->name
, errmsg
);
967 simple_object_find_sections (obj
.objfile
, process_offload_section
,
970 if (obj
.found
== 0 && obj
.offload
== 0)
974 resolve_conflicts (<o_file
.symtab
, <o_file
.conflicts
);
978 status
= add_symbols (file
->handle
, lto_file
.symtab
.nsyms
,
979 lto_file
.symtab
.syms
);
980 check (status
== LDPS_OK
, LDPL_FATAL
, "could not add symbols");
984 xrealloc (claimed_files
,
985 num_claimed_files
* sizeof (struct plugin_file_info
));
986 claimed_files
[num_claimed_files
- 1] = lto_file
;
989 if (obj
.found
== 0 && obj
.offload
== 1)
993 xrealloc (offload_files
,
994 num_offload_files
* sizeof (struct plugin_file_info
));
995 offload_files
[num_offload_files
- 1] = lto_file
;
1003 free (lto_file
.name
);
1007 simple_object_release_read (obj
.objfile
);
1012 /* Parse the plugin options. */
1015 process_option (const char *option
)
1017 if (strcmp (option
, "-debug") == 0)
1019 else if (strcmp (option
, "-nop") == 0)
1021 else if (!strncmp (option
, "-pass-through=", strlen("-pass-through=")))
1023 num_pass_through_items
++;
1024 pass_through_items
= xrealloc (pass_through_items
,
1025 num_pass_through_items
* sizeof (char *));
1026 pass_through_items
[num_pass_through_items
- 1] =
1027 xstrdup (option
+ strlen ("-pass-through="));
1029 else if (!strncmp (option
, "-sym-style=", sizeof ("-sym-style=") - 1))
1031 switch (option
[sizeof ("-sym-style=") - 1])
1034 sym_style
= ss_win32
;
1037 sym_style
= ss_uscore
;
1040 sym_style
= ss_none
;
1047 char *opt
= xstrdup (option
);
1048 lto_wrapper_num_args
+= 1;
1049 size
= lto_wrapper_num_args
* sizeof (char *);
1050 lto_wrapper_argv
= (char **) xrealloc (lto_wrapper_argv
, size
);
1051 lto_wrapper_argv
[lto_wrapper_num_args
- 1] = opt
;
1052 if (strncmp (option
, "-fresolution=", sizeof ("-fresolution=") - 1) == 0)
1053 resolution_file
= opt
+ sizeof ("-fresolution=") - 1;
1057 /* Called by gold after loading the plugin. TV is the transfer vector. */
1059 enum ld_plugin_status
1060 onload (struct ld_plugin_tv
*tv
)
1062 struct ld_plugin_tv
*p
;
1063 enum ld_plugin_status status
;
1071 message
= p
->tv_u
.tv_message
;
1073 case LDPT_REGISTER_CLAIM_FILE_HOOK
:
1074 register_claim_file
= p
->tv_u
.tv_register_claim_file
;
1076 case LDPT_ADD_SYMBOLS
:
1077 add_symbols
= p
->tv_u
.tv_add_symbols
;
1079 case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK
:
1080 register_all_symbols_read
= p
->tv_u
.tv_register_all_symbols_read
;
1082 case LDPT_GET_SYMBOLS_V2
:
1083 get_symbols_v2
= p
->tv_u
.tv_get_symbols
;
1085 case LDPT_GET_SYMBOLS
:
1086 get_symbols
= p
->tv_u
.tv_get_symbols
;
1088 case LDPT_REGISTER_CLEANUP_HOOK
:
1089 register_cleanup
= p
->tv_u
.tv_register_cleanup
;
1091 case LDPT_ADD_INPUT_FILE
:
1092 add_input_file
= p
->tv_u
.tv_add_input_file
;
1094 case LDPT_ADD_INPUT_LIBRARY
:
1095 add_input_library
= p
->tv_u
.tv_add_input_library
;
1098 process_option (p
->tv_u
.tv_string
);
1100 case LDPT_GOLD_VERSION
:
1101 gold_version
= p
->tv_u
.tv_val
;
1109 check (register_claim_file
, LDPL_FATAL
, "register_claim_file not found");
1110 check (add_symbols
, LDPL_FATAL
, "add_symbols not found");
1111 status
= register_claim_file (claim_file_handler
);
1112 check (status
== LDPS_OK
, LDPL_FATAL
,
1113 "could not register the claim_file callback");
1115 if (register_cleanup
)
1117 status
= register_cleanup (cleanup_handler
);
1118 check (status
== LDPS_OK
, LDPL_FATAL
,
1119 "could not register the cleanup callback");
1122 if (register_all_symbols_read
)
1124 check (get_symbols
, LDPL_FATAL
, "get_symbols not found");
1125 status
= register_all_symbols_read (all_symbols_read_handler
);
1126 check (status
== LDPS_OK
, LDPL_FATAL
,
1127 "could not register the all_symbols_read callback");
1130 /* Support -fno-use-linker-plugin by failing to load the plugin
1131 for the case where it is auto-loaded by BFD. */
1132 char *collect_gcc_options
= getenv ("COLLECT_GCC_OPTIONS");
1133 if (collect_gcc_options
1134 && strstr (collect_gcc_options
, "'-fno-use-linker-plugin'"))