mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-23 03:29:47 +08:00
Redo gas local symbol support
gas handles local symbols specially in order to save memory, but the implementation using two separate hash tables is inefficient, particularly the scheme of duplicating a struct local_symbol when it needs to be converted to a full struct symbol. Also, updating symbol pointers with LOCAL_SYMBOL_CHECK is horrible and has led to some hard to find bugs. This changes the implementation to use a single hash table and avoids another copy of the symbol name in symbol_entry_t. When converting local symbols the struct local_symbol memory is reused. Not only does that save memory, but there is no need to twiddle symbol pointers with LOCAL_SYMBOL_CHECK. Assembling gcc-10 -g -Og gold/powerpc.cc output shows the following: old: symbol table hash statistics: 1371192 searches 1290398 collisions 143585 elements 262139 table size mini local symbol table hash statistics: 2966204 searches 2707489 collisions 523533 elements 1048573 table size 523533 mini local symbols created, 140453 converted new: symbol table hash statistics: 2828883 searches 2453138 collisions 526665 elements 1048573 table size 523533 mini local symbols created, 140453 converted * symbols.c (struct local_symbol): Add "hash" entry. Reorder fields. Delete union. Adjust code throughout file. (struct symbol): Add "hash", "name" and "x" entries. Reorder fields. Split off some to.. (struct xsymbol): ..this. New struct. Adjust code throughout file accessing these fields. (struct symbol_entry): Delete. (union symbol_entry): New. (hash_symbol_entry): Adjust for symbol_entry_t change. (symbol_entry_find): Likewise. (eq_symbol_entry): Compare hash values too. (symbol_entry_alloc): Delete. (local_symbol_converted_p, local_symbol_mark_converted): Delete. (local_symbol_get_real_symbol, local_symbol_set_real_symbol): Delete. (local_hash): Delete. (abs_symbol_x, dot_symbol_x): New static var. (symbol_init): New function. (symbol_create): Rewrite. (LOCAL_SYMBOL_CHECK): Delete. Replace uses throughout with simple test of flags.local_symbol. (local_symbol_make): Adjust for struct local_symbol changes. (local_symbol_convert): Rewrite. Adjust all callers. (symbol_table_insert): Simplify. (symbol_clone): Comment on local sym cloning. Handle split symbol struct. (get_real_sym): Delete. Remove all uses. (symbol_find_exact_noref): Simplify. (resolve_local_symbol): Don't resolve non-locals. (S_SET_SEGMENT): Don't special case reg_section. (S_SET_NAME): Set both name and bsym->name. (symbol_mark_resolved, symbol_resolved_p): Simplify. (symbol_symbolS): Update comment. (symbol_begin): Don't create local_hash. Adjust abs_symbol setup. (dot_symbol_init): Adjust dot_symbol setup. (symbol_print_statistics): Delete local_hash stats.
This commit is contained in:
@ -1,3 +1,41 @@
|
|||||||
|
2020-08-21 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* symbols.c (struct local_symbol): Add "hash" entry. Reorder fields.
|
||||||
|
Delete union. Adjust code throughout file.
|
||||||
|
(struct symbol): Add "hash", "name" and "x" entries. Reorder fields.
|
||||||
|
Split off some to..
|
||||||
|
(struct xsymbol): ..this. New struct. Adjust code throughout file
|
||||||
|
accessing these fields.
|
||||||
|
(struct symbol_entry): Delete.
|
||||||
|
(union symbol_entry): New.
|
||||||
|
(hash_symbol_entry): Adjust for symbol_entry_t change.
|
||||||
|
(symbol_entry_find): Likewise.
|
||||||
|
(eq_symbol_entry): Compare hash values too.
|
||||||
|
(symbol_entry_alloc): Delete.
|
||||||
|
(local_symbol_converted_p, local_symbol_mark_converted): Delete.
|
||||||
|
(local_symbol_get_real_symbol, local_symbol_set_real_symbol): Delete.
|
||||||
|
(local_hash): Delete.
|
||||||
|
(abs_symbol_x, dot_symbol_x): New static var.
|
||||||
|
(symbol_init): New function.
|
||||||
|
(symbol_create): Rewrite.
|
||||||
|
(LOCAL_SYMBOL_CHECK): Delete. Replace uses throughout with simple
|
||||||
|
test of flags.local_symbol.
|
||||||
|
(local_symbol_make): Adjust for struct local_symbol changes.
|
||||||
|
(local_symbol_convert): Rewrite. Adjust all callers.
|
||||||
|
(symbol_table_insert): Simplify.
|
||||||
|
(symbol_clone): Comment on local sym cloning. Handle split symbol
|
||||||
|
struct.
|
||||||
|
(get_real_sym): Delete. Remove all uses.
|
||||||
|
(symbol_find_exact_noref): Simplify.
|
||||||
|
(resolve_local_symbol): Don't resolve non-locals.
|
||||||
|
(S_SET_SEGMENT): Don't special case reg_section.
|
||||||
|
(S_SET_NAME): Set both name and bsym->name.
|
||||||
|
(symbol_mark_resolved, symbol_resolved_p): Simplify.
|
||||||
|
(symbol_symbolS): Update comment.
|
||||||
|
(symbol_begin): Don't create local_hash. Adjust abs_symbol setup.
|
||||||
|
(dot_symbol_init): Adjust dot_symbol setup.
|
||||||
|
(symbol_print_statistics): Delete local_hash stats.
|
||||||
|
|
||||||
2020-08-21 Alan Modra <amodra@gmail.com>
|
2020-08-21 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* symbols.c (struct symbol_flags): Rename sy_volatile to volatil,
|
* symbols.c (struct symbol_flags): Rename sy_volatile to volatil,
|
||||||
|
736
gas/symbols.c
736
gas/symbols.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user