diff options
author | Alan Modra <amodra@gmail.com> | 2023-05-18 11:10:38 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-05-18 12:21:40 +0930 |
commit | 0cc8cc5e6f82b8d3d8e3803c6f7f5e63f0c866ad (patch) | |
tree | 804b289fe94a7a6f0653dd898b03069f6fec47ee /bfd | |
parent | 4cb88cfae84363cef6ed59d9d458a20ff2e1e893 (diff) | |
download | gdb-0cc8cc5e6f82b8d3d8e3803c6f7f5e63f0c866ad.zip gdb-0cc8cc5e6f82b8d3d8e3803c6f7f5e63f0c866ad.tar.gz gdb-0cc8cc5e6f82b8d3d8e3803c6f7f5e63f0c866ad.tar.bz2 |
Re: Add section caches to coff_data_type
Commit 0e759f232b6d regressed these tests:
rs6000-aix7.2 +FAIL: Garbage collection test 1 (32-bit)
rs6000-aix7.2 +FAIL: Garbage collection test 1 (64-bit)
rs6000-aix7.2 +FAIL: Glink test 1 (32-bit)
rs6000-aix7.2 +FAIL: Glink test 1 (64-bit)
Investigation showed segfaults in coff_section_from_bfd_index called
by xcoff_write_global_symbol due to the hash table pointer being
NULL. Well, yes, the hash table isn't initialised for the output bfd.
mkobject_hook is the wrong place to do that.
* coffcode.h: Revert 0e759f232b6d changes.
* peicode.h: Likewise.
* coff-x86_64.c (htab_hash_section_index, htab_eq_section_index):
Moved here from coffcode.h.
(coff_amd64_rtype_to_howto): Create section_by_index htab.
* coffgen.c (htab_hash_section_target_index),
(htab_eq_section_target_index): Moved here from coffcode.h.
(coff_section_from_bfd_index): Create section_by_target_index
htab. Stash newly created sections in htab.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/coff-x86_64.c | 26 | ||||
-rw-r--r-- | bfd/coffcode.h | 35 | ||||
-rw-r--r-- | bfd/coffgen.c | 45 | ||||
-rw-r--r-- | bfd/peicode.h | 35 |
4 files changed, 57 insertions, 84 deletions
diff --git a/bfd/coff-x86_64.c b/bfd/coff-x86_64.c index 1f8c8d5..f5bd5a2 100644 --- a/bfd/coff-x86_64.c +++ b/bfd/coff-x86_64.c @@ -656,6 +656,20 @@ coff_pe_amd64_relocate_section (bfd *output_bfd, #define coff_relocate_section coff_pe_amd64_relocate_section +static hashval_t +htab_hash_section_index (const void * entry) +{ + const struct bfd_section * sec = entry; + return sec->index; +} + +static int +htab_eq_section_index (const void * e1, const void * e2) +{ + const struct bfd_section * sec1 = e1; + const struct bfd_section * sec2 = e2; + return sec1->index == sec2->index; +} #endif /* COFF_WITH_PE */ /* Convert an rtype to howto for the COFF backend linker. */ @@ -756,11 +770,17 @@ coff_amd64_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED, htab_t table = coff_data (abfd)->section_by_index; asection *s; + if (!table) + { + table = htab_create (10, htab_hash_section_index, + htab_eq_section_index, NULL); + if (table == NULL) + return NULL; + coff_data (abfd)->section_by_index = table; + } + if (htab_elements (table) == 0) { - /* Sigh - if we do not have a section index then the only way - to get the section to offset against is to find it the hard - way. */ for (s = abfd->sections; s != NULL; s = s->next) { void ** slot = htab_find_slot (table, s, INSERT); diff --git a/bfd/coffcode.h b/bfd/coffcode.h index ab6f797..777515e 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -731,36 +731,6 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags) #ifndef COFF_WITH_PE -static hashval_t -htab_hash_section_index (const void * entry) -{ - const struct bfd_section * sec = entry; - return sec->index; -} - -static int -htab_eq_section_index (const void * e1, const void * e2) -{ - const struct bfd_section * sec1 = e1; - const struct bfd_section * sec2 = e2; - return sec1->index == sec2->index; -} - -static hashval_t -htab_hash_section_target_index (const void * entry) -{ - const struct bfd_section * sec = entry; - return sec->target_index; -} - -static int -htab_eq_section_target_index (const void * e1, const void * e2) -{ - const struct bfd_section * sec1 = e1; - const struct bfd_section * sec2 = e2; - return sec1->target_index == sec2->target_index; -} - static bool styp_to_sec_flags (bfd *abfd, void * hdr, @@ -2185,11 +2155,6 @@ coff_mkobject_hook (bfd * abfd, abfd->flags |= HAS_DEBUG; #endif - coff->section_by_index - = htab_create (10, htab_hash_section_index, htab_eq_section_index, NULL); - coff->section_by_target_index = htab_create - (10, htab_hash_section_target_index, htab_eq_section_target_index, NULL); - return coff; } #endif diff --git a/bfd/coffgen.c b/bfd/coffgen.c index 03b64ac..d4c14fb 100644 --- a/bfd/coffgen.c +++ b/bfd/coffgen.c @@ -356,6 +356,21 @@ coff_object_p (bfd *abfd) : (struct internal_aouthdr *) NULL)); } +static hashval_t +htab_hash_section_target_index (const void * entry) +{ + const struct bfd_section * sec = entry; + return sec->target_index; +} + +static int +htab_eq_section_target_index (const void * e1, const void * e2) +{ + const struct bfd_section * sec1 = e1; + const struct bfd_section * sec2 = e2; + return sec1->target_index == sec2->target_index; +} + /* Get the BFD section from a COFF symbol section number. */ asection * @@ -371,17 +386,23 @@ coff_section_from_bfd_index (bfd *abfd, int section_index) struct bfd_section *answer; htab_t table = coff_data (abfd)->section_by_target_index; - if (htab_elements (table) == 0) + if (!table) { - answer = abfd->sections; + table = htab_create (10, htab_hash_section_target_index, + htab_eq_section_target_index, NULL); + if (table == NULL) + return bfd_und_section_ptr; + coff_data (abfd)->section_by_target_index = table; + } - while (answer) + if (htab_elements (table) == 0) + { + for (answer = abfd->sections; answer; answer = answer->next) { void **slot = htab_find_slot (table, answer, INSERT); if (slot == NULL) return bfd_und_section_ptr; *slot = answer; - answer = answer->next; } } @@ -392,14 +413,16 @@ coff_section_from_bfd_index (bfd *abfd, int section_index) if (answer != NULL) return answer; - answer = abfd->sections; - - while (answer) - { - if (answer->target_index == section_index) + /* Cover the unlikely case of sections added after the first call to + this function. */ + for (answer = abfd->sections; answer; answer = answer->next) + if (answer->target_index == section_index) + { + void **slot = htab_find_slot (table, answer, INSERT); + if (slot != NULL) + *slot = answer; return answer; - answer = answer->next; - } + } /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a has a bad symbol table in biglitpow.o. */ diff --git a/bfd/peicode.h b/bfd/peicode.h index 436ff54..e2e2be6 100644 --- a/bfd/peicode.h +++ b/bfd/peicode.h @@ -255,36 +255,6 @@ coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in) #endif } -static hashval_t -htab_hash_section_index (const void * entry) -{ - const struct bfd_section * sec = entry; - return sec->index; -} - -static int -htab_eq_section_index (const void * e1, const void * e2) -{ - const struct bfd_section * sec1 = e1; - const struct bfd_section * sec2 = e2; - return sec1->index == sec2->index; -} - -static hashval_t -htab_hash_section_target_index (const void * entry) -{ - const struct bfd_section * sec = entry; - return sec->target_index; -} - -static int -htab_eq_section_target_index (const void * e1, const void * e2) -{ - const struct bfd_section * sec1 = e1; - const struct bfd_section * sec2 = e2; - return sec1->target_index == sec2->target_index; -} - static bool pe_mkobject (bfd * abfd) { @@ -382,11 +352,6 @@ pe_mkobject_hook (bfd * abfd, memcpy (pe->dos_message, internal_f->pe.dos_message, sizeof (pe->dos_message)); - pe->coff.section_by_index - = htab_create (10, htab_hash_section_index, htab_eq_section_index, NULL); - pe->coff.section_by_target_index = htab_create - (10, htab_hash_section_target_index, htab_eq_section_target_index, NULL); - return (void *) pe; } |