diff options
author | Martin Liska <mliska@suse.cz> | 2020-03-19 16:56:27 +0100 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2020-03-19 16:56:27 +0100 |
commit | c8429c2aba80f845939ffa6b2cfe8a0be1b50078 (patch) | |
tree | 24fdc75d0c796217da6680c0dd3e9abddb1238ca /gcc | |
parent | f5389e17e4b8cfd4877082b46d31d1db3341a0aa (diff) | |
download | gcc-c8429c2aba80f845939ffa6b2cfe8a0be1b50078.zip gcc-c8429c2aba80f845939ffa6b2cfe8a0be1b50078.tar.gz gcc-c8429c2aba80f845939ffa6b2cfe8a0be1b50078.tar.bz2 |
API extension for binutils (type of symbols).
* lto-section-in.c: Add ext_symtab.
* lto-streamer-out.c (write_symbol_extension_info): New.
(produce_symtab_extension): New.
(produce_asm_for_decls): Stream also produce_symtab_extension.
* lto-streamer.h (enum lto_section_type): New section.
* lto-symtab.h (enum gcc_plugin_symbol_type): New.
(enum gcc_plugin_symbol_section_kind): Likewise.
* lto-plugin.c (LTO_SECTION_PREFIX): Rename to ...
(LTO_SYMTAB_PREFIX): ... this.
(LTO_SECTION_PREFIX_LEN): Rename to ...
(LTO_SYMTAB_PREFIX_LEN): ... this.
(LTO_SYMTAB_EXT_PREFIX): New.
(LTO_SYMTAB_EXT_PREFIX_LEN): New.
(LTO_LTO_PREFIX): New.
(LTO_LTO_PREFIX_LEN): New.
(parse_table_entry): Fill up unused to zero.
(parse_table_entry_extension): New.
(parse_symtab_extension): New.
(finish_conflict_resolution): Change type
for resolution.
(process_symtab): Use new macro name.
(process_symtab_extension): New.
(claim_file_handler): Parse also process_symtab_extension.
(onload): Call new add_symbols_v2.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/lto-section-in.c | 1 | ||||
-rw-r--r-- | gcc/lto-streamer-out.c | 82 | ||||
-rw-r--r-- | gcc/lto-streamer.h | 1 |
4 files changed, 90 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 259d4ae..6b1b295 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2020-03-19 Martin Liska <mliska@suse.cz> + + * lto-section-in.c: Add ext_symtab. + * lto-streamer-out.c (write_symbol_extension_info): New. + (produce_symtab_extension): New. + (produce_asm_for_decls): Stream also produce_symtab_extension. + * lto-streamer.h (enum lto_section_type): New section. + 2020-03-19 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/94211 diff --git a/gcc/lto-section-in.c b/gcc/lto-section-in.c index c17dd69..0923a8c 100644 --- a/gcc/lto-section-in.c +++ b/gcc/lto-section-in.c @@ -38,6 +38,7 @@ const char *lto_section_name[LTO_N_SECTION_TYPES] = "function_body", "statics", "symtab", + "ext_symtab", "refs", "asm", "jmpfuncs", diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index cea5e71..a219c1d 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -45,6 +45,7 @@ along with GCC; see the file COPYING3. If not see #include "print-tree.h" #include "tree-dfa.h" #include "file-prefix-map.h" /* remap_debug_filename() */ +#include "output.h" static void lto_write_tree (struct output_block*, tree, bool); @@ -2777,12 +2778,32 @@ write_symbol (struct streamer_tree_cache_d *cache, lto_write_data (&slot_num, 4); } +/* Write extension information for symbols (symbol type, section flags). */ + +static void +write_symbol_extension_info (tree t) +{ + unsigned char c; + c = ((unsigned char) TREE_CODE (t) == VAR_DECL + ? GCCST_VARIABLE : GCCST_FUNCTION); + lto_write_data (&c, 1); + unsigned char section_kind = 0; + if (TREE_CODE (t) == VAR_DECL) + { + section *s = get_variable_section (t, false); + if (s->common.flags & SECTION_BSS) + section_kind |= GCCSSK_BSS; + } + lto_write_data (§ion_kind, 1); +} + /* Write an IL symbol table to OB. SET and VSET are cgraph/varpool node sets we are outputting. */ -static void +static unsigned int produce_symtab (struct output_block *ob) { + unsigned int streamed_symbols = 0; struct streamer_tree_cache_d *cache = ob->writer_cache; char *section_name = lto_get_section_name (LTO_section_symtab, NULL, 0, NULL); lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder; @@ -2804,6 +2825,7 @@ produce_symtab (struct output_block *ob) if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ()) continue; write_symbol (cache, node->decl, &seen, false); + ++streamed_symbols; } for (lsei = lsei_start (encoder); !lsei_end_p (lsei); lsei_next (&lsei)) @@ -2813,8 +2835,61 @@ produce_symtab (struct output_block *ob) if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ()) continue; write_symbol (cache, node->decl, &seen, false); + ++streamed_symbols; + } + + lto_end_section (); + + return streamed_symbols; +} + +/* Symtab extension version. */ +#define LTO_SYMTAB_EXTENSION_VERSION 1 + +/* Write an IL symbol table extension to OB. + SET and VSET are cgraph/varpool node sets we are outputting. */ + +static void +produce_symtab_extension (struct output_block *ob, + unsigned int previous_streamed_symbols) +{ + unsigned int streamed_symbols = 0; + char *section_name = lto_get_section_name (LTO_section_symtab_extension, + NULL, 0, NULL); + lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder; + lto_symtab_encoder_iterator lsei; + + lto_begin_section (section_name, false); + free (section_name); + + unsigned char version = LTO_SYMTAB_EXTENSION_VERSION; + lto_write_data (&version, 1); + + /* Write the symbol table. + First write everything defined and then all declarations. + This is necessary to handle cases where we have duplicated symbols. */ + for (lsei = lsei_start (encoder); + !lsei_end_p (lsei); lsei_next (&lsei)) + { + symtab_node *node = lsei_node (lsei); + + if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ()) + continue; + write_symbol_extension_info (node->decl); + ++streamed_symbols; + } + for (lsei = lsei_start (encoder); + !lsei_end_p (lsei); lsei_next (&lsei)) + { + symtab_node *node = lsei_node (lsei); + + if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ()) + continue; + write_symbol_extension_info (node->decl); + ++streamed_symbols; } + gcc_assert (previous_streamed_symbols == streamed_symbols); lto_end_section (); } @@ -3001,7 +3076,10 @@ produce_asm_for_decls (void) /* Write the symbol table. It is used by linker to determine dependencies and thus we can skip it for WPA. */ if (!flag_wpa) - produce_symtab (ob); + { + unsigned int streamed_symbols = produce_symtab (ob); + produce_symtab_extension (ob, streamed_symbols); + } /* Write command line opts. */ lto_write_options (); diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h index 25bf6c4..76aa6fe 100644 --- a/gcc/lto-streamer.h +++ b/gcc/lto-streamer.h @@ -219,6 +219,7 @@ enum lto_section_type LTO_section_function_body, LTO_section_static_initializer, LTO_section_symtab, + LTO_section_symtab_extension, LTO_section_refs, LTO_section_asm, LTO_section_jump_functions, |