# This shell script emits a C file. -*- C -*-
-# Copyright (C) 2009-2014 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)
static asection *
elf${ELFSIZE}_aarch64_add_stub_section (const char *stub_sec_name,
- asection *input_section)
+ asection *input_section)
{
asection *stub_sec;
flagword flags;
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;
os = lang_output_section_get (output_section);
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 = elf${ELFSIZE}_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)
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)
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;