* 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.
This commit is contained in:
Ian Lance Taylor 2011-11-02 19:11:48 +00:00
parent f179e16214
commit cd6eab1c16
12 changed files with 601 additions and 26 deletions

View File

@ -1,3 +1,28 @@
2011-11-02 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.
2011-10-31 Cary Coutant <ccoutant@google.com>
PR gold/13023

View File

@ -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;

View File

@ -2471,6 +2471,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

View File

@ -509,6 +509,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 \
@ -517,7 +525,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 \
@ -546,7 +558,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 \
@ -573,7 +594,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
@ -3688,6 +3718,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)
@ -5371,6 +5409,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:

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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