aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog17
-rw-r--r--ld/emultempl/armelf.em117
2 files changed, 72 insertions, 62 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index bf186c5..b38a7e3 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,20 @@
+2016-08-26 Thomas Preud'homme <thomas.preudhomme@arm.com>
+
+ * emultempl/armelf.em (params): New static variable.
+ (thumb_entry_symbol, byteswap_code, target1_is_rel, target2_type,
+ fix_v4bx, use_blx, vfp11_denorm_fix, stm32l4xx_fix, fix_cortex_a8,
+ no_enum_size_warning, no_wchar_size_warning, pic_veneer,
+ merge_exidx_entries, fix_arm1176, cmse_implib): move as part of the
+ above new structure.
+ (arm_elf_before_allocation): Access static variable from the params
+ structure.
+ (gld${EMULATION_NAME}_finish): Likewise.
+ (arm_elf_create_output_section_statements): Likewise and pass the
+ address of that structure to bfd_elf32_arm_set_target_relocs instead
+ of the static variables.
+ (PARSE_AND_LIST_ARGS_CASES): Access static variable from the params
+ structure.
+
2016-08-26 Cupertino Miranda <cmiranda@synopsys.com>
* ld/testsuite/ld-arc/tls_gd-01.s: Added a testcase for this patch.
diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em
index 306caf1..27f95f2 100644
--- a/ld/emultempl/armelf.em
+++ b/ld/emultempl/armelf.em
@@ -28,21 +28,25 @@ fragment <<EOF
#include "ldctor.h"
#include "elf/arm.h"
-static char * thumb_entry_symbol = NULL;
-static int byteswap_code = 0;
-static int target1_is_rel = 0${TARGET1_IS_REL};
-static char * target2_type = "${TARGET2_TYPE}";
-static int fix_v4bx = 0;
-static int use_blx = 0;
-static bfd_arm_vfp11_fix vfp11_denorm_fix = BFD_ARM_VFP11_FIX_DEFAULT;
-static bfd_arm_stm32l4xx_fix stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_NONE;
-static int fix_cortex_a8 = -1;
-static int no_enum_size_warning = 0;
-static int no_wchar_size_warning = 0;
-static int pic_veneer = 0;
-static int merge_exidx_entries = -1;
-static int fix_arm1176 = 1;
-static int cmse_implib = 0;
+static struct elf32_arm_params params =
+{
+ NULL, /* thumb_entry_symbol */
+ 0, /* byteswap_code */
+ 0${TARGET1_IS_REL}, /* target1_is_rel */
+ "${TARGET2_TYPE}", /* target2_type */
+ 0, /* fix_v4bx */
+ 0, /* use_blx */
+ BFD_ARM_VFP11_FIX_DEFAULT, /* vfp11_denorm_fix */
+ BFD_ARM_STM32L4XX_FIX_NONE, /* stm32l4xx_fix */
+ 0, /* no_enum_size_warning */
+ 0, /* no_wchar_size_warning */
+ 0, /* pic_veneer */
+ -1, /* fix_cortex_a8 */
+ 1, /* fix_arm1176 */
+ -1, /* merge_exidx_entries */
+ 0, /* cmse_implib */
+ NULL /* in_implib_bfd */
+};
static char *in_implib_filename = NULL;
static void
@@ -73,7 +77,7 @@ gld${EMULATION_NAME}_set_symbols (void)
static void
arm_elf_before_allocation (void)
{
- bfd_elf32_arm_set_byteswap_code (&link_info, byteswap_code);
+ bfd_elf32_arm_set_byteswap_code (&link_info, params.byteswap_code);
/* Choose type of VFP11 erratum fix, or warn if specified fix is unnecessary
due to architecture version. */
@@ -358,7 +362,7 @@ gld${EMULATION_NAME}_after_allocation (void)
qsort (sec_list, sec_count, sizeof (asection *), &compare_output_sec_vma);
if (elf32_arm_fix_exidx_coverage (sec_list, sec_count, &link_info,
- merge_exidx_entries))
+ params.merge_exidx_entries))
need_laying_out = 1;
free (sec_list);
@@ -439,9 +443,9 @@ gld${EMULATION_NAME}_finish (void)
finish_default ();
- if (thumb_entry_symbol)
+ if (params.thumb_entry_symbol)
{
- h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol,
+ h = bfd_link_hash_lookup (link_info.hash, params.thumb_entry_symbol,
FALSE, FALSE, TRUE);
}
else
@@ -484,15 +488,15 @@ gld${EMULATION_NAME}_finish (void)
sprintf_vma (buffer + 2, val);
- if (thumb_entry_symbol != NULL && entry_symbol.name != NULL
+ if (params.thumb_entry_symbol != NULL && entry_symbol.name != NULL
&& entry_from_cmdline)
einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
- thumb_entry_symbol, entry_symbol.name);
+ params.thumb_entry_symbol, entry_symbol.name);
entry_symbol.name = buffer;
}
else
einfo (_("%P: warning: cannot find thumb start symbol %s\n"),
- thumb_entry_symbol);
+ params.thumb_entry_symbol);
}
/* This is a convenient point to tell BFD about target specific flags.
@@ -500,8 +504,6 @@ gld${EMULATION_NAME}_finish (void)
static void
arm_elf_create_output_section_statements (void)
{
- bfd *in_implib_bfd;
-
if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL)
{
/* The arm backend needs special fields in the output hash structure.
@@ -514,26 +516,17 @@ arm_elf_create_output_section_statements (void)
if (in_implib_filename)
{
- in_implib_bfd = bfd_openr (in_implib_filename,
- bfd_get_target (link_info.output_bfd));
+ params.in_implib_bfd = bfd_openr (in_implib_filename,
+ bfd_get_target (link_info.output_bfd));
- if (in_implib_bfd == NULL)
+ if (params.in_implib_bfd == NULL)
einfo ("%F%s: Can't open: %E\n", in_implib_filename);
- if (!bfd_check_format (in_implib_bfd, bfd_object))
+ if (!bfd_check_format (params.in_implib_bfd, bfd_object))
einfo ("%F%s: Not a relocatable file: %E\n", in_implib_filename);
}
- else
- in_implib_bfd = NULL;
- bfd_elf32_arm_set_target_relocs (link_info.output_bfd, &link_info,
- target1_is_rel,
- target2_type, fix_v4bx, use_blx,
- vfp11_denorm_fix, stm32l4xx_fix,
- no_enum_size_warning,
- no_wchar_size_warning,
- pic_veneer, fix_cortex_a8,
- fix_arm1176, cmse_implib, in_implib_bfd);
+ bfd_elf32_arm_set_target_params (link_info.output_bfd, &link_info, &params);
stub_file = lang_add_input_file ("linker stubs",
lang_input_file_is_fake_enum,
@@ -676,71 +669,71 @@ PARSE_AND_LIST_ARGS_CASES='
break;
case OPTION_THUMB_ENTRY:
- thumb_entry_symbol = optarg;
+ params.thumb_entry_symbol = optarg;
break;
case OPTION_BE8:
- byteswap_code = 1;
+ params.byteswap_code = 1;
break;
case OPTION_TARGET1_REL:
- target1_is_rel = 1;
+ params.target1_is_rel = 1;
break;
case OPTION_TARGET1_ABS:
- target1_is_rel = 0;
+ params.target1_is_rel = 0;
break;
case OPTION_TARGET2:
- target2_type = optarg;
+ params.target2_type = optarg;
break;
case OPTION_FIX_V4BX:
- fix_v4bx = 1;
+ params.fix_v4bx = 1;
break;
case OPTION_FIX_V4BX_INTERWORKING:
- fix_v4bx = 2;
+ params.fix_v4bx = 2;
break;
case OPTION_USE_BLX:
- use_blx = 1;
+ params.use_blx = 1;
break;
case OPTION_VFP11_DENORM_FIX:
if (strcmp (optarg, "none") == 0)
- vfp11_denorm_fix = BFD_ARM_VFP11_FIX_NONE;
+ params.vfp11_denorm_fix = BFD_ARM_VFP11_FIX_NONE;
else if (strcmp (optarg, "scalar") == 0)
- vfp11_denorm_fix = BFD_ARM_VFP11_FIX_SCALAR;
+ params.vfp11_denorm_fix = BFD_ARM_VFP11_FIX_SCALAR;
else if (strcmp (optarg, "vector") == 0)
- vfp11_denorm_fix = BFD_ARM_VFP11_FIX_VECTOR;
+ params.vfp11_denorm_fix = BFD_ARM_VFP11_FIX_VECTOR;
else
einfo (_("Unrecognized VFP11 fix type '\''%s'\''.\n"), optarg);
break;
case OPTION_STM32L4XX_FIX:
if (!optarg)
- stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_DEFAULT;
+ params.stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_DEFAULT;
else if (strcmp (optarg, "none") == 0)
- stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_NONE;
+ params.stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_NONE;
else if (strcmp (optarg, "default") == 0)
- stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_DEFAULT;
+ params.stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_DEFAULT;
else if (strcmp (optarg, "all") == 0)
- stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_ALL;
+ params.stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_ALL;
else
einfo (_("Unrecognized STM32L4XX fix type '\''%s'\''.\n"), optarg);
break;
case OPTION_NO_ENUM_SIZE_WARNING:
- no_enum_size_warning = 1;
+ params.no_enum_size_warning = 1;
break;
case OPTION_NO_WCHAR_SIZE_WARNING:
- no_wchar_size_warning = 1;
+ params.no_wchar_size_warning = 1;
break;
case OPTION_PIC_VENEER:
- pic_veneer = 1;
+ params.pic_veneer = 1;
break;
case OPTION_STUBGROUP_SIZE:
@@ -754,23 +747,23 @@ PARSE_AND_LIST_ARGS_CASES='
break;
case OPTION_FIX_CORTEX_A8:
- fix_cortex_a8 = 1;
+ params.fix_cortex_a8 = 1;
break;
case OPTION_NO_FIX_CORTEX_A8:
- fix_cortex_a8 = 0;
+ params.fix_cortex_a8 = 0;
break;
case OPTION_NO_MERGE_EXIDX_ENTRIES:
- merge_exidx_entries = 0;
+ params.merge_exidx_entries = 0;
break;
case OPTION_FIX_ARM1176:
- fix_arm1176 = 1;
+ params.fix_arm1176 = 1;
break;
case OPTION_NO_FIX_ARM1176:
- fix_arm1176 = 0;
+ params.fix_arm1176 = 0;
break;
case OPTION_LONG_PLT:
@@ -778,7 +771,7 @@ PARSE_AND_LIST_ARGS_CASES='
break;
case OPTION_CMSE_IMPLIB:
- cmse_implib = 1;
+ params.cmse_implib = 1;
break;
case OPTION_IN_IMPLIB: