This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] Fix sparc gas wdisp16 and wdisp19 relocation overflow checking (BZ#4558)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: binutils at sources dot redhat dot com
- Cc: "David S. Miller" <davem at redhat dot com>
- Date: Mon, 28 May 2007 12:23:07 +0200
- Subject: [PATCH] Fix sparc gas wdisp16 and wdisp19 relocation overflow checking (BZ#4558)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
As shown by the attached testcases, the branch overflow checks
for v9 branches were incorrect.
I'll commit tomorrow to give DaveM a chance to comment on this
version of the patch.
gas/
2007-05-28 David S. Miller <davem@davemloft.net>
Jakub Jelinek <jakub@redhat.com>
PR gas/4558
* config/tc-sparc.c (md_apply_fix): Fix relocation overflow checks
for BFD_RELOC_SPARC_WDISP16 and BFD_RELOC_SPARC_WDISP19.
gas/testsuite/
2007-05-28 Jakub Jelinek <jakub@redhat.com>
PR gas/4558
* gas/sparc/sparc.exp: Add v9branch{1,2,3,4,5} tests.
* gas/sparc/v9branch1.d: New test.
* gas/sparc/v9branch1.s: New.
* gas/sparc/v9branch2.d: New test.
* gas/sparc/v9branch2.s: New.
* gas/sparc/v9branch3.d: New test.
* gas/sparc/v9branch3.s: New.
* gas/sparc/v9branch4.d: New test.
* gas/sparc/v9branch4.s: New.
* gas/sparc/v9branch5.d: New test.
* gas/sparc/v9branch5.s: New.
--- gas/config/tc-sparc.c.jj 2007-05-28 11:18:53.000000000 +0200
+++ gas/config/tc-sparc.c 2007-05-28 12:12:17.000000000 +0200
@@ -1,6 +1,6 @@
/* tc-sparc.c -- Assemble for the SPARC
Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@@ -3309,9 +3309,9 @@ md_apply_fix (fixP, valP, segment)
break;
case BFD_RELOC_SPARC_WDISP16:
- /* FIXME: simplify. */
- if (((val > 0) && (val & ~0x3fffc))
- || ((val < 0) && (~(val - 1) & ~0x3fffc)))
+ if ((val & 3)
+ || val >= 0x1fffc
+ || val <= -(offsetT) 0x20008)
as_bad_where (fixP->fx_file, fixP->fx_line,
_("relocation overflow"));
/* FIXME: The +1 deserves a comment. */
@@ -3320,9 +3320,9 @@ md_apply_fix (fixP, valP, segment)
break;
case BFD_RELOC_SPARC_WDISP19:
- /* FIXME: simplify. */
- if (((val > 0) && (val & ~0x1ffffc))
- || ((val < 0) && (~(val - 1) & ~0x1ffffc)))
+ if ((val & 3)
+ || val >= 0xffffc
+ || val <= -(offsetT) 0x100008)
as_bad_where (fixP->fx_file, fixP->fx_line,
_("relocation overflow"));
/* FIXME: The +1 deserves a comment. */
--- gas/testsuite/gas/sparc/sparc.exp.jj 2006-04-05 14:41:57.000000000 +0200
+++ gas/testsuite/gas/sparc/sparc.exp 2007-05-28 11:14:51.000000000 +0200
@@ -48,6 +48,11 @@ if [istarget sparc*-*-*] {
run_dump_test "pcrel64"
run_dump_test "plt64"
}
+ run_dump_test "v9branch1"
+ run_dump_test "v9branch2"
+ run_dump_test "v9branch3"
+ run_dump_test "v9branch4"
+ run_dump_test "v9branch5"
}
if [istarget sparc-*-vxworks*] {
--- gas/testsuite/gas/sparc/v9branch1.d.jj 2007-05-28 10:59:19.000000000 +0200
+++ gas/testsuite/gas/sparc/v9branch1.d 2007-05-28 11:04:19.000000000 +0200
@@ -0,0 +1,23 @@
+#as: -Av9
+#objdump: -dr --prefix-addresses
+#name: v9branch1
+
+.*: +file format .*sparc.*
+
+Disassembly of section .text:
+0x0+000000 brz %o0, 0x0+01fffc
+0x0+000004 nop
+ ...
+0x0+01fff8 nop
+0x0+01fffc nop
+ ...
+0x0+03fffc brz %o0, 0x0+01fffc
+0x0+040000 nop
+0x0+040004 bne %icc, 0x0+140000
+0x0+040008 nop
+ ...
+0x0+13fffc nop
+0x0+140000 nop
+ ...
+0x0+240000 bne %icc, 0x0+140000
+0x0+240004 nop
--- gas/testsuite/gas/sparc/v9branch1.s.jj 2007-05-28 10:59:01.000000000 +0200
+++ gas/testsuite/gas/sparc/v9branch1.s 2007-05-28 11:05:39.000000000 +0200
@@ -0,0 +1,18 @@
+ # Check if maximum possible branch distances for v9 branches are accepted
+ .text
+ brz,pt %o0, 1f
+ nop
+ .skip (128 * 1024 - 16)
+ nop
+1: nop
+ .skip (128 * 1024 - 4)
+ brz,pt %o0, 1b
+ nop
+ bne,pt %icc, 2f
+ nop
+ .skip (1024 * 1024 - 16)
+ nop
+2: nop
+ .skip (1024 * 1024 - 4)
+ bne,pt %icc, 2b
+ nop
--- gas/testsuite/gas/sparc/v9branch2.d.jj 2007-05-28 11:10:46.000000000 +0200
+++ gas/testsuite/gas/sparc/v9branch2.d 2007-05-28 11:15:49.000000000 +0200
@@ -0,0 +1,3 @@
+#as: -Av9
+#name: v9branch2
+#error: :3:.*relocation.*overflow
--- gas/testsuite/gas/sparc/v9branch2.s.jj 2007-05-28 11:10:05.000000000 +0200
+++ gas/testsuite/gas/sparc/v9branch2.s 2007-05-28 11:15:27.000000000 +0200
@@ -0,0 +1,7 @@
+ # Text for relocation overflow diagnostic
+ .text
+ brz,pt %o0, 1f
+ nop
+ .skip (128 * 1024 - 12)
+ nop
+1: nop
--- gas/testsuite/gas/sparc/v9branch3.d.jj 2007-05-28 11:10:46.000000000 +0200
+++ gas/testsuite/gas/sparc/v9branch3.d 2007-05-28 11:16:14.000000000 +0200
@@ -0,0 +1,3 @@
+#as: -Av9
+#name: v9branch3
+#error: :5:.*relocation.*overflow
--- gas/testsuite/gas/sparc/v9branch3.s.jj 2007-05-28 11:10:05.000000000 +0200
+++ gas/testsuite/gas/sparc/v9branch3.s 2007-05-28 11:18:08.000000000 +0200
@@ -0,0 +1,6 @@
+ # Text for relocation overflow diagnostic
+ .text
+1: nop
+ .skip (128 * 1024)
+ brz,pt %o0, 1b
+ nop
--- gas/testsuite/gas/sparc/v9branch4.d.jj 2007-05-28 11:10:46.000000000 +0200
+++ gas/testsuite/gas/sparc/v9branch4.d 2007-05-28 11:17:50.000000000 +0200
@@ -0,0 +1,3 @@
+#as: -Av9
+#name: v9branch4
+#error: :3:.*relocation.*overflow
--- gas/testsuite/gas/sparc/v9branch4.s.jj 2007-05-28 11:10:05.000000000 +0200
+++ gas/testsuite/gas/sparc/v9branch4.s 2007-05-28 11:18:13.000000000 +0200
@@ -0,0 +1,7 @@
+ # Text for relocation overflow diagnostic
+ .text
+ bne,pt %icc, 1f
+ nop
+ .skip (1024 * 1024 - 12)
+ nop
+1: nop
--- gas/testsuite/gas/sparc/v9branch5.d.jj 2007-05-28 11:10:46.000000000 +0200
+++ gas/testsuite/gas/sparc/v9branch5.d 2007-05-28 11:17:55.000000000 +0200
@@ -0,0 +1,3 @@
+#as: -Av9
+#name: v9branch5
+#error: :5:.*relocation.*overflow
--- gas/testsuite/gas/sparc/v9branch5.s.jj 2007-05-28 11:10:05.000000000 +0200
+++ gas/testsuite/gas/sparc/v9branch5.s 2007-05-28 11:18:19.000000000 +0200
@@ -0,0 +1,6 @@
+ # Text for relocation overflow diagnostic
+ .text
+1: nop
+ .skip (1024 * 1024)
+ bne,pt %icc, 1b
+ nop
Jakub