diff options
-rw-r--r-- | gas/ChangeLog | 6 | ||||
-rw-r--r-- | gas/config/tc-ppc.c | 17 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/aix.exp | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/xcoff-branch-1-32.d | 61 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/xcoff-branch-1-64.d | 61 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/xcoff-branch-1.s | 40 |
7 files changed, 185 insertions, 8 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index b4472b2..5056d8d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,11 @@ 2009-03-14 Richard Sandiford <r.sandiford@uk.ibm.com> + * config/tc-ppc.c (md_apply_fix): On COFF targets, always reread + "value" from fx_offset. Manually resubtract md_pcrel_from_section + where necessary. + +2009-03-14 Richard Sandiford <r.sandiford@uk.ibm.com> + * configure.tgt: Extend AIX 5 behavior to AIX 6 and above. * configure.in: Likewise. * configure: Regenerate. diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c index 691d943..c3803b3 100644 --- a/gas/config/tc-ppc.c +++ b/gas/config/tc-ppc.c @@ -5741,18 +5741,19 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) going to use the symbol value. That means that if the reloc is fully resolved we want to use *valP since bfd_install_relocation is not being used. - However, if the reloc is not fully resolved we do not want to use - *valP, and must use fx_offset instead. However, if the reloc - is PC relative, we do want to use *valP since it includes the - result of md_pcrel_from. This is confusing. */ + However, if the reloc is not fully resolved we do not want to + use *valP, and must use fx_offset instead. If the relocation + is PC-relative, we then need to re-apply md_pcrel_from_section + to this new relocation value. */ if (fixP->fx_addsy == (symbolS *) NULL) fixP->fx_done = 1; - else if (fixP->fx_pcrel) - ; - else - value = fixP->fx_offset; + { + value = fixP->fx_offset; + if (fixP->fx_pcrel) + value -= md_pcrel_from_section (fixP, seg); + } #endif if (fixP->fx_subsy != (symbolS *) NULL) diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index ad4a755..b97d3d1 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-03-14 Richard Sandiford <r.sandiford@uk.ibm.com> + + * gas/ppc/xcoff-branch-1.s, gas/ppc/xcoff-branch-1-32.d, + gas/ppc/xcoff-branch-1-64.d: New tests. + * gas/ppc/aix.exp: Run them. + 2009-03-11 Hans-Peter Nilsson <hp@axis.com> * gas/cris/rd-bkw5.d, gas/cris/rd-bkw5.s, gas/cris/rd-bkw5b.d, diff --git a/gas/testsuite/gas/ppc/aix.exp b/gas/testsuite/gas/ppc/aix.exp index 9a8b2b7..83e14af 100644 --- a/gas/testsuite/gas/ppc/aix.exp +++ b/gas/testsuite/gas/ppc/aix.exp @@ -63,4 +63,6 @@ if [istarget powerpc-ibm-aix*] then { run_dump_test "textalign-xcoff-001" run_dump_test "textalign-xcoff-002" + run_dump_test "xcoff-branch-1-32" + run_dump_test "xcoff-branch-1-64" } diff --git a/gas/testsuite/gas/ppc/xcoff-branch-1-32.d b/gas/testsuite/gas/ppc/xcoff-branch-1-32.d new file mode 100644 index 0000000..55aea6d --- /dev/null +++ b/gas/testsuite/gas/ppc/xcoff-branch-1-32.d @@ -0,0 +1,61 @@ +#as: -a32 +#source: xcoff-branch-1.s +#objdump: -dr +#name: XCOFF branch test 1 (32-bit) + +.* + + +Disassembly of section \.text: + +0+00 <\.foo>: + 0: 48 00 00 29 bl 28 <foo2\+0x4> + 4: 48 00 00 1d bl 20 <foo1\+0xc> + 8: 48 00 00 0d bl 14 <foo1> + c: 48 00 00 19 bl 24 <foo2> + 10: 48 00 00 1d bl 2c <\.bar> + 10: R_(RBR_26|BR) .* + +0+14 <foo1>: + 14: 4b ff ff ed bl 0 <\.foo> + 18: 48 00 00 3d bl 54 <\.frob> + 18: R_(RBR_26|BR) .* + 1c: 4b ff ff f5 bl 10 <\.foo\+0x10> + 20: 48 00 00 15 bl 34 <\.bar\+0x8> + 20: R_(RBR_26|BR) .* + +0+24 <foo2>: + 24: 48 00 00 41 bl 64 <\.frob\+0x10> + 24: R_(RBR_26|BR) .* + 28: 4e 80 00 20 br + +0+2c <\.bar>: + 2c: 4b ff ff e9 bl 14 <foo1> + 2c: R_(RBR_26|BR) .* + 30: 4b ff ff f5 bl 24 <foo2> + 30: R_(RBR_26|BR) .* + 34: 4b ff ff e9 bl 1c <foo1\+0x8> + 34: R_(RBR_26|BR) .* + 38: 4b ff ff f1 bl 28 <foo2\+0x4> + 38: R_(RBR_26|BR) .* + 3c: 4b ff ff c5 bl 0 <\.foo> + 3c: R_(RBR_26|BR) .* + 40: 4b ff ff ed bl 2c <\.bar> + 44: 48 00 00 11 bl 54 <\.frob> + 44: R_(RBR_26|BR) .* + 48: 4b ff ff d5 bl 1c <foo1\+0x8> + 48: R_(RBR_26|BR) .* + 4c: 4b ff ff ed bl 38 <\.bar\+0xc> + 50: 48 00 00 09 bl 58 <\.frob\+0x4> + 50: R_(RBR_26|BR) .* + +0+54 <\.frob>: + 54: 4b ff ff ad bl 0 <\.foo> + 54: R_(RBR_26|BR) .* + 58: 4b ff ff d5 bl 2c <\.bar> + 58: R_(RBR_26|BR) .* + 5c: 4b ff ff f9 bl 54 <\.frob> + 60: 4b ff ff b5 bl 14 <foo1> + 60: R_(RBR_26|BR) .* + 64: 4b ff ff c1 bl 24 <foo2> + 64: R_(RBR_26|BR) .* diff --git a/gas/testsuite/gas/ppc/xcoff-branch-1-64.d b/gas/testsuite/gas/ppc/xcoff-branch-1-64.d new file mode 100644 index 0000000..42e15fb --- /dev/null +++ b/gas/testsuite/gas/ppc/xcoff-branch-1-64.d @@ -0,0 +1,61 @@ +#as: -a64 +#source: xcoff-branch-1.s +#objdump: -dr +#name: XCOFF branch test 1 (64-bit) + +.* + + +Disassembly of section \.text: + +0+00 <\.foo>: + 0: 48 00 00 29 bl 28 <foo2\+0x4> + 4: 48 00 00 1d bl 20 <foo1\+0xc> + 8: 48 00 00 0d bl 14 <foo1> + c: 48 00 00 19 bl 24 <foo2> + 10: 48 00 00 1d bl 2c <\.bar> + 10: R_(RBR_26|BR) .* + +0+14 <foo1>: + 14: 4b ff ff ed bl 0 <\.foo> + 18: 48 00 00 3d bl 54 <\.frob> + 18: R_(RBR_26|BR) .* + 1c: 4b ff ff f5 bl 10 <\.foo\+0x10> + 20: 48 00 00 15 bl 34 <\.bar\+0x8> + 20: R_(RBR_26|BR) .* + +0+24 <foo2>: + 24: 48 00 00 41 bl 64 <\.frob\+0x10> + 24: R_(RBR_26|BR) .* + 28: 4e 80 00 20 blr + +0+2c <\.bar>: + 2c: 4b ff ff e9 bl 14 <foo1> + 2c: R_(RBR_26|BR) .* + 30: 4b ff ff f5 bl 24 <foo2> + 30: R_(RBR_26|BR) .* + 34: 4b ff ff e9 bl 1c <foo1\+0x8> + 34: R_(RBR_26|BR) .* + 38: 4b ff ff f1 bl 28 <foo2\+0x4> + 38: R_(RBR_26|BR) .* + 3c: 4b ff ff c5 bl 0 <\.foo> + 3c: R_(RBR_26|BR) .* + 40: 4b ff ff ed bl 2c <\.bar> + 44: 48 00 00 11 bl 54 <\.frob> + 44: R_(RBR_26|BR) .* + 48: 4b ff ff d5 bl 1c <foo1\+0x8> + 48: R_(RBR_26|BR) .* + 4c: 4b ff ff ed bl 38 <\.bar\+0xc> + 50: 48 00 00 09 bl 58 <\.frob\+0x4> + 50: R_(RBR_26|BR) .* + +0+54 <\.frob>: + 54: 4b ff ff ad bl 0 <\.foo> + 54: R_(RBR_26|BR) .* + 58: 4b ff ff d5 bl 2c <\.bar> + 58: R_(RBR_26|BR) .* + 5c: 4b ff ff f9 bl 54 <\.frob> + 60: 4b ff ff b5 bl 14 <foo1> + 60: R_(RBR_26|BR) .* + 64: 4b ff ff c1 bl 24 <foo2> + 64: R_(RBR_26|BR) .* diff --git a/gas/testsuite/gas/ppc/xcoff-branch-1.s b/gas/testsuite/gas/ppc/xcoff-branch-1.s new file mode 100644 index 0000000..0cfeb3e --- /dev/null +++ b/gas/testsuite/gas/ppc/xcoff-branch-1.s @@ -0,0 +1,40 @@ + .globl .foo + .globl foo1 + .globl foo2 + .globl .bar + .globl .frob + + .csect .foo[PR] +.foo: + bl foo2 + 0x4 + bl foo1 + 0xc + bl foo1 + bl foo2 + bl .bar +foo1: + bl .foo + bl .frob + bl .foo + 0x10 + bl .bar + 0x8 +foo2: + bl .frob + 0x10 + blr + + .csect .bar[PR] +.bar: bl foo1 + bl foo2 + bl foo1 + 0x8 + bl foo2 + 0x4 + bl .foo + bl .bar + bl .frob + bl .foo + 0x1c + bl .bar + 0xc + bl .frob + 0x4 + + .csect .frob[PR] +.frob: bl .foo + bl .bar + bl .frob + bl foo1 + bl foo2 |