mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-26 01:43:34 +08:00
* elf32-arm.c (struct section_list): Remove.
(section_list): Remove typedef. (record_section_with_arm_elf_section_data): Remove. (find_arm_elf_section_entry): Remove. (get_arm_elf_section_data): Use is_arm_elf. (unrecord_section_with_arm_elf_section_data): Remove. (elf32_arm_new_section_hook): Don't call record_section_with_arm_elf_section_data. (elf32_arm_write_section): Set mapcount to -1 when the map has been used. Don't call unrecord_section_with_arm_elf_section_data. (unrecord_section_via_map_over_sections): Remove. (elf32_arm_close_and_cleanup): Remove. (elf32_arm_bfd_free_cached_info): Remove. (bfd_elf32_close_and_cleanup): Don't define. (bfd_elf32_bfd_free_cached_info): Don't define.
This commit is contained in:
parent
bb6be443ae
commit
47b2e99cef
@ -1,3 +1,22 @@
|
||||
2010-03-19 Jie Zhang <jie@codesourcery.com>
|
||||
|
||||
* elf32-arm.c (struct section_list): Remove.
|
||||
(section_list): Remove typedef.
|
||||
(record_section_with_arm_elf_section_data): Remove.
|
||||
(find_arm_elf_section_entry): Remove.
|
||||
(get_arm_elf_section_data): Use is_arm_elf.
|
||||
(unrecord_section_with_arm_elf_section_data): Remove.
|
||||
(elf32_arm_new_section_hook): Don't call
|
||||
record_section_with_arm_elf_section_data.
|
||||
(elf32_arm_write_section): Set mapcount to -1 when
|
||||
the map has been used. Don't call
|
||||
unrecord_section_with_arm_elf_section_data.
|
||||
(unrecord_section_via_map_over_sections): Remove.
|
||||
(elf32_arm_close_and_cleanup): Remove.
|
||||
(elf32_arm_bfd_free_cached_info): Remove.
|
||||
(bfd_elf32_close_and_cleanup): Don't define.
|
||||
(bfd_elf32_bfd_free_cached_info): Don't define.
|
||||
|
||||
2010-03-18 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR binutils/11396
|
||||
|
134
bfd/elf32-arm.c
134
bfd/elf32-arm.c
@ -12787,108 +12787,15 @@ elf32_arm_section_from_shdr (bfd *abfd,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* A structure used to record a list of sections, independently
|
||||
of the next and prev fields in the asection structure. */
|
||||
typedef struct section_list
|
||||
{
|
||||
asection * sec;
|
||||
struct section_list * next;
|
||||
struct section_list * prev;
|
||||
}
|
||||
section_list;
|
||||
|
||||
/* Unfortunately we need to keep a list of sections for which
|
||||
an _arm_elf_section_data structure has been allocated. This
|
||||
is because it is possible for functions like elf32_arm_write_section
|
||||
to be called on a section which has had an elf_data_structure
|
||||
allocated for it (and so the used_by_bfd field is valid) but
|
||||
for which the ARM extended version of this structure - the
|
||||
_arm_elf_section_data structure - has not been allocated. */
|
||||
static section_list * sections_with_arm_elf_section_data = NULL;
|
||||
|
||||
static void
|
||||
record_section_with_arm_elf_section_data (asection * sec)
|
||||
{
|
||||
struct section_list * entry;
|
||||
|
||||
entry = (struct section_list *) bfd_malloc (sizeof (* entry));
|
||||
if (entry == NULL)
|
||||
return;
|
||||
entry->sec = sec;
|
||||
entry->next = sections_with_arm_elf_section_data;
|
||||
entry->prev = NULL;
|
||||
if (entry->next != NULL)
|
||||
entry->next->prev = entry;
|
||||
sections_with_arm_elf_section_data = entry;
|
||||
}
|
||||
|
||||
static struct section_list *
|
||||
find_arm_elf_section_entry (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. */
|
||||
entry = sections_with_arm_elf_section_data;
|
||||
if (last_entry != NULL)
|
||||
{
|
||||
if (last_entry->sec == sec)
|
||||
entry = last_entry;
|
||||
else if (last_entry->next != NULL
|
||||
&& last_entry->next->sec == sec)
|
||||
entry = last_entry->next;
|
||||
}
|
||||
|
||||
for (; entry; entry = entry->next)
|
||||
if (entry->sec == sec)
|
||||
break;
|
||||
|
||||
if (entry)
|
||||
/* Record the entry prior to this one - it is the entry we are most
|
||||
likely to want to locate next time. Also this way if we have been
|
||||
called from unrecord_section_with_arm_elf_section_data() we will not
|
||||
be caching a pointer that is about to be freed. */
|
||||
last_entry = entry->prev;
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
static _arm_elf_section_data *
|
||||
get_arm_elf_section_data (asection * sec)
|
||||
{
|
||||
struct section_list * entry;
|
||||
|
||||
entry = find_arm_elf_section_entry (sec);
|
||||
|
||||
if (entry)
|
||||
return elf32_arm_section_data (entry->sec);
|
||||
if (sec && sec->owner && is_arm_elf (sec->owner))
|
||||
return elf32_arm_section_data (sec);
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
unrecord_section_with_arm_elf_section_data (asection * sec)
|
||||
{
|
||||
struct section_list * entry;
|
||||
|
||||
entry = find_arm_elf_section_entry (sec);
|
||||
|
||||
if (entry)
|
||||
{
|
||||
if (entry->prev != NULL)
|
||||
entry->prev->next = entry->next;
|
||||
if (entry->next != NULL)
|
||||
entry->next->prev = entry->prev;
|
||||
if (entry == sections_with_arm_elf_section_data)
|
||||
sections_with_arm_elf_section_data = entry->next;
|
||||
free (entry);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
void *finfo;
|
||||
@ -13313,8 +13220,6 @@ elf32_arm_new_section_hook (bfd *abfd, asection *sec)
|
||||
sec->used_by_bfd = sdata;
|
||||
}
|
||||
|
||||
record_section_with_arm_elf_section_data (sec);
|
||||
|
||||
return _bfd_elf_new_section_hook (abfd, sec);
|
||||
}
|
||||
|
||||
@ -13745,44 +13650,13 @@ elf32_arm_write_section (bfd *output_bfd,
|
||||
}
|
||||
|
||||
free (map);
|
||||
arm_data->mapcount = 0;
|
||||
arm_data->mapcount = -1;
|
||||
arm_data->mapsize = 0;
|
||||
arm_data->map = NULL;
|
||||
unrecord_section_with_arm_elf_section_data (sec);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
unrecord_section_via_map_over_sections (bfd * abfd ATTRIBUTE_UNUSED,
|
||||
asection * sec,
|
||||
void * ignore ATTRIBUTE_UNUSED)
|
||||
{
|
||||
unrecord_section_with_arm_elf_section_data (sec);
|
||||
}
|
||||
|
||||
static bfd_boolean
|
||||
elf32_arm_close_and_cleanup (bfd * abfd)
|
||||
{
|
||||
if (abfd->sections)
|
||||
bfd_map_over_sections (abfd,
|
||||
unrecord_section_via_map_over_sections,
|
||||
NULL);
|
||||
|
||||
return _bfd_elf_close_and_cleanup (abfd);
|
||||
}
|
||||
|
||||
static bfd_boolean
|
||||
elf32_arm_bfd_free_cached_info (bfd * abfd)
|
||||
{
|
||||
if (abfd->sections)
|
||||
bfd_map_over_sections (abfd,
|
||||
unrecord_section_via_map_over_sections,
|
||||
NULL);
|
||||
|
||||
return _bfd_free_cached_info (abfd);
|
||||
}
|
||||
|
||||
/* Display STT_ARM_TFUNC symbols as functions. */
|
||||
|
||||
static void
|
||||
@ -13969,8 +13843,6 @@ const struct elf_size_info elf32_arm_size_info =
|
||||
#define bfd_elf32_find_inliner_info elf32_arm_find_inliner_info
|
||||
#define bfd_elf32_new_section_hook elf32_arm_new_section_hook
|
||||
#define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol
|
||||
#define bfd_elf32_close_and_cleanup elf32_arm_close_and_cleanup
|
||||
#define bfd_elf32_bfd_free_cached_info elf32_arm_bfd_free_cached_info
|
||||
#define bfd_elf32_bfd_final_link elf32_arm_final_link
|
||||
|
||||
#define elf_backend_get_symbol_type elf32_arm_get_symbol_type
|
||||
|
Loading…
Reference in New Issue
Block a user