* Fix some of the ARM GAS failures
@ 2005-05-24 21:24 Zack Weinberg
2005-05-25 13:42 ` Richard Earnshaw
0 siblings, 1 reply; 3+ messages in thread
From: Zack Weinberg @ 2005-05-24 21:24 UTC (permalink / raw)
To: Nick Clifton, binutils
This patch should improve the ARM-GAS situation somewhat. md_apply_fix3
needs to truncate the relocation to 32 signed bits manually; if the host
is 64-bit, fx_addnumber and fx_offset are 64-bit, and may generate
spurious overflows. Also, we need a double cast on both sides of the
hack to pass an integer around in tc_fix_data.
zw
* config/tc-arm.c (fix_new_arm): Cast thumb_mode to size_t
before casting it to PTR.
(md_apply_fix3): Truncate value, *valP, fixP->fx_addnumber,
and fixP->fx_offset to 32 signed bits.
===================================================================
Index: config/tc-arm.c
--- config/tc-arm.c 18 May 2005 05:40:07 -0000 1.204
+++ config/tc-arm.c 24 May 2005 20:08:45 -0000
@@ -7296,8 +7296,9 @@ fix_new_arm (fragS * frag,
}
/* Mark whether the fix is to a THUMB instruction, or an ARM
- instruction. */
- new_fix->tc_fix_data = (PTR) thumb_mode;
+ instruction. The double cast prevents warnings about
+ creating a pointer from an integer of different size. */
+ new_fix->tc_fix_data = (PTR) (size_t) thumb_mode;
}
static void
@@ -10098,9 +10099,21 @@ md_apply_fix3 (fixS * fixP,
value += md_pcrel_from (fixP);
}
- /* Remember value for emit_reloc. */
+ /* On a 64-bit host, silently truncate 'value' to 32 bits for
+ consistency with the behavior on 32-bit hosts. Remember value
+ for emit_reloc. */
+ value &= 0xffffffff;
+ value ^= 0x80000000;
+ value -= 0x80000000;
+
+ *valP = value;
fixP->fx_addnumber = value;
+ /* Same treatment for fixP->fx_offset. */
+ fixP->fx_offset &= 0xffffffff;
+ fixP->fx_offset ^= 0x80000000;
+ fixP->fx_offset -= 0x80000000;
+
switch (fixP->fx_r_type)
{
case BFD_RELOC_NONE:
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Fix some of the ARM GAS failures
2005-05-24 21:24 Fix some of the ARM GAS failures Zack Weinberg
@ 2005-05-25 13:42 ` Richard Earnshaw
2005-05-27 11:42 ` Zack Weinberg
0 siblings, 1 reply; 3+ messages in thread
From: Richard Earnshaw @ 2005-05-25 13:42 UTC (permalink / raw)
To: Zack Weinberg; +Cc: Nick Clifton, binutils
On Tue, 2005-05-24 at 21:17, Zack Weinberg wrote:
> This patch should improve the ARM-GAS situation somewhat. md_apply_fix3
> needs to truncate the relocation to 32 signed bits manually; if the host
> is 64-bit, fx_addnumber and fx_offset are 64-bit, and may generate
> spurious overflows. Also, we need a double cast on both sides of the
> hack to pass an integer around in tc_fix_data.
>
AFAICT tc_fix_data is a private type to the ARM-specific parts of the
assembler. Since storing the thumbness is the only use, and the type of
tc_fix_data is defined in tc-arm.h (TC_FIX_TYPE), it would make much
more sense to just change TC_FIX_TYPE to 'int' and get rid of all those
nasty casts.
Otherwise OK.
R.
> zw
> * config/tc-arm.c (fix_new_arm): Cast thumb_mode to size_t
> before casting it to PTR.
> (md_apply_fix3): Truncate value, *valP, fixP->fx_addnumber,
> and fixP->fx_offset to 32 signed bits.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Fix some of the ARM GAS failures
2005-05-25 13:42 ` Richard Earnshaw
@ 2005-05-27 11:42 ` Zack Weinberg
0 siblings, 0 replies; 3+ messages in thread
From: Zack Weinberg @ 2005-05-27 11:42 UTC (permalink / raw)
To: Richard Earnshaw; +Cc: Nick Clifton, binutils
Richard Earnshaw <rearnsha@gcc.gnu.org> writes:
> On Tue, 2005-05-24 at 21:17, Zack Weinberg wrote:
>> This patch should improve the ARM-GAS situation somewhat. md_apply_fix3
>> needs to truncate the relocation to 32 signed bits manually; if the host
>> is 64-bit, fx_addnumber and fx_offset are 64-bit, and may generate
>> spurious overflows. Also, we need a double cast on both sides of the
>> hack to pass an integer around in tc_fix_data.
>>
>
> AFAICT tc_fix_data is a private type to the ARM-specific parts of the
> assembler. Since storing the thumbness is the only use, and the type of
> tc_fix_data is defined in tc-arm.h (TC_FIX_TYPE), it would make much
> more sense to just change TC_FIX_TYPE to 'int' and get rid of all those
> nasty casts.
>
> Otherwise OK.
Gosh, I had no idea the target could define the type of tc_fix_data.
Thanks!
Here's the patch I'll check in.
zw
* config/tc-arm.h (TC_FIX_TYPE): Change to int.
(TC_INIT_FIX_DATA): Initialize to 0, not NULL.
* config/tc-arm.c (fix_new_arm): Remove now-unnecessary cast.
(md_apply_fix3): Delete fix_is_thumb variable; refer to
fixP->tc_fix_data directly in the sole place it was used.
Explicitly truncate value, *valP, fixP->fx_addnumber, and
fixP->fx_offset to 32 bits, for consistent behavior between 32-
and 64-bit hosts.
===================================================================
Index: config/tc-arm.h
--- config/tc-arm.h 18 May 2005 05:40:08 -0000 1.28
+++ config/tc-arm.h 27 May 2005 06:43:18 -0000
@@ -96,8 +96,8 @@ struct fix;
deliberately not been updated to mark assembler created stabs
symbols as Thumb. */
-#define TC_FIX_TYPE PTR
-#define TC_INIT_FIX_DATA(FIX) ((FIX)->tc_fix_data = NULL)
+#define TC_FIX_TYPE int
+#define TC_INIT_FIX_DATA(FIX) ((FIX)->tc_fix_data = 0)
/* We need to keep some local information on symbols. */
===================================================================
Index: config/tc-arm.c
--- config/tc-arm.c 18 May 2005 05:40:07 -0000 1.204
+++ config/tc-arm.c 27 May 2005 06:46:10 -0000
@@ -7297,7 +7297,7 @@ fix_new_arm (fragS * frag,
/* Mark whether the fix is to a THUMB instruction, or an ARM
instruction. */
- new_fix->tc_fix_data = (PTR) thumb_mode;
+ new_fix->tc_fix_data = thumb_mode;
}
static void
@@ -10077,9 +10077,6 @@ md_apply_fix3 (fixS * fixP,
unsigned long temp;
int sign;
char * buf = fixP->fx_where + fixP->fx_frag->fr_literal;
- /* The double cast here prevents warnings about converting a pointer
- to an integer of different size. We know the value is 0, 1, or 2. */
- int fix_is_thumb = (int) (size_t) fixP->tc_fix_data;
assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
@@ -10098,9 +10095,21 @@ md_apply_fix3 (fixS * fixP,
value += md_pcrel_from (fixP);
}
- /* Remember value for emit_reloc. */
+ /* On a 64-bit host, silently truncate 'value' to 32 bits for
+ consistency with the behavior on 32-bit hosts. Remember value
+ for emit_reloc. */
+ value &= 0xffffffff;
+ value ^= 0x80000000;
+ value -= 0x80000000;
+
+ *valP = value;
fixP->fx_addnumber = value;
+ /* Same treatment for fixP->fx_offset. */
+ fixP->fx_offset &= 0xffffffff;
+ fixP->fx_offset ^= 0x80000000;
+ fixP->fx_offset -= 0x80000000;
+
switch (fixP->fx_r_type)
{
case BFD_RELOC_NONE:
@@ -10436,7 +10445,7 @@ md_apply_fix3 (fixS * fixP,
break;
case BFD_RELOC_ARM_SWI:
- if (fix_is_thumb)
+ if (fixP->tc_fix_data != 0)
{
if (((unsigned long) value) > 0xff)
as_bad_where (fixP->fx_file, fixP->fx_line,
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2005-05-27 6:52 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-05-24 21:24 Fix some of the ARM GAS failures Zack Weinberg
2005-05-25 13:42 ` Richard Earnshaw
2005-05-27 11:42 ` Zack Weinberg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).