reverse the order of relocs in mach-o gas output.
authorIain Sandoe <iain@codesourcery.com>
Fri, 13 Jan 2012 15:19:13 +0000 (15:19 +0000)
committerIain Sandoe <iain@codesourcery.com>
Fri, 13 Jan 2012 15:19:13 +0000 (15:19 +0000)
gas:

* config/obj-macho.c (obj_mach_o_reorder_section_relocs): New.
* config/obj-macho.h (SET_SECTION_RELOCS): Define.
(obj_mach_o_reorder_section_relocs): Declare.

gas/testsuite:

* gas/all/redef2.d: Skip for Darwin.
* gas/all/redef3.d: Likewise.
* gas/all/weakref1.d: Likewise.
* gas/macros/irp.d: Likewise.
* gas/macros/repeat.d: Likewise.
* gas/macros/rept.d: Likewise.
* gas/macros/test2.d: Likewise.
* gas/macros/vararg.d: Likewise.
* gas/mach-o/macro-irp.d: New.
* gas/mach-o/macro-repeat.d: New.
* gas/mach-o/macro-rept.d: New.
* gas/mach-o/macro-test2.d: New.
* gas/mach-o/macro-vararg.d: New.
* gas/mach-o/redef2.d: New.
* gas/mach-o/redef3.d: New.

19 files changed:
gas/ChangeLog
gas/config/obj-macho.c
gas/config/obj-macho.h
gas/testsuite/ChangeLog
gas/testsuite/gas/all/redef2.d
gas/testsuite/gas/all/redef3.d
gas/testsuite/gas/all/weakref1.d
gas/testsuite/gas/mach-o/macro-irp.d [new file with mode: 0644]
gas/testsuite/gas/mach-o/macro-repeat.d [new file with mode: 0644]
gas/testsuite/gas/mach-o/macro-rept.d [new file with mode: 0644]
gas/testsuite/gas/mach-o/macro-test2.d [new file with mode: 0644]
gas/testsuite/gas/mach-o/macro-vararg.d [new file with mode: 0644]
gas/testsuite/gas/mach-o/redef2.d [new file with mode: 0644]
gas/testsuite/gas/mach-o/redef3.d [new file with mode: 0644]
gas/testsuite/gas/macros/irp.d
gas/testsuite/gas/macros/repeat.d
gas/testsuite/gas/macros/rept.d
gas/testsuite/gas/macros/test2.d
gas/testsuite/gas/macros/vararg.d

index 9d405565a7f8b1e946d06d29f9cf09c67abc9636..5c3c60a5975f7864e412a5425de146972ca4f885 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-13  Tristan Gingold  <gingold@adacore.com>
+
+       * config/obj-macho.c (obj_mach_o_reorder_section_relocs): New.
+       * config/obj-macho.h (SET_SECTION_RELOCS): Define.
+       (obj_mach_o_reorder_section_relocs): Declare.
+
 2012-01-13  Iain Sandoe  <idsandoe@googlemail.com>
 
        * config/obj-macho.c (obj_mach_o_set_indirect_symbols): Handle
index ddf098881b5d2aa8f3a67bedfc110304611592a1..f0cb43e115e3ea167f7a70eee714fb2f50410c3f 100644 (file)
@@ -1679,6 +1679,23 @@ obj_mach_o_frob_file_after_relocs (void)
   bfd_map_over_sections (stdoutput, obj_mach_o_set_indirect_symbols, (char *) 0);
 }
 
+/* Reverse relocations order to make ld happy.  */
+
+void
+obj_mach_o_reorder_section_relocs (asection *sec, arelent **rels, unsigned int n)
+{
+  unsigned int i;
+  unsigned int max = n / 2;
+
+  for (i = 0; i < max; i++)
+    {
+      arelent *r = rels[i];
+      rels[i] = rels[n - i - 1];
+      rels[n - i - 1] = r;
+    }
+  bfd_set_reloc (stdoutput, sec, rels, n);
+}
+
 /* Support stabs for mach-o.  */
 
 void
index 2fc5cb6876be4bc7c8e4ef6724444a0e0906a0ff..bb8daf90c056bf02a07ec78b6d0ff0894b7d2984 100644 (file)
@@ -68,6 +68,11 @@ void obj_mach_o_post_relax_hook (void);
 #define obj_frob_file_after_relocs obj_mach_o_frob_file_after_relocs
 extern void obj_mach_o_frob_file_after_relocs (void);
 
+void obj_mach_o_reorder_section_relocs (asection *, arelent **, unsigned int);
+
+#define SET_SECTION_RELOCS(sec, relocs, n) \
+  obj_mach_o_reorder_section_relocs (sec, relocs, n)
+
 #define EMIT_SECTION_SYMBOLS           0
 
 #define OBJ_PROCESS_STAB(SEG,W,S,T,O,D)        obj_mach_o_process_stab(W,S,T,O,D)
index 01418cb3f14a925d97bbf085826b6962b0d08623..ea80694d9666939ed081edcaca128808ff293c0f 100644 (file)
@@ -1,3 +1,21 @@
+2012-01-13  Iain Sandoe  <idsandoe@googlemail.com>
+
+       * gas/all/redef2.d: Skip for Darwin.
+       * gas/all/redef3.d: Likewise.
+       * gas/all/weakref1.d: Likewise.
+       * gas/macros/irp.d: Likewise.
+       * gas/macros/repeat.d: Likewise.
+       * gas/macros/rept.d: Likewise.
+       * gas/macros/test2.d: Likewise.
+       * gas/macros/vararg.d: Likewise.
+       * gas/mach-o/macro-irp.d: New.
+       * gas/mach-o/macro-repeat.d: New.
+       * gas/mach-o/macro-rept.d: New.
+       * gas/mach-o/macro-test2.d: New.
+       * gas/mach-o/macro-vararg.d: New.
+       * gas/mach-o/redef2.d: New.
+       * gas/mach-o/redef3.d: New.
+
 2012-01-13  Iain Sandoe  <idsandoe@googlemail.com>
 
        * gas/mach-o/dysymtab-3.d: New.
index 244d33dd68024fb1f50fb233eea45381b54eedc4..c50cd6c94c75f184de442eae558c7941733345ea 100644 (file)
@@ -1,5 +1,6 @@
 #objdump: -rs -j .data -j "\$DATA\$"
 #name: .equ redefinitions (2)
+#not-target: *-*-darwin*
 
 .*: .*
 
index 566f9c95d58d941e055b779c5d232fa4e82c2e05..a16fac3c9b5ca86b21ba1bbf1e3f5eae12ed9667 100644 (file)
@@ -1,6 +1,6 @@
 #objdump: -rsj .data
 #name: .equ redefinitions (3)
-#not-target: arc-*-*
+#not-target: arc-*-* *-*darwin*
 
 .*: .*
 
index ee37d977009b6d688021e78b7bb0b55e6a1713ea..b44d1fced42110505623e282ff47fd60d006bfdd 100644 (file)
@@ -2,8 +2,9 @@
 #name: weakref tests, relocations
 # ecoff (OSF/alpha) lacks .weak support
 # pdp11 lacks .long
+# darwin (mach-o) reverses the order of relocs.
 # the following must be present in all weakref1*.d
-#not-target: alpha*-*-osf* *-*-ecoff pdp11-*-aout
+#not-target: alpha*-*-osf* *-*-ecoff pdp11-*-aout *-*-darwin*
 
 #...
 RELOCATION RECORDS FOR \[(\.text|\$CODE\$)\]:
diff --git a/gas/testsuite/gas/mach-o/macro-irp.d b/gas/testsuite/gas/mach-o/macro-irp.d
new file mode 100644 (file)
index 0000000..c7737fa
--- /dev/null
@@ -0,0 +1,14 @@
+#objdump: -r
+#name: macro irp
+#source: ../macros/irp.s
+
+.*: +file format .*
+
+RELOCATION RECORDS FOR .*
+OFFSET[        ]+TYPE[         ]+VALUE.*
+0+14[  ]+[a-zA-Z0-9_]+[        ]+bar3
+0+10[  ]+[a-zA-Z0-9_]+[        ]+bar2
+0+0c[  ]+[a-zA-Z0-9_]+[        ]+bar1
+0+08[  ]+[a-zA-Z0-9_]+[        ]+foo3
+0+04[  ]+[a-zA-Z0-9_]+[        ]+foo2
+0+00[  ]+[a-zA-Z0-9_]+[        ]+foo1
diff --git a/gas/testsuite/gas/mach-o/macro-repeat.d b/gas/testsuite/gas/mach-o/macro-repeat.d
new file mode 100644 (file)
index 0000000..db215a4
--- /dev/null
@@ -0,0 +1,44 @@
+#objdump: -r
+#name: nested irp/irpc/rept
+#source: ../macros/repeat.s
+
+.*: +file format .*
+
+RELOCATION RECORDS FOR .*
+OFFSET[        ]+TYPE[         ]+VALUE.*
+0+8c[  ]+[a-zA-Z0-9_]+[        ]+rept_rept
+0+88[  ]+[a-zA-Z0-9_]+[        ]+rept_rept
+0+84[  ]+[a-zA-Z0-9_]+[        ]+rept_rept
+0+80[  ]+[a-zA-Z0-9_]+[        ]+rept_rept
+0+7c[  ]+[a-zA-Z0-9_]+[        ]+rept_irpc_8
+0+78[  ]+[a-zA-Z0-9_]+[        ]+rept_irpc_9
+0+74[  ]+[a-zA-Z0-9_]+[        ]+rept_irpc_8
+0+70[  ]+[a-zA-Z0-9_]+[        ]+rept_irpc_9
+0+6c[  ]+[a-zA-Z0-9_]+[        ]+rept_irp_8
+0+68[  ]+[a-zA-Z0-9_]+[        ]+rept_irp_9
+0+64[  ]+[a-zA-Z0-9_]+[        ]+rept_irp_8
+0+60[  ]+[a-zA-Z0-9_]+[        ]+rept_irp_9
+0+5c[  ]+[a-zA-Z0-9_]+[        ]+irpc_rept_2
+0+58[  ]+[a-zA-Z0-9_]+[        ]+irpc_rept_2
+0+54[  ]+[a-zA-Z0-9_]+[        ]+irpc_rept_1
+0+50[  ]+[a-zA-Z0-9_]+[        ]+irpc_rept_1
+0+4c[  ]+[a-zA-Z0-9_]+[        ]+irpc_irpc_28
+0+48[  ]+[a-zA-Z0-9_]+[        ]+irpc_irpc_29
+0+44[  ]+[a-zA-Z0-9_]+[        ]+irpc_irpc_18
+0+40[  ]+[a-zA-Z0-9_]+[        ]+irpc_irpc_19
+0+3c[  ]+[a-zA-Z0-9_]+[        ]+irpc_irp_28
+0+38[  ]+[a-zA-Z0-9_]+[        ]+irpc_irp_29
+0+34[  ]+[a-zA-Z0-9_]+[        ]+irpc_irp_18
+0+30[  ]+[a-zA-Z0-9_]+[        ]+irpc_irp_19
+0+2c[  ]+[a-zA-Z0-9_]+[        ]+irp_rept_2
+0+28[  ]+[a-zA-Z0-9_]+[        ]+irp_rept_2
+0+24[  ]+[a-zA-Z0-9_]+[        ]+irp_rept_1
+0+20[  ]+[a-zA-Z0-9_]+[        ]+irp_rept_1
+0+1c[  ]+[a-zA-Z0-9_]+[        ]+irp_irpc_28
+0+18[  ]+[a-zA-Z0-9_]+[        ]+irp_irpc_29
+0+14[  ]+[a-zA-Z0-9_]+[        ]+irp_irpc_18
+0+10[  ]+[a-zA-Z0-9_]+[        ]+irp_irpc_19
+0+0c[  ]+[a-zA-Z0-9_]+[        ]+irp_irp_28
+0+08[  ]+[a-zA-Z0-9_]+[        ]+irp_irp_29
+0+04[  ]+[a-zA-Z0-9_]+[        ]+irp_irp_18
+0+00[  ]+[a-zA-Z0-9_]+[        ]+irp_irp_19
diff --git a/gas/testsuite/gas/mach-o/macro-rept.d b/gas/testsuite/gas/mach-o/macro-rept.d
new file mode 100644 (file)
index 0000000..7ac212a
--- /dev/null
@@ -0,0 +1,11 @@
+#objdump: -r
+#name: macro rept
+#source: ../macros/rept.s
+
+.*: +file format .*
+
+RELOCATION RECORDS FOR .*
+OFFSET[        ]+TYPE[         ]+VALUE.*
+0+08[  ]+[a-zA-Z0-9_]+[        ]+foo1
+0+04[  ]+[a-zA-Z0-9_]+[        ]+foo1
+0+00[  ]+[a-zA-Z0-9_]+[        ]+foo1
diff --git a/gas/testsuite/gas/mach-o/macro-test2.d b/gas/testsuite/gas/mach-o/macro-test2.d
new file mode 100644 (file)
index 0000000..30a2b2f
--- /dev/null
@@ -0,0 +1,11 @@
+#objdump: -r
+#name: macro test 2
+#source: ../macros/test2.s
+
+.*: +file format .*
+
+RELOCATION RECORDS FOR .*
+OFFSET[        ]+TYPE[         ]+VALUE.*
+0+08[  ]+[a-zA-Z0-9_]+[        ]+foo3
+0+04[  ]+[a-zA-Z0-9_]+[        ]+foo2
+0+00[  ]+[a-zA-Z0-9_]+[        ]+foo1
diff --git a/gas/testsuite/gas/mach-o/macro-vararg.d b/gas/testsuite/gas/mach-o/macro-vararg.d
new file mode 100644 (file)
index 0000000..da6c0af
--- /dev/null
@@ -0,0 +1,14 @@
+#objdump: -r
+#name: macro vararg
+#source: ../macros/vararg.s
+
+.*: +file format .*
+
+RELOCATION RECORDS FOR .*
+OFFSET[        ]+TYPE[         ]+VALUE.*
+0+14[  ]+[a-zA-Z0-9_]+[        ]+foo6
+0+10[  ]+[a-zA-Z0-9_]+[        ]+foo5
+0+0c[  ]+[a-zA-Z0-9_]+[        ]+foo4
+0+08[  ]+[a-zA-Z0-9_]+[        ]+foo3
+0+04[  ]+[a-zA-Z0-9_]+[        ]+foo2
+0+00[  ]+[a-zA-Z0-9_]+[        ]+foo1
diff --git a/gas/testsuite/gas/mach-o/redef2.d b/gas/testsuite/gas/mach-o/redef2.d
new file mode 100644 (file)
index 0000000..5e76d50
--- /dev/null
@@ -0,0 +1,17 @@
+#objdump: -rs -j .data -j "\$DATA\$"
+#name: .equ redefinitions (2)
+# identical to ../all, we just need to reverse the relocs.
+#source: ../all/redef2.s
+
+.*: .*
+
+RELOCATION RECORDS FOR .*
+.*
+0+10.*(sym|(\.data|\$DATA\$)(\+0x0+10)?)
+0+08.*xtrn
+0+00.*(here|\.data|\$DATA\$)
+#...
+Contents of section (\.data|\$DATA\$):
+ 0000 00000000 11111111 00000000 22222222[     ]+................[     ]*
+ 0010 [01]00000[01]0 .*
+#pass
diff --git a/gas/testsuite/gas/mach-o/redef3.d b/gas/testsuite/gas/mach-o/redef3.d
new file mode 100644 (file)
index 0000000..3f61a3f
--- /dev/null
@@ -0,0 +1,17 @@
+#objdump: -rsj .data
+#name: .equ redefinitions (3)
+#identical to ../all/redef, we just need to reverse the relocs.
+#source: ../all/redef3.s
+
+.*: .*
+
+RELOCATION RECORDS FOR .*
+.*
+0+10.*sym
+0+08.*xtrn
+0+00.*(here|\.data)
+#...
+Contents of section \.data:
+ 0000 00000000 11111111 00000000 22222222[     ]+................[     ]*
+ 0010 00000000 .*
+#pass
index e6d7bcfd40e1c5b6e0fd404be682b1b84a72c179..2c07f8eecbcd90e2ff55b2d7104996da8fbea57d 100644 (file)
@@ -1,5 +1,7 @@
 #objdump: -r
 #name: macro irp
+#darwin (mach-o) reverses relocs.
+#not-target: *-*-darwin*
 
 .*: +file format .*
 
index 272e441d02c68f3bf6ebee4f36f6a2c5dfd06383..1e6e42220fbd7e99ad692bf0ebfcdcebb135529d 100644 (file)
@@ -1,5 +1,7 @@
 #objdump: -r
 #name: nested irp/irpc/rept
+# darwin (mach-o) reverse relocs.
+#not-target: *-*-darwin*
 
 .*: +file format .*
 
index 0022d5f95dfb5b0705056fcf5d31d17d79ea8e3b..df2ed9648e13a60d776c11209fecd1be49a244c2 100644 (file)
@@ -1,5 +1,7 @@
 #objdump: -r
 #name: macro rept
+#darwin (mach-o) reverses relocs.
+#not-target: *-*-darwin*
 
 .*: +file format .*
 
index 9a7d41481d799bfe24467695b0f5d5f21cf8a118..e5041cd1ff18702c21b2ae242903608bc76f727e 100644 (file)
@@ -1,5 +1,7 @@
 #objdump: -r
 #name: macro test 2
+# darwin(mach-o) reverses the order of relocs.
+#not-target: *-*-darwin*
 
 .*: +file format .*
 
index 4b943fd18fac575b99f8443b70d2febfd42081c4..94c151126013ded5a40c1e8b2e8a130fa3ccd86c 100644 (file)
@@ -1,5 +1,7 @@
 #objdump: -r
 #name: macro vararg
+# darwin (mach-o) reverses relocs.
+#not-target: *-*-darwin*
 
 .*: +file format .*