* elf32-arm.c (cortex_a8_erratum_scan): Change type of offset
authorNick Clifton <nickc@redhat.com>
Tue, 16 Jun 2009 11:33:42 +0000 (11:33 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 16 Jun 2009 11:33:42 +0000 (11:33 +0000)
   to bfd_signed_vma.  Cast constant operands which are used in
   offset related expressions to bfd_signed_vma type as appropriate.

bfd/ChangeLog
bfd/elf32-arm.c

index b0f4726..281d56e 100644 (file)
@@ -1,3 +1,9 @@
+2009-06-16  Doug Kwan  <dougkwan@google.com>
+
+        * elf32-arm.c (cortex_a8_erratum_scan): Change type of offset
+        to bfd_signed_vma.  Cast constant operands which are used in
+        offset related expressions to bfd_signed_vma type as appropriate.
+
 2009-06-16  Maciej W. Rozycki  <macro@linux-mips.org>
 
        * elf32-vax.c (elf_vax_plt_sym_val): New function.
index df4be8b..d06d369 100644 (file)
@@ -1,6 +1,6 @@
 /* 32-bit ELF support for ARM
    Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-   2008 Free Software Foundation, Inc.
+   2008, 2009  Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -3884,11 +3884,12 @@ static struct elf_link_hash_entry *find_thumb_glue (struct bfd_link_info *,
 
 /* Helper function to scan code for sequences which might trigger the Cortex-A8
    branch/TLB erratum.  Fill in the table described by A8_FIXES_P,
-   NUM_A8_FIXES_P, A8_FIX_TABLE_SIZE_P.  Return 1 if an error occurs, 0
+   NUM_A8_FIXES_P, A8_FIX_TABLE_SIZE_P.  Returns true if an error occurs, false
    otherwise.  */
 
-static int
-cortex_a8_erratum_scan (bfd *input_bfd, struct bfd_link_info *info,
+static bfd_boolean
+cortex_a8_erratum_scan (bfd *input_bfd,
+                       struct bfd_link_info *info,
                        struct a8_erratum_fix **a8_fixes_p,
                        unsigned int *num_a8_fixes_p,
                        unsigned int *a8_fix_table_size_p,
@@ -3922,7 +3923,7 @@ cortex_a8_erratum_scan (bfd *input_bfd, struct bfd_link_info *info,
       if (elf_section_data (section)->this_hdr.contents != NULL)
         contents = elf_section_data (section)->this_hdr.contents;
       else if (! bfd_malloc_and_get_section (input_bfd, section, &contents))
-        return 1;
+        return TRUE;
 
       sec_data = elf32_arm_section_data (section);
 
@@ -3949,9 +3950,7 @@ cortex_a8_erratum_scan (bfd *input_bfd, struct bfd_link_info *info,
                * The branch target is in the same 4KB region as the
                  first half of the branch.
                * The instruction before the branch is a 32-bit
-                 length non-branch instruction.
-          */
-
+                 length non-branch instruction.  */
           for (i = span_start; i < span_end;)
             {
               unsigned int insn = bfd_getl16 (&contents[i]);
@@ -3979,10 +3978,13 @@ cortex_a8_erratum_scan (bfd *input_bfd, struct bfd_link_info *info,
 
              is_32bit_branch = is_b || is_bl || is_blx || is_bcc;
                           
-              if (((base_vma + i) & 0xfff) == 0xffe && insn_32bit
-                 && is_32bit_branch && last_was_32bit && !last_was_branch)
+              if (((base_vma + i) & 0xfff) == 0xffe
+                 && insn_32bit
+                 && is_32bit_branch
+                 && last_was_32bit
+                 && ! last_was_branch)
                 {
-                  bfd_vma offset;
+                  bfd_signed_vma offset;
                   bfd_boolean force_target_arm = FALSE;
                  bfd_boolean force_target_thumb = FALSE;
                   bfd_vma target;
@@ -4031,7 +4033,7 @@ cortex_a8_erratum_scan (bfd *input_bfd, struct bfd_link_info *info,
                       offset |= (insn & 0x800) ? 0x80000 : 0;
                       offset |= (insn & 0x4000000) ? 0x100000 : 0;
                       if (offset & 0x100000)
-                        offset |= ~0xfffff;
+                        offset |= ~ ((bfd_signed_vma) 0xfffff);
                       stub_type = arm_stub_a8_veneer_b_cond;
                     }
                   else if (is_b || is_bl || is_blx)
@@ -4048,10 +4050,10 @@ cortex_a8_erratum_scan (bfd *input_bfd, struct bfd_link_info *info,
                       offset |= i1 << 23;
                       offset |= s << 24;
                       if (offset & 0x1000000)
-                        offset |= ~0xffffff;
+                        offset |= ~ ((bfd_signed_vma) 0xffffff);
 
                       if (is_blx)
-                        offset &= ~3u;
+                        offset &= ~ ((bfd_signed_vma) 3);
 
                       stub_type = is_blx ? arm_stub_a8_veneer_blx :
                         is_bl ? arm_stub_a8_veneer_bl : arm_stub_a8_veneer_b;
@@ -4084,14 +4086,15 @@ cortex_a8_erratum_scan (bfd *input_bfd, struct bfd_link_info *info,
                        }
 
                       if (is_blx)
-                        pc_for_insn &= ~3u;
+                        pc_for_insn &= ~ ((bfd_vma) 3);
 
                       /* If we found a relocation, use the proper destination,
                         not the offset in the (unrelocated) instruction.
                         Note this is always done if we switched the stub type
                         above.  */
                       if (found)
-                        offset = found->destination - pc_for_insn;
+                        offset =
+                         (bfd_signed_vma) (found->destination - pc_for_insn);
 
                       target = pc_for_insn + offset;
 
@@ -4144,7 +4147,7 @@ cortex_a8_erratum_scan (bfd *input_bfd, struct bfd_link_info *info,
   *num_a8_fixes_p = num_a8_fixes;
   *a8_fix_table_size_p = a8_fix_table_size;
   
-  return 0;
+  return FALSE;
 }
 
 /* Determine and set the size of the stub section for a final link.