* elf32-xtensa.c (analyze_relocations): Zero src_count if not relaxing.
authorBob Wilson <bob.wilson@acm.org>
Thu, 1 Mar 2007 23:38:03 +0000 (23:38 +0000)
committerBob Wilson <bob.wilson@acm.org>
Thu, 1 Mar 2007 23:38:03 +0000 (23:38 +0000)
(find_relaxable_sections): Do not increment src_count for unknown
opcodes.  Decode only once instead of calling is_l32r_relocation.
(compute_text_actions): Remove unused no_insn_move flag.  Assert that
src_next matches src_count in relax_info.

bfd/ChangeLog
bfd/elf32-xtensa.c

index a59681dc358a7a3b22614dcc791876cf64e0e98a..37b3c2df2ee00af098c7a646a40ec7b96601d683 100644 (file)
@@ -1,3 +1,11 @@
+2007-03-01  Bob Wilson  <bob.wilson@acm.org>
+
+       * elf32-xtensa.c (analyze_relocations): Zero src_count if not relaxing.
+       (find_relaxable_sections): Do not increment src_count for unknown
+       opcodes.  Decode only once instead of calling is_l32r_relocation.
+       (compute_text_actions): Remove unused no_insn_move flag.  Assert that
+       src_next matches src_count in relax_info.
+
 2007-03-01  Joseph Myers  <joseph@codesourcery.com>
 
        * Makefile.am (bfdver.h): Use "." not " " between version number
index cfc85202f7d23bd896673172d2f65b395fb0752a..8bf855de48af91216c15d52666755d37942706d8 100644 (file)
@@ -5913,6 +5913,8 @@ analyze_relocations (struct bfd_link_info *link_info)
            relax_info->src_relocs = (source_reloc *)
              bfd_malloc (relax_info->src_count * sizeof (source_reloc));
          }
+       else
+         relax_info->src_count = 0;
       }
 
   /* Collect info on relocations against each relaxable section.  */
@@ -5956,6 +5958,7 @@ find_relaxable_sections (bfd *abfd,
   bfd_boolean ok = TRUE;
   unsigned i;
   xtensa_relax_info *source_relax_info;
+  bfd_boolean is_l32r_reloc;
 
   internal_relocs = retrieve_internal_relocs (abfd, sec,
                                              link_info->keep_memory);
@@ -6006,13 +6009,21 @@ find_relaxable_sections (bfd *abfd,
       /* Count PC-relative operand relocations against the target section.
          Note: The conditions tested here must match the conditions under
         which init_source_reloc is called in collect_source_relocs().  */
-      if (is_operand_relocation (ELF32_R_TYPE (irel->r_info))
-         && (!is_alt_relocation (ELF32_R_TYPE (irel->r_info))
-             || is_l32r_relocation (abfd, sec, contents, irel)))
-       target_relax_info->src_count++;
+      is_l32r_reloc = FALSE;
+      if (is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
+       {
+         xtensa_opcode opcode =
+           get_relocation_opcode (abfd, sec, contents, irel);
+         if (opcode != XTENSA_UNDEFINED)
+           {
+             is_l32r_reloc = (opcode == get_l32r_opcode ());
+             if (!is_alt_relocation (ELF32_R_TYPE (irel->r_info))
+                 || is_l32r_reloc)
+               target_relax_info->src_count++;
+           }
+       }
 
-      if (is_l32r_relocation (abfd, sec, contents, irel)
-         && r_reloc_is_defined (&r_rel))
+      if (is_l32r_reloc && r_reloc_is_defined (&r_rel))
        {
          /* Mark the target section as relaxable.  */
          target_relax_info->is_relaxable_literal_section = TRUE;
@@ -6333,14 +6344,12 @@ compute_text_actions (bfd *abfd,
   property_table_entry *prop_table = 0;
   int ptblsize = 0;
   bfd_size_type sec_size;
-  static bfd_boolean no_insn_move = FALSE;
 
-  if (no_insn_move)
-    return ok;
-
-  /* Do nothing if the section contains no optimized longcalls.  */
   relax_info = get_xtensa_relax_info (sec);
   BFD_ASSERT (relax_info);
+  BFD_ASSERT (relax_info->src_next == relax_info->src_count);
+
+  /* Do nothing if the section contains no optimized longcalls.  */
   if (!relax_info->is_relaxable_asm_section)
     return ok;