* [RFA] Fix gold's understanding of ARM v4T/v5T interworking
@ 2011-09-26 14:48 Matthew Gretton-Dann
2011-11-02 10:43 ` [PING] " Matthew Gretton-Dann
2011-11-02 19:12 ` Ian Lance Taylor
0 siblings, 2 replies; 6+ messages in thread
From: Matthew Gretton-Dann @ 2011-09-26 14:48 UTC (permalink / raw)
To: binutils; +Cc: ian
[-- Attachment #1: Type: text/plain, Size: 2125 bytes --]
Hi,
Whilst preparing a patch for gold to work around an issue on ARM1176
CPUs (forthcoming) I noticed that gold doesn't correctly identify
between v4T and v5T. In particular:
* It assumes BLX is available on v4T - it is not, BLX is only
available from v5T.
* It therefore assumes that using the availability of BLX is a good
test for whether --fix-v4bx-interworking is also available.
The attached patch fixes these two issues by splitting the
Target_arm::may_use_blx() function into two:
* Target_arm::may_use_v4t_interworking()
* Target_arm::may_use_v5t_interworking()
The tests which previous checked may_use_blx() are then directed to use
one of the appropriate may_use_v#t_interworking queries.
I also ported some of the ld-arm/farcall* tests to gold in order to test
these fixes.
Tested on arm-none-eabi.
Can someone please review?
Thanks,
Matt
gold/ChangeLog:
2011-09-20 Matthew Gretton-Dann<matthew.gretton-dann@arm.com>
* arm.cc (Target_arm::Target_arm): Remove initialisation of
may_use_blx_
(Target_arm::may_use_blx): Remove method.
(Target_arm::set_may_use_blx): Likewise.
(Target_arm::may_use_v4t_interworking): New method.
(Target_arm::may_use_v5t_interworking): Likewise.
(Target_arm::may_use_blx_): Remove member variable.
(Arm_relocate_functions::arm_branch_common): Check for v5T
interworking.
(Arm_relocate_functions::thumb_branch_common): Likewise.
(Reloc_stub::stub_type_for_reloc): Likewise.
(Target_arm::do_finalize_sections): Correct interworking checks.
* testsuite/Makefile.am: Add new tests.
* testsuite/Makefile.in: Regenerate.
* testsuite/arm_farcall_arm_arm.s: New test.
* testsuite/arm_farcall_arm_arm.sh: Likewise.
* testsuite/arm_farcall_arm_thumb.s: Likewise.
* testsuite/arm_farcall_arm_thumb.sh: Likewise.
* testsuite/arm_farcall_thumb_arm.s: Likewise.
* testsuite/arm_farcall_thumb_arm.sh: Likewise.
* testsuite/arm_farcall_thumb_thumb.s: Likewise.
* testsuite/arm_farcall_thumb_thumb.sh: Likewise.
--
Matthew Gretton-Dann
Principal Engineer, PD Software - Tools, ARM Ltd
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 1109-Add-may_use_v-45-t_interworking-functions.patch --]
[-- Type: text/x-patch; name=1109-Add-may_use_v-45-t_interworking-functions.patch, Size: 33492 bytes --]
diff --git a/gold/arm.cc b/gold/arm.cc
index f652677..c0a2049 100644
--- a/gold/arm.cc
+++ b/gold/arm.cc
@@ -2177,21 +2177,11 @@ class Target_arm : public Sized_target<32, big_endian>
copy_relocs_(elfcpp::R_ARM_COPY), dynbss_(NULL),
got_mod_index_offset_(-1U), tls_base_symbol_defined_(false),
stub_tables_(), stub_factory_(Stub_factory::get_instance()),
- may_use_blx_(false), should_force_pic_veneer_(false),
+ should_force_pic_veneer_(false),
arm_input_section_map_(), attributes_section_data_(NULL),
fix_cortex_a8_(false), cortex_a8_relocs_info_()
{ }
- // Whether we can use BLX.
- bool
- may_use_blx() const
- { return this->may_use_blx_; }
-
- // Set use-BLX flag.
- void
- set_may_use_blx(bool value)
- { this->may_use_blx_ = value; }
-
// Whether we force PCI branch veneers.
bool
should_force_pic_veneer() const
@@ -2253,6 +2243,29 @@ class Target_arm : public Sized_target<32, big_endian>
|| arch == elfcpp::TAG_CPU_ARCH_V7
|| arch == elfcpp::TAG_CPU_ARCH_V7E_M);
}
+
+ // Whether we have v4T interworking instructions available.
+ bool
+ may_use_v4t_interworking() const
+ {
+ Object_attribute* attr =
+ this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
+ int arch = attr->int_value();
+ return (arch != elfcpp::TAG_CPU_ARCH_PRE_V4
+ && arch != elfcpp::TAG_CPU_ARCH_V4);
+ }
+
+ // Whether we have v5T interworking instructions available.
+ bool
+ may_use_v5t_interworking() const
+ {
+ Object_attribute* attr =
+ this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
+ int arch = attr->int_value();
+ return (arch != elfcpp::TAG_CPU_ARCH_PRE_V4
+ && arch != elfcpp::TAG_CPU_ARCH_V4
+ && arch != elfcpp::TAG_CPU_ARCH_V4T);
+ }
// Process the relocations to determine unreferenced sections for
// garbage collection.
@@ -2922,8 +2935,6 @@ class Target_arm : public Sized_target<32, big_endian>
Stub_table_list stub_tables_;
// Stub factory.
const Stub_factory &stub_factory_;
- // Whether we can use BLX.
- bool may_use_blx_;
// Whether we force PIC branch veneers.
bool should_force_pic_veneer_;
// Map for locating Arm_input_sections.
@@ -3950,7 +3961,7 @@ Arm_relocate_functions<big_endian>::arm_branch_common(
// We need a stub if the branch offset is too large or if we need
// to switch mode.
- bool may_use_blx = arm_target->may_use_blx();
+ bool may_use_blx = arm_target->may_use_v5t_interworking();
Reloc_stub* stub = NULL;
if (!parameters->options().relocatable()
@@ -4081,7 +4092,7 @@ Arm_relocate_functions<big_endian>::thumb_branch_common(
Arm_address branch_target = psymval->value(object, addend);
// For BLX, bit 1 of target address comes from bit 1 of base address.
- bool may_use_blx = arm_target->may_use_blx();
+ bool may_use_blx = arm_target->may_use_v5t_interworking();
if (thumb_bit == 0 && may_use_blx)
branch_target = utils::bit_select(branch_target, address, 0x2);
@@ -4464,7 +4475,7 @@ Reloc_stub::stub_type_for_reloc(
{
const Target_arm<true>* big_endian_target =
Target_arm<true>::default_target();
- may_use_blx = big_endian_target->may_use_blx();
+ may_use_blx = big_endian_target->may_use_v5t_interworking();
should_force_pic_veneer = big_endian_target->should_force_pic_veneer();
thumb2 = big_endian_target->using_thumb2();
thumb_only = big_endian_target->using_thumb_only();
@@ -4473,7 +4484,7 @@ Reloc_stub::stub_type_for_reloc(
{
const Target_arm<false>* little_endian_target =
Target_arm<false>::default_target();
- may_use_blx = little_endian_target->may_use_blx();
+ may_use_blx = little_endian_target->may_use_v5t_interworking();
should_force_pic_veneer = little_endian_target->should_force_pic_veneer();
thumb2 = little_endian_target->using_thumb2();
thumb_only = little_endian_target->using_thumb_only();
@@ -8604,12 +8615,8 @@ Target_arm<big_endian>::do_finalize_sections(
if (this->attributes_section_data_ == NULL)
this->attributes_section_data_ = new Attributes_section_data(NULL, 0);
- // Check BLX use.
const Object_attribute* cpu_arch_attr =
this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
- if (cpu_arch_attr->int_value() > elfcpp::TAG_CPU_ARCH_V4)
- this->set_may_use_blx(true);
-
// Check if we need to use Cortex-A8 workaround.
if (parameters->options().user_set_fix_cortex_a8())
this->fix_cortex_a8_ = parameters->options().fix_cortex_a8();
@@ -8630,7 +8637,7 @@ Target_arm<big_endian>::do_finalize_sections(
// The V4BX interworking stub contains BX instruction,
// which is not specified for some profiles.
if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING
- && !this->may_use_blx())
+ && !this->may_use_v4t_interworking())
gold_error(_("unable to provide V4BX reloc interworking fix up; "
"the target profile does not support BX instruction"));
@@ -11797,7 +11804,7 @@ Target_arm<big_endian>::scan_span_for_cortex_a8_erratum(
// an ARM instruction. If we were not making a stub,
// the BL would have been converted to a BLX. Use the
// BLX stub instead in that case.
- if (this->may_use_blx() && force_target_arm
+ if (this->may_use_v5t_interworking() && force_target_arm
&& stub_type == arm_stub_a8_veneer_bl)
{
stub_type = arm_stub_a8_veneer_blx;
diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
index ca07f87..75cd272 100644
--- a/gold/testsuite/Makefile.am
+++ b/gold/testsuite/Makefile.am
@@ -2436,6 +2436,120 @@ arm_unaligned_reloc.o: arm_unaligned_reloc.s
MOSTLYCLEANFILES += arm_unaligned_reloc
+# Check ARM to ARM farcall veneers
+
+check_SCRIPTS += arm_farcall_arm_arm.sh
+check_DATA += arm_farcall_arm_arm.stdout
+
+arm_farcall_arm_arm.stdout: arm_farcall_arm_arm
+ $(TEST_OBJDUMP) -d $< > $@
+
+arm_farcall_arm_arm: arm_farcall_arm_arm.o ../ld-new
+ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001020 -o $@ $<
+
+arm_farcall_arm_arm.o: arm_farcall_arm_arm.s
+ $(TEST_AS) -o $@ $<
+
+MOSTLYCLEANFILES += arm_farcall_arm_arm
+
+# Check ARM to Thumb farcall veneers
+
+check_SCRIPTS += arm_farcall_arm_thumb.sh
+check_DATA += arm_farcall_arm_thumb.stdout arm_farcall_arm_thumb_5t.stdout
+
+arm_farcall_arm_thumb.stdout: arm_farcall_arm_thumb
+ $(TEST_OBJDUMP) -D $< > $@
+
+arm_farcall_arm_thumb: arm_farcall_arm_thumb.o ../ld-new
+ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+arm_farcall_arm_thumb.o: arm_farcall_arm_thumb.s
+ $(TEST_AS) -o $@ $<
+
+arm_farcall_arm_thumb_5t.stdout: arm_farcall_arm_thumb_5t
+ $(TEST_OBJDUMP) -D $< > $@
+
+arm_farcall_arm_thumb_5t: arm_farcall_arm_thumb_5t.o ../ld-new
+ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+arm_farcall_arm_thumb_5t.o: arm_farcall_arm_thumb.s
+ $(TEST_AS) -march=armv5t -o $@ $<
+
+MOSTLYCLEANFILES += arm_farcall_arm_thumb arm_farcall_arm_thumb_5t
+
+# Check Thumb to Thumb farcall veneers
+
+check_SCRIPTS += arm_farcall_thumb_thumb.sh
+check_DATA += arm_farcall_thumb_thumb.stdout \
+ arm_farcall_thumb_thumb_5t.stdout \
+ arm_farcall_thumb_thumb_7m.stdout \
+ arm_farcall_thumb_thumb_6m.stdout
+
+arm_farcall_thumb_thumb.stdout: arm_farcall_thumb_thumb
+ $(TEST_OBJDUMP) -D $< > $@
+
+arm_farcall_thumb_thumb: arm_farcall_thumb_thumb.o ../ld-new
+ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+arm_farcall_thumb_thumb.o: arm_farcall_thumb_thumb.s
+ $(TEST_AS) -march=armv4t -o $@ $<
+
+arm_farcall_thumb_thumb_5t.stdout: arm_farcall_thumb_thumb_5t
+ $(TEST_OBJDUMP) -D $< > $@
+
+arm_farcall_thumb_thumb_5t: arm_farcall_thumb_thumb_5t.o ../ld-new
+ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+arm_farcall_thumb_thumb_5t.o: arm_farcall_thumb_thumb.s
+ $(TEST_AS) -march=armv5t -o $@ $<
+
+arm_farcall_thumb_thumb_7m.stdout: arm_farcall_thumb_thumb_7m
+ $(TEST_OBJDUMP) -D $< > $@
+
+arm_farcall_thumb_thumb_7m: arm_farcall_thumb_thumb_7m.o ../ld-new
+ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+arm_farcall_thumb_thumb_7m.o: arm_farcall_thumb_thumb.s
+ $(TEST_AS) -march=armv7-m -o $@ $<
+
+arm_farcall_thumb_thumb_6m.stdout: arm_farcall_thumb_thumb_6m
+ $(TEST_OBJDUMP) -D $< > $@
+
+arm_farcall_thumb_thumb_6m: arm_farcall_thumb_thumb_6m.o ../ld-new
+ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+arm_farcall_thumb_thumb_6m.o: arm_farcall_thumb_thumb.s
+ $(TEST_AS) -march=armv6-m -o $@ $<
+
+MOSTLYCLEANFILES += arm_farcall_thumb_thumb arm_farcall_thumb_thumb_5t \
+ arm_farcall_thumb_thumb_7m arm_farcall_thumb_thumb_6m
+
+# Check Thumb to ARM farcall veneers
+
+check_SCRIPTS += arm_farcall_thumb_arm.sh
+check_DATA += arm_farcall_thumb_arm.stdout \
+ arm_farcall_thumb_arm_5t.stdout
+
+arm_farcall_thumb_arm.stdout: arm_farcall_thumb_arm
+ $(TEST_OBJDUMP) -D $< > $@
+
+arm_farcall_thumb_arm: arm_farcall_thumb_arm.o ../ld-new
+ ../ld-new --section-start .text=0x1c01010 --section-start .foo=0x2001014 -o $@ $<
+
+arm_farcall_thumb_arm.o: arm_farcall_thumb_arm.s
+ $(TEST_AS) -o $@ $<
+
+arm_farcall_thumb_arm_5t.stdout: arm_farcall_thumb_arm_5t
+ $(TEST_OBJDUMP) -D $< > $@
+
+arm_farcall_thumb_arm_5t: arm_farcall_thumb_arm_5t.o ../ld-new
+ ../ld-new --section-start .text=0x1c01010 --section-start .foo=0x2001014 -o $@ $<
+
+arm_farcall_thumb_arm_5t.o: arm_farcall_thumb_arm.s
+ $(TEST_AS) -march=armv5t -o $@ $<
+
+MOSTLYCLEANFILES += arm_farcall_thumb_arm arm_farcall_thumb_arm_5t
+
endif DEFAULT_TARGET_ARM
endif NATIVE_OR_CROSS_LINKER
diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
index f0339fd..0226275 100644
--- a/gold/testsuite/Makefile.in
+++ b/gold/testsuite/Makefile.in
@@ -503,6 +503,14 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
# Cortex-A8 workaround test.
+
+# Check ARM to ARM farcall veneers
+
+# Check ARM to Thumb farcall veneers
+
+# Check Thumb to Thumb farcall veneers
+
+# Check Thumb to ARM farcall veneers
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_64 = arm_abs_global.sh \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_branch_in_range.sh \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_branch_out_of_range.sh \
@@ -511,7 +519,11 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8.sh \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_exidx_test.sh \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ pr12826.sh \
-@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc.sh
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc.sh \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_arm.sh \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb.sh \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb.sh \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_arm.sh
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_65 = arm_abs_global.stdout \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_in_range.stdout \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_out_of_range.stdout \
@@ -540,7 +552,16 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8_local_reloc.stdout \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_exidx_test.stdout \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ pr12826.stdout \
-@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc.stdout
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc.stdout \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_arm.stdout \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb.stdout \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb_5t.stdout \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb.stdout \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_5t.stdout \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_7m.stdout \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_6m.stdout \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_arm.stdout \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_arm_5t.stdout
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_66 = arm_abs_global \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_in_range \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_out_of_range \
@@ -567,7 +588,16 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8_blx \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8_local \
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8_local_reloc \
-@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_arm \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb_5t \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_5t \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_7m \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_6m \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_arm \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_arm_5t
subdir = testsuite
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -3644,6 +3674,14 @@ pr12826.sh.log: pr12826.sh
@p='pr12826.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
arm_unaligned_reloc.sh.log: arm_unaligned_reloc.sh
@p='arm_unaligned_reloc.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
+arm_farcall_arm_arm.sh.log: arm_farcall_arm_arm.sh
+ @p='arm_farcall_arm_arm.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
+arm_farcall_arm_thumb.sh.log: arm_farcall_arm_thumb.sh
+ @p='arm_farcall_arm_thumb.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
+arm_farcall_thumb_thumb.sh.log: arm_farcall_thumb_thumb.sh
+ @p='arm_farcall_thumb_thumb.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
+arm_farcall_thumb_arm.sh.log: arm_farcall_thumb_arm.sh
+ @p='arm_farcall_thumb_arm.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
object_unittest.log: object_unittest$(EXEEXT)
@p='object_unittest$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
binary_unittest.log: binary_unittest$(EXEEXT)
@@ -5305,6 +5343,87 @@ uninstall-am:
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_unaligned_reloc.o: arm_unaligned_reloc.s
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -o $@ $<
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_arm.stdout: arm_farcall_arm_arm
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -d $< > $@
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_arm: arm_farcall_arm_arm.o ../ld-new
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001020 -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_arm.o: arm_farcall_arm_arm.s
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb.stdout: arm_farcall_arm_thumb
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb: arm_farcall_arm_thumb.o ../ld-new
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb.o: arm_farcall_arm_thumb.s
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb_5t.stdout: arm_farcall_arm_thumb_5t
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb_5t: arm_farcall_arm_thumb_5t.o ../ld-new
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb_5t.o: arm_farcall_arm_thumb.s
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv5t -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb.stdout: arm_farcall_thumb_thumb
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb: arm_farcall_thumb_thumb.o ../ld-new
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb.o: arm_farcall_thumb_thumb.s
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv4t -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_5t.stdout: arm_farcall_thumb_thumb_5t
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_5t: arm_farcall_thumb_thumb_5t.o ../ld-new
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_5t.o: arm_farcall_thumb_thumb.s
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv5t -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_7m.stdout: arm_farcall_thumb_thumb_7m
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_7m: arm_farcall_thumb_thumb_7m.o ../ld-new
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_7m.o: arm_farcall_thumb_thumb.s
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv7-m -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_6m.stdout: arm_farcall_thumb_thumb_6m
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_6m: arm_farcall_thumb_thumb_6m.o ../ld-new
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_6m.o: arm_farcall_thumb_thumb.s
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv6-m -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm.stdout: arm_farcall_thumb_arm
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm: arm_farcall_thumb_arm.o ../ld-new
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1c01010 --section-start .foo=0x2001014 -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm.o: arm_farcall_thumb_arm.s
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm_5t.stdout: arm_farcall_thumb_arm_5t
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm_5t: arm_farcall_thumb_arm_5t.o ../ld-new
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1c01010 --section-start .foo=0x2001014 -o $@ $<
+
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm_5t.o: arm_farcall_thumb_arm.s
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv5t -o $@ $<
+
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/gold/testsuite/arm_farcall_arm_arm.s b/gold/testsuite/arm_farcall_arm_arm.s
new file mode 100644
index 0000000..00c1e48
--- /dev/null
+++ b/gold/testsuite/arm_farcall_arm_arm.s
@@ -0,0 +1,20 @@
+@ Test to ensure that a ARM to ARM call exceeding 32Mb generates a stub.
+
+ .global _start
+ .syntax unified
+
+@ We will place the section .text at 0x1000.
+
+ .text
+
+_start:
+ bl bar
+
+@ We will place the section .foo at 0x2001020.
+
+ .section .foo, "xa"
+
+ .type bar, %function
+bar:
+ bx lr
+
diff --git a/gold/testsuite/arm_farcall_arm_arm.sh b/gold/testsuite/arm_farcall_arm_arm.sh
new file mode 100755
index 0000000..7d95528
--- /dev/null
+++ b/gold/testsuite/arm_farcall_arm_arm.sh
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+# arm_farcall_arm_arm.sh -- a test case for ARM->ARM farcall veneers
+
+# Copyright 2010, 2011, Free Software Foundation, Inc.
+# Written by Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
+# Based upon arm_cortex_a8.sh
+# Written by Doug Kwan <dougkwan@google.com>.
+
+# This file is part of gold.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+check()
+{
+ if ! grep -q "$2" "$1"
+ then
+ echo "Did not find expected instruction in $1:"
+ echo " $2"
+ echo ""
+ echo "Actual instructions below:"
+ cat "$1"
+ exit 1
+ fi
+}
+
+# Check for ARM->ARM default
+check arm_farcall_arm_arm.stdout "1004: .* ldr pc, \[pc, #-4\] .*"
+check arm_farcall_arm_arm.stdout "1008: 02001020"
+
+exit 0
diff --git a/gold/testsuite/arm_farcall_arm_thumb.s b/gold/testsuite/arm_farcall_arm_thumb.s
new file mode 100644
index 0000000..c69f31c
--- /dev/null
+++ b/gold/testsuite/arm_farcall_arm_thumb.s
@@ -0,0 +1,20 @@
+@ Test to ensure that a ARM to Thumb call exceeding 32Mb generates a stub.
+
+ .global _start
+ .global bar
+ .syntax unified
+
+@ We will place the section .text at 0x1000.
+
+ .text
+
+_start:
+ bl bar
+
+@ We will place the section .foo at 0x2001010.
+
+ .section .foo, "xa"
+ .thumb_func
+bar:
+ bx lr
+
diff --git a/gold/testsuite/arm_farcall_arm_thumb.sh b/gold/testsuite/arm_farcall_arm_thumb.sh
new file mode 100755
index 0000000..2df2d65
--- /dev/null
+++ b/gold/testsuite/arm_farcall_arm_thumb.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+
+# arm_farcall_arm_thumb.sh -- a test case for ARM->Thumb farcall veneers.
+
+# Copyright 2010, 2011, Free Software Foundation, Inc.
+# Written by Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
+# Based upon arm_cortex_a8.sh
+# Written by Doug Kwan <dougkwan@google.com>.
+
+# This file is part of gold.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+check()
+{
+ if ! grep -q "$2" "$1"
+ then
+ echo "Did not find expected instruction in $1:"
+ echo " $2"
+ echo ""
+ echo "Actual instructions below:"
+ cat "$1"
+ exit 1
+ fi
+}
+
+# Check for ARM->Thumb default
+check arm_farcall_arm_thumb.stdout "1004: .* ldr ip, \[pc\]"
+check arm_farcall_arm_thumb.stdout "1008: .* bx ip"
+check arm_farcall_arm_thumb.stdout "100c: 02001015"
+
+# Check for ARM->Thumb with v5t interworking
+chck arm_farcall_arm_thumb_5t.stdout "1004: f004 e51f"
+chck arm_farcall_arm_thumb_5t.stdout "1008: 1015"
+chck arm_farcall_arm_thumb_5t.stdout "100a: 0200"
+
+exit 0
diff --git a/gold/testsuite/arm_farcall_thumb_arm.s b/gold/testsuite/arm_farcall_thumb_arm.s
new file mode 100644
index 0000000..1fd6a07
--- /dev/null
+++ b/gold/testsuite/arm_farcall_thumb_arm.s
@@ -0,0 +1,27 @@
+@ Test to ensure that a Thumb to ARM call exceeding 4Mb generates a stub.
+@ Check that we can generate two types of stub in the same section.
+
+ .global _start
+ .syntax unified
+
+@ We will place the section .text at 0x1c01010.
+
+ .text
+ .thumb_func
+_start:
+ .global bar
+ bl bar
+@ This call is close enough to generate a "short branch" stub
+@ or no stub if blx is available.
+ .space 0x0300000
+ bl bar
+
+@ We will place the section .foo at 0x2001014.
+
+ .section .foo, "xa"
+
+ .arm
+ .type bar, %function
+bar:
+ bx lr
+
diff --git a/gold/testsuite/arm_farcall_thumb_arm.sh b/gold/testsuite/arm_farcall_thumb_arm.sh
new file mode 100755
index 0000000..e22da46
--- /dev/null
+++ b/gold/testsuite/arm_farcall_thumb_arm.sh
@@ -0,0 +1,56 @@
+#!/bin/sh
+
+# arm_farcall_thumb_arm.sh -- a test case for Thumb->ARM farcall veneers.
+
+# Copyright 2010, 2011, Free Software Foundation, Inc.
+# Written by Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
+# Based upon arm_cortex_a8.sh
+# Written by Doug Kwan <dougkwan@google.com>.
+
+# This file is part of gold.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+check()
+{
+ if ! grep -q "$2" "$1"
+ then
+ echo "Did not find expected instruction in $1:"
+ echo " $2"
+ echo ""
+ echo "Actual instructions below:"
+ cat "$1"
+ exit 1
+ fi
+}
+
+# Thumb->ARM
+check arm_farcall_thumb_arm.stdout "1f01018: .* bx pc"
+check arm_farcall_thumb_arm.stdout "1f0101a: .* nop"
+check arm_farcall_thumb_arm.stdout "1f0101c: f004 e51f"
+check arm_farcall_thumb_arm.stdout "1f01020: 1014"
+check arm_farcall_thumb_arm.stdout "1f01022: 0200"
+
+check arm_farcall_thumb_arm.stdout "1f01024: .* bx pc"
+check arm_farcall_thumb_arm.stdout "1f01026: .* nop"
+check arm_farcall_thumb_arm.stdout "1f01028: fff9 ea03"
+
+# Thumb->ARM with v5T interworking
+check arm_farcall_thumb_arm_5t.stdout "1f01018: f004 e51f"
+check arm_farcall_thumb_arm_5t.stdout "1f0101c: 1014"
+check arm_farcall_thumb_arm_5t.stdout "1f0101e: 0200"
+
+exit 0
diff --git a/gold/testsuite/arm_farcall_thumb_thumb.s b/gold/testsuite/arm_farcall_thumb_thumb.s
new file mode 100644
index 0000000..650b1a6
--- /dev/null
+++ b/gold/testsuite/arm_farcall_thumb_thumb.s
@@ -0,0 +1,19 @@
+@ Test to ensure that a Thumb to Thumb call exceeding 4Mb generates a stub.
+
+ .global _start
+ .syntax unified
+
+@ We will place the section .text at 0x1000.
+
+ .text
+ .thumb_func
+_start:
+ bl bar
+
+@ We will place the section .foo at 0x02001014.
+
+ .section .foo, "xa"
+ .thumb_func
+bar:
+ bx lr
+
diff --git a/gold/testsuite/arm_farcall_thumb_thumb.sh b/gold/testsuite/arm_farcall_thumb_thumb.sh
new file mode 100755
index 0000000..23fb0cd
--- /dev/null
+++ b/gold/testsuite/arm_farcall_thumb_thumb.sh
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+# arm_farcall_thumb_thumb.sh -- a test case for Thumb->Thumb farcall veneers.
+
+# Copyright 2010, 2011, Free Software Foundation, Inc.
+# Written by Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
+# Based upon arm_cortex_a8.sh
+# Written by Doug Kwan <dougkwan@google.com>.
+
+# This file is part of gold.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+check()
+{
+ if ! grep -q "$2" "$1"
+ then
+ echo "Did not find expected instruction in $1:"
+ echo " $2"
+ echo ""
+ echo "Actual instructions below:"
+ cat "$1"
+ exit 1
+ fi
+}
+
+# Thumb->Thumb default
+check arm_farcall_thumb_thumb.stdout "1004: .* bx pc"
+check arm_farcall_thumb_thumb.stdout "1006: .* nop"
+check arm_farcall_thumb_thumb.stdout "1008: c000"
+check arm_farcall_thumb_thumb.stdout "100a: e59f"
+check arm_farcall_thumb_thumb.stdout "100c: ff1c e12f"
+check arm_farcall_thumb_thumb.stdout "1010: 1015"
+check arm_farcall_thumb_thumb.stdout "1012: 0200"
+
+# Thumb->Thumb with v5T interworking
+check arm_farcall_thumb_thumb_5t.stdout "1004: f004 e51f"
+check arm_farcall_thumb_thumb_5t.stdout "1008: 1015"
+check arm_farcall_thumb_thumb_5t.stdout "100a: 0200"
+
+# Thumb->Thumb on v6-M
+check arm_farcall_thumb_thumb_6m.stdout "1004: .* push {r0}"
+check arm_farcall_thumb_thumb_6m.stdout "1006: .* ldr r0, \\[pc, #8\\]"
+check arm_farcall_thumb_thumb_6m.stdout "1008: .* mov ip, r0"
+check arm_farcall_thumb_thumb_6m.stdout "100a: .* pop {r0}"
+check arm_farcall_thumb_thumb_6m.stdout "100c: .* bx ip"
+check arm_farcall_thumb_thumb_6m.stdout "100e: .* nop"
+check arm_farcall_thumb_thumb_6m.stdout "1010: 1015"
+check arm_farcall_thumb_thumb_6m.stdout "1012: 0200"
+
+# Thumb->Thumb on v7-M
+check arm_farcall_thumb_thumb_6m.stdout "1004: .* push {r0}"
+check arm_farcall_thumb_thumb_6m.stdout "1006: .* ldr r0, \\[pc, #8\\]"
+check arm_farcall_thumb_thumb_6m.stdout "1008: .* mov ip, r0"
+check arm_farcall_thumb_thumb_6m.stdout "100a: .* pop {r0}"
+check arm_farcall_thumb_thumb_6m.stdout "100c: .* bx ip"
+check arm_farcall_thumb_thumb_6m.stdout "100e: .* nop"
+check arm_farcall_thumb_thumb_6m.stdout "1010: 1015"
+check arm_farcall_thumb_thumb_6m.stdout "1012: 0200"
+
+exit 0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PING] [RFA] Fix gold's understanding of ARM v4T/v5T interworking
2011-09-26 14:48 [RFA] Fix gold's understanding of ARM v4T/v5T interworking Matthew Gretton-Dann
@ 2011-11-02 10:43 ` Matthew Gretton-Dann
2011-11-02 19:12 ` Ian Lance Taylor
1 sibling, 0 replies; 6+ messages in thread
From: Matthew Gretton-Dann @ 2011-11-02 10:43 UTC (permalink / raw)
To: binutils; +Cc: ian, "Doug Kwan (關振德)"
Ping.
On 26/09/11 15:47, Matthew Gretton-Dann wrote:
> Hi,
>
> Whilst preparing a patch for gold to work around an issue on ARM1176
> CPUs (forthcoming) I noticed that gold doesn't correctly identify
> between v4T and v5T. In particular:
>
> * It assumes BLX is available on v4T - it is not, BLX is only
> available from v5T.
> * It therefore assumes that using the availability of BLX is a good
> test for whether --fix-v4bx-interworking is also available.
>
> The attached patch fixes these two issues by splitting the
> Target_arm::may_use_blx() function into two:
> * Target_arm::may_use_v4t_interworking()
> * Target_arm::may_use_v5t_interworking()
>
> The tests which previous checked may_use_blx() are then directed to use
> one of the appropriate may_use_v#t_interworking queries.
>
> I also ported some of the ld-arm/farcall* tests to gold in order to test
> these fixes.
>
> Tested on arm-none-eabi.
>
> Can someone please review?
>
> Thanks,
>
> Matt
>
> gold/ChangeLog:
>
> 2011-09-20 Matthew Gretton-Dann<matthew.gretton-dann@arm.com>
>
> * arm.cc (Target_arm::Target_arm): Remove initialisation of
> may_use_blx_
> (Target_arm::may_use_blx): Remove method.
> (Target_arm::set_may_use_blx): Likewise.
> (Target_arm::may_use_v4t_interworking): New method.
> (Target_arm::may_use_v5t_interworking): Likewise.
> (Target_arm::may_use_blx_): Remove member variable.
> (Arm_relocate_functions::arm_branch_common): Check for v5T
> interworking.
> (Arm_relocate_functions::thumb_branch_common): Likewise.
> (Reloc_stub::stub_type_for_reloc): Likewise.
> (Target_arm::do_finalize_sections): Correct interworking checks.
> * testsuite/Makefile.am: Add new tests.
> * testsuite/Makefile.in: Regenerate.
> * testsuite/arm_farcall_arm_arm.s: New test.
> * testsuite/arm_farcall_arm_arm.sh: Likewise.
> * testsuite/arm_farcall_arm_thumb.s: Likewise.
> * testsuite/arm_farcall_arm_thumb.sh: Likewise.
> * testsuite/arm_farcall_thumb_arm.s: Likewise.
> * testsuite/arm_farcall_thumb_arm.sh: Likewise.
> * testsuite/arm_farcall_thumb_thumb.s: Likewise.
> * testsuite/arm_farcall_thumb_thumb.sh: Likewise.
>
>
>
> 1109-Add-may_use_v-45-t_interworking-functions.patch
>
>
> diff --git a/gold/arm.cc b/gold/arm.cc
> index f652677..c0a2049 100644
> --- a/gold/arm.cc
> +++ b/gold/arm.cc
> @@ -2177,21 +2177,11 @@ class Target_arm : public Sized_target<32, big_endian>
> copy_relocs_(elfcpp::R_ARM_COPY), dynbss_(NULL),
> got_mod_index_offset_(-1U), tls_base_symbol_defined_(false),
> stub_tables_(), stub_factory_(Stub_factory::get_instance()),
> - may_use_blx_(false), should_force_pic_veneer_(false),
> + should_force_pic_veneer_(false),
> arm_input_section_map_(), attributes_section_data_(NULL),
> fix_cortex_a8_(false), cortex_a8_relocs_info_()
> { }
>
> - // Whether we can use BLX.
> - bool
> - may_use_blx() const
> - { return this->may_use_blx_; }
> -
> - // Set use-BLX flag.
> - void
> - set_may_use_blx(bool value)
> - { this->may_use_blx_ = value; }
> -
> // Whether we force PCI branch veneers.
> bool
> should_force_pic_veneer() const
> @@ -2253,6 +2243,29 @@ class Target_arm : public Sized_target<32, big_endian>
> || arch == elfcpp::TAG_CPU_ARCH_V7
> || arch == elfcpp::TAG_CPU_ARCH_V7E_M);
> }
> +
> + // Whether we have v4T interworking instructions available.
> + bool
> + may_use_v4t_interworking() const
> + {
> + Object_attribute* attr =
> + this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
> + int arch = attr->int_value();
> + return (arch != elfcpp::TAG_CPU_ARCH_PRE_V4
> + && arch != elfcpp::TAG_CPU_ARCH_V4);
> + }
> +
> + // Whether we have v5T interworking instructions available.
> + bool
> + may_use_v5t_interworking() const
> + {
> + Object_attribute* attr =
> + this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
> + int arch = attr->int_value();
> + return (arch != elfcpp::TAG_CPU_ARCH_PRE_V4
> + && arch != elfcpp::TAG_CPU_ARCH_V4
> + && arch != elfcpp::TAG_CPU_ARCH_V4T);
> + }
>
> // Process the relocations to determine unreferenced sections for
> // garbage collection.
> @@ -2922,8 +2935,6 @@ class Target_arm : public Sized_target<32, big_endian>
> Stub_table_list stub_tables_;
> // Stub factory.
> const Stub_factory&stub_factory_;
> - // Whether we can use BLX.
> - bool may_use_blx_;
> // Whether we force PIC branch veneers.
> bool should_force_pic_veneer_;
> // Map for locating Arm_input_sections.
> @@ -3950,7 +3961,7 @@ Arm_relocate_functions<big_endian>::arm_branch_common(
>
> // We need a stub if the branch offset is too large or if we need
> // to switch mode.
> - bool may_use_blx = arm_target->may_use_blx();
> + bool may_use_blx = arm_target->may_use_v5t_interworking();
> Reloc_stub* stub = NULL;
>
> if (!parameters->options().relocatable()
> @@ -4081,7 +4092,7 @@ Arm_relocate_functions<big_endian>::thumb_branch_common(
> Arm_address branch_target = psymval->value(object, addend);
>
> // For BLX, bit 1 of target address comes from bit 1 of base address.
> - bool may_use_blx = arm_target->may_use_blx();
> + bool may_use_blx = arm_target->may_use_v5t_interworking();
> if (thumb_bit == 0&& may_use_blx)
> branch_target = utils::bit_select(branch_target, address, 0x2);
>
> @@ -4464,7 +4475,7 @@ Reloc_stub::stub_type_for_reloc(
> {
> const Target_arm<true>* big_endian_target =
> Target_arm<true>::default_target();
> - may_use_blx = big_endian_target->may_use_blx();
> + may_use_blx = big_endian_target->may_use_v5t_interworking();
> should_force_pic_veneer = big_endian_target->should_force_pic_veneer();
> thumb2 = big_endian_target->using_thumb2();
> thumb_only = big_endian_target->using_thumb_only();
> @@ -4473,7 +4484,7 @@ Reloc_stub::stub_type_for_reloc(
> {
> const Target_arm<false>* little_endian_target =
> Target_arm<false>::default_target();
> - may_use_blx = little_endian_target->may_use_blx();
> + may_use_blx = little_endian_target->may_use_v5t_interworking();
> should_force_pic_veneer = little_endian_target->should_force_pic_veneer();
> thumb2 = little_endian_target->using_thumb2();
> thumb_only = little_endian_target->using_thumb_only();
> @@ -8604,12 +8615,8 @@ Target_arm<big_endian>::do_finalize_sections(
> if (this->attributes_section_data_ == NULL)
> this->attributes_section_data_ = new Attributes_section_data(NULL, 0);
>
> - // Check BLX use.
> const Object_attribute* cpu_arch_attr =
> this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch);
> - if (cpu_arch_attr->int_value()> elfcpp::TAG_CPU_ARCH_V4)
> - this->set_may_use_blx(true);
> -
> // Check if we need to use Cortex-A8 workaround.
> if (parameters->options().user_set_fix_cortex_a8())
> this->fix_cortex_a8_ = parameters->options().fix_cortex_a8();
> @@ -8630,7 +8637,7 @@ Target_arm<big_endian>::do_finalize_sections(
> // The V4BX interworking stub contains BX instruction,
> // which is not specified for some profiles.
> if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING
> -&& !this->may_use_blx())
> +&& !this->may_use_v4t_interworking())
> gold_error(_("unable to provide V4BX reloc interworking fix up; "
> "the target profile does not support BX instruction"));
>
> @@ -11797,7 +11804,7 @@ Target_arm<big_endian>::scan_span_for_cortex_a8_erratum(
> // an ARM instruction. If we were not making a stub,
> // the BL would have been converted to a BLX. Use the
> // BLX stub instead in that case.
> - if (this->may_use_blx()&& force_target_arm
> + if (this->may_use_v5t_interworking()&& force_target_arm
> && stub_type == arm_stub_a8_veneer_bl)
> {
> stub_type = arm_stub_a8_veneer_blx;
> diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
> index ca07f87..75cd272 100644
> --- a/gold/testsuite/Makefile.am
> +++ b/gold/testsuite/Makefile.am
> @@ -2436,6 +2436,120 @@ arm_unaligned_reloc.o: arm_unaligned_reloc.s
>
> MOSTLYCLEANFILES += arm_unaligned_reloc
>
> +# Check ARM to ARM farcall veneers
> +
> +check_SCRIPTS += arm_farcall_arm_arm.sh
> +check_DATA += arm_farcall_arm_arm.stdout
> +
> +arm_farcall_arm_arm.stdout: arm_farcall_arm_arm
> + $(TEST_OBJDUMP) -d $< > $@
> +
> +arm_farcall_arm_arm: arm_farcall_arm_arm.o ../ld-new
> + ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001020 -o $@ $<
> +
> +arm_farcall_arm_arm.o: arm_farcall_arm_arm.s
> + $(TEST_AS) -o $@ $<
> +
> +MOSTLYCLEANFILES += arm_farcall_arm_arm
> +
> +# Check ARM to Thumb farcall veneers
> +
> +check_SCRIPTS += arm_farcall_arm_thumb.sh
> +check_DATA += arm_farcall_arm_thumb.stdout arm_farcall_arm_thumb_5t.stdout
> +
> +arm_farcall_arm_thumb.stdout: arm_farcall_arm_thumb
> + $(TEST_OBJDUMP) -D $< > $@
> +
> +arm_farcall_arm_thumb: arm_farcall_arm_thumb.o ../ld-new
> + ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +arm_farcall_arm_thumb.o: arm_farcall_arm_thumb.s
> + $(TEST_AS) -o $@ $<
> +
> +arm_farcall_arm_thumb_5t.stdout: arm_farcall_arm_thumb_5t
> + $(TEST_OBJDUMP) -D $< > $@
> +
> +arm_farcall_arm_thumb_5t: arm_farcall_arm_thumb_5t.o ../ld-new
> + ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +arm_farcall_arm_thumb_5t.o: arm_farcall_arm_thumb.s
> + $(TEST_AS) -march=armv5t -o $@ $<
> +
> +MOSTLYCLEANFILES += arm_farcall_arm_thumb arm_farcall_arm_thumb_5t
> +
> +# Check Thumb to Thumb farcall veneers
> +
> +check_SCRIPTS += arm_farcall_thumb_thumb.sh
> +check_DATA += arm_farcall_thumb_thumb.stdout \
> + arm_farcall_thumb_thumb_5t.stdout \
> + arm_farcall_thumb_thumb_7m.stdout \
> + arm_farcall_thumb_thumb_6m.stdout
> +
> +arm_farcall_thumb_thumb.stdout: arm_farcall_thumb_thumb
> + $(TEST_OBJDUMP) -D $< > $@
> +
> +arm_farcall_thumb_thumb: arm_farcall_thumb_thumb.o ../ld-new
> + ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +arm_farcall_thumb_thumb.o: arm_farcall_thumb_thumb.s
> + $(TEST_AS) -march=armv4t -o $@ $<
> +
> +arm_farcall_thumb_thumb_5t.stdout: arm_farcall_thumb_thumb_5t
> + $(TEST_OBJDUMP) -D $< > $@
> +
> +arm_farcall_thumb_thumb_5t: arm_farcall_thumb_thumb_5t.o ../ld-new
> + ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +arm_farcall_thumb_thumb_5t.o: arm_farcall_thumb_thumb.s
> + $(TEST_AS) -march=armv5t -o $@ $<
> +
> +arm_farcall_thumb_thumb_7m.stdout: arm_farcall_thumb_thumb_7m
> + $(TEST_OBJDUMP) -D $< > $@
> +
> +arm_farcall_thumb_thumb_7m: arm_farcall_thumb_thumb_7m.o ../ld-new
> + ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +arm_farcall_thumb_thumb_7m.o: arm_farcall_thumb_thumb.s
> + $(TEST_AS) -march=armv7-m -o $@ $<
> +
> +arm_farcall_thumb_thumb_6m.stdout: arm_farcall_thumb_thumb_6m
> + $(TEST_OBJDUMP) -D $< > $@
> +
> +arm_farcall_thumb_thumb_6m: arm_farcall_thumb_thumb_6m.o ../ld-new
> + ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +arm_farcall_thumb_thumb_6m.o: arm_farcall_thumb_thumb.s
> + $(TEST_AS) -march=armv6-m -o $@ $<
> +
> +MOSTLYCLEANFILES += arm_farcall_thumb_thumb arm_farcall_thumb_thumb_5t \
> + arm_farcall_thumb_thumb_7m arm_farcall_thumb_thumb_6m
> +
> +# Check Thumb to ARM farcall veneers
> +
> +check_SCRIPTS += arm_farcall_thumb_arm.sh
> +check_DATA += arm_farcall_thumb_arm.stdout \
> + arm_farcall_thumb_arm_5t.stdout
> +
> +arm_farcall_thumb_arm.stdout: arm_farcall_thumb_arm
> + $(TEST_OBJDUMP) -D $< > $@
> +
> +arm_farcall_thumb_arm: arm_farcall_thumb_arm.o ../ld-new
> + ../ld-new --section-start .text=0x1c01010 --section-start .foo=0x2001014 -o $@ $<
> +
> +arm_farcall_thumb_arm.o: arm_farcall_thumb_arm.s
> + $(TEST_AS) -o $@ $<
> +
> +arm_farcall_thumb_arm_5t.stdout: arm_farcall_thumb_arm_5t
> + $(TEST_OBJDUMP) -D $< > $@
> +
> +arm_farcall_thumb_arm_5t: arm_farcall_thumb_arm_5t.o ../ld-new
> + ../ld-new --section-start .text=0x1c01010 --section-start .foo=0x2001014 -o $@ $<
> +
> +arm_farcall_thumb_arm_5t.o: arm_farcall_thumb_arm.s
> + $(TEST_AS) -march=armv5t -o $@ $<
> +
> +MOSTLYCLEANFILES += arm_farcall_thumb_arm arm_farcall_thumb_arm_5t
> +
> endif DEFAULT_TARGET_ARM
>
> endif NATIVE_OR_CROSS_LINKER
> diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
> index f0339fd..0226275 100644
> --- a/gold/testsuite/Makefile.in
> +++ b/gold/testsuite/Makefile.in
> @@ -503,6 +503,14 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
>
>
> # Cortex-A8 workaround test.
> +
> +# Check ARM to ARM farcall veneers
> +
> +# Check ARM to Thumb farcall veneers
> +
> +# Check Thumb to Thumb farcall veneers
> +
> +# Check Thumb to ARM farcall veneers
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_64 = arm_abs_global.sh \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_branch_in_range.sh \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_branch_out_of_range.sh \
> @@ -511,7 +519,11 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8.sh \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_exidx_test.sh \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ pr12826.sh \
> -@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc.sh
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc.sh \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_arm.sh \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb.sh \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb.sh \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_arm.sh
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_65 = arm_abs_global.stdout \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_in_range.stdout \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_out_of_range.stdout \
> @@ -540,7 +552,16 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8_local_reloc.stdout \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_exidx_test.stdout \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ pr12826.stdout \
> -@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc.stdout
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc.stdout \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_arm.stdout \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb.stdout \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb_5t.stdout \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb.stdout \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_5t.stdout \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_7m.stdout \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_6m.stdout \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_arm.stdout \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_arm_5t.stdout
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_66 = arm_abs_global \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_in_range \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_out_of_range \
> @@ -567,7 +588,16 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8_blx \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8_local \
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8_local_reloc \
> -@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_arm \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb_5t \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_5t \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_7m \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_thumb_6m \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_arm \
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_thumb_arm_5t
> subdir = testsuite
> DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
> ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
> @@ -3644,6 +3674,14 @@ pr12826.sh.log: pr12826.sh
> @p='pr12826.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
> arm_unaligned_reloc.sh.log: arm_unaligned_reloc.sh
> @p='arm_unaligned_reloc.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
> +arm_farcall_arm_arm.sh.log: arm_farcall_arm_arm.sh
> + @p='arm_farcall_arm_arm.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
> +arm_farcall_arm_thumb.sh.log: arm_farcall_arm_thumb.sh
> + @p='arm_farcall_arm_thumb.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
> +arm_farcall_thumb_thumb.sh.log: arm_farcall_thumb_thumb.sh
> + @p='arm_farcall_thumb_thumb.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
> +arm_farcall_thumb_arm.sh.log: arm_farcall_thumb_arm.sh
> + @p='arm_farcall_thumb_arm.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
> object_unittest.log: object_unittest$(EXEEXT)
> @p='object_unittest$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
> binary_unittest.log: binary_unittest$(EXEEXT)
> @@ -5305,6 +5343,87 @@ uninstall-am:
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_unaligned_reloc.o: arm_unaligned_reloc.s
> @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -o $@ $<
>
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_arm.stdout: arm_farcall_arm_arm
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -d $< > $@
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_arm: arm_farcall_arm_arm.o ../ld-new
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001020 -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_arm.o: arm_farcall_arm_arm.s
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb.stdout: arm_farcall_arm_thumb
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb: arm_farcall_arm_thumb.o ../ld-new
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb.o: arm_farcall_arm_thumb.s
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb_5t.stdout: arm_farcall_arm_thumb_5t
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb_5t: arm_farcall_arm_thumb_5t.o ../ld-new
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_arm_thumb_5t.o: arm_farcall_arm_thumb.s
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv5t -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb.stdout: arm_farcall_thumb_thumb
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb: arm_farcall_thumb_thumb.o ../ld-new
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb.o: arm_farcall_thumb_thumb.s
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv4t -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_5t.stdout: arm_farcall_thumb_thumb_5t
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_5t: arm_farcall_thumb_thumb_5t.o ../ld-new
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_5t.o: arm_farcall_thumb_thumb.s
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv5t -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_7m.stdout: arm_farcall_thumb_thumb_7m
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_7m: arm_farcall_thumb_thumb_7m.o ../ld-new
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_7m.o: arm_farcall_thumb_thumb.s
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv7-m -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_6m.stdout: arm_farcall_thumb_thumb_6m
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_6m: arm_farcall_thumb_thumb_6m.o ../ld-new
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1000 --section-start .foo=0x2001014 -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_thumb_6m.o: arm_farcall_thumb_thumb.s
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv6-m -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm.stdout: arm_farcall_thumb_arm
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm: arm_farcall_thumb_arm.o ../ld-new
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1c01010 --section-start .foo=0x2001014 -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm.o: arm_farcall_thumb_arm.s
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm_5t.stdout: arm_farcall_thumb_arm_5t
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm_5t: arm_farcall_thumb_arm_5t.o ../ld-new
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new --section-start .text=0x1c01010 --section-start .foo=0x2001014 -o $@ $<
> +
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_farcall_thumb_arm_5t.o: arm_farcall_thumb_arm.s
> +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -march=armv5t -o $@ $<
> +
> # Tell versions [3.59,3.63) of GNU make to not export all variables.
> # Otherwise a system limit (for SysV at least) may be exceeded.
> .NOEXPORT:
> diff --git a/gold/testsuite/arm_farcall_arm_arm.s b/gold/testsuite/arm_farcall_arm_arm.s
> new file mode 100644
> index 0000000..00c1e48
> --- /dev/null
> +++ b/gold/testsuite/arm_farcall_arm_arm.s
> @@ -0,0 +1,20 @@
> +@ Test to ensure that a ARM to ARM call exceeding 32Mb generates a stub.
> +
> + .global _start
> + .syntax unified
> +
> +@ We will place the section .text at 0x1000.
> +
> + .text
> +
> +_start:
> + bl bar
> +
> +@ We will place the section .foo at 0x2001020.
> +
> + .section .foo, "xa"
> +
> + .type bar, %function
> +bar:
> + bx lr
> +
> diff --git a/gold/testsuite/arm_farcall_arm_arm.sh b/gold/testsuite/arm_farcall_arm_arm.sh
> new file mode 100755
> index 0000000..7d95528
> --- /dev/null
> +++ b/gold/testsuite/arm_farcall_arm_arm.sh
> @@ -0,0 +1,44 @@
> +#!/bin/sh
> +
> +# arm_farcall_arm_arm.sh -- a test case for ARM->ARM farcall veneers
> +
> +# Copyright 2010, 2011, Free Software Foundation, Inc.
> +# Written by Matthew Gretton-Dann<matthew.gretton-dann@arm.com>
> +# Based upon arm_cortex_a8.sh
> +# Written by Doug Kwan<dougkwan@google.com>.
> +
> +# This file is part of gold.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
> +# MA 02110-1301, USA.
> +
> +check()
> +{
> + if ! grep -q "$2" "$1"
> + then
> + echo "Did not find expected instruction in $1:"
> + echo " $2"
> + echo ""
> + echo "Actual instructions below:"
> + cat "$1"
> + exit 1
> + fi
> +}
> +
> +# Check for ARM->ARM default
> +check arm_farcall_arm_arm.stdout "1004: .* ldr pc, \[pc, #-4\] .*"
> +check arm_farcall_arm_arm.stdout "1008: 02001020"
> +
> +exit 0
> diff --git a/gold/testsuite/arm_farcall_arm_thumb.s b/gold/testsuite/arm_farcall_arm_thumb.s
> new file mode 100644
> index 0000000..c69f31c
> --- /dev/null
> +++ b/gold/testsuite/arm_farcall_arm_thumb.s
> @@ -0,0 +1,20 @@
> +@ Test to ensure that a ARM to Thumb call exceeding 32Mb generates a stub.
> +
> + .global _start
> + .global bar
> + .syntax unified
> +
> +@ We will place the section .text at 0x1000.
> +
> + .text
> +
> +_start:
> + bl bar
> +
> +@ We will place the section .foo at 0x2001010.
> +
> + .section .foo, "xa"
> + .thumb_func
> +bar:
> + bx lr
> +
> diff --git a/gold/testsuite/arm_farcall_arm_thumb.sh b/gold/testsuite/arm_farcall_arm_thumb.sh
> new file mode 100755
> index 0000000..2df2d65
> --- /dev/null
> +++ b/gold/testsuite/arm_farcall_arm_thumb.sh
> @@ -0,0 +1,50 @@
> +#!/bin/sh
> +
> +# arm_farcall_arm_thumb.sh -- a test case for ARM->Thumb farcall veneers.
> +
> +# Copyright 2010, 2011, Free Software Foundation, Inc.
> +# Written by Matthew Gretton-Dann<matthew.gretton-dann@arm.com>
> +# Based upon arm_cortex_a8.sh
> +# Written by Doug Kwan<dougkwan@google.com>.
> +
> +# This file is part of gold.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
> +# MA 02110-1301, USA.
> +
> +check()
> +{
> + if ! grep -q "$2" "$1"
> + then
> + echo "Did not find expected instruction in $1:"
> + echo " $2"
> + echo ""
> + echo "Actual instructions below:"
> + cat "$1"
> + exit 1
> + fi
> +}
> +
> +# Check for ARM->Thumb default
> +check arm_farcall_arm_thumb.stdout "1004: .* ldr ip, \[pc\]"
> +check arm_farcall_arm_thumb.stdout "1008: .* bx ip"
> +check arm_farcall_arm_thumb.stdout "100c: 02001015"
> +
> +# Check for ARM->Thumb with v5t interworking
> +chck arm_farcall_arm_thumb_5t.stdout "1004: f004 e51f"
> +chck arm_farcall_arm_thumb_5t.stdout "1008: 1015"
> +chck arm_farcall_arm_thumb_5t.stdout "100a: 0200"
> +
> +exit 0
> diff --git a/gold/testsuite/arm_farcall_thumb_arm.s b/gold/testsuite/arm_farcall_thumb_arm.s
> new file mode 100644
> index 0000000..1fd6a07
> --- /dev/null
> +++ b/gold/testsuite/arm_farcall_thumb_arm.s
> @@ -0,0 +1,27 @@
> +@ Test to ensure that a Thumb to ARM call exceeding 4Mb generates a stub.
> +@ Check that we can generate two types of stub in the same section.
> +
> + .global _start
> + .syntax unified
> +
> +@ We will place the section .text at 0x1c01010.
> +
> + .text
> + .thumb_func
> +_start:
> + .global bar
> + bl bar
> +@ This call is close enough to generate a "short branch" stub
> +@ or no stub if blx is available.
> + .space 0x0300000
> + bl bar
> +
> +@ We will place the section .foo at 0x2001014.
> +
> + .section .foo, "xa"
> +
> + .arm
> + .type bar, %function
> +bar:
> + bx lr
> +
> diff --git a/gold/testsuite/arm_farcall_thumb_arm.sh b/gold/testsuite/arm_farcall_thumb_arm.sh
> new file mode 100755
> index 0000000..e22da46
> --- /dev/null
> +++ b/gold/testsuite/arm_farcall_thumb_arm.sh
> @@ -0,0 +1,56 @@
> +#!/bin/sh
> +
> +# arm_farcall_thumb_arm.sh -- a test case for Thumb->ARM farcall veneers.
> +
> +# Copyright 2010, 2011, Free Software Foundation, Inc.
> +# Written by Matthew Gretton-Dann<matthew.gretton-dann@arm.com>
> +# Based upon arm_cortex_a8.sh
> +# Written by Doug Kwan<dougkwan@google.com>.
> +
> +# This file is part of gold.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
> +# MA 02110-1301, USA.
> +
> +check()
> +{
> + if ! grep -q "$2" "$1"
> + then
> + echo "Did not find expected instruction in $1:"
> + echo " $2"
> + echo ""
> + echo "Actual instructions below:"
> + cat "$1"
> + exit 1
> + fi
> +}
> +
> +# Thumb->ARM
> +check arm_farcall_thumb_arm.stdout "1f01018: .* bx pc"
> +check arm_farcall_thumb_arm.stdout "1f0101a: .* nop"
> +check arm_farcall_thumb_arm.stdout "1f0101c: f004 e51f"
> +check arm_farcall_thumb_arm.stdout "1f01020: 1014"
> +check arm_farcall_thumb_arm.stdout "1f01022: 0200"
> +
> +check arm_farcall_thumb_arm.stdout "1f01024: .* bx pc"
> +check arm_farcall_thumb_arm.stdout "1f01026: .* nop"
> +check arm_farcall_thumb_arm.stdout "1f01028: fff9 ea03"
> +
> +# Thumb->ARM with v5T interworking
> +check arm_farcall_thumb_arm_5t.stdout "1f01018: f004 e51f"
> +check arm_farcall_thumb_arm_5t.stdout "1f0101c: 1014"
> +check arm_farcall_thumb_arm_5t.stdout "1f0101e: 0200"
> +
> +exit 0
> diff --git a/gold/testsuite/arm_farcall_thumb_thumb.s b/gold/testsuite/arm_farcall_thumb_thumb.s
> new file mode 100644
> index 0000000..650b1a6
> --- /dev/null
> +++ b/gold/testsuite/arm_farcall_thumb_thumb.s
> @@ -0,0 +1,19 @@
> +@ Test to ensure that a Thumb to Thumb call exceeding 4Mb generates a stub.
> +
> + .global _start
> + .syntax unified
> +
> +@ We will place the section .text at 0x1000.
> +
> + .text
> + .thumb_func
> +_start:
> + bl bar
> +
> +@ We will place the section .foo at 0x02001014.
> +
> + .section .foo, "xa"
> + .thumb_func
> +bar:
> + bx lr
> +
> diff --git a/gold/testsuite/arm_farcall_thumb_thumb.sh b/gold/testsuite/arm_farcall_thumb_thumb.sh
> new file mode 100755
> index 0000000..23fb0cd
> --- /dev/null
> +++ b/gold/testsuite/arm_farcall_thumb_thumb.sh
> @@ -0,0 +1,74 @@
> +#!/bin/sh
> +
> +# arm_farcall_thumb_thumb.sh -- a test case for Thumb->Thumb farcall veneers.
> +
> +# Copyright 2010, 2011, Free Software Foundation, Inc.
> +# Written by Matthew Gretton-Dann<matthew.gretton-dann@arm.com>
> +# Based upon arm_cortex_a8.sh
> +# Written by Doug Kwan<dougkwan@google.com>.
> +
> +# This file is part of gold.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
> +# MA 02110-1301, USA.
> +
> +check()
> +{
> + if ! grep -q "$2" "$1"
> + then
> + echo "Did not find expected instruction in $1:"
> + echo " $2"
> + echo ""
> + echo "Actual instructions below:"
> + cat "$1"
> + exit 1
> + fi
> +}
> +
> +# Thumb->Thumb default
> +check arm_farcall_thumb_thumb.stdout "1004: .* bx pc"
> +check arm_farcall_thumb_thumb.stdout "1006: .* nop"
> +check arm_farcall_thumb_thumb.stdout "1008: c000"
> +check arm_farcall_thumb_thumb.stdout "100a: e59f"
> +check arm_farcall_thumb_thumb.stdout "100c: ff1c e12f"
> +check arm_farcall_thumb_thumb.stdout "1010: 1015"
> +check arm_farcall_thumb_thumb.stdout "1012: 0200"
> +
> +# Thumb->Thumb with v5T interworking
> +check arm_farcall_thumb_thumb_5t.stdout "1004: f004 e51f"
> +check arm_farcall_thumb_thumb_5t.stdout "1008: 1015"
> +check arm_farcall_thumb_thumb_5t.stdout "100a: 0200"
> +
> +# Thumb->Thumb on v6-M
> +check arm_farcall_thumb_thumb_6m.stdout "1004: .* push {r0}"
> +check arm_farcall_thumb_thumb_6m.stdout "1006: .* ldr r0, \\[pc, #8\\]"
> +check arm_farcall_thumb_thumb_6m.stdout "1008: .* mov ip, r0"
> +check arm_farcall_thumb_thumb_6m.stdout "100a: .* pop {r0}"
> +check arm_farcall_thumb_thumb_6m.stdout "100c: .* bx ip"
> +check arm_farcall_thumb_thumb_6m.stdout "100e: .* nop"
> +check arm_farcall_thumb_thumb_6m.stdout "1010: 1015"
> +check arm_farcall_thumb_thumb_6m.stdout "1012: 0200"
> +
> +# Thumb->Thumb on v7-M
> +check arm_farcall_thumb_thumb_6m.stdout "1004: .* push {r0}"
> +check arm_farcall_thumb_thumb_6m.stdout "1006: .* ldr r0, \\[pc, #8\\]"
> +check arm_farcall_thumb_thumb_6m.stdout "1008: .* mov ip, r0"
> +check arm_farcall_thumb_thumb_6m.stdout "100a: .* pop {r0}"
> +check arm_farcall_thumb_thumb_6m.stdout "100c: .* bx ip"
> +check arm_farcall_thumb_thumb_6m.stdout "100e: .* nop"
> +check arm_farcall_thumb_thumb_6m.stdout "1010: 1015"
> +check arm_farcall_thumb_thumb_6m.stdout "1012: 0200"
> +
> +exit 0
--
Matthew Gretton-Dann
Principal Engineer, PD Software - Tools, ARM Ltd
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFA] Fix gold's understanding of ARM v4T/v5T interworking
2011-09-26 14:48 [RFA] Fix gold's understanding of ARM v4T/v5T interworking Matthew Gretton-Dann
2011-11-02 10:43 ` [PING] " Matthew Gretton-Dann
@ 2011-11-02 19:12 ` Ian Lance Taylor
2011-11-10 11:27 ` Matthew Gretton-Dann
1 sibling, 1 reply; 6+ messages in thread
From: Ian Lance Taylor @ 2011-11-02 19:12 UTC (permalink / raw)
To: Matthew Gretton-Dann; +Cc: binutils
Matthew Gretton-Dann <matthew.gretton-dann@arm.com> writes:
> 2011-09-20 Matthew Gretton-Dann<matthew.gretton-dann@arm.com>
>
> * arm.cc (Target_arm::Target_arm): Remove initialisation of
> may_use_blx_
> (Target_arm::may_use_blx): Remove method.
> (Target_arm::set_may_use_blx): Likewise.
> (Target_arm::may_use_v4t_interworking): New method.
> (Target_arm::may_use_v5t_interworking): Likewise.
> (Target_arm::may_use_blx_): Remove member variable.
> (Arm_relocate_functions::arm_branch_common): Check for v5T
> interworking.
> (Arm_relocate_functions::thumb_branch_common): Likewise.
> (Reloc_stub::stub_type_for_reloc): Likewise.
> (Target_arm::do_finalize_sections): Correct interworking checks.
> * testsuite/Makefile.am: Add new tests.
> * testsuite/Makefile.in: Regenerate.
> * testsuite/arm_farcall_arm_arm.s: New test.
> * testsuite/arm_farcall_arm_arm.sh: Likewise.
> * testsuite/arm_farcall_arm_thumb.s: Likewise.
> * testsuite/arm_farcall_arm_thumb.sh: Likewise.
> * testsuite/arm_farcall_thumb_arm.s: Likewise.
> * testsuite/arm_farcall_thumb_arm.sh: Likewise.
> * testsuite/arm_farcall_thumb_thumb.s: Likewise.
> * testsuite/arm_farcall_thumb_thumb.sh: Likewise.
Committed.
Sorry for the delay.
Ian
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFA] Fix gold's understanding of ARM v4T/v5T interworking
2011-11-02 19:12 ` Ian Lance Taylor
@ 2011-11-10 11:27 ` Matthew Gretton-Dann
2011-11-10 14:33 ` Tristan Gingold
2011-11-10 18:30 ` Ian Lance Taylor
0 siblings, 2 replies; 6+ messages in thread
From: Matthew Gretton-Dann @ 2011-11-10 11:27 UTC (permalink / raw)
To: Ian Lance Taylor; +Cc: binutils, gingold
Ian, Tristan,
On 02/11/11 19:11, Ian Lance Taylor wrote:
> Matthew Gretton-Dann<matthew.gretton-dann@arm.com> writes:
>
>> 2011-09-20 Matthew Gretton-Dann<matthew.gretton-dann@arm.com>
>>
>> * arm.cc (Target_arm::Target_arm): Remove initialisation of
>> may_use_blx_
>> (Target_arm::may_use_blx): Remove method.
>> (Target_arm::set_may_use_blx): Likewise.
>> (Target_arm::may_use_v4t_interworking): New method.
>> (Target_arm::may_use_v5t_interworking): Likewise.
>> (Target_arm::may_use_blx_): Remove member variable.
>> (Arm_relocate_functions::arm_branch_common): Check for v5T
>> interworking.
>> (Arm_relocate_functions::thumb_branch_common): Likewise.
>> (Reloc_stub::stub_type_for_reloc): Likewise.
>> (Target_arm::do_finalize_sections): Correct interworking checks.
>> * testsuite/Makefile.am: Add new tests.
>> * testsuite/Makefile.in: Regenerate.
>> * testsuite/arm_farcall_arm_arm.s: New test.
>> * testsuite/arm_farcall_arm_arm.sh: Likewise.
>> * testsuite/arm_farcall_arm_thumb.s: Likewise.
>> * testsuite/arm_farcall_arm_thumb.sh: Likewise.
>> * testsuite/arm_farcall_thumb_arm.s: Likewise.
>> * testsuite/arm_farcall_thumb_arm.sh: Likewise.
>> * testsuite/arm_farcall_thumb_thumb.s: Likewise.
>> * testsuite/arm_farcall_thumb_thumb.sh: Likewise.
>
> Committed.
>
> Sorry for the delay.
Are you happy for this patch to be backported to the 2.22 branch?
Thanks,
Matt
--
Matthew Gretton-Dann
Principal Engineer, PD Software - Tools, ARM Ltd
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFA] Fix gold's understanding of ARM v4T/v5T interworking
2011-11-10 11:27 ` Matthew Gretton-Dann
@ 2011-11-10 14:33 ` Tristan Gingold
2011-11-10 18:30 ` Ian Lance Taylor
1 sibling, 0 replies; 6+ messages in thread
From: Tristan Gingold @ 2011-11-10 14:33 UTC (permalink / raw)
To: Matthew Gretton-Dann; +Cc: Ian Lance Taylor, binutils
On Nov 10, 2011, at 12:27 PM, Matthew Gretton-Dann wrote:
> Ian, Tristan,
>
> On 02/11/11 19:11, Ian Lance Taylor wrote:
>> Matthew Gretton-Dann<matthew.gretton-dann@arm.com> writes:
>>
>>> 2011-09-20 Matthew Gretton-Dann<matthew.gretton-dann@arm.com>
>>>
>>> * arm.cc (Target_arm::Target_arm): Remove initialisation of
>>> may_use_blx_
>>> (Target_arm::may_use_blx): Remove method.
>>> (Target_arm::set_may_use_blx): Likewise.
>>> (Target_arm::may_use_v4t_interworking): New method.
>>> (Target_arm::may_use_v5t_interworking): Likewise.
>>> (Target_arm::may_use_blx_): Remove member variable.
>>> (Arm_relocate_functions::arm_branch_common): Check for v5T
>>> interworking.
>>> (Arm_relocate_functions::thumb_branch_common): Likewise.
>>> (Reloc_stub::stub_type_for_reloc): Likewise.
>>> (Target_arm::do_finalize_sections): Correct interworking checks.
>>> * testsuite/Makefile.am: Add new tests.
>>> * testsuite/Makefile.in: Regenerate.
>>> * testsuite/arm_farcall_arm_arm.s: New test.
>>> * testsuite/arm_farcall_arm_arm.sh: Likewise.
>>> * testsuite/arm_farcall_arm_thumb.s: Likewise.
>>> * testsuite/arm_farcall_arm_thumb.sh: Likewise.
>>> * testsuite/arm_farcall_thumb_arm.s: Likewise.
>>> * testsuite/arm_farcall_thumb_arm.sh: Likewise.
>>> * testsuite/arm_farcall_thumb_thumb.s: Likewise.
>>> * testsuite/arm_farcall_thumb_thumb.sh: Likewise.
>>
>> Committed.
>>
>> Sorry for the delay.
>
> Are you happy for this patch to be backported to the 2.22 branch?
Fine with me.
>
> Thanks,
>
> Matt
>
> --
> Matthew Gretton-Dann
> Principal Engineer, PD Software - Tools, ARM Ltd
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFA] Fix gold's understanding of ARM v4T/v5T interworking
2011-11-10 11:27 ` Matthew Gretton-Dann
2011-11-10 14:33 ` Tristan Gingold
@ 2011-11-10 18:30 ` Ian Lance Taylor
1 sibling, 0 replies; 6+ messages in thread
From: Ian Lance Taylor @ 2011-11-10 18:30 UTC (permalink / raw)
To: Matthew Gretton-Dann; +Cc: binutils, gingold
Matthew Gretton-Dann <matthew.gretton-dann@arm.com> writes:
> Ian, Tristan,
>
> On 02/11/11 19:11, Ian Lance Taylor wrote:
>> Matthew Gretton-Dann<matthew.gretton-dann@arm.com> writes:
>>
>>> 2011-09-20 Matthew Gretton-Dann<matthew.gretton-dann@arm.com>
>>>
>>> * arm.cc (Target_arm::Target_arm): Remove initialisation of
>>> may_use_blx_
>>> (Target_arm::may_use_blx): Remove method.
>>> (Target_arm::set_may_use_blx): Likewise.
>>> (Target_arm::may_use_v4t_interworking): New method.
>>> (Target_arm::may_use_v5t_interworking): Likewise.
>>> (Target_arm::may_use_blx_): Remove member variable.
>>> (Arm_relocate_functions::arm_branch_common): Check for v5T
>>> interworking.
>>> (Arm_relocate_functions::thumb_branch_common): Likewise.
>>> (Reloc_stub::stub_type_for_reloc): Likewise.
>>> (Target_arm::do_finalize_sections): Correct interworking checks.
>>> * testsuite/Makefile.am: Add new tests.
>>> * testsuite/Makefile.in: Regenerate.
>>> * testsuite/arm_farcall_arm_arm.s: New test.
>>> * testsuite/arm_farcall_arm_arm.sh: Likewise.
>>> * testsuite/arm_farcall_arm_thumb.s: Likewise.
>>> * testsuite/arm_farcall_arm_thumb.sh: Likewise.
>>> * testsuite/arm_farcall_thumb_arm.s: Likewise.
>>> * testsuite/arm_farcall_thumb_arm.sh: Likewise.
>>> * testsuite/arm_farcall_thumb_thumb.s: Likewise.
>>> * testsuite/arm_farcall_thumb_thumb.sh: Likewise.
>>
>> Committed.
>>
>> Sorry for the delay.
>
> Are you happy for this patch to be backported to the 2.22 branch?
It's fine with me.
Ian
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2011-11-10 18:30 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-09-26 14:48 [RFA] Fix gold's understanding of ARM v4T/v5T interworking Matthew Gretton-Dann
2011-11-02 10:43 ` [PING] " Matthew Gretton-Dann
2011-11-02 19:12 ` Ian Lance Taylor
2011-11-10 11:27 ` Matthew Gretton-Dann
2011-11-10 14:33 ` Tristan Gingold
2011-11-10 18:30 ` Ian Lance Taylor
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).