* config/tc-arm.h (TC_FIX_TYPE): Change to int.
authorZack Weinberg <zackw@panix.com>
Fri, 27 May 2005 07:11:45 +0000 (07:11 +0000)
committerZack Weinberg <zackw@panix.com>
Fri, 27 May 2005 07:11:45 +0000 (07:11 +0000)
(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.

gas/ChangeLog
gas/config/tc-arm.c
gas/config/tc-arm.h

index 155957b61e624046c73aa97f9ffc58159b4810cd..ced79a88a3ec78b6c6c85dac94087e87efa530b1 100644 (file)
@@ -1,3 +1,14 @@
+2005-05-26  Zack Weinberg  <zack@codesourcery.com>
+
+       * 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.
+
 2005-05-27  Jan Beulich  <jbeulich@novell.com>
 
        * config/tc-ia64.c (struct proc_pending): New.
index a0804f3a05d54f5c7b94d2147a5b6c9fec2ca4d5..00ad3edb4419807a1b15fa9991431702d8114065 100644 (file)
@@ -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,
index 7660cfcb883b68a968f19dfa2cad5210f88e11c2..4f52f43274b88052f06901425687d7f03ca9e82a 100644 (file)
@@ -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.  */