From bd4aae00ccd21e4fd0bc03e5a122e9f08b95e01c Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 4 Oct 2005 07:23:50 +0000 Subject: [PATCH] * 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. --- bfd/ChangeLog | 6 ++++++ bfd/elf32-arm.c | 24 +++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 3ba259bd80..9fdfdd8aa3 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2005-10-04 Nick Clifton + + * 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 * elf32-xtensa.c (relocations_reach): Skip range check for diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index c90b5b646b..6bace7a9c7 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -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; } -- 2.34.1