aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-03-19 16:56:27 +0100
committerMartin Liska <mliska@suse.cz>2020-03-19 16:56:27 +0100
commitc8429c2aba80f845939ffa6b2cfe8a0be1b50078 (patch)
tree24fdc75d0c796217da6680c0dd3e9abddb1238ca /gcc
parentf5389e17e4b8cfd4877082b46d31d1db3341a0aa (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/lto-section-in.c1
-rw-r--r--gcc/lto-streamer-out.c82
-rw-r--r--gcc/lto-streamer.h1
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 (&section_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,