This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

xstormy16: Fix handling of pc-relative relocs against defined symbols


Hi Guys,

  Sanyo has reported that GAS for the xstormy16 will generate bad
  relocations for pc-relative relocs against already defined global
  symbols.  I tracked the bug down to md_apply_fix3 which was adding
  in the symbols's value to the reloc's addend, even though this will
  be done by the generic code.

  Fixed by applying the patch below, and checked by adding the
  attached test case to the linker.  (To ensure that the relocs are
  resolved correctly as well as generated correctly).

Cheers
        Nick

gas/ChangeLog
2003-05-02  Nick Clifton  <nickc@redhat.com>

	* config/tc-xstormy16.c (xstormy16_md_apply_fix3): Do not bias the
	addend with the symbol's value for pc-relative relocations against
	a defined symbol - this will be done automatically.

ld/testsuite/ChangeLog
2003-05-02  Nick Clifton  <nickc@redhat.com>

	* ld-xstormy16: New directory.
	* ld-xstormy16/xstormy16.exp: New test script.
	* ld-xstormy16/pcrel.s: Test assembler source file.
	* ld-xstormy16/external.s: Test assembler source file.
	* ld-xstormy16/pcrel.d: Test expected disassembly.

Index: gas/config/tc-xstormy16.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-xstormy16.c,v
retrieving revision 1.9
diff -c -3 -p -w -r1.9 tc-xstormy16.c
*** gas/config/tc-xstormy16.c	23 Jan 2003 12:51:05 -0000	1.9
--- gas/config/tc-xstormy16.c	2 May 2003 12:30:51 -0000
*************** xstormy16_md_apply_fix3 (fixP, valueP, s
*** 556,562 ****
  
    /* Tuck `value' away for use by tc_gen_reloc.
       See the comment describing fx_addnumber in write.h.
!      This field is misnamed (or misused :-).  */
    fixP->fx_addnumber += value;
  }
  
--- 556,566 ----
  
    /* Tuck `value' away for use by tc_gen_reloc.
       See the comment describing fx_addnumber in write.h.
!      This field is misnamed (or misused :-).
!      We do not do this for pc-relative relocs against a
!      defined symbol, since it will be done for us.  */
!   if ((! fixP->fx_pcrel)
!       || (fixP->fx_addsy && ! S_IS_DEFINED (fixP->fx_addsy)))
      fixP->fx_addnumber += value;
  }
  
*** /dev/null	2003-01-30 10:24:37.000000000 +0000
--- xstormy16.exp	2003-05-02 13:18:28.000000000 +0100
***************
*** 0 ****
--- 1,38 ----
+ # Expect script for ld-xstormy16 tests
+ #   Copyright (C) 2003 Free Software Foundation
+ #
+ # This file 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ #
+ 
+ # Test xstormy16 linking of pc-relative relocs.  This tests the assembler and
+ # tools like objdump as well as the linker.
+ 
+ if {!([istarget "xstormy16*-*-*"]) } {
+     return
+ }
+ 
+ # Set up a list as described in ld-lib.exp
+ 
+ set xstormy16_tests {
+     {   "xstormy16 pc-relative relocs linker test"
+ 	""
+ 	""
+ 	{ "pcrel.s" "external.s" }
+ 	{ {objdump -Dz pcrel.d} }
+ 	"pcrel"
+     }
+ }
+ 
+ run_ld_link_tests $xstormy16_tests
*** /dev/null	2003-01-30 10:24:37.000000000 +0000
--- pcrel.s	2003-05-02 13:13:59.000000000 +0100
***************
*** 0 ****
--- 1,31 ----
+ 	.text
+ 	.global _start
+ _start:	
+ 	mov 0, # external
+ 	mov 0, # global
+ 	mov 0, # local
+ 	
+ 	mov 0, # external - .
+ 	mov 0, # global - .
+ 	mov 0, # local - .
+ 
+ 	bc            external
+ 	bc            global
+ 	bc            local
+ 	
+ 	bc rx, #0,    external
+ 	bc rx, #0,    global
+ 	bc rx, #0,    local
+ 
+ 	bc r0, #0,    external
+ 	bc r0, #0,    global
+ 	bc r0, #0,    local
+ 	
+ 	bc  r0, r1,   external
+ 	bc  r0, r1,   global
+ 	bc  r0, r1,   local
+ 	.global global
+ global:
+ 	nop
+ local:
+ 	nop
*** /dev/null	2003-01-30 10:24:37.000000000 +0000
--- external.s	2003-05-02 13:14:19.000000000 +0100
***************
*** 0 ****
--- 1,5 ----
+ 	.text
+ 	.global external
+ external:
+ 	nop
+ 	
\ No newline at end of file
*** /dev/null	2003-01-30 10:24:37.000000000 +0000
--- pcrel.d	2003-05-02 13:21:57.000000000 +0100
***************
*** 0 ****
--- 1,34 ----
+ 
+ .*:     file format elf32-xstormy16
+ 
+ Disassembly of section .data:
+ Disassembly of section .text:
+ 
+ 00008000 <_start>:
+     8000:	00 79 46 80 	mov.w 0x0,#0x8046
+     8004:	00 79 42 80 	mov.w 0x0,#0x8042
+     8008:	00 79 44 80 	mov.w 0x0,#0x8044
+     800c:	00 79 2c 00 	mov.w 0x0,#0x2c
+     8010:	00 79 32 00 	mov.w 0x0,#0x32
+     8014:	00 79 30 00 	mov.w 0x0,#0x30
+     8018:	2c d3       	bc 0x8046
+     801a:	26 d3       	bc 0x8042
+     801c:	26 d3       	bc 0x8044
+     801e:	24 c3 00 00 	bc Rx,#0x0,0x8046
+     8022:	1c c3 00 00 	bc Rx,#0x0,0x8042
+     8026:	1a c3 00 00 	bc Rx,#0x0,0x8044
+     802a:	00 20 18 30 	bc r0,#0x0,0x8046
+     802e:	00 20 10 30 	bc r0,#0x0,0x8042
+     8032:	00 20 0e 30 	bc r0,#0x0,0x8044
+     8036:	10 0d 0c 30 	bc r0,r1,0x8046
+     803a:	10 0d 04 30 	bc r0,r1,0x8042
+     803e:	10 0d 02 30 	bc r0,r1,0x8044
+ 
+ 00008042 <global>:
+     8042:	00 00       	nop
+ 
+ 00008044 <local>:
+     8044:	00 00       	nop
+ 
+ 00008046 <external>:
+     8046:	00 00       	nop


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]