public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH][GOLD] Fix overflow check in R_ARM_THM_JUMP11 and R_ARM_THM_JUMP8.
@ 2011-06-25  7:23 Doug Kwan (關振德)
  2011-06-27 17:24 ` Ian Lance Taylor
  0 siblings, 1 reply; 2+ messages in thread
From: Doug Kwan (關振德) @ 2011-06-25  7:23 UTC (permalink / raw)
  To: Ian Lance Taylor, binutils

[-- Attachment #1: Type: text/plain, Size: 792 bytes --]

Hi Ian,

    This patch fixes problems in overflow checking of
R_ARM_THM_JUMP{11,8}.  It also adds two new tests.

-Doug


2011-06-25  Doug Kwan  <dougkwan@google.com>

        * arm.cc (Arm_relocate_functions::thm_jump8,
        Arm_relocate_functions::thm_jump11): Use a wider signed
        type to compute offset.
        * testsuite/Makefile.am: Add new tests arm_thm_jump11 and
        arm_thm_jump8.
        * testsuite/Makefile.in: Regenerate.
        * testsuite/arm_branch_in_range.sh: Check test results of
        arm_thm_jump11 and arm_thm_jump8.
        * testsuite/arm_thm_jump11.s: New test source file.
        * testsuite/arm_thm_jump11.t: New linker script.
        * testsuite/arm_thm_jump8.s: New test source file.
        * testsuite/arm_thm_jump8.t: New linker script.

[-- Attachment #2: patch-thm-jump.txt --]
[-- Type: text/plain, Size: 11087 bytes --]

Index: gold/arm.cc
===================================================================
RCS file: /cvs/src/src/gold/arm.cc,v
retrieving revision 1.134
diff -u -u -p -r1.134 arm.cc
--- gold/arm.cc	24 Jun 2011 16:40:34 -0000	1.134
+++ gold/arm.cc	25 Jun 2011 06:50:33 -0000
@@ -3356,13 +3356,14 @@ class Arm_relocate_functions : public Re
 	    Arm_address address)
   {
     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
-    typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
     Valtype* wv = reinterpret_cast<Valtype*>(view);
     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
-    Reltype addend = utils::sign_extend<8>((val & 0x00ff) << 1);
-    Reltype x = (psymval->value(object, addend) - address);
-    elfcpp::Swap<16, big_endian>::writeval(wv, (val & 0xff00) | ((x & 0x01fe) >> 1));
-    return (utils::has_overflow<8>(x)
+    int32_t addend = utils::sign_extend<8>((val & 0x00ff) << 1);
+    int32_t x = (psymval->value(object, addend) - address);
+    elfcpp::Swap<16, big_endian>::writeval(wv, ((val & 0xff00)
+                                                | ((x & 0x01fe) >> 1)));
+    // We do a 9-bit overflow check because x is right-shifted by 1 bit.
+    return (utils::has_overflow<9>(x)
 	    ? This::STATUS_OVERFLOW
 	    : This::STATUS_OKAY);
   }
@@ -3375,13 +3376,14 @@ class Arm_relocate_functions : public Re
 	    Arm_address address)
   {
     typedef typename elfcpp::Swap<16, big_endian>::Valtype Valtype;
-    typedef typename elfcpp::Swap<16, big_endian>::Valtype Reltype;
     Valtype* wv = reinterpret_cast<Valtype*>(view);
     Valtype val = elfcpp::Swap<16, big_endian>::readval(wv);
-    Reltype addend = utils::sign_extend<11>((val & 0x07ff) << 1);
-    Reltype x = (psymval->value(object, addend) - address);
-    elfcpp::Swap<16, big_endian>::writeval(wv, (val & 0xf800) | ((x & 0x0ffe) >> 1));
-    return (utils::has_overflow<11>(x)
+    int32_t addend = utils::sign_extend<11>((val & 0x07ff) << 1);
+    int32_t x = (psymval->value(object, addend) - address);
+    elfcpp::Swap<16, big_endian>::writeval(wv, ((val & 0xf800)
+                                                | ((x & 0x0ffe) >> 1)));
+    // We do a 12-bit overflow check because x is right-shifted by 1 bit.
+    return (utils::has_overflow<12>(x)
 	    ? This::STATUS_OVERFLOW
 	    : This::STATUS_OKAY);
   }
Index: gold/testsuite/Makefile.am
===================================================================
RCS file: /cvs/src/src/gold/testsuite/Makefile.am,v
retrieving revision 1.166
diff -u -u -p -r1.166 Makefile.am
--- gold/testsuite/Makefile.am	25 Jun 2011 00:40:56 -0000	1.166
+++ gold/testsuite/Makefile.am	25 Jun 2011 06:50:33 -0000
@@ -2027,7 +2027,8 @@ check_DATA += arm_bl_in_range.stdout arm
 	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 \
-	thumb_bl_out_of_range_local.stdout
+	thumb_bl_out_of_range_local.stdout arm_thm_jump11.stdout \
+	arm_thm_jump8.stdout
 
 arm_bl_in_range.stdout: arm_bl_in_range
 	$(TEST_OBJDUMP) -D $< > $@
@@ -2128,10 +2129,29 @@ thumb_bl_out_of_range_local: thumb_bl_ou
 thumb_bl_out_of_range_local.o: thumb_bl_out_of_range_local.s
 	$(TEST_AS) -o $@ -march=armv5te $<
 
+arm_thm_jump11.stdout: arm_thm_jump11
+	$(TEST_OBJDUMP) -D $< > $@
+
+arm_thm_jump11: arm_thm_jump11.o ../ld-new
+	../ld-new -T $(srcdir)/arm_thm_jump11.t -o $@ $<
+
+arm_thm_jump11.o: arm_thm_jump11.s
+	$(TEST_AS) -o $@ $<
+
+arm_thm_jump8.stdout: arm_thm_jump8
+	$(TEST_OBJDUMP) -D $< > $@
+
+arm_thm_jump8: arm_thm_jump8.o ../ld-new
+	../ld-new -T $(srcdir)/arm_thm_jump8.t -o $@ $<
+
+arm_thm_jump8.o: arm_thm_jump8.s
+	$(TEST_AS) -o $@ $<
+
 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_blx_in_range thumb_blx_out_of_range thumb2_blx_in_range \
-	thumb2_blx_out_of_range thumb_bl_out_of_range_local
+	thumb2_blx_out_of_range thumb_bl_out_of_range_local arm_thm_jump11 \
+	arm_thm_jump8
 
 check_SCRIPTS += arm_fix_v4bx.sh
 check_DATA += arm_fix_v4bx.stdout arm_fix_v4bx_interworking.stdout \
Index: gold/testsuite/arm_branch_in_range.sh
===================================================================
RCS file: /cvs/src/src/gold/testsuite/arm_branch_in_range.sh,v
retrieving revision 1.2
diff -u -u -p -r1.2 arm_branch_in_range.sh
--- gold/testsuite/arm_branch_in_range.sh	22 Mar 2010 22:48:05 -0000	1.2
+++ gold/testsuite/arm_branch_in_range.sh	25 Jun 2011 06:50:33 -0000
@@ -61,4 +61,13 @@ 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>"
+check arm_thm_jump11.stdout \
+ "    8804:	e400      	b.n	8008 <_backward_target>"
+check arm_thm_jump11.stdout \
+ "    8806:	e3ff      	b.n	9008 <_forward_target>"
+check arm_thm_jump8.stdout \
+ "    8104:	d080      	beq.n	8008 <_backward_target>"
+check arm_thm_jump8.stdout \
+ "    8106:	d07f      	beq.n	8208 <_forward_target>"
+
 exit 0
Index: gold/testsuite/arm_thm_jump11.s
===================================================================
RCS file: gold/testsuite/arm_thm_jump11.s
diff -N gold/testsuite/arm_thm_jump11.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gold/testsuite/arm_thm_jump11.s	25 Jun 2011 06:50:33 -0000
@@ -0,0 +1,57 @@
+# arm_thm_jump11.s
+# Test R_ARM_THM_JUMP11 relocations just within the branch range limits.
+	.syntax	unified
+	.arch	armv5te
+
+	.section	.text.pre,"x"
+
+# Add padding so that target is just in branch range. 
+	.space	8
+
+	.global	_backward_target
+	.code	16
+	.thumb_func
+	.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:
+	b.n	_backward_target
+	.size	_backward_test, .-_backward_test
+
+	.global	_forward_test
+	.code	16
+	.thumb_func
+	.type	_forward_test, %function
+_forward_test:
+	b.n	_forward_target
+	.size	_forward_test, .-_forward_test
+	
+	.section	.text.post,"x"
+
+# Add padding so that target is just in branch range. 
+	.space	8
+
+	.global	_forward_target
+	.code	16
+	.thumb_func
+	.type	_forward_target, %function
+_forward_target:
+	bx	lr
+	.size	_forward_target, .-_forward_target
Index: gold/testsuite/arm_thm_jump11.t
===================================================================
RCS file: gold/testsuite/arm_thm_jump11.t
diff -N gold/testsuite/arm_thm_jump11.t
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gold/testsuite/arm_thm_jump11.t	25 Jun 2011 06:50:33 -0000
@@ -0,0 +1,36 @@
+/* arm_thm_jump11.t -- linker script to test R_ARM_THM_JUMP11 relocation.
+
+   Copyright 2011 Free Software Foundation, Inc.
+   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.  */
+
+SECTIONS
+{
+  . = 0x8000;
+
+  .text.pre : { *(.text.pre) }
+  . = ALIGN(0x800);
+  .text : { *(.text) }
+  . = ALIGN(0x800);
+  .text.post : { *(.text.post) }
+  . += 0x1000;
+  .data : { *(.data) }
+  .bss : { *(.bss) }
+  .ARM.attributes : { *(.ARM.attributes) }
+}
Index: gold/testsuite/arm_thm_jump8.s
===================================================================
RCS file: gold/testsuite/arm_thm_jump8.s
diff -N gold/testsuite/arm_thm_jump8.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gold/testsuite/arm_thm_jump8.s	25 Jun 2011 06:50:33 -0000
@@ -0,0 +1,57 @@
+# arm_thm_jump8.s
+# Test R_ARM_THM_JUMP8 relocations just within the branch range limits.
+	.syntax	unified
+	.arch	armv5te
+
+	.section	.text.pre,"x"
+
+# Add padding so that target is just in branch range. 
+	.space	8
+
+	.global	_backward_target
+	.code	16
+	.thumb_func
+	.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:
+	beq.n	_backward_target
+	.size	_backward_test, .-_backward_test
+
+	.global	_forward_test
+	.code	16
+	.thumb_func
+	.type	_forward_test, %function
+_forward_test:
+	beq.n	_forward_target
+	.size	_forward_test, .-_forward_test
+	
+	.section	.text.post,"x"
+
+# Add padding so that target is just in branch range. 
+	.space	8
+
+	.global	_forward_target
+	.code	16
+	.thumb_func
+	.type	_forward_target, %function
+_forward_target:
+	bx	lr
+	.size	_forward_target, .-_forward_target
Index: gold/testsuite/arm_thm_jump8.t
===================================================================
RCS file: gold/testsuite/arm_thm_jump8.t
diff -N gold/testsuite/arm_thm_jump8.t
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gold/testsuite/arm_thm_jump8.t	25 Jun 2011 06:50:33 -0000
@@ -0,0 +1,36 @@
+/* arm_thm_jump8.t -- linker script to test R_ARM_THM_JUMP8 relocation.
+
+   Copyright 2011 Free Software Foundation, Inc.
+   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.  */
+
+SECTIONS
+{
+  . = 0x8000;
+
+  .text.pre : { *(.text.pre) }
+  . = ALIGN(0x100);
+  .text : { *(.text) }
+  . = ALIGN(0x100);
+  .text.post : { *(.text.post) }
+  . += 0x1000;
+  .data : { *(.data) }
+  .bss : { *(.bss) }
+  .ARM.attributes : { *(.ARM.attributes) }
+}

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH][GOLD] Fix overflow check in R_ARM_THM_JUMP11 and R_ARM_THM_JUMP8.
  2011-06-25  7:23 [PATCH][GOLD] Fix overflow check in R_ARM_THM_JUMP11 and R_ARM_THM_JUMP8 Doug Kwan (關振德)
@ 2011-06-27 17:24 ` Ian Lance Taylor
  0 siblings, 0 replies; 2+ messages in thread
From: Ian Lance Taylor @ 2011-06-27 17:24 UTC (permalink / raw)
  To: Doug Kwan (關振德); +Cc: binutils

"Doug Kwan (關振德)" <dougkwan@google.com> writes:

> 2011-06-25  Doug Kwan  <dougkwan@google.com>
>
>         * arm.cc (Arm_relocate_functions::thm_jump8,
>         Arm_relocate_functions::thm_jump11): Use a wider signed
>         type to compute offset.
>         * testsuite/Makefile.am: Add new tests arm_thm_jump11 and
>         arm_thm_jump8.
>         * testsuite/Makefile.in: Regenerate.
>         * testsuite/arm_branch_in_range.sh: Check test results of
>         arm_thm_jump11 and arm_thm_jump8.
>         * testsuite/arm_thm_jump11.s: New test source file.
>         * testsuite/arm_thm_jump11.t: New linker script.
>         * testsuite/arm_thm_jump8.s: New test source file.
>         * testsuite/arm_thm_jump8.t: New linker script.

This is OK.

Thanks.

Ian

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-06-27 17:24 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-06-25  7:23 [PATCH][GOLD] Fix overflow check in R_ARM_THM_JUMP11 and R_ARM_THM_JUMP8 Doug Kwan (關振德)
2011-06-27 17:24 ` 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).