diff options
author | Doug Kwan <dougkwan@google.com> | 2010-03-22 22:48:05 +0000 |
---|---|---|
committer | Doug Kwan <dougkwan@google.com> | 2010-03-22 22:48:05 +0000 |
commit | a2c7281b72172647cccb72d921839f5034b2d381 (patch) | |
tree | 2a5aee4f36d1555c9933b37ce00942fb043eb378 /gold/testsuite | |
parent | f9b58c5ba68696e797030f26a469cc432cf20397 (diff) | |
download | gdb-a2c7281b72172647cccb72d921839f5034b2d381.zip gdb-a2c7281b72172647cccb72d921839f5034b2d381.tar.gz gdb-a2c7281b72172647cccb72d921839f5034b2d381.tar.bz2 |
2010-03-22 Doug Kwan <dougkwan@google.com>
* arm.cc (Arm_relocate_functions::abs8,
Arm_relocate_functions::abs16): Use correct check for overflow
specified in the ARM ELF specs.
(Arm_relocate_functions): thumb_branch_common. Handle bit 1 of branch
target of a BLX instruction specially.
(Reloc_stub::stub_type_for_reloc): Ditto.
(Relocate::relocate): Use symbolic names instead of numeric relocation
codes to report error.
(Target_arm::do_relox): Reduce default stub-group size for Cortex-A8
workaround.
* testsuite/Makefile.am (check_DATA): add thumb_blx_in_range.stdout,
thumb_blx_out_of_range.stdout, thumb2_blx_in_range.stdout and
thumb2_blx_out_of_range.stdout
(thumb_bl_out_of_range, thumb_bl_out_of_range.o,
thumb2_bl_out_of_range, thumb2_bl_out_of_range.o): Fix dependenices.
(thumb_blx_in_range.stdout, thumb_blx_in_range, thumb_blx_in_range.o,
thumb_blx_out_of_range.stdout, thumb_blx_out_of_range,
thumb_blx_out_of_range.o, thumb2_blx_in_range.stdout,
thumb2_blx_in_range, thumb2_blx_in_range.o,
thumb2_blx_out_of_range.stdout, thumb2_blx_out_of_range,
thumb2_blx_out_of_range.o): New rules.
(MOSTLYCLEANFILES): Add thumb_blx_in_range, thumb_blx_out_of_range,
thumb2_blx_in_range and thumb2_blx_out_of_range.
* testsuite/Makefile.in: Regenerate.
* arm_branch_in_range.sh: Add tests for THUMB BLX.
* testsuite/thumb_blx_in_range.s: New file.
* testsuite/thumb_blx_out_of_range.s: New file.
Diffstat (limited to 'gold/testsuite')
-rw-r--r-- | gold/testsuite/Makefile.am | 52 | ||||
-rw-r--r-- | gold/testsuite/Makefile.in | 54 | ||||
-rwxr-xr-x | gold/testsuite/arm_branch_in_range.sh | 9 | ||||
-rw-r--r-- | gold/testsuite/thumb_blx_in_range.s | 64 | ||||
-rw-r--r-- | gold/testsuite/thumb_blx_out_of_range.s | 61 |
5 files changed, 228 insertions, 12 deletions
diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am index a083bc4..b115283 100644 --- a/gold/testsuite/Makefile.am +++ b/gold/testsuite/Makefile.am @@ -1488,7 +1488,9 @@ MOSTLYCLEANFILES += arm_abs_global check_SCRIPTS += arm_branch_in_range.sh check_DATA += arm_bl_in_range.stdout arm_bl_out_of_range.stdout \ thumb_bl_in_range.stdout thumb_bl_out_of_range.stdout \ - thumb2_bl_in_range.stdout thumb2_bl_out_of_range.stdout + thumb2_bl_in_range.stdout thumb2_bl_out_of_range.stdout \ + thumb_blx_in_range.stdout thumb_blx_out_of_range.stdout \ + thumb2_blx_in_range.stdout thumb2_blx_out_of_range.stdout arm_bl_in_range.stdout: arm_bl_in_range $(TEST_OBJDUMP) -D $< > $@ @@ -1520,10 +1522,10 @@ thumb_bl_in_range.o: thumb_bl_in_range.s thumb_bl_out_of_range.stdout: thumb_bl_out_of_range $(TEST_OBJDUMP) -D $< > $@ -thumb_bl_out_of_range: thumb_bl_in_range.o ../ld-new +thumb_bl_out_of_range: thumb_bl_out_of_range.o ../ld-new ../ld-new -T $(srcdir)/thumb_branch_range.t -o $@ $< -thumb_bl_out_of_range.o: thumb_bl_in_range.s +thumb_bl_out_of_range.o: thumb_bl_out_of_range.s $(TEST_AS) -o $@ -march=armv5te $< thumb2_bl_in_range.stdout: thumb2_bl_in_range @@ -1538,14 +1540,52 @@ thumb2_bl_in_range.o: thumb_bl_in_range.s thumb2_bl_out_of_range.stdout: thumb2_bl_out_of_range $(TEST_OBJDUMP) -D $< > $@ -thumb2_bl_out_of_range: thumb2_bl_in_range.o ../ld-new +thumb2_bl_out_of_range: thumb2_bl_out_of_range.o ../ld-new ../ld-new -T $(srcdir)/thumb2_branch_range.t -o $@ $< -thumb2_bl_out_of_range.o: thumb_bl_in_range.s +thumb2_bl_out_of_range.o: thumb_bl_out_of_range.s + $(TEST_AS) -o $@ -march=armv7-a $< + +thumb_blx_in_range.stdout: thumb_blx_in_range + $(TEST_OBJDUMP) -D $< > $@ + +thumb_blx_in_range: thumb_blx_in_range.o ../ld-new + ../ld-new -T $(srcdir)/thumb_branch_range.t -o $@ $< + +thumb_blx_in_range.o: thumb_blx_in_range.s + $(TEST_AS) -o $@ -march=armv5te $< + +thumb_blx_out_of_range.stdout: thumb_blx_out_of_range + $(TEST_OBJDUMP) -D $< > $@ + +thumb_blx_out_of_range: thumb_blx_out_of_range.o ../ld-new + ../ld-new -T $(srcdir)/thumb_branch_range.t -o $@ $< + +thumb_blx_out_of_range.o: thumb_blx_out_of_range.s + $(TEST_AS) -o $@ -march=armv5te $< + +thumb2_blx_in_range.stdout: thumb2_blx_in_range + $(TEST_OBJDUMP) -D $< > $@ + +thumb2_blx_in_range: thumb2_blx_in_range.o ../ld-new + ../ld-new -T $(srcdir)/thumb2_branch_range.t -o $@ $< + +thumb2_blx_in_range.o: thumb_blx_in_range.s + $(TEST_AS) -o $@ -march=armv7-a $< + +thumb2_blx_out_of_range.stdout: thumb2_blx_out_of_range + $(TEST_OBJDUMP) -D $< > $@ + +thumb2_blx_out_of_range: thumb2_blx_out_of_range.o ../ld-new + ../ld-new -T $(srcdir)/thumb2_branch_range.t -o $@ $< + +thumb2_blx_out_of_range.o: thumb_blx_out_of_range.s $(TEST_AS) -o $@ -march=armv7-a $< MOSTLYCLEANFILES += arm_bl_in_range arm_bl_out_of_range thumb_bl_in_range \ - thumb_bl_out_of_range thumb2_bl_in_range thumb2_bl_out_of_range + thumb_bl_out_of_range thumb2_bl_in_range thumb2_bl_out_of_range \ + thumb_blx_in_range thumb_blx_out_of_range thumb2_blx_in_range \ + thumb2_blx_out_of_range check_SCRIPTS += arm_fix_v4bx.sh check_DATA += arm_fix_v4bx.stdout arm_fix_v4bx_interworking.stdout \ diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in index d21b32b..061c627 100644 --- a/gold/testsuite/Makefile.in +++ b/gold/testsuite/Makefile.in @@ -338,6 +338,10 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \ @DEFAULT_TARGET_ARM_TRUE@ thumb_bl_out_of_range.stdout \ @DEFAULT_TARGET_ARM_TRUE@ thumb2_bl_in_range.stdout \ @DEFAULT_TARGET_ARM_TRUE@ thumb2_bl_out_of_range.stdout \ +@DEFAULT_TARGET_ARM_TRUE@ thumb_blx_in_range.stdout \ +@DEFAULT_TARGET_ARM_TRUE@ thumb_blx_out_of_range.stdout \ +@DEFAULT_TARGET_ARM_TRUE@ thumb2_blx_in_range.stdout \ +@DEFAULT_TARGET_ARM_TRUE@ thumb2_blx_out_of_range.stdout \ @DEFAULT_TARGET_ARM_TRUE@ arm_fix_v4bx.stdout \ @DEFAULT_TARGET_ARM_TRUE@ arm_fix_v4bx_interworking.stdout \ @DEFAULT_TARGET_ARM_TRUE@ arm_no_fix_v4bx.stdout @@ -346,7 +350,11 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \ @DEFAULT_TARGET_ARM_TRUE@ thumb_bl_in_range \ @DEFAULT_TARGET_ARM_TRUE@ thumb_bl_out_of_range \ @DEFAULT_TARGET_ARM_TRUE@ thumb2_bl_in_range \ -@DEFAULT_TARGET_ARM_TRUE@ thumb2_bl_out_of_range arm_fix_v4bx \ +@DEFAULT_TARGET_ARM_TRUE@ thumb2_bl_out_of_range \ +@DEFAULT_TARGET_ARM_TRUE@ thumb_blx_in_range \ +@DEFAULT_TARGET_ARM_TRUE@ thumb_blx_out_of_range \ +@DEFAULT_TARGET_ARM_TRUE@ thumb2_blx_in_range \ +@DEFAULT_TARGET_ARM_TRUE@ thumb2_blx_out_of_range arm_fix_v4bx \ @DEFAULT_TARGET_ARM_TRUE@ arm_fix_v4bx_interworking \ @DEFAULT_TARGET_ARM_TRUE@ arm_no_fix_v4bx subdir = testsuite @@ -3288,10 +3296,10 @@ uninstall-am: @DEFAULT_TARGET_ARM_TRUE@thumb_bl_out_of_range.stdout: thumb_bl_out_of_range @DEFAULT_TARGET_ARM_TRUE@ $(TEST_OBJDUMP) -D $< > $@ -@DEFAULT_TARGET_ARM_TRUE@thumb_bl_out_of_range: thumb_bl_in_range.o ../ld-new +@DEFAULT_TARGET_ARM_TRUE@thumb_bl_out_of_range: thumb_bl_out_of_range.o ../ld-new @DEFAULT_TARGET_ARM_TRUE@ ../ld-new -T $(srcdir)/thumb_branch_range.t -o $@ $< -@DEFAULT_TARGET_ARM_TRUE@thumb_bl_out_of_range.o: thumb_bl_in_range.s +@DEFAULT_TARGET_ARM_TRUE@thumb_bl_out_of_range.o: thumb_bl_out_of_range.s @DEFAULT_TARGET_ARM_TRUE@ $(TEST_AS) -o $@ -march=armv5te $< @DEFAULT_TARGET_ARM_TRUE@thumb2_bl_in_range.stdout: thumb2_bl_in_range @@ -3306,10 +3314,46 @@ uninstall-am: @DEFAULT_TARGET_ARM_TRUE@thumb2_bl_out_of_range.stdout: thumb2_bl_out_of_range @DEFAULT_TARGET_ARM_TRUE@ $(TEST_OBJDUMP) -D $< > $@ -@DEFAULT_TARGET_ARM_TRUE@thumb2_bl_out_of_range: thumb2_bl_in_range.o ../ld-new +@DEFAULT_TARGET_ARM_TRUE@thumb2_bl_out_of_range: thumb2_bl_out_of_range.o ../ld-new @DEFAULT_TARGET_ARM_TRUE@ ../ld-new -T $(srcdir)/thumb2_branch_range.t -o $@ $< -@DEFAULT_TARGET_ARM_TRUE@thumb2_bl_out_of_range.o: thumb_bl_in_range.s +@DEFAULT_TARGET_ARM_TRUE@thumb2_bl_out_of_range.o: thumb_bl_out_of_range.s +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_AS) -o $@ -march=armv7-a $< + +@DEFAULT_TARGET_ARM_TRUE@thumb_blx_in_range.stdout: thumb_blx_in_range +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_OBJDUMP) -D $< > $@ + +@DEFAULT_TARGET_ARM_TRUE@thumb_blx_in_range: thumb_blx_in_range.o ../ld-new +@DEFAULT_TARGET_ARM_TRUE@ ../ld-new -T $(srcdir)/thumb_branch_range.t -o $@ $< + +@DEFAULT_TARGET_ARM_TRUE@thumb_blx_in_range.o: thumb_blx_in_range.s +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_AS) -o $@ -march=armv5te $< + +@DEFAULT_TARGET_ARM_TRUE@thumb_blx_out_of_range.stdout: thumb_blx_out_of_range +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_OBJDUMP) -D $< > $@ + +@DEFAULT_TARGET_ARM_TRUE@thumb_blx_out_of_range: thumb_blx_out_of_range.o ../ld-new +@DEFAULT_TARGET_ARM_TRUE@ ../ld-new -T $(srcdir)/thumb_branch_range.t -o $@ $< + +@DEFAULT_TARGET_ARM_TRUE@thumb_blx_out_of_range.o: thumb_blx_out_of_range.s +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_AS) -o $@ -march=armv5te $< + +@DEFAULT_TARGET_ARM_TRUE@thumb2_blx_in_range.stdout: thumb2_blx_in_range +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_OBJDUMP) -D $< > $@ + +@DEFAULT_TARGET_ARM_TRUE@thumb2_blx_in_range: thumb2_blx_in_range.o ../ld-new +@DEFAULT_TARGET_ARM_TRUE@ ../ld-new -T $(srcdir)/thumb2_branch_range.t -o $@ $< + +@DEFAULT_TARGET_ARM_TRUE@thumb2_blx_in_range.o: thumb_blx_in_range.s +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_AS) -o $@ -march=armv7-a $< + +@DEFAULT_TARGET_ARM_TRUE@thumb2_blx_out_of_range.stdout: thumb2_blx_out_of_range +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_OBJDUMP) -D $< > $@ + +@DEFAULT_TARGET_ARM_TRUE@thumb2_blx_out_of_range: thumb2_blx_out_of_range.o ../ld-new +@DEFAULT_TARGET_ARM_TRUE@ ../ld-new -T $(srcdir)/thumb2_branch_range.t -o $@ $< + +@DEFAULT_TARGET_ARM_TRUE@thumb2_blx_out_of_range.o: thumb_blx_out_of_range.s @DEFAULT_TARGET_ARM_TRUE@ $(TEST_AS) -o $@ -march=armv7-a $< @DEFAULT_TARGET_ARM_TRUE@arm_fix_v4bx.stdout: arm_fix_v4bx diff --git a/gold/testsuite/arm_branch_in_range.sh b/gold/testsuite/arm_branch_in_range.sh index b676770..43b50c6 100755 --- a/gold/testsuite/arm_branch_in_range.sh +++ b/gold/testsuite/arm_branch_in_range.sh @@ -53,5 +53,12 @@ check thumb2_bl_in_range.stdout \ " 2000004: f400 d000 bl 1000008 <_backward_target>" check thumb2_bl_in_range.stdout \ " 2000008: f3ff d7ff bl 300000a <_forward_target>" - +check thumb_blx_in_range.stdout \ + " 800006: f400 e800 blx 400008 <_backward_target>" +check thumb_blx_in_range.stdout \ + " 80000c: f3ff effe blx c0000c <_forward_target>" +check thumb2_blx_in_range.stdout \ + " 2000006: f400 c000 blx 1000008 <_backward_target>" +check thumb2_blx_in_range.stdout \ + " 200000c: f3ff c7fe blx 300000c <_forward_target>" exit 0 diff --git a/gold/testsuite/thumb_blx_in_range.s b/gold/testsuite/thumb_blx_in_range.s new file mode 100644 index 0000000..bd2d060 --- /dev/null +++ b/gold/testsuite/thumb_blx_in_range.s @@ -0,0 +1,64 @@ +# thumb_blx_in_range.s +# +# Test THUMB/THUMB-2 blx instructions just within the branch range limits. +# Because bit 1 of the branch target comes from the branch instruction +# address, the branch range from PC (branch instruction address + 4) is +# acutally -((1<<22) + 2) to ((1<<22) - 4) for THUMB and -((1<<24) + 2) to +# ((1<<24) - 4) from THUMB2. + + .syntax unified + .section .text.pre,"x" + +# Add padding so that target is just in branch range. + .space 8 + + .align 2 + .global _backward_target + .code 32 + .type _backword_target, %function +_backward_target: + bx lr + .size _backward_target, .-_backward_target + + .text + +# Define _start so that linker does not complain. + .global _start + .code 32 + .align 2 + .type _start, %function +_start: + bx lr + .size _start, .-_start + + .global _backward_test + .code 16 + .thumb_func + .type _backward_test, %function +_backward_test: + nop.n + blx _backward_target + .size _backward_test, .-_backward_test + + .align 2 + .global _forward_test + .code 16 + .thumb_func + .type _forward_test, %function +_forward_test: + blx _forward_target + .size _forward_test, .-_forward_test + .code 32 + + .section .text.post,"x" + +# Add padding so that target is just in branch range. + .space 12 + + .align 2 + .global _forward_target + .code 32 + .type _forward_target, %function +_forward_target: + bx lr + .size _forward_target, .-_forward_target diff --git a/gold/testsuite/thumb_blx_out_of_range.s b/gold/testsuite/thumb_blx_out_of_range.s new file mode 100644 index 0000000..fc5beb5 --- /dev/null +++ b/gold/testsuite/thumb_blx_out_of_range.s @@ -0,0 +1,61 @@ +# thumb_blx_out_of_range.s +# Test THUMB/THUMB-2 blx instructions just out of the branch range limits. + .syntax unified + + .section .text.pre,"x" + +# Add padding so that target is just output of branch range. + .space 6 + + .global _forward_target + .global _backward_target + .type _backword_target, %function +_backward_target: + bx lr + .size _backward_target, .-_backward_target + + .text + +# Define _start so that linker does not complain. + .align 2 + .global _start + .code 32 + .type _start, %function +_start: + bx lr + .size _start, .-_start + + .global _backward_test + .code 16 + .thumb_func + .type _backward_test, %function +_backward_test: + bl _backward_target + .size _backward_test, .-_backward_test + + .align 2 + .global _forward_test + .code 16 + .thumb_func + .type _forward_test, %function +_forward_test: + # Bit 1 of the BLX target comes from bit 1 of branch base address, + # which is BLX instruction's address + 4. We intentionally put this + # forward BLX at an address n*4 + 2 so that the branch offset is + # bumped up by 2. + nop.n + bl _forward_target + .size _forward_test, .-_forward_test + .code 32 + + .section .text.post,"x" + +# Add padding so that target is just out of branch range. + .space 12 + .align 2 + .code 32 + .global _forward_target + .type _forward_target, %function +_forward_target: + bx lr + .size _forward_target, .-_forward_target |