* elf32-arm.c (get_arm_elf_section_data): Cache the last pointer matched so
authorNick Clifton <nickc@redhat.com>
Tue, 4 Oct 2005 07:23:50 +0000 (07:23 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 4 Oct 2005 07:23:50 +0000 (07:23 +0000)
that the typical case of scanning for the previous section to last one can be
handled quickly.

bfd/ChangeLog
bfd/elf32-arm.c

index 3ba259b..9fdfdd8 100644 (file)
@@ -1,3 +1,9 @@
+2005-10-04  Nick Clifton  <nickc@redhat.com>
+
+       * elf32-arm.c (get_arm_elf_section_data): Cache the last pointer
+       matched so that the typical case of scanning for the previous
+       section to last one can be handled quickly.
+
 2005-10-03  David Heine  <dlheine@tensilica.com>
 
        * elf32-xtensa.c (relocations_reach): Skip range check for
index c90b5b6..6bace7a 100644 (file)
@@ -6563,10 +6563,32 @@ static _arm_elf_section_data *
 get_arm_elf_section_data (asection * sec)
 {
   struct section_list * entry;
+  static struct section_list * last_entry = NULL;
 
+  /* This is a short cut for the typical case where the sections are added
+     to the sections_with_arm_elf_section_data list in forward order and
+     then looked up here in backwards order.  This makes a real difference
+     to the ld-srec/sec64k.exp linker test.  */
+  if (last_entry != NULL)
+    {
+      if (last_entry->sec == sec)
+       return elf32_arm_section_data (sec);
+
+      if (last_entry->prev != NULL
+         && last_entry->prev->sec == sec)
+       {
+         last_entry = last_entry->prev;
+         return elf32_arm_section_data (sec);
+       }
+    }
   for (entry = sections_with_arm_elf_section_data; entry; entry = entry->next)
     if (entry->sec == sec)
-      return elf32_arm_section_data (sec);
+      {
+       last_entry = entry;
+       return elf32_arm_section_data (sec);
+      }
+
   return NULL;
 }