MIPS/LD: Convert ELF linker emulation option macros to an enum
[deliverable/binutils-gdb.git] / ld / emultempl / aarch64elf.em
index 4c03ffd4490e599c7eacf99a954cf21aa2c1f123..9923be3a6b685088cbd32377a13e1063206136ed 100644 (file)
@@ -1,5 +1,5 @@
 # This shell script emits a C file. -*- C -*-
-#   Copyright 2009-2012  Free Software Foundation, Inc.
+#   Copyright (C) 2009-2016 Free Software Foundation, Inc.
 #   Contributed by ARM Ltd.
 #
 # This file is part of the GNU Binutils.
@@ -30,6 +30,8 @@ fragment <<EOF
 static int no_enum_size_warning = 0;
 static int no_wchar_size_warning = 0;
 static int pic_veneer = 0;
+static int fix_erratum_835769 = 0;
+static int fix_erratum_843419 = 0;
 
 static void
 gld${EMULATION_NAME}_before_parse (void)
@@ -39,6 +41,7 @@ gld${EMULATION_NAME}_before_parse (void)
 #endif /* not TARGET_ */
   input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
+  config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
 }
 
 static void
@@ -52,7 +55,7 @@ aarch64_elf_before_allocation (void)
       LANG_FOR_EACH_INPUT_STATEMENT (is)
        {
           /* Initialise mapping tables for code/data.  */
-          bfd_elf64_aarch64_init_maps (is->the_bfd);
+          bfd_elf${ELFSIZE}_aarch64_init_maps (is->the_bfd);
        }
     }
 
@@ -146,19 +149,18 @@ hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp)
 }
 
 
-/* Call-back for elf64_aarch64_size_stubs.  */
+/* Call-back for elf${ELFSIZE}_aarch64_size_stubs.  */
 
 /* Create a new stub section, and arrange for it to be linked
    immediately after INPUT_SECTION.  */
 
 static asection *
-elf64_aarch64_add_stub_section (const char *stub_sec_name,
-                               asection *input_section)
+elf${ELFSIZE}_aarch64_add_stub_section (const char *stub_sec_name,
+                                       asection *input_section)
 {
   asection *stub_sec;
   flagword flags;
   asection *output_section;
-  const char *secname;
   lang_output_section_statement_type *os;
   struct hook_stub_info info;
 
@@ -169,11 +171,10 @@ elf64_aarch64_add_stub_section (const char *stub_sec_name,
   if (stub_sec == NULL)
     goto err_ret;
 
-  bfd_set_section_alignment (stub_file->the_bfd, stub_sec, 3);
+  bfd_set_section_alignment (stub_file->the_bfd, stub_sec, 2);
 
   output_section = input_section->output_section;
-  secname = bfd_get_section_name (output_section->owner, output_section);
-  os = lang_output_section_find (secname);
+  os = lang_output_section_get (output_section);
 
   info.input_section = input_section;
   lang_list_init (&info.add);
@@ -190,7 +191,7 @@ elf64_aarch64_add_stub_section (const char *stub_sec_name,
   return NULL;
 }
 
-/* Another call-back for elf_arm_size_stubs.  */
+/* Another call-back for elf${ELFSIZE}_aarch64_size_stubs.  */
 
 static void
 gldaarch64_layout_sections_again (void)
@@ -213,27 +214,34 @@ build_section_lists (lang_statement_union_type *statement)
          && (i->flags & SEC_EXCLUDE) == 0
          && i->output_section != NULL
          && i->output_section->owner == link_info.output_bfd)
-       elf64_aarch64_next_input_section (& link_info, i);
+       elf${ELFSIZE}_aarch64_next_input_section (& link_info, i);
     }
 }
 
 static void
 gld${EMULATION_NAME}_after_allocation (void)
 {
+  int ret;
+
   /* bfd_elf32_discard_info just plays with debugging sections,
      ie. doesn't affect any code, so we can delay resizing the
      sections.  It's likely we'll resize everything in the process of
      adding stubs.  */
-  if (bfd_elf_discard_info (link_info.output_bfd, & link_info))
+  ret = bfd_elf_discard_info (link_info.output_bfd, & link_info);
+  if (ret < 0)
+    {
+      einfo ("%X%P: .eh_frame/.stab edit: %E\n");
+      return;
+    }
+  else if (ret > 0)
     need_laying_out = 1;
 
   /* If generating a relocatable output file, then we don't
      have to examine the relocs.  */
-  if (stub_file != NULL && !link_info.relocatable)
+  if (stub_file != NULL && !bfd_link_relocatable (&link_info))
     {
-      int ret = elf64_aarch64_setup_section_lists (link_info.output_bfd,
-                                                  & link_info);
-
+      ret = elf${ELFSIZE}_aarch64_setup_section_lists (link_info.output_bfd,
+                                                      &link_info);
       if (ret != 0)
        {
          if (ret < 0)
@@ -245,11 +253,11 @@ gld${EMULATION_NAME}_after_allocation (void)
          lang_for_each_statement (build_section_lists);
 
          /* Call into the BFD backend to do the real work.  */
-         if (! elf64_aarch64_size_stubs (link_info.output_bfd,
+         if (! elf${ELFSIZE}_aarch64_size_stubs (link_info.output_bfd,
                                          stub_file->the_bfd,
                                          & link_info,
                                          group_size,
-                                         & elf64_aarch64_add_stub_section,
+                                         & elf${ELFSIZE}_aarch64_add_stub_section,
                                          & gldaarch64_layout_sections_again))
            {
              einfo ("%X%P: cannot size stub section: %E\n");
@@ -265,12 +273,12 @@ gld${EMULATION_NAME}_after_allocation (void)
 static void
 gld${EMULATION_NAME}_finish (void)
 {
-  if (! link_info.relocatable)
+  if (!bfd_link_relocatable (&link_info))
     {
       /* Now build the linker stubs.  */
       if (stub_file->the_bfd->sections != NULL)
        {
-         if (! elf64_aarch64_build_stubs (& link_info))
+         if (! elf${ELFSIZE}_aarch64_build_stubs (& link_info))
            einfo ("%X%P: can not build stubs: %E\n");
        }
     }
@@ -293,10 +301,11 @@ aarch64_elf_create_output_section_statements (void)
       return;
     }
 
-  bfd_elf64_aarch64_set_options (link_info.output_bfd, &link_info,
+  bfd_elf${ELFSIZE}_aarch64_set_options (link_info.output_bfd, &link_info,
                                 no_enum_size_warning,
                                 no_wchar_size_warning,
-                                pic_veneer);
+                                pic_veneer,
+                                fix_erratum_835769, fix_erratum_843419);
 
   stub_file = lang_add_input_file ("linker stubs",
                                   lang_input_file_is_fake_enum,
@@ -345,6 +354,8 @@ PARSE_AND_LIST_PROLOGUE='
 #define OPTION_PIC_VENEER              310
 #define OPTION_STUBGROUP_SIZE           311
 #define OPTION_NO_WCHAR_SIZE_WARNING   312
+#define OPTION_FIX_ERRATUM_835769      313
+#define OPTION_FIX_ERRATUM_843419      314
 '
 
 PARSE_AND_LIST_SHORTOPTS=p
@@ -355,6 +366,8 @@ PARSE_AND_LIST_LONGOPTS='
   { "pic-veneer", no_argument, NULL, OPTION_PIC_VENEER},
   { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
   { "no-wchar-size-warning", no_argument, NULL, OPTION_NO_WCHAR_SIZE_WARNING},
+  { "fix-cortex-a53-835769", no_argument, NULL, OPTION_FIX_ERRATUM_835769},
+  { "fix-cortex-a53-843419", no_argument, NULL, OPTION_FIX_ERRATUM_843419},
 '
 
 PARSE_AND_LIST_OPTIONS='
@@ -372,6 +385,8 @@ PARSE_AND_LIST_OPTIONS='
                            after each stub section.  Values of +/-1 indicate\n\
                            the linker should choose suitable defaults.\n"
                   ));
+  fprintf (file, _("  --fix-cortex-a53-835769      Fix erratum 835769\n"));
+  fprintf (file, _("  --fix-cortex-a53-843419      Fix erratum 843419\n"));
 '
 
 PARSE_AND_LIST_ARGS_CASES='
@@ -391,6 +406,14 @@ PARSE_AND_LIST_ARGS_CASES='
       pic_veneer = 1;
       break;
 
+    case OPTION_FIX_ERRATUM_835769:
+      fix_erratum_835769 = 1;
+      break;
+
+    case OPTION_FIX_ERRATUM_843419:
+      fix_erratum_843419 = 1;
+      break;
+
     case OPTION_STUBGROUP_SIZE:
       {
        const char *end;
This page took 0.026546 seconds and 4 git commands to generate.