[binutils-gdb] [binutils][Arm] Fix Branch Future relocation handling and testisms

Andre Simoes Dias Vieira avieira@sourceware.org
Tue May 21 13:54:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e6f65e7573a317ac4efff26fe0e49fe1b9e7a596

commit e6f65e7573a317ac4efff26fe0e49fe1b9e7a596
Author: Andre Vieira <andre.simoesdiasvieira@arm.com>
Date:   Tue May 21 14:49:03 2019 +0100

    [binutils][Arm] Fix Branch Future relocation handling and testisms
    
    bfd/ChangeLog:
    2019-05-21  Andre Vieira  <andre.simoesdiasvieira@arm.com>
    
    	PR/target 24460
    	* elf32-arm.c (get_value_helper): Remove.
    	(elf32_arm_final_link_relocate): Fix branch future relocations.
    
    gas/ChangeLog:
    2019-05-21  Andre Vieira  <andre.simoesdiasvieira@arm.com>
    
    	* testsuite/gas/arm/armv8_1-m-bf.d: Allow different branch target naming
    	conventions.
    	* testsuite/gas/arm/armv8_1-m-bfl.d: Likewise.
    	* testsuite/gas/arm/armv8_1-m-bfcsel.d: Likewise.
    	* testsuite/gas/arm/armv8_1-m-loloop.d: Likewise.
    	* testsuite/gas/arm/armv8_1-m-bf-rel.d: Skip for vxworks.
    	* testsuite/gas/arm/armv8_1-m-bf-rela.d: New test.
    	* testsuite/gas/arm/armv8_1-m-bfl-rel.d: Skip for vxworks.
    	* testsuite/gas/arm/armv8_1-m-bfl-rela.d: New test.
    
    ld/ChangeLog:
    2019-05-21  Andre Vieira  <andre.simoesdiasvieira@arm.com>
    
    	* testsuite/ld-arm/arm-elf.exp: Add tests
    	* testsuite/ld-arm/bfs-0.s: New test.
    	* testsuite/ld-arm/bfs-1.s: New test.
    	* testsuite/ld-arm/branch-futures.d: New test.

Diff:
---
 bfd/ChangeLog                              |  6 +++
 bfd/elf32-arm.c                            | 75 +++---------------------------
 gas/ChangeLog                              | 12 +++++
 gas/testsuite/gas/arm/armv8_1-m-bf-rel.d   |  4 +-
 gas/testsuite/gas/arm/armv8_1-m-bf-rela.d  | 12 +++++
 gas/testsuite/gas/arm/armv8_1-m-bf.d       |  4 +-
 gas/testsuite/gas/arm/armv8_1-m-bfcsel.d   |  4 +-
 gas/testsuite/gas/arm/armv8_1-m-bfl-rel.d  |  4 +-
 gas/testsuite/gas/arm/armv8_1-m-bfl-rela.d | 12 +++++
 gas/testsuite/gas/arm/armv8_1-m-bfl.d      |  4 +-
 gas/testsuite/gas/arm/armv8_1-m-loloop.d   | 10 ++--
 ld/ChangeLog                               |  7 +++
 ld/testsuite/ld-arm/arm-elf.exp            |  9 ++++
 ld/testsuite/ld-arm/bfs-0.s                | 12 +++++
 ld/testsuite/ld-arm/bfs-1.s                |  9 ++++
 ld/testsuite/ld-arm/branch-futures.d       | 17 +++++++
 16 files changed, 117 insertions(+), 84 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 2e7158f..81885bd 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2019-05-21  Andre Vieira  <andre.simoesdiasvieira@arm.com>
+
+	PR 24460
+	* elf32-arm.c (get_value_helper): Remove.
+	(elf32_arm_final_link_relocate): Fix branch future relocations.
+
 2019-05-21  Tamar Christina  <tamar.christina@arm.com>
 
 	PR ld/24373
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 418458c..7f08526 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -10293,59 +10293,6 @@ identify_add_or_sub (bfd_vma insn)
   return 0;
 }
 
-/* Helper function to compute the Addend for Armv8.1-M Mainline relocations.  */
-static bfd_vma
-get_value_helper (bfd_vma plt_offset,
-		  asection *splt,
-		  asection *input_section,
-		  asection *sym_sec,
-		  struct elf_link_hash_entry * h,
-		  struct bfd_link_info *info,
-		  bfd *input_bfd,
-		  Elf_Internal_Rela *rel,
-		  const char *sym_name,
-		  unsigned char st_type,
-		  struct elf32_arm_link_hash_table *globals,
-		  bfd_boolean *unresolved_reloc_p)
-{
-  bfd_vma value = 0;
-  enum arm_st_branch_type branch_type;
-  enum elf32_arm_stub_type stub_type = arm_stub_none;
-  struct elf32_arm_stub_hash_entry *stub_entry;
-  struct elf32_arm_link_hash_entry *hash
-    = (struct elf32_arm_link_hash_entry *)h;
-
-
-  if (plt_offset != (bfd_vma) -1)
-    {
-      value = (splt->output_section->vma
-	       + splt->output_offset
-	       + plt_offset);
-      value -= PLT_THUMB_STUB_SIZE;
-      *unresolved_reloc_p = FALSE;
-    }
-
-  stub_type = arm_type_of_stub (info, input_section, rel,
-				st_type, &branch_type,
-				hash, value, sym_sec,
-				input_bfd, sym_name);
-
-  if (stub_type != arm_stub_none)
-    {
-      stub_entry = elf32_arm_get_stub_entry (input_section,
-					     sym_sec, h,
-					     rel, globals,
-					     stub_type);
-	    if (stub_entry != NULL)
-	      {
-		value = (stub_entry->stub_offset
-			 + stub_entry->stub_sec->output_offset
-			 + stub_entry->stub_sec->output_section->vma);
-	      }
-	  }
-  return value;
-}
-
 /* Perform a relocation as part of a final link.  */
 
 static bfd_reloc_status_type
@@ -12968,14 +12915,10 @@ elf32_arm_final_link_relocate (reloc_howto_type *	    howto,
 	    addend |= (immC << 1);
 	    addend |= 1;
 	    /* Sign extend.  */
-	    addend = (addend & 0x10000) ? addend - (1 << 17) : addend;
+	    signed_addend = (addend & 0x10000) ? addend - (1 << 17) : addend;
 	  }
 
-	value = get_value_helper (plt_offset, splt, input_section, sym_sec, h,
-				  info, input_bfd, rel, sym_name, st_type,
-				  globals, unresolved_reloc_p);
-
-	relocation  = value + addend;
+	relocation  = value + signed_addend;
 	relocation -= (input_section->output_section->vma
 		       + input_section->output_offset
 		       + rel->r_offset);
@@ -13014,13 +12957,10 @@ elf32_arm_final_link_relocate (reloc_howto_type *	    howto,
 	    addend |= 1;
 	    /* Sign extend.  */
 	    addend = (addend & 0x1000) ? addend - (1 << 13) : addend;
+	    signed_addend = addend;
 	  }
 
-	value = get_value_helper (plt_offset, splt, input_section, sym_sec, h,
-				  info, input_bfd, rel, sym_name, st_type,
-				  globals, unresolved_reloc_p);
-
-	relocation  = value + addend;
+	relocation  = value + signed_addend;
 	relocation -= (input_section->output_section->vma
 		       + input_section->output_offset
 		       + rel->r_offset);
@@ -13059,13 +12999,10 @@ elf32_arm_final_link_relocate (reloc_howto_type *	    howto,
 	    addend |= 1;
 	    /* Sign extend.  */
 	    addend = (addend & 0x40000) ? addend - (1 << 19) : addend;
+	    signed_addend = addend;
 	  }
 
-	value = get_value_helper (plt_offset, splt, input_section, sym_sec, h,
-				  info, input_bfd, rel, sym_name, st_type,
-				  globals, unresolved_reloc_p);
-
-	relocation  = value + addend;
+	relocation  = value + signed_addend;
 	relocation -= (input_section->output_section->vma
 		       + input_section->output_offset
 		       + rel->r_offset);
diff --git a/gas/ChangeLog b/gas/ChangeLog
index fbfa00b..90fc3c3 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,15 @@
+2019-05-21  Andre Vieira  <andre.simoesdiasvieira@arm.com>
+
+	* testsuite/gas/arm/armv8_1-m-bf.d: Allow different branch target naming
+	conventions.
+	* testsuite/gas/arm/armv8_1-m-bfl.d: Likewise.
+	* testsuite/gas/arm/armv8_1-m-bfcsel.d: Likewise.
+	* testsuite/gas/arm/armv8_1-m-loloop.d: Likewise.
+	* testsuite/gas/arm/armv8_1-m-bf-rel.d: Skip for vxworks.
+	* testsuite/gas/arm/armv8_1-m-bf-rela.d: New test.
+	* testsuite/gas/arm/armv8_1-m-bfl-rel.d: Skip for vxworks.
+	* testsuite/gas/arm/armv8_1-m-bfl-rela.d: New test.
+
 2019-05-21  John Darrington <john@darrington.wattle.id.au>
 
 	* expr.c (literal_prefix_dollar_hex): New variable.
diff --git a/gas/testsuite/gas/arm/armv8_1-m-bf-rel.d b/gas/testsuite/gas/arm/armv8_1-m-bf-rel.d
index e429c13..bdb265c 100644
--- a/gas/testsuite/gas/arm/armv8_1-m-bf-rel.d
+++ b/gas/testsuite/gas/arm/armv8_1-m-bf-rel.d
@@ -1,7 +1,7 @@
-#name: Valid Armv8.1-M Mainline BF instruction with relocation
+#name: Valid Armv8.1-M Mainline BF instruction with REL
 #as: -march=armv8.1-m.main
 #objdump: -dr --prefix-addresses --show-raw-insn
-#skip: *-*-pe *-wince-* 
+#skip: *-*-pe *-wince-* *-vxworks
 
 .*: +file format .*arm.*
 
diff --git a/gas/testsuite/gas/arm/armv8_1-m-bf-rela.d b/gas/testsuite/gas/arm/armv8_1-m-bf-rela.d
new file mode 100644
index 0000000..d363d09
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_1-m-bf-rela.d
@@ -0,0 +1,12 @@
+#name: Valid Armv8.1-M Mainline BF instruction with RELA
+#as: -march=armv8.1-m.main
+#objdump: -dr --prefix-addresses --show-raw-insn
+#source:armv8_1-m-bf-rel.s
+#noskip: *-vxworks
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+0[0-9a-f]+ <[^>]+> f0c0 e001 	bf	2, 00000004 <.target\+0x4>
+			0: R_ARM_THM_BF16	.target-0x4
+
diff --git a/gas/testsuite/gas/arm/armv8_1-m-bf.d b/gas/testsuite/gas/arm/armv8_1-m-bf.d
index dd30b2a..99de065 100644
--- a/gas/testsuite/gas/arm/armv8_1-m-bf.d
+++ b/gas/testsuite/gas/arm/armv8_1-m-bf.d
@@ -5,9 +5,9 @@
 .*: +file format .*arm.*
 
 Disassembly of section .text:
-0[0-9a-f]+ <[^>]+> f0c0 e803 	bf	2, 0000000a <foo\+0xa>
+0[0-9a-f]+ <[^>]+> f0c0 e803 	bf	2, 0000000a <.*>
 0[0-9a-f]+ <[^>]+> 4609      	mov	r1, r1
-0[0-9a-f]+ <[^>]+> f140 e801 	bf	4, 0000000c <foo\+0xc>
+0[0-9a-f]+ <[^>]+> f140 e801 	bf	4, 0000000c <.*>
 0[0-9a-f]+ <[^>]+> 460a      	mov	r2, r1
 0[0-9a-f]+ <[^>]+> 4613      	mov	r3, r2
 0[0-9a-f]+ <[^>]+> 4614      	mov	r4, r2
diff --git a/gas/testsuite/gas/arm/armv8_1-m-bfcsel.d b/gas/testsuite/gas/arm/armv8_1-m-bfcsel.d
index a498f06..b66e929 100644
--- a/gas/testsuite/gas/arm/armv8_1-m-bfcsel.d
+++ b/gas/testsuite/gas/arm/armv8_1-m-bfcsel.d
@@ -5,8 +5,8 @@
 .*: +file format .*arm.*
 
 Disassembly of section .text:
-0[0-9a-f]+ <[^>]+> f080 e803 	bfcsel	2, 0000000a <foo\+0xa>, 4, eq
+0[0-9a-f]+ <[^>]+> f080 e803 	bfcsel	2, 0000000a <.*>, 4, eq
 0[0-9a-f]+ <[^>]+> 4609      	mov	r1, r1
-0[0-9a-f]+ <[^>]+> d000      	beq.n	0000000a <foo\+0xa>
+0[0-9a-f]+ <[^>]+> d000      	beq.n	0000000a <.*>
 0[0-9a-f]+ <[^>]+> 4613      	mov	r3, r2
 0[0-9a-f]+ <[^>]+> 4614      	mov	r4, r2
diff --git a/gas/testsuite/gas/arm/armv8_1-m-bfl-rel.d b/gas/testsuite/gas/arm/armv8_1-m-bfl-rel.d
index 13c6bf1..951074c 100644
--- a/gas/testsuite/gas/arm/armv8_1-m-bfl-rel.d
+++ b/gas/testsuite/gas/arm/armv8_1-m-bfl-rel.d
@@ -1,7 +1,7 @@
-#name: Valid Armv8.1-M Mainline BFL instruction with relocation
+#name: Valid Armv8.1-M Mainline BFL instruction with REL
 #as: -march=armv8.1-m.main
 #objdump: -dr --prefix-addresses --show-raw-insn
-#skip: *-*-pe *-wince-*
+#skip: *-*-pe *-wince-* *-vxworks
 
 .*: +file format .*arm.*
 
diff --git a/gas/testsuite/gas/arm/armv8_1-m-bfl-rela.d b/gas/testsuite/gas/arm/armv8_1-m-bfl-rela.d
new file mode 100644
index 0000000..291d10b
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_1-m-bfl-rela.d
@@ -0,0 +1,12 @@
+#name: Valid Armv8.1-M Mainline BFL instruction with RELA
+#as: -march=armv8.1-m.main
+#objdump: -dr --prefix-addresses --show-raw-insn
+#source: armv8_1-m-bfl-rel.s
+#noskip: *-vxworks
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+0[0-9a-f]+ <[^>]+> f080 c001 	bfl	2, 00000004 <.target\+0x4>
+			0: R_ARM_THM_BF18	.target-0x4
+
diff --git a/gas/testsuite/gas/arm/armv8_1-m-bfl.d b/gas/testsuite/gas/arm/armv8_1-m-bfl.d
index e15636b..b28d0b1 100644
--- a/gas/testsuite/gas/arm/armv8_1-m-bfl.d
+++ b/gas/testsuite/gas/arm/armv8_1-m-bfl.d
@@ -5,9 +5,9 @@
 .*: +file format .*arm.*
 
 Disassembly of section .text:
-0[0-9a-f]+ <[^>]+> f080 c803 	bfl	2, 0000000a <foo\+0xa>
+0[0-9a-f]+ <[^>]+> f080 c803 	bfl	2, 0000000a <.*>
 0[0-9a-f]+ <[^>]+> 4608      	mov	r0, r1
-0[0-9a-f]+ <[^>]+> f100 c801 	bfl	4, 0000000c <foo\+0xc>
+0[0-9a-f]+ <[^>]+> f100 c801 	bfl	4, 0000000c <.*>
 0[0-9a-f]+ <[^>]+> 460a      	mov	r2, r1
 0[0-9a-f]+ <[^>]+> 4613      	mov	r3, r2
 0[0-9a-f]+ <[^>]+> 4614      	mov	r4, r2
diff --git a/gas/testsuite/gas/arm/armv8_1-m-loloop.d b/gas/testsuite/gas/arm/armv8_1-m-loloop.d
index 1e02b82..20506c6 100644
--- a/gas/testsuite/gas/arm/armv8_1-m-loloop.d
+++ b/gas/testsuite/gas/arm/armv8_1-m-loloop.d
@@ -6,12 +6,12 @@
 .*: +file format .*arm.*
 
 Disassembly of section .text:
-0[0-9a-f]+ <[^>]+> f042 c00d 	wls	lr, r2, 0000001c <foo\+0x1c>
+0[0-9a-f]+ <[^>]+> f042 c00d 	wls	lr, r2, 0000001c <.*>
 0[0-9a-f]+ <[^>]+> f042 e001 	dls	lr, r2
 0[0-9a-f]+ <[^>]+> f04e e001 	dls	lr, lr
-0[0-9a-f]+ <[^>]+> f00f c009 	le	lr, 00000000 <foo>
-0[0-9a-f]+ <[^>]+> f02f c00b 	le	00000000 <foo>
-0[0-9a-f]+ <[^>]+> f00f c24b 	le	lr, fffffb84 <foo\+0xfffffb84>
-0[0-9a-f]+ <[^>]+> f02f c007 	le	00000010 <foo\+0x10>
+0[0-9a-f]+ <[^>]+> f00f c009 	le	lr, 00000000 <.*>
+0[0-9a-f]+ <[^>]+> f02f c00b 	le	00000000 <.*>
+0[0-9a-f]+ <[^>]+> f00f c24b 	le	lr, fffffb84 <.*>
+0[0-9a-f]+ <[^>]+> f02f c007 	le	00000010 <.*>
 0[0-9a-f]+ <[^>]+> 4613      	mov	r3, r2
 #...
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 77beea0..05af393 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2019-05-21  Andre Vieira  <andre.simoesdiasvieira@arm.com>
+
+	* testsuite/ld-arm/arm-elf.exp: Add tests
+	* testsuite/ld-arm/bfs-0.s: New test.
+	* testsuite/ld-arm/bfs-1.s: New test.
+	* testsuite/ld-arm/branch-futures.d: New test.
+
 2019-05-21  Tamar Christina  <tamar.christina@arm.com>
 
 	PR ld/24373
diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp
index 5471895..7d3217f 100644
--- a/ld/testsuite/ld-arm/arm-elf.exp
+++ b/ld/testsuite/ld-arm/arm-elf.exp
@@ -42,6 +42,11 @@ if {[istarget "arm-*-vxworks"]} {
 	 "" {vxworks2.s}
 	 {{readelf --segments vxworks2-static.sd}}
 	 "vxworks2"}
+	{"Branch future relocations for armv8.1-m.main target"
+	  "-static -T arm.ld"
+	  "" "" {bfs-0.s bfs-1.s}
+	  {{objdump -dw branch-futures.d}}
+	 "branch-futures"}
     }
     run_ld_link_tests $armvxworkstests
     run_dump_test "vxworks1-static"
@@ -260,6 +265,10 @@ set armelftests_common_3 {
     {"ADDS thumb1 relocations for armv7-m target" "-static -T arm.ld" "" "" {thumb1-adds-armv7-m.s}
      {{objdump -dw thumb1-adds.d}}
      "thumb1-adds"}
+    {"Branch future relocations for armv8.1-m.main target" "-static -T arm.ld"
+      "" "" {bfs-0.s bfs-1.s}
+      {{objdump -dw branch-futures.d}}
+     "branch-futures"}
 }
 
 run_ld_link_tests $armelftests_common_1
diff --git a/ld/testsuite/ld-arm/bfs-0.s b/ld/testsuite/ld-arm/bfs-0.s
new file mode 100644
index 0000000..844417a
--- /dev/null
+++ b/ld/testsuite/ld-arm/bfs-0.s
@@ -0,0 +1,12 @@
+.arch armv8.1-m.main
+.text
+.syntax unified
+.thumb
+future:
+	bf	branch, target
+	bfcsel	branch, target, else, eq
+	bfl	branch, target
+	add	r0, r0, r1
+branch:
+	b	target
+else:
diff --git a/ld/testsuite/ld-arm/bfs-1.s b/ld/testsuite/ld-arm/bfs-1.s
new file mode 100644
index 0000000..2b72819
--- /dev/null
+++ b/ld/testsuite/ld-arm/bfs-1.s
@@ -0,0 +1,9 @@
+.arch armv8.1-m.main
+.text
+.syntax unified
+.thumb
+.global _start
+.global target
+_start:
+target:
+	add	r0, r0, r1
diff --git a/ld/testsuite/ld-arm/branch-futures.d b/ld/testsuite/ld-arm/branch-futures.d
new file mode 100644
index 0000000..427ecce
--- /dev/null
+++ b/ld/testsuite/ld-arm/branch-futures.d
@@ -0,0 +1,17 @@
+
+.*:     file format elf32-.*
+
+
+Disassembly of section .text:
+
+0[0-9a-f]+ <future>:
+    [0-9a-f]+:	f2c0 e807 	bf	a, 8012 <_start>
+    [0-9a-f]+:	f182 e805 	bfcsel	6, 8012 <_start>, a, eq
+    [0-9a-f]+:	f080 c803 	bfl	2, 8012 <_start>
+    [0-9a-f]+:	4408      	add	r0, r1
+
+0[0-9a-f]+ <branch>:
+    [0-9a-f]+:	f000 b800 	b.w	8012 <_start>
+
+0[0-9a-f]+ <_start>:
+    [0-9a-f]+:	4408      	add	r0, r1



More information about the Binutils-cvs mailing list