diff options
author | Marcus Shawcroft <mshawcroft@sourceware.org> | 2013-05-28 09:43:42 +0000 |
---|---|---|
committer | Marcus Shawcroft <mshawcroft@sourceware.org> | 2013-05-28 09:43:42 +0000 |
commit | 89d2a2a39e924e48033edc1d04e55b5cc10dbe21 (patch) | |
tree | 6ae7d6f6d85792371d339b6d8733c6e45867a92e /gas/config | |
parent | a73e3634d1f2873959629046578ef562aed68592 (diff) | |
download | gdb-89d2a2a39e924e48033edc1d04e55b5cc10dbe21.zip gdb-89d2a2a39e924e48033edc1d04e55b5cc10dbe21.tar.gz gdb-89d2a2a39e924e48033edc1d04e55b5cc10dbe21.tar.bz2 |
[AArch64] Range check only resolved relocations.
2013-05-28 Marcus Shawcroft <marcus.shawcroft@arm.com>
* config/tc-aarch64.c (md_apply_fix): Move value range checking
inside fx_done condition.
2013-05-28 Marcus Shawcroft <marcus.shawcroft@arm.com>
* 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.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-aarch64.c | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 6cd7e9d..6af526d 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); |