]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - ld/emultempl/ppc32elf.em
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / ld / emultempl / ppc32elf.em
index 05a2894e2b93cac16376389f005bcc7579b90215..003bc9952aad4743f228b9885f04e23b70d96052 100644 (file)
@@ -1,5 +1,5 @@
 # This shell script emits a C file. -*- C -*-
-#   Copyright (C) 2003-2018 Free Software Foundation, Inc.
+#   Copyright (C) 2003-2021 Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
 #
@@ -19,7 +19,7 @@
 # MA 02110-1301, USA.
 #
 
-# This file is sourced from elf32.em, and defines extra powerpc32-elf
+# This file is sourced from elf.em, and defines extra powerpc32-elf
 # specific routines.
 #
 fragment <<EOF
@@ -35,6 +35,9 @@ fragment <<EOF
 /* Whether to run tls optimization.  */
 static int notlsopt = 0;
 
+/* Whether to convert inline PLT calls to direct.  */
+static int no_inline_opt = 0;
+
 /* Choose the correct place for .got.  */
 static int old_got = 0;
 
@@ -48,7 +51,7 @@ ppc_after_open_output (void)
     params.emit_stub_syms = (link_info.emitrelocations
                             || bfd_link_pic (&link_info));
   if (params.pagesize == 0)
-    params.pagesize = config.commonpagesize;
+    params.pagesize = link_info.commonpagesize;
   ppc_elf_link_params (&link_info, &params);
 }
 
@@ -76,7 +79,7 @@ ppc_after_check_relocs (void)
 
       num_got = 0;
       num_plt = 0;
-      for (os = &lang_output_section_statement.head->output_section_statement;
+      for (os = (void *) lang_os_list.head;
           os != NULL;
           os = os->next)
        {
@@ -115,11 +118,33 @@ ppc_after_check_relocs (void)
 EOF
 fi
 fragment <<EOF
+static void
+prelim_size_sections (void)
+{
+  if (expld.phase != lang_mark_phase_enum)
+    {
+      expld.phase = lang_mark_phase_enum;
+      expld.dataseg.phase = exp_seg_none;
+      one_lang_size_sections_pass (NULL, FALSE);
+      /* We must not cache anything from the preliminary sizing.  */
+      lang_reset_memory_regions ();
+    }
+}
+
 static void
 ppc_before_allocation (void)
 {
   if (is_ppc_elf (link_info.output_bfd))
     {
+      if (!no_inline_opt
+         && !bfd_link_relocatable (&link_info))
+       {
+         prelim_size_sections ();
+
+         if (!ppc_elf_inline_plt (&link_info))
+           einfo (_("%X%P: inline PLT: %E\n"));
+       }
+
       if (ppc_elf_tls_setup (link_info.output_bfd, &link_info)
          && !notlsopt)
        {
@@ -146,14 +171,13 @@ ppc_before_allocation (void)
       bfd_vma high = 0;
       asection *o;
 
-      /* Run lang_size_sections (if not already done).  */
-      if (expld.phase != lang_mark_phase_enum)
-       {
-         expld.phase = lang_mark_phase_enum;
-         expld.dataseg.phase = exp_seg_none;
-         one_lang_size_sections_pass (NULL, FALSE);
-         lang_reset_memory_regions ();
-       }
+      /* Run lang_size_sections even if already done, so as to pick
+        up gld${EMULATION_NAME}_before_allocation sizing.  This
+        matters when we have an executable bss plt which will
+        typically be laid out near the end of the image, ie. worst
+        case for branches at the start of .text.  */
+      expld.phase = lang_first_phase_enum;
+      prelim_size_sections ();
 
       for (o = link_info.output_bfd->sections; o != NULL; o = o->next)
        {
@@ -223,7 +247,6 @@ if grep -q 'ld_elf32_spu_emulation' ldemul-list.h; then
   fragment <<EOF
 /* Special handling for embedded SPU executables.  */
 extern bfd_boolean embedded_spu_file (lang_input_statement_type *, const char *);
-static bfd_boolean gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *);
 
 static bfd_boolean
 ppc_recognized_file (lang_input_statement_type *entry)
@@ -231,7 +254,7 @@ ppc_recognized_file (lang_input_statement_type *entry)
   if (embedded_spu_file (entry, "-m32"))
     return TRUE;
 
-  return gld${EMULATION_NAME}_load_symbols (entry);
+  return ldelf_load_symbols (entry);
 }
 
 EOF
@@ -250,6 +273,7 @@ enum ppc32_opt
   OPTION_OLD_PLT,
   OPTION_PLT_ALIGN,
   OPTION_NO_PLT_ALIGN,
+  OPTION_NO_INLINE_OPT,
   OPTION_OLD_GOT,
   OPTION_STUBSYMS,
   OPTION_NO_STUBSYMS,
@@ -271,6 +295,7 @@ if test -z "$VXWORKS_BASE_EM_FILE" ; then
   { "bss-plt", no_argument, NULL, OPTION_OLD_PLT },
   { "plt-align", optional_argument, NULL, OPTION_PLT_ALIGN },
   { "no-plt-align", no_argument, NULL, OPTION_NO_PLT_ALIGN },
+  { "no-inline-optimize", no_argument, NULL, OPTION_NO_INLINE_OPT },
   { "sdata-got", no_argument, NULL, OPTION_OLD_GOT },'
 fi
 PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
@@ -308,6 +333,9 @@ if test -z "$VXWORKS_BASE_EM_FILE" ; then
   --no-plt-align              Dont'\''t align individual PLT call stubs\n"
                   ));
   fprintf (file, _("\
+  --no-inline-optimize        Don'\''t convert inline PLT to direct calls\n"
+                  ));
+  fprintf (file, _("\
   --sdata-got                 Force GOT location just before .sdata\n"
                   ));'
 fi
@@ -369,6 +397,10 @@ PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
       params.plt_stub_align = 0;
       break;
 
+    case OPTION_NO_INLINE_OPT:
+      no_inline_opt = 1;
+      break;
+
     case OPTION_OLD_GOT:
       old_got = 1;
       break;