Fix whitespace snafu in tc-riscv.c
[binutils-gdb.git] / ld / emultempl / ppc64elf.em
blob6f5c8a54d6139446ce593fb63650ad878dfd43b3
1 # This shell script emits a C file. -*- C -*-
2 # Copyright (C) 2002-2023 Free Software Foundation, Inc.
4 # This file is part of the GNU Binutils.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 # MA 02110-1301, USA.
22 # This file is sourced from elf.em, and defines extra powerpc64-elf
23 # specific routines.
25 fragment <<EOF
27 #include "ldctor.h"
28 #include "elf-bfd.h"
29 #include "elf64-ppc.h"
30 #include "ldlex.h"
31 #include "elf/ppc64.h"
33 static asection *ppc_add_stub_section (const char *, asection *);
34 static void ppc_layout_sections_again (void);
35 static void ppc_edit (void);
37 static struct ppc64_elf_params params = { NULL,
38                                           &ppc_add_stub_section,
39                                           &ppc_layout_sections_again,
40                                           &ppc_edit,
41                                           1, -1, -1, 0,
42                                           ${DEFAULT_PLT_STATIC_CHAIN-0}, -1, 5,
43                                           -1, -1, 0, 0, -1, -1, 0};
45 /* Fake input file for stubs.  */
46 static lang_input_statement_type *stub_file;
48 /* Whether we need to call ppc_layout_sections_again.  */
49 static int need_laying_out = 0;
51 /* Whether to add ".foo" entries for each "foo" in a version script.  */
52 static int dotsyms = 1;
54 /* Whether to run tls optimization.  */
55 static int no_tls_opt = 0;
57 /* Whether to run opd optimization.  */
58 static int no_opd_opt = 0;
60 /* Whether to convert inline PLT calls to direct.  */
61 static int no_inline_opt = 0;
63 /* Whether to run toc optimization.  */
64 static int no_toc_opt = 0;
66 /* Whether to sort input toc and got sections.  */
67 static int no_toc_sort = 0;
69 /* Input .toc sections will be placed in this output section.  */
70 static const char *toc_section_name = ".got";
71 static asection *toc_section = 0;
73 /* This is called before the input files are opened.  We create a new
74    fake input file to hold the stub sections.  */
76 static void
77 ppc_create_output_section_statements (void)
79   if (!(bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
80         && elf_object_id (link_info.output_bfd) == PPC64_ELF_DATA))
81     return;
83   link_info.wrap_char = '.';
85   stub_file = lang_add_input_file ("linker stubs",
86                                    lang_input_file_is_fake_enum,
87                                    NULL);
88   stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd);
89   if (stub_file->the_bfd == NULL
90       || !bfd_set_arch_mach (stub_file->the_bfd,
91                              bfd_get_arch (link_info.output_bfd),
92                              bfd_get_mach (link_info.output_bfd)))
93     {
94       einfo (_("%F%P: can not create BFD: %E\n"));
95       return;
96     }
98   stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
99   ldlang_add_file (stub_file);
100   params.stub_bfd = stub_file->the_bfd;
101   if (params.save_restore_funcs < 0)
102     params.save_restore_funcs = !bfd_link_relocatable (&link_info);
103   if (!ppc64_elf_init_stub_bfd (&link_info, &params))
104     einfo (_("%F%P: can not init BFD: %E\n"));
107 /* Called after opening files but before mapping sections.  */
109 static void
110 ppc_after_open (void)
112   if (stub_file != NULL && link_info.relro && params.object_in_toc)
113     {
114       /* We have a .toc section that might be written to at run time.
115          Don't put .toc into the .got output section.  */
116       lang_output_section_statement_type *got;
118       got = lang_output_section_find (".got");
119       if (got != NULL)
120         {
121           lang_statement_union_type *s;
122           for (s = got->children.head; s != NULL; s = s->header.next)
123             if (s->header.type == lang_wild_statement_enum
124                 && s->wild_statement.filename == NULL)
125               {
126                 struct wildcard_list **i = &s->wild_statement.section_list;
127                 while (*i != NULL)
128                   if (strcmp ((*i)->spec.name, ".toc") == 0)
129                     *i = (*i)->next;
130                   else
131                     i = &(*i)->next;
132               }
133           /* Instead, .toc input sections will be mapped to the
134              read/write .toc output section.  If user scripts don't
135              provide one then we'll lose toc sorting and multi-toc.  */
136           toc_section_name = ".toc";
137         }
138     }
139   gld${EMULATION_NAME}_after_open ();
142 /* Move the input section statement at *U which happens to be on LIST
143    to be just before *TO.  */
145 static void
146 move_input_section (lang_statement_list_type *list,
147                     lang_statement_union_type **u,
148                     lang_statement_union_type **to)
150   lang_statement_union_type *s = *u;
151   asection *i = s->input_section.section;
152   asection *p, *n;
154   /* Snip the input section from the statement list.  If it was the
155      last statement, fix the list tail pointer.  */
156   *u = s->header.next;
157   if (*u == NULL)
158     list->tail = u;
159   /* Add it back in the new position.  */
160   s->header.next = *to;
161   *to = s;
162   if (list->tail == to)
163     list->tail = &s->header.next;
165   /* Trim I off the bfd map_head/map_tail doubly linked lists.  */
166   n = i->map_head.s;
167   p = i->map_tail.s;
168   (p != NULL ? p : i->output_section)->map_head.s = n;
169   (n != NULL ? n : i->output_section)->map_tail.s = p;
171   /* Add I back on in its new position.  */
172   if (s->header.next->header.type == lang_input_section_enum)
173     {
174       n = s->header.next->input_section.section;
175       p = n->map_tail.s;
176     }
177   else
178     {
179       /* If the next statement is not an input section statement then
180          TO must point at the previous input section statement
181          header.next field.  */
182       lang_input_section_type *prev = (lang_input_section_type *)
183         ((char *) to - offsetof (lang_statement_union_type, header.next));
185       ASSERT (prev->header.type == lang_input_section_enum);
186       p = prev->section;
187       n = p->map_head.s;
188     }
189   i->map_head.s = n;
190   i->map_tail.s = p;
191   (p != NULL ? p : i->output_section)->map_head.s = i;
192   (n != NULL ? n : i->output_section)->map_tail.s = i;
195 /* Sort input section statements in the linker script tree rooted at
196    LIST so that those whose owning bfd happens to have a section
197    called .init or .fini are placed first.  Place any TOC sections
198    referenced by small TOC relocs next, with TOC sections referenced
199    only by bigtoc relocs last.  */
201 static void
202 sort_toc_sections (lang_statement_list_type *list,
203                    lang_statement_union_type **ini,
204                    lang_statement_union_type **small)
206   lang_statement_union_type *s, **u;
207   asection *i;
209   u = &list->head;
210   while ((s = *u) != NULL)
211     {
212       switch (s->header.type)
213         {
214         case lang_wild_statement_enum:
215           sort_toc_sections (&s->wild_statement.children, ini, small);
216           break;
218         case lang_group_statement_enum:
219           sort_toc_sections (&s->group_statement.children, ini, small);
220           break;
222         case lang_input_section_enum:
223           i = s->input_section.section;
224           /* Leave the stub_file .got where it is.  We put the .got
225              header there.  */
226           if (i->owner == stub_file->the_bfd)
227             break;
228           if (bfd_get_section_by_name (i->owner, ".init") != NULL
229               || bfd_get_section_by_name (i->owner, ".fini") != NULL)
230             {
231               if (ini != NULL && *ini != s)
232                 {
233                   move_input_section (list, u, ini);
234                   if (small == ini)
235                     small = &s->header.next;
236                   ini = &s->header.next;
237                   continue;
238                 }
239               if (small == ini)
240                 small = &s->header.next;
241               ini = &s->header.next;
242               break;
243             }
244           else if (ini == NULL)
245             ini = u;
247           if (ppc64_elf_has_small_toc_reloc (i))
248             {
249               if (small != NULL && *small != s)
250                 {
251                   move_input_section (list, u, small);
252                   small = &s->header.next;
253                   continue;
254                 }
255               small = &s->header.next;
256             }
257           else if (small == NULL)
258             small = u;
259           break;
261         default:
262           break;
263         }
264       u = &s->header.next;
265     }
268 static void
269 prelim_size_sections (void)
271   if (expld.phase != lang_mark_phase_enum)
272     {
273       expld.phase = lang_mark_phase_enum;
274       expld.dataseg.phase = exp_seg_none;
275       one_lang_size_sections_pass (NULL, false);
276       /* We must not cache anything from the preliminary sizing.  */
277       lang_reset_memory_regions ();
278     }
281 static void
282 ppc_before_allocation (void)
284   if (stub_file != NULL)
285     {
286       if (!no_opd_opt
287           && !ppc64_elf_edit_opd (&link_info))
288         einfo (_("%X%P: can not edit %s: %E\n"), "opd");
290       if (!no_inline_opt
291           && !bfd_link_relocatable (&link_info))
292         {
293           prelim_size_sections ();
295           if (!ppc64_elf_inline_plt (&link_info))
296             einfo (_("%X%P: inline PLT: %E\n"));
297         }
299       if (!ppc64_elf_tls_setup (&link_info))
300         einfo (_("%X%P: TLS problem %E\n"));
301     }
303   gld${EMULATION_NAME}_before_allocation ();
306 static void
307 ppc_edit (void)
309   if (stub_file != NULL)
310     {
311       if (elf_hash_table (&link_info)->tls_sec != NULL
312           && !no_tls_opt)
313         {
314           /* Size the sections.  This is premature, but we want to know the
315              TLS segment layout so that certain optimizations can be done.  */
316           prelim_size_sections ();
318           if (!ppc64_elf_tls_optimize (&link_info))
319             einfo (_("%X%P: TLS problem %E\n"));
320         }
322       if (!no_toc_opt
323           && !bfd_link_relocatable (&link_info))
324         {
325           prelim_size_sections ();
327           if (!ppc64_elf_edit_toc (&link_info))
328             einfo (_("%X%P: can not edit %s: %E\n"), "toc");
329         }
331       if (!no_toc_sort)
332         {
333           lang_output_section_statement_type *toc_os;
335           toc_os = lang_output_section_find (toc_section_name);
336           if (toc_os != NULL)
337             sort_toc_sections (&toc_os->children, NULL, NULL);
338         }
339     }
342 struct hook_stub_info
344   lang_statement_list_type add;
345   asection *input_section;
348 /* Traverse the linker tree to find the spot where the stub goes.  */
350 static bool
351 hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp)
353   lang_statement_union_type *l;
354   bool ret;
356   for (; (l = *lp) != NULL; lp = &l->header.next)
357     {
358       switch (l->header.type)
359         {
360         case lang_constructors_statement_enum:
361           ret = hook_in_stub (info, &constructor_list.head);
362           if (ret)
363             return ret;
364           break;
366         case lang_output_section_statement_enum:
367           ret = hook_in_stub (info,
368                               &l->output_section_statement.children.head);
369           if (ret)
370             return ret;
371           break;
373         case lang_wild_statement_enum:
374           ret = hook_in_stub (info, &l->wild_statement.children.head);
375           if (ret)
376             return ret;
377           break;
379         case lang_group_statement_enum:
380           ret = hook_in_stub (info, &l->group_statement.children.head);
381           if (ret)
382             return ret;
383           break;
385         case lang_input_section_enum:
386           if (l->input_section.section == info->input_section)
387             {
388               /* We've found our section.  Insert the stub immediately
389                  before its associated input section.  */
390               *lp = info->add.head;
391               *(info->add.tail) = l;
392               return true;
393             }
394           break;
396         case lang_data_statement_enum:
397         case lang_reloc_statement_enum:
398         case lang_object_symbols_statement_enum:
399         case lang_output_statement_enum:
400         case lang_target_statement_enum:
401         case lang_input_statement_enum:
402         case lang_assignment_statement_enum:
403         case lang_padding_statement_enum:
404         case lang_address_statement_enum:
405         case lang_fill_statement_enum:
406           break;
408         default:
409           FAIL ();
410           break;
411         }
412     }
413   return false;
417 /* Call-back for ppc64_elf_size_stubs.  */
419 /* Create a new stub section, and arrange for it to be linked
420    immediately before INPUT_SECTION.  */
422 static asection *
423 ppc_add_stub_section (const char *stub_sec_name, asection *input_section)
425   asection *stub_sec;
426   flagword flags;
427   asection *output_section;
428   lang_output_section_statement_type *os;
429   struct hook_stub_info info;
431   flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
432            | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_KEEP);
433   stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd,
434                                                  stub_sec_name, flags);
435   if (stub_sec == NULL
436       || !bfd_set_section_alignment (stub_sec, (params.plt_stub_align > 5
437                                                 ? params.plt_stub_align
438                                                 : params.plt_stub_align < -5
439                                                 ? -params.plt_stub_align
440                                                 : 5)))
441     goto err_ret;
443   output_section = input_section->output_section;
444   os = lang_output_section_get (output_section);
446   info.input_section = input_section;
447   lang_list_init (&info.add);
448   lang_add_section (&info.add, stub_sec, NULL, NULL, os);
450   if (info.add.head == NULL)
451     goto err_ret;
453   if (hook_in_stub (&info, &os->children.head))
454     return stub_sec;
456  err_ret:
457   einfo (_("%X%P: can not make stub section: %E\n"));
458   return NULL;
462 /* Another call-back for ppc64_elf_size_stubs.  */
464 static void
465 ppc_layout_sections_again (void)
467   /* If we have changed sizes of the stub sections, then we need
468      to recalculate all the section offsets.  This may mean we need to
469      add even more stubs.  */
470   ldelf_map_segments (true);
472   if (!bfd_link_relocatable (&link_info))
473     ppc64_elf_set_toc (&link_info, link_info.output_bfd);
475   need_laying_out = -1;
479 static void
480 build_toc_list (lang_statement_union_type *statement)
482   if (statement->header.type == lang_input_section_enum)
483     {
484       asection *i = statement->input_section.section;
486       if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
487           && (i->flags & SEC_EXCLUDE) == 0
488           && i->output_section == toc_section)
489         {
490           if (!ppc64_elf_next_toc_section (&link_info, i))
491             einfo (_("%X%P: linker script separates .got and .toc\n"));
492         }
493     }
497 static void
498 build_section_lists (lang_statement_union_type *statement)
500   if (statement->header.type == lang_input_section_enum)
501     {
502       asection *i = statement->input_section.section;
504       if (!bfd_input_just_syms (i->owner)
505           && (i->flags & SEC_EXCLUDE) == 0
506           && i->output_section != NULL
507           && i->output_section->owner == link_info.output_bfd)
508         {
509           if (!ppc64_elf_next_input_section (&link_info, i))
510             einfo (_("%X%P: can not size stub section: %E\n"));
511         }
512     }
516 /* Call the back-end function to set TOC base after we have placed all
517    the sections.  */
518 static void
519 gld${EMULATION_NAME}_after_allocation (void)
521   int ret;
523   /* If generating a relocatable output file, then we don't have any
524      stubs.  */
525   if (stub_file != NULL && !bfd_link_relocatable (&link_info))
526     {
527       ret = ppc64_elf_setup_section_lists (&link_info);
528       if (ret < 0)
529         einfo (_("%X%P: can not size stub section: %E\n"));
530       else
531         {
532           ppc64_elf_start_multitoc_partition (&link_info);
534           if (!params.no_multi_toc)
535             {
536               toc_section = bfd_get_section_by_name (link_info.output_bfd,
537                                                      toc_section_name);
538               if (toc_section != NULL)
539                 lang_for_each_statement (build_toc_list);
540             }
542           if (ppc64_elf_layout_multitoc (&link_info)
543               && !params.no_multi_toc
544               && toc_section != NULL)
545             lang_for_each_statement (build_toc_list);
547           ppc64_elf_finish_multitoc_partition (&link_info);
549           lang_for_each_statement (build_section_lists);
551           if (!ppc64_elf_check_init_fini (&link_info))
552             einfo (_("%P: .init/.fini fragments use differing TOC pointers\n"));
554           /* Call into the BFD backend to do the real work.  */
555           if (!ppc64_elf_size_stubs (&link_info))
556             einfo (_("%X%P: can not size stub section: %E\n"));
557         }
558     }
560   /* We can't parse and merge .eh_frame until the glink .eh_frame has
561      been generated.  Otherwise the glink .eh_frame CIE won't be
562      merged with other CIEs, and worse, the glink .eh_frame FDEs won't
563      be listed in .eh_frame_hdr.  */
564   ret = bfd_elf_discard_info (link_info.output_bfd, &link_info);
565   if (ret < 0)
566     {
567       einfo (_("%X%P: .eh_frame/.stab edit: %E\n"));
568       return;
569     }
570   else if (ret > 0)
571     need_laying_out = 1;
573   /* Call map_segments regardless of the state of need_laying_out.
574      need_laying_out set to -1 means we have just laid everything out,
575      but ppc64_elf_size_stubs strips .branch_lt and .eh_frame if
576      unneeded, after ppc_layout_sections_again.  Another call removes
577      these sections from the segment map.  Their presence is
578      innocuous except for confusing ELF_SECTION_IN_SEGMENT.  */
579   ldelf_map_segments (need_laying_out > 0);
581   if (need_laying_out != -1 && !bfd_link_relocatable (&link_info))
582     ppc64_elf_set_toc (&link_info, link_info.output_bfd);
586 /* Final emulation specific call.  */
588 static void
589 gld${EMULATION_NAME}_finish (void)
591   char *msg = NULL;
592   char *line, *endline;
594   /* e_entry on PowerPC64 points to the function descriptor for
595      _start.  If _start is missing, default to the first function
596      descriptor in the .opd section.  */
597   if (stub_file != NULL
598       && (elf_elfheader (link_info.output_bfd)->e_flags & EF_PPC64_ABI) == 1)
599     entry_section = ".opd";
601   if (params.emit_stub_syms < 0)
602     params.emit_stub_syms = 1;
603   if (stub_file != NULL
604       && !bfd_link_relocatable (&link_info)
605       && !ppc64_elf_build_stubs (&link_info, config.stats ? &msg : NULL))
606     einfo (_("%X%P: can not build stubs: %E\n"));
608   fflush (stdout);
609   for (line = msg; line != NULL; line = endline)
610     {
611       endline = strchr (line, '\n');
612       if (endline != NULL)
613         *endline++ = '\0';
614       fprintf (stderr, "%s: %s\n", program_name, line);
615     }
616   fflush (stderr);
617   free (msg);
619   finish_default ();
623 /* Add a pattern matching ".foo" for every "foo" in a version script.
625    The reason for doing this is that many shared library version
626    scripts export a selected set of functions or data symbols, forcing
627    others local.  eg.
629    . VERS_1 {
630    .       global:
631    .               this; that; some; thing;
632    .       local:
633    .               *;
634    .   };
636    To make the above work for PowerPC64, we need to export ".this",
637    ".that" and so on, otherwise only the function descriptor syms are
638    exported.  Lack of an exported function code sym may cause a
639    definition to be pulled in from a static library.  */
641 static struct bfd_elf_version_expr *
642 gld${EMULATION_NAME}_new_vers_pattern (struct bfd_elf_version_expr *entry)
644   struct bfd_elf_version_expr *dot_entry;
645   unsigned int len;
646   char *dot_pat;
648   if (!dotsyms
649       || entry->pattern[0] == '.'
650       || (!entry->literal && entry->pattern[0] == '*'))
651     return entry;
653   dot_entry = xmalloc (sizeof *dot_entry);
654   *dot_entry = *entry;
655   dot_entry->next = entry;
656   len = strlen (entry->pattern) + 2;
657   dot_pat = xmalloc (len);
658   dot_pat[0] = '.';
659   memcpy (dot_pat + 1, entry->pattern, len - 1);
660   dot_entry->pattern = dot_pat;
661   dot_entry->script = 1;
662   return dot_entry;
667 if grep -q 'ld_elf32_spu_emulation' ldemul-list.h; then
668   fragment <<EOF
669 /* Special handling for embedded SPU executables.  */
670 extern bool embedded_spu_file (lang_input_statement_type *, const char *);
672 static bool
673 ppc64_recognized_file (lang_input_statement_type *entry)
675   if (embedded_spu_file (entry, "-m64"))
676     return true;
678   return ldelf_load_symbols (entry);
681 LDEMUL_RECOGNIZED_FILE=ppc64_recognized_file
684 # Define some shell vars to insert bits of code into the standard elf
685 # parse_args and list_options functions.
687 PARSE_AND_LIST_PROLOGUE=${PARSE_AND_LIST_PROLOGUE}'
688 enum ppc64_opt
690   OPTION_STUBGROUP_SIZE = 321,
691   OPTION_PLT_STATIC_CHAIN,
692   OPTION_NO_PLT_STATIC_CHAIN,
693   OPTION_PLT_THREAD_SAFE,
694   OPTION_NO_PLT_THREAD_SAFE,
695   OPTION_PLT_ALIGN,
696   OPTION_NO_PLT_ALIGN,
697   OPTION_PLT_LOCALENTRY,
698   OPTION_NO_PLT_LOCALENTRY,
699   OPTION_POWER10_STUBS,
700   OPTION_NO_POWER10_STUBS,
701   OPTION_NO_PCREL_OPT,
702   OPTION_STUBSYMS,
703   OPTION_NO_STUBSYMS,
704   OPTION_SAVRES,
705   OPTION_NO_SAVRES,
706   OPTION_DOTSYMS,
707   OPTION_NO_DOTSYMS,
708   OPTION_NO_TLS_OPT,
709   OPTION_TLS_GET_ADDR_OPT,
710   OPTION_NO_TLS_GET_ADDR_OPT,
711   OPTION_TLS_GET_ADDR_REGSAVE,
712   OPTION_NO_TLS_GET_ADDR_REGSAVE,
713   OPTION_NO_OPD_OPT,
714   OPTION_NO_INLINE_OPT,
715   OPTION_NO_TOC_OPT,
716   OPTION_NO_MULTI_TOC,
717   OPTION_NO_TOC_SORT,
718   OPTION_NON_OVERLAPPING_OPD
722 PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
723   { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
724   { "plt-static-chain", no_argument, NULL, OPTION_PLT_STATIC_CHAIN },
725   { "no-plt-static-chain", no_argument, NULL, OPTION_NO_PLT_STATIC_CHAIN },
726   { "plt-thread-safe", no_argument, NULL, OPTION_PLT_THREAD_SAFE },
727   { "no-plt-thread-safe", no_argument, NULL, OPTION_NO_PLT_THREAD_SAFE },
728   { "plt-align", optional_argument, NULL, OPTION_PLT_ALIGN },
729   { "no-plt-align", no_argument, NULL, OPTION_NO_PLT_ALIGN },
730   { "plt-localentry", optional_argument, NULL, OPTION_PLT_LOCALENTRY },
731   { "no-plt-localentry", no_argument, NULL, OPTION_NO_PLT_LOCALENTRY },
732   { "power10-stubs", optional_argument, NULL, OPTION_POWER10_STUBS },
733   { "no-pcrel-optimize", no_argument, NULL, OPTION_NO_PCREL_OPT },
734   { "no-power10-stubs", no_argument, NULL, OPTION_NO_POWER10_STUBS },
735   { "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
736   { "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
737   { "dotsyms", no_argument, NULL, OPTION_DOTSYMS },
738   { "no-dotsyms", no_argument, NULL, OPTION_NO_DOTSYMS },
739   { "save-restore-funcs", no_argument, NULL, OPTION_SAVRES },
740   { "no-save-restore-funcs", no_argument, NULL, OPTION_NO_SAVRES },
741   { "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
742   { "tls-get-addr-optimize", no_argument, NULL, OPTION_TLS_GET_ADDR_OPT },
743   { "no-tls-get-addr-optimize", no_argument, NULL, OPTION_NO_TLS_GET_ADDR_OPT },
744   { "tls-get-addr-regsave", no_argument, NULL, OPTION_TLS_GET_ADDR_REGSAVE },
745   { "no-tls-get-addr-regsave", no_argument, NULL, OPTION_NO_TLS_GET_ADDR_REGSAVE},
746   { "no-opd-optimize", no_argument, NULL, OPTION_NO_OPD_OPT },
747   { "no-inline-optimize", no_argument, NULL, OPTION_NO_INLINE_OPT },
748   { "no-toc-optimize", no_argument, NULL, OPTION_NO_TOC_OPT },
749   { "no-multi-toc", no_argument, NULL, OPTION_NO_MULTI_TOC },
750   { "no-toc-sort", no_argument, NULL, OPTION_NO_TOC_SORT },
751   { "non-overlapping-opd", no_argument, NULL, OPTION_NON_OVERLAPPING_OPD },
754 PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'
755   fprintf (file, _("\
756   --stub-group-size=N         Maximum size of a group of input sections that\n\
757                                 can be handled by one stub section.  A negative\n\
758                                 value locates all stubs before their branches\n\
759                                 (with a group size of -N), while a positive\n\
760                                 value allows two groups of input sections, one\n\
761                                 before, and one after each stub section.\n\
762                                 Values of +/-1 indicate the linker should\n\
763                                 choose suitable defaults.\n"
764                    ));
765   fprintf (file, _("\
766   --plt-static-chain          PLT call stubs should load r11'${DEFAULT_PLT_STATIC_CHAIN- (default)}'\n"
767                    ));
768   fprintf (file, _("\
769   --no-plt-static-chain       PLT call stubs should not load r11'${DEFAULT_PLT_STATIC_CHAIN+ (default)}'\n"
770                    ));
771   fprintf (file, _("\
772   --plt-thread-safe           PLT call stubs with load-load barrier\n"
773                    ));
774   fprintf (file, _("\
775   --no-plt-thread-safe        PLT call stubs without barrier\n"
776                    ));
777   fprintf (file, _("\
778   --plt-align [=<align>]      Align PLT call stubs to fit cache lines\n"
779                    ));
780   fprintf (file, _("\
781   --no-plt-align              Dont'\''t align individual PLT call stubs\n"
782                    ));
783   fprintf (file, _("\
784   --plt-localentry            Optimize calls to ELFv2 localentry:0 functions\n"
785                    ));
786   fprintf (file, _("\
787   --no-plt-localentry         Don'\''t optimize ELFv2 calls\n"
788                    ));
789   fprintf (file, _("\
790   --power10-stubs [=auto]     Use Power10 PLT call stubs (default auto)\n"
791                    ));
792   fprintf (file, _("\
793   --no-pcrel-optimize         Don'\''t perform R_PPC64_PCREL_OPT optimization\n"
794                    ));
795   fprintf (file, _("\
796   --no-power10-stubs          Don'\''t use Power10 PLT call stubs\n"
797                    ));
798   fprintf (file, _("\
799   --emit-stub-syms            Label linker stubs with a symbol\n"
800                    ));
801   fprintf (file, _("\
802   --no-emit-stub-syms         Don'\''t label linker stubs with a symbol\n"
803                    ));
804   fprintf (file, _("\
805   --dotsyms                   For every version pattern \"foo\" in a version\n\
806                                 script, add \".foo\" so that function code\n\
807                                 symbols are treated the same as function\n\
808                                 descriptor symbols.  Defaults to on.\n"
809                    ));
810   fprintf (file, _("\
811   --no-dotsyms                Don'\''t do anything special in version scripts\n"
812                    ));
813   fprintf (file, _("\
814   --save-restore-funcs        Provide register save and restore routines used\n\
815                                 by gcc -Os code.  Defaults to on for normal\n\
816                                 final link, off for ld -r.\n"
817                    ));
818   fprintf (file, _("\
819   --no-save-restore-funcs     Don'\''t provide these routines\n"
820                    ));
821   fprintf (file, _("\
822   --no-tls-optimize           Don'\''t try to optimize TLS accesses\n"
823                    ));
824   fprintf (file, _("\
825   --tls-get-addr-optimize     Force use of special __tls_get_addr call\n"
826                    ));
827   fprintf (file, _("\
828   --no-tls-get-addr-optimize  Don'\''t use a special __tls_get_addr call\n"
829                    ));
830   fprintf (file, _("\
831   --tls-get-addr-regsave      Force register save __tls_get_addr stub\n"
832                    ));
833   fprintf (file, _("\
834   --no-tls-get-addr-regsave   Don'\''t use register save __tls_get_addr stub\n"
835                    ));
836   fprintf (file, _("\
837   --no-opd-optimize           Don'\''t optimize the OPD section\n"
838                    ));
839   fprintf (file, _("\
840   --no-inline-optimize        Don'\''t convert inline PLT to direct calls\n"
841                    ));
842   fprintf (file, _("\
843   --no-toc-optimize           Don'\''t optimize the TOC section\n"
844                    ));
845   fprintf (file, _("\
846   --no-multi-toc              Disallow automatic multiple toc sections\n"
847                    ));
848   fprintf (file, _("\
849   --no-toc-sort               Don'\''t sort TOC and GOT sections\n"
850                    ));
851   fprintf (file, _("\
852   --non-overlapping-opd       Canonicalize .opd, so that there are no\n\
853                                 overlapping .opd entries\n"
854                    ));
857 PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
858     case OPTION_STUBGROUP_SIZE:
859       {
860         const char *end;
861         params.group_size = bfd_scan_vma (optarg, &end, 0);
862         if (*end)
863           einfo (_("%F%P: invalid number `%s'\''\n"), optarg);
864       }
865       break;
867     case OPTION_PLT_STATIC_CHAIN:
868       params.plt_static_chain = 1;
869       break;
871     case OPTION_NO_PLT_STATIC_CHAIN:
872       params.plt_static_chain = 0;
873       break;
875     case OPTION_PLT_THREAD_SAFE:
876       params.plt_thread_safe = 1;
877       break;
879     case OPTION_NO_PLT_THREAD_SAFE:
880       params.plt_thread_safe = 0;
881       break;
883     case OPTION_PLT_ALIGN:
884       if (optarg != NULL)
885         {
886           char *end;
887           long val = strtol (optarg, &end, 0);
888           if (*end || (unsigned long) val + 8 > 16)
889             einfo (_("%F%P: invalid --plt-align `%s'\''\n"), optarg);
890           params.plt_stub_align = val;
891         }
892       else
893         params.plt_stub_align = 5;
894       break;
896     case OPTION_NO_PLT_ALIGN:
897       params.plt_stub_align = 0;
898       break;
900     case OPTION_PLT_LOCALENTRY:
901       params.plt_localentry0 = 1;
902       break;
904     case OPTION_NO_PLT_LOCALENTRY:
905       params.plt_localentry0 = 0;
906       break;
908     case OPTION_POWER10_STUBS:
909       if (optarg != NULL)
910         {
911           if (strcasecmp (optarg, "auto") == 0)
912             params.power10_stubs = -1;
913           else if (strcasecmp (optarg, "yes") == 0)
914             params.power10_stubs = 1;
915           else if (strcasecmp (optarg, "no") == 0)
916             params.power10_stubs = 0;
917           else
918             einfo (_("%F%P: invalid --power10-stubs argument `%s'\''\n"),
919                    optarg);
920         }
921       else
922         params.power10_stubs = 1;
923       break;
925     case OPTION_NO_POWER10_STUBS:
926       params.power10_stubs = 0;
927       break;
929     case OPTION_NO_PCREL_OPT:
930       params.no_pcrel_opt = 1;
931       break;
933     case OPTION_STUBSYMS:
934       params.emit_stub_syms = 1;
935       break;
937     case OPTION_NO_STUBSYMS:
938       params.emit_stub_syms = 0;
939       break;
941     case OPTION_DOTSYMS:
942       dotsyms = 1;
943       break;
945     case OPTION_NO_DOTSYMS:
946       dotsyms = 0;
947       break;
949     case OPTION_SAVRES:
950       params.save_restore_funcs = 1;
951       break;
953     case OPTION_NO_SAVRES:
954       params.save_restore_funcs = 0;
955       break;
957     case OPTION_NO_TLS_OPT:
958       no_tls_opt = 1;
959       break;
961     case OPTION_TLS_GET_ADDR_OPT:
962       params.tls_get_addr_opt = 1;
963       break;
965     case OPTION_NO_TLS_GET_ADDR_OPT:
966       params.tls_get_addr_opt = 0;
967       break;
969     case OPTION_TLS_GET_ADDR_REGSAVE:
970       params.no_tls_get_addr_regsave = 0;
971       break;
973     case OPTION_NO_TLS_GET_ADDR_REGSAVE:
974       params.no_tls_get_addr_regsave = 1;
975       break;
977     case OPTION_NO_OPD_OPT:
978       no_opd_opt = 1;
979       break;
981     case OPTION_NO_INLINE_OPT:
982       no_inline_opt = 1;
983       break;
985     case OPTION_NO_TOC_OPT:
986       no_toc_opt = 1;
987       break;
989     case OPTION_NO_MULTI_TOC:
990       params.no_multi_toc = 1;
991       break;
993     case OPTION_NO_TOC_SORT:
994       no_toc_sort = 1;
995       break;
997     case OPTION_NON_OVERLAPPING_OPD:
998       params.non_overlapping_opd = 1;
999       break;
1001     case OPTION_TRADITIONAL_FORMAT:
1002       no_tls_opt = 1;
1003       params.tls_get_addr_opt = 0;
1004       no_opd_opt = 1;
1005       no_toc_opt = 1;
1006       params.no_multi_toc = 1;
1007       no_toc_sort = 1;
1008       params.plt_static_chain = 1;
1009       params.no_pcrel_opt = 1;
1010       return false;
1013 # Put these extra ppc64elf routines in ld_${EMULATION_NAME}_emulation
1015 LDEMUL_NEW_VERS_PATTERN=gld${EMULATION_NAME}_new_vers_pattern
1016 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_create_output_section_statements
1017 LDEMUL_AFTER_OPEN=ppc_after_open
1018 LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
1019 LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
1020 LDEMUL_FINISH=gld${EMULATION_NAME}_finish