This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH 2/2] MIPS/gas: Fix misaligned address errors to disregard ISA mode bit
- From: Faraz Shahbazker <fshahbazker at wavecomp dot com>
- To: "binutils at sourceware dot org" <binutils at sourceware dot org>
- Cc: Faraz Shahbazker <fshahbazker at wavecomp dot com>, Paul Hua <paul dot hua dot gm at gmail dot com>
- Date: Mon, 5 Aug 2019 23:38:46 +0000
- Subject: [PATCH 2/2] MIPS/gas: Fix misaligned address errors to disregard ISA mode bit
- Arc-authentication-results: i=1; mx.microsoft.com 1;spf=pass smtp.mailfrom=wavecomp.com;dmarc=pass action=none header.from=wavecomp.com;dkim=pass header.d=wavecomp.com;arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=UySVxZTJVDFquvZ+1urDKAVKnHB1IIcXDqZ/31rDf8g=; b=Rt0kpikgsiyeZDR9v17HSs9qNTLPq/nUlLcRg6XYUp2j+dpsuFKzQNSwyWcHhN2TK/4nMmYDxP1pNK9/zqhLKHF/f+n1GTYxMJV8/vLYITJrR7gN0j31T2T+/6IOVCWSfi3Fkkdi+Y6SXK+seeLvUsluOJyYDzDvSSBlEc0YDlwT17/BZZYjKPhrkgqKXJTyfObYIijh6WWRRcjws0ot96WLcHZRuWvrD8YUdV/O+TsFSdAuWd0ncHOxOPt9+KVrzFB/bhR6ksEql9wXgXfILygkzhMJ0Q+/U1eYwxMGmUbXkl9/zX9sVNjCSJLtbJIPaqP4TEMYIBFvfbE/1gsEhQ==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZqDvmF3FEGO0GDnWffSg7qYtuvk3jDYXfva6g8eVmIByzx6vPQvHIEXEXlPjehQYoBXURj29looe8u1LKrGImbOoOT2hgv5vnQu1A/OP1BTQop9TAMzN6nkCwo46yTXhMYMA55pCdC3k/Bk1fNncf4ZFd4jfigFVQGSdk2ktVLFHKWS+6TqiFpa8ix0Dy3Obm4wgK0sTj9SAOOJetK8MhQC0o3lcB/l8H5cYN1p2PmjDGxsfa77ng3jKQYURGw/u0mIoYakVPTbK43xup6foc+ipSoKGq3aRksfcRKotNcHqgFElZRrUofQw7GBHLT5nc/UVq3XYaNp/4LaHRLZavQ==
- References: <20190805233847.183450-1-fshahbazker@wavecomp.com>
gas/
* config/tc-mips.c (fix_bad_misaligned_address): New function.
(fix_validate_branch): Call fix_bad_misaligned address_to
calculate the target address.
(md_apply_fix): Likewise.
(md_convert_frag): Update misaligned address calculation to
disregard ISA mode bit.
---
gas/config/tc-mips.c | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 38a1b8c..8fdc501 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -15743,6 +15743,23 @@ fix_bad_misaligned_branch_p (fixS *fixP)
return (val & 0x3) != isa_bit;
}
+/* Calculate the relocation target by masking off ISA mode bit before
+ combining symbol and addend. */
+
+static valueT
+fix_bad_misaligned_address (fixS *fixP)
+{
+ valueT val;
+ valueT off;
+ int other;
+ gas_assert (fixP != NULL && fixP->fx_addsy != NULL);
+ val = S_GET_VALUE (fixP->fx_addsy);
+ other = S_GET_OTHER (fixP->fx_addsy);
+ off = fixP->fx_offset;
+
+ return ((val & ~(ELF_ST_IS_COMPRESSED (other))) + off);
+}
+
/* Make the necessary checks on a regular MIPS branch pointed to by FIXP
and its calculated value VAL. */
@@ -15759,7 +15776,7 @@ fix_validate_branch (fixS *fixP, valueT val)
else if (fix_bad_misaligned_branch_p (fixP))
as_bad_where (fixP->fx_file, fixP->fx_line,
_("branch to misaligned address (0x%lx)"),
- (long) (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset));
+ (long) fix_bad_misaligned_address (fixP));
else if (HAVE_IN_PLACE_ADDENDS && (fixP->fx_offset & 0x3) != 0)
as_bad_where (fixP->fx_file, fixP->fx_line,
_("cannot encode misaligned addend "
@@ -15898,8 +15915,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
else if (fix_bad_misaligned_jump_p (fixP, shift))
as_bad_where (fixP->fx_file, fixP->fx_line,
_("jump to misaligned address (0x%lx)"),
- (long) (S_GET_VALUE (fixP->fx_addsy)
- + fixP->fx_offset));
+ (long) fix_bad_misaligned_address (fixP));
else if (HAVE_IN_PLACE_ADDENDS
&& (fixP->fx_offset & ((1 << shift) - 1)) != 0)
as_bad_where (fixP->fx_file, fixP->fx_line,
@@ -16153,7 +16169,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
&& (fixP->fx_offset & 0x1) != 0)
as_bad_where (fixP->fx_file, fixP->fx_line,
_("branch to misaligned address (0x%lx)"),
- (long) (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset));
+ (long) fix_bad_misaligned_address (fixP));
else if (HAVE_IN_PLACE_ADDENDS && (fixP->fx_offset & 0x1) != 0)
as_bad_where (fixP->fx_file, fixP->fx_line,
_("cannot encode misaligned addend "
@@ -19000,7 +19016,8 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
else if ((fragp->fr_offset & 0x1) != 0)
as_bad_where (fragp->fr_file, fragp->fr_line,
_("branch to misaligned address (0x%lx)"),
- (long) val);
+ (long) (resolve_symbol_value (fragp->fr_symbol)
+ + (fragp->fr_offset & ~1)));
}
val = mips16_pcrel_val (fragp, pcrel_op, val, 0);
--
2.9.5