From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3943 invoked by alias); 24 May 2005 20:10:53 -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 3291 invoked by uid 22791); 24 May 2005 20:10:45 -0000 Received: from admin.voldemort.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.9) by sourceware.org (qpsmtpd/0.30-dev) with ESMTP; Tue, 24 May 2005 20:10:45 +0000 Received: (qmail 28214 invoked from network); 24 May 2005 20:10:43 -0000 Received: from localhost (HELO ?10.100.1.196?) (zack@127.0.0.1) by mail.codesourcery.com with SMTP; 24 May 2005 20:10:43 -0000 Subject: Fix some of the ARM GAS failures From: Zack Weinberg To: Nick Clifton , binutils@sourceware.org Content-Type: text/plain Date: Tue, 24 May 2005 21:24:00 -0000 Message-Id: <1116965825.7031.16.camel@localhost.localdomain> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-SW-Source: 2005-05/txt/msg00687.txt.bz2 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: