# 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.
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)
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);
}
}
}
-/* 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;
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);
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)
&& (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)
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");
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");
}
}
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,
#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
{ "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='
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='
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;