From 34dd18bca5b8991d5e107dc1669ba6710916ce1d Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Fri, 13 Jan 2012 15:19:13 +0000 Subject: [PATCH] reverse the order of relocs in mach-o gas output. 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. --- gas/ChangeLog | 6 ++++ gas/config/obj-macho.c | 17 ++++++++++ gas/config/obj-macho.h | 5 +++ gas/testsuite/ChangeLog | 18 ++++++++++ gas/testsuite/gas/all/redef2.d | 1 + gas/testsuite/gas/all/redef3.d | 2 +- gas/testsuite/gas/all/weakref1.d | 3 +- gas/testsuite/gas/mach-o/macro-irp.d | 14 ++++++++ gas/testsuite/gas/mach-o/macro-repeat.d | 44 +++++++++++++++++++++++++ gas/testsuite/gas/mach-o/macro-rept.d | 11 +++++++ gas/testsuite/gas/mach-o/macro-test2.d | 11 +++++++ gas/testsuite/gas/mach-o/macro-vararg.d | 14 ++++++++ gas/testsuite/gas/mach-o/redef2.d | 17 ++++++++++ gas/testsuite/gas/mach-o/redef3.d | 17 ++++++++++ gas/testsuite/gas/macros/irp.d | 2 ++ gas/testsuite/gas/macros/repeat.d | 2 ++ gas/testsuite/gas/macros/rept.d | 2 ++ gas/testsuite/gas/macros/test2.d | 2 ++ gas/testsuite/gas/macros/vararg.d | 2 ++ 19 files changed, 188 insertions(+), 2 deletions(-) create mode 100644 gas/testsuite/gas/mach-o/macro-irp.d create mode 100644 gas/testsuite/gas/mach-o/macro-repeat.d create mode 100644 gas/testsuite/gas/mach-o/macro-rept.d create mode 100644 gas/testsuite/gas/mach-o/macro-test2.d create mode 100644 gas/testsuite/gas/mach-o/macro-vararg.d create mode 100644 gas/testsuite/gas/mach-o/redef2.d create mode 100644 gas/testsuite/gas/mach-o/redef3.d diff --git a/gas/ChangeLog b/gas/ChangeLog index 9d405565a7..5c3c60a597 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2012-01-13 Tristan Gingold + + * 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 * config/obj-macho.c (obj_mach_o_set_indirect_symbols): Handle diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c index ddf098881b..f0cb43e115 100644 --- a/gas/config/obj-macho.c +++ b/gas/config/obj-macho.c @@ -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 diff --git a/gas/config/obj-macho.h b/gas/config/obj-macho.h index 2fc5cb6876..bb8daf90c0 100644 --- a/gas/config/obj-macho.h +++ b/gas/config/obj-macho.h @@ -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) diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 01418cb3f1..ea80694d96 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,21 @@ +2012-01-13 Iain Sandoe + + * 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 * gas/mach-o/dysymtab-3.d: New. diff --git a/gas/testsuite/gas/all/redef2.d b/gas/testsuite/gas/all/redef2.d index 244d33dd68..c50cd6c94c 100644 --- a/gas/testsuite/gas/all/redef2.d +++ b/gas/testsuite/gas/all/redef2.d @@ -1,5 +1,6 @@ #objdump: -rs -j .data -j "\$DATA\$" #name: .equ redefinitions (2) +#not-target: *-*-darwin* .*: .* diff --git a/gas/testsuite/gas/all/redef3.d b/gas/testsuite/gas/all/redef3.d index 566f9c95d5..a16fac3c9b 100644 --- a/gas/testsuite/gas/all/redef3.d +++ b/gas/testsuite/gas/all/redef3.d @@ -1,6 +1,6 @@ #objdump: -rsj .data #name: .equ redefinitions (3) -#not-target: arc-*-* +#not-target: arc-*-* *-*darwin* .*: .* diff --git a/gas/testsuite/gas/all/weakref1.d b/gas/testsuite/gas/all/weakref1.d index ee37d97700..b44d1fced4 100644 --- a/gas/testsuite/gas/all/weakref1.d +++ b/gas/testsuite/gas/all/weakref1.d @@ -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 index 0000000000..c7737fa0fb --- /dev/null +++ b/gas/testsuite/gas/mach-o/macro-irp.d @@ -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 index 0000000000..db215a43d2 --- /dev/null +++ b/gas/testsuite/gas/mach-o/macro-repeat.d @@ -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 index 0000000000..7ac212a78c --- /dev/null +++ b/gas/testsuite/gas/mach-o/macro-rept.d @@ -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 index 0000000000..30a2b2f5e2 --- /dev/null +++ b/gas/testsuite/gas/mach-o/macro-test2.d @@ -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 index 0000000000..da6c0afece --- /dev/null +++ b/gas/testsuite/gas/mach-o/macro-vararg.d @@ -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 index 0000000000..5e76d5074a --- /dev/null +++ b/gas/testsuite/gas/mach-o/redef2.d @@ -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 index 0000000000..3f61a3fe8f --- /dev/null +++ b/gas/testsuite/gas/mach-o/redef3.d @@ -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 diff --git a/gas/testsuite/gas/macros/irp.d b/gas/testsuite/gas/macros/irp.d index e6d7bcfd40..2c07f8eecb 100644 --- a/gas/testsuite/gas/macros/irp.d +++ b/gas/testsuite/gas/macros/irp.d @@ -1,5 +1,7 @@ #objdump: -r #name: macro irp +#darwin (mach-o) reverses relocs. +#not-target: *-*-darwin* .*: +file format .* diff --git a/gas/testsuite/gas/macros/repeat.d b/gas/testsuite/gas/macros/repeat.d index 272e441d02..1e6e42220f 100644 --- a/gas/testsuite/gas/macros/repeat.d +++ b/gas/testsuite/gas/macros/repeat.d @@ -1,5 +1,7 @@ #objdump: -r #name: nested irp/irpc/rept +# darwin (mach-o) reverse relocs. +#not-target: *-*-darwin* .*: +file format .* diff --git a/gas/testsuite/gas/macros/rept.d b/gas/testsuite/gas/macros/rept.d index 0022d5f95d..df2ed9648e 100644 --- a/gas/testsuite/gas/macros/rept.d +++ b/gas/testsuite/gas/macros/rept.d @@ -1,5 +1,7 @@ #objdump: -r #name: macro rept +#darwin (mach-o) reverses relocs. +#not-target: *-*-darwin* .*: +file format .* diff --git a/gas/testsuite/gas/macros/test2.d b/gas/testsuite/gas/macros/test2.d index 9a7d41481d..e5041cd1ff 100644 --- a/gas/testsuite/gas/macros/test2.d +++ b/gas/testsuite/gas/macros/test2.d @@ -1,5 +1,7 @@ #objdump: -r #name: macro test 2 +# darwin(mach-o) reverses the order of relocs. +#not-target: *-*-darwin* .*: +file format .* diff --git a/gas/testsuite/gas/macros/vararg.d b/gas/testsuite/gas/macros/vararg.d index 4b943fd18f..94c1511260 100644 --- a/gas/testsuite/gas/macros/vararg.d +++ b/gas/testsuite/gas/macros/vararg.d @@ -1,5 +1,7 @@ #objdump: -r #name: macro vararg +# darwin (mach-o) reverses relocs. +#not-target: *-*-darwin* .*: +file format .*