From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20639 invoked by alias); 27 May 2005 06:52:22 -0000 Mailing-List: contact binutils-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sources.redhat.com Received: (qmail 20616 invoked by uid 22791); 27 May 2005 06:52:17 -0000 Received: from admin.voldemort.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.9) by sourceware.org (qpsmtpd/0.30-dev) with ESMTP; Fri, 27 May 2005 06:52:17 +0000 Received: (qmail 10884 invoked from network); 27 May 2005 06:52:14 -0000 Received: from localhost (HELO taltos.codesourcery.com) (zack@127.0.0.1) by mail.codesourcery.com with SMTP; 27 May 2005 06:52:14 -0000 Received: by taltos.codesourcery.com (sSMTP sendmail emulation); Thu, 26 May 2005 23:52:16 -0700 To: Richard Earnshaw Cc: Nick Clifton , binutils@sourceware.org Subject: Re: Fix some of the ARM GAS failures References: <1116965825.7031.16.camel@localhost.localdomain> <1117010314.7618.15.camel@pc960.cambridge.arm.com> From: Zack Weinberg Date: Fri, 27 May 2005 11:42:00 -0000 In-Reply-To: <1117010314.7618.15.camel@pc960.cambridge.arm.com> (Richard Earnshaw's message of "Wed, 25 May 2005 09:38:34 +0100") Message-ID: <87fyw9kvr3.fsf@codesourcery.com> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2005-05/txt/msg00718.txt.bz2 Richard Earnshaw 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,