diff --git a/gas/ChangeLog b/gas/ChangeLog index 83fb073d9cf..c21bffb9d68 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2013-05-28 Marcus Shawcroft + + * config/tc-aarch64.c (md_apply_fix): Move value range checking + inside fx_done condition. + 2013-05-22 Jürgen Urban * config/tc-mips.c (macro): Handle M_LQC2_AB and M_SQC2_AB. diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 6cd7e9d5862..6af526db232 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -6341,14 +6341,14 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg) break; case BFD_RELOC_AARCH64_LD_LO19_PCREL: - if (value & 3) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("pc-relative load offset not word aligned")); - if (signed_overflow (value, 21)) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("pc-relative load offset out of range")); if (fixP->fx_done || !seg->use_rela_p) { + if (value & 3) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("pc-relative load offset not word aligned")); + if (signed_overflow (value, 21)) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("pc-relative load offset out of range")); insn = get_aarch64_insn (buf); insn |= encode_ld_lit_ofs_19 (value >> 2); put_aarch64_insn (buf, insn); @@ -6356,11 +6356,11 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg) break; case BFD_RELOC_AARCH64_ADR_LO21_PCREL: - if (signed_overflow (value, 21)) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("pc-relative address offset out of range")); if (fixP->fx_done || !seg->use_rela_p) { + if (signed_overflow (value, 21)) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("pc-relative address offset out of range")); insn = get_aarch64_insn (buf); insn |= encode_adr_imm (value); put_aarch64_insn (buf, insn); @@ -6368,14 +6368,14 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg) break; case BFD_RELOC_AARCH64_BRANCH19: - if (value & 3) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("conditional branch target not word aligned")); - if (signed_overflow (value, 21)) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("conditional branch out of range")); if (fixP->fx_done || !seg->use_rela_p) { + if (value & 3) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("conditional branch target not word aligned")); + if (signed_overflow (value, 21)) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("conditional branch out of range")); insn = get_aarch64_insn (buf); insn |= encode_cond_branch_ofs_19 (value >> 2); put_aarch64_insn (buf, insn); @@ -6383,14 +6383,14 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg) break; case BFD_RELOC_AARCH64_TSTBR14: - if (value & 3) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("conditional branch target not word aligned")); - if (signed_overflow (value, 16)) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("conditional branch out of range")); if (fixP->fx_done || !seg->use_rela_p) { + if (value & 3) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("conditional branch target not word aligned")); + if (signed_overflow (value, 16)) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("conditional branch out of range")); insn = get_aarch64_insn (buf); insn |= encode_tst_branch_ofs_14 (value >> 2); put_aarch64_insn (buf, insn); @@ -6399,13 +6399,14 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg) case BFD_RELOC_AARCH64_JUMP26: case BFD_RELOC_AARCH64_CALL26: - if (value & 3) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("branch target not word aligned")); - if (signed_overflow (value, 28)) - as_bad_where (fixP->fx_file, fixP->fx_line, _("branch out of range")); if (fixP->fx_done || !seg->use_rela_p) { + if (value & 3) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("branch target not word aligned")); + if (signed_overflow (value, 28)) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("branch out of range")); insn = get_aarch64_insn (buf); insn |= encode_branch_ofs_26 (value >> 2); put_aarch64_insn (buf, insn); diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index f71d45cbc9f..f32603373bb 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2013-05-28 Marcus Shawcroft + + * gas/aarch64/adr_1.d: New file. + * gas/aarch64/adr_1.s: New file. + * gas/aarch64/b_1.d: New file. + * gas/aarch64/b_1.s: New file. + * gas/aarch64/beq_1.d: New file. + * gas/aarch64/beq_1.s: New file. + * gas/aarch64/ldr_1.d: New file. + * gas/aarch64/ldr_1.s: New file. + * gas/aarch64/tbz_1.d: New file. + * gas/aarch64/tbz_1.s: New file. + 2013-05-24 Richard Sandiford * gas/s390/zarch-z9-109-err.s, gas/s390/zarch-z9-109-err.l: New test. diff --git a/gas/testsuite/gas/aarch64/adr_1.d b/gas/testsuite/gas/aarch64/adr_1.d new file mode 100644 index 00000000000..bfaaece8086 --- /dev/null +++ b/gas/testsuite/gas/aarch64/adr_1.d @@ -0,0 +1,9 @@ +#objdump: -dr + +.*: file format .* + +Disassembly of section \.text: + +0000000000000000 <.*>: + 0: 10000001 adr x1, 0 + 0: R_AARCH64_ADR_PREL_LO21 bar\+0x80000000 diff --git a/gas/testsuite/gas/aarch64/adr_1.s b/gas/testsuite/gas/aarch64/adr_1.s new file mode 100644 index 00000000000..e4ef2624628 --- /dev/null +++ b/gas/testsuite/gas/aarch64/adr_1.s @@ -0,0 +1,5 @@ +// adr.s Test file for AArch64 adr. + + .text + + adr x1, bar + 0x80000000 diff --git a/gas/testsuite/gas/aarch64/b_1.d b/gas/testsuite/gas/aarch64/b_1.d new file mode 100644 index 00000000000..c093f66a0de --- /dev/null +++ b/gas/testsuite/gas/aarch64/b_1.d @@ -0,0 +1,9 @@ +#objdump: -dr + +.*: file format .* + +Disassembly of section \.text: + +0000000000000000 <.*>: + 0: 14000000 b 0 + 0: R_AARCH64_JUMP26 bar\+0x8000000 diff --git a/gas/testsuite/gas/aarch64/b_1.s b/gas/testsuite/gas/aarch64/b_1.s new file mode 100644 index 00000000000..6de560702b1 --- /dev/null +++ b/gas/testsuite/gas/aarch64/b_1.s @@ -0,0 +1,5 @@ +// b.s Test file for AArch64 b. + + .text + + b bar + 0x8000000 diff --git a/gas/testsuite/gas/aarch64/beq_1.d b/gas/testsuite/gas/aarch64/beq_1.d new file mode 100644 index 00000000000..4e3b0d1e856 --- /dev/null +++ b/gas/testsuite/gas/aarch64/beq_1.d @@ -0,0 +1,9 @@ +#objdump: -dr + +.*: file format .* + +Disassembly of section \.text: + +0000000000000000 <.*>: + 0: 54000000 b.eq 0 + 0: R_AARCH64_CONDBR19 bar\+0x100000 diff --git a/gas/testsuite/gas/aarch64/beq_1.s b/gas/testsuite/gas/aarch64/beq_1.s new file mode 100644 index 00000000000..085c8de3de9 --- /dev/null +++ b/gas/testsuite/gas/aarch64/beq_1.s @@ -0,0 +1,5 @@ +// b.s Test file for AArch64 b. + + .text + + beq bar + 0x100000 diff --git a/gas/testsuite/gas/aarch64/ldr_1.d b/gas/testsuite/gas/aarch64/ldr_1.d new file mode 100644 index 00000000000..95f6f1b116b --- /dev/null +++ b/gas/testsuite/gas/aarch64/ldr_1.d @@ -0,0 +1,9 @@ +#objdump: -dr + +.*: file format .* + +Disassembly of section \.text: + +0000000000000000 <.*>: + 0: 58000001 ldr x1, 0 + 0: R_AARCH64_LD_PREL_LO19 bar\+0x100000 diff --git a/gas/testsuite/gas/aarch64/ldr_1.s b/gas/testsuite/gas/aarch64/ldr_1.s new file mode 100644 index 00000000000..8e4a14d42c5 --- /dev/null +++ b/gas/testsuite/gas/aarch64/ldr_1.s @@ -0,0 +1,5 @@ +// ldr.s Test file for AArch64 ldr. + + .text + + ldr x1, bar + 0x100000 diff --git a/gas/testsuite/gas/aarch64/tbz_1.d b/gas/testsuite/gas/aarch64/tbz_1.d new file mode 100644 index 00000000000..8183a2270d8 --- /dev/null +++ b/gas/testsuite/gas/aarch64/tbz_1.d @@ -0,0 +1,9 @@ +#objdump: -dr + +.*: file format .* + +Disassembly of section \.text: + +0000000000000000 <.*>: + 0: 36080000 tbz w0, #1, 0 + 0: R_AARCH64_TSTBR14 bar\+0x8000 diff --git a/gas/testsuite/gas/aarch64/tbz_1.s b/gas/testsuite/gas/aarch64/tbz_1.s new file mode 100644 index 00000000000..10a1a7fb6d5 --- /dev/null +++ b/gas/testsuite/gas/aarch64/tbz_1.s @@ -0,0 +1,5 @@ +// tbz.s Test file for AArch64 tbz. + + .text + + tbz x0, #1, bar + 0x8000