Use symtab_node::order in LTO sections with body.
authorMartin Liska <mliska@suse.cz>
Wed, 30 Oct 2019 10:38:52 +0000 (11:38 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Wed, 30 Oct 2019 10:38:52 +0000 (10:38 +0000)
2019-10-30  Martin Liska  <mliska@suse.cz>

PR lto/91393
PR lto/88220
* cgraph.c (cgraph_node::get_create): Overwrite node->order
from a first_clone in order to get proper LTO section
in LTO stream.
(cgraph_node::get_untransformed_body):
Use lto_get_section_data where symtab_node::order
must be provided.
* cgraphclones.c (cgraph_node::find_replacement):
Update also symbol order.
* ipa-fnsummary.c (ipa_fn_summary_read):
Use new function lto_get_summary_section_data.
* ipa-hsa.c (ipa_hsa_read_summary): Likewise.
* ipa-icf.c (sem_item_optimizer::read_summary):
Likewise.
* ipa-prop.c (ipa_prop_read_jump_functions):
Likewise.
(ipcp_read_transformation_summaries): Likewise.
* ipa-sra.c (ipa_sra_read_summary): Likewise.
* lto-cgraph.c (input_node): Add also order_base.
(input_varpool_node): Likewise.
(input_cgraph_1): Assign the order_base.
(input_cgraph_opt_summary): Use new lto_get_summary_section_data.
* lto-opts.c (lto_write_options): Pass new argument.
* lto-section-in.c (lto_get_section_data): Add new argumente order.
(lto_get_summary_section_data): New.
(lto_get_raw_section_data): Add order argument.
(lto_create_simple_input_block): Likewise.
* lto-section-out.c (lto_destroy_simple_output_block):
Likewise.
* lto-streamer-in.c (lto_input_toplevel_asms):
Use lto_get_summary_section_data.
(lto_input_mode_table): Likewise.
* lto-streamer-out.c (produce_asm): Pass symtab_node::order.
(lto_output_toplevel_asms): Pass new argument.
(copy_function_or_variable): Likewise.
(produce_lto_section):Likewise.
(produce_symtab): Likewise.
(lto_write_mode_table): Likewise.
(produce_asm_for_decls): Likewise.
* lto-streamer.c (lto_get_section_name): Concat symbol name
and symbol order.
* lto-streamer.h (lto_get_section_data): Add order argument.
(lto_get_summary_section_data): New.
(lto_get_raw_section_data): Add order argument.
(lto_get_section_name): Likewise.
* varpool.c (varpool_node::get_constructor): Pass order argument.
2019-10-30  Martin Liska  <mliska@suse.cz>

PR lto/91393
PR lto/88220
* lto-common.c (lto_file_finalize): Use lto_get_summary_section_data.
(get_section_data): Add order argument.
2019-10-30  Martin Liska  <mliska@suse.cz>

PR lto/91393
PR lto/88220
* gcc.dg/lto/pr91393_0.c: New test.

From-SVN: r277607

21 files changed:
gcc/ChangeLog
gcc/cgraph.c
gcc/cgraphclones.c
gcc/ipa-fnsummary.c
gcc/ipa-hsa.c
gcc/ipa-icf.c
gcc/ipa-prop.c
gcc/ipa-sra.c
gcc/lto-cgraph.c
gcc/lto-opts.c
gcc/lto-section-in.c
gcc/lto-section-out.c
gcc/lto-streamer-in.c
gcc/lto-streamer-out.c
gcc/lto-streamer.c
gcc/lto-streamer.h
gcc/lto/ChangeLog
gcc/lto/lto-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lto/pr91393_0.c [new file with mode: 0644]
gcc/varpool.c

index 821d97a233d28a3c306aef7e830777c934ecc4e3..89ddfcef05a73d068e5788e829131a5a9ec93c7a 100644 (file)
@@ -1,3 +1,53 @@
+2019-10-30  Martin Liska  <mliska@suse.cz>
+
+       PR lto/91393
+       PR lto/88220
+       * cgraph.c (cgraph_node::get_create): Overwrite node->order
+       from a first_clone in order to get proper LTO section
+       in LTO stream.
+       (cgraph_node::get_untransformed_body):
+       Use lto_get_section_data where symtab_node::order
+       must be provided.
+       * cgraphclones.c (cgraph_node::find_replacement):
+       Update also symbol order.
+       * ipa-fnsummary.c (ipa_fn_summary_read):
+       Use new function lto_get_summary_section_data.
+       * ipa-hsa.c (ipa_hsa_read_summary): Likewise.
+       * ipa-icf.c (sem_item_optimizer::read_summary):
+       Likewise.
+       * ipa-prop.c (ipa_prop_read_jump_functions):
+       Likewise.
+       (ipcp_read_transformation_summaries): Likewise.
+       * ipa-sra.c (ipa_sra_read_summary): Likewise.
+       * lto-cgraph.c (input_node): Add also order_base.
+       (input_varpool_node): Likewise.
+       (input_cgraph_1): Assign the order_base.
+       (input_cgraph_opt_summary): Use new lto_get_summary_section_data.
+       * lto-opts.c (lto_write_options): Pass new argument.
+       * lto-section-in.c (lto_get_section_data): Add new argumente order.
+       (lto_get_summary_section_data): New.
+       (lto_get_raw_section_data): Add order argument.
+       (lto_create_simple_input_block): Likewise.
+       * lto-section-out.c (lto_destroy_simple_output_block):
+       Likewise.
+       * lto-streamer-in.c (lto_input_toplevel_asms):
+       Use lto_get_summary_section_data.
+       (lto_input_mode_table): Likewise.
+       * lto-streamer-out.c (produce_asm): Pass symtab_node::order.
+       (lto_output_toplevel_asms): Pass new argument.
+       (copy_function_or_variable): Likewise.
+       (produce_lto_section):Likewise.
+       (produce_symtab): Likewise.
+       (lto_write_mode_table): Likewise.
+       (produce_asm_for_decls): Likewise.
+       * lto-streamer.c (lto_get_section_name): Concat symbol name
+       and symbol order.
+       * lto-streamer.h (lto_get_section_data): Add order argument.
+       (lto_get_summary_section_data): New.
+       (lto_get_raw_section_data): Add order argument.
+       (lto_get_section_name): Likewise.
+       * varpool.c (varpool_node::get_constructor): Pass order argument.
+
 2019-10-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/92262
index 33fba5a8f1c7e0cb216293995de34b50f726e6fd..9eea0218c4fc70ab4851072b6833644e792cc478 100644 (file)
@@ -547,6 +547,7 @@ cgraph_node::get_create (tree decl)
     {
       first_clone->clone_of = node;
       node->clones = first_clone;
+      node->order = first_clone->order;
       symtab->symtab_prevail_in_asm_name_hash (node);
       node->decl->decl_with_vis.symtab_node = node;
       if (dump_file)
@@ -3546,12 +3547,17 @@ cgraph_node::get_untransformed_body (void)
   struct lto_in_decl_state *decl_state
         = lto_get_function_in_decl_state (file_data, decl);
 
+  cgraph_node *origin = this;
+  while (origin->clone_of)
+    origin = origin->clone_of;
+
+  int stream_order = origin->order - file_data->order_base;
   data = lto_get_section_data (file_data, LTO_section_function_body,
-                              name, &len, decl_state->compressed);
+                              name, stream_order, &len,
+                              decl_state->compressed);
   if (!data)
-    fatal_error (input_location, "%s: section %s is missing",
-                file_data->file_name,
-                name);
+    fatal_error (input_location, "%s: section %s.%d is missing",
+                file_data->file_name, name, stream_order);
 
   gcc_assert (DECL_STRUCT_FUNCTION (decl) == NULL);
 
index 84d6e71a20b81453dc95e51c582c4f79c0c2dd75..726e31e17f7833fed65549d4520b2de9e5d48b47 100644 (file)
@@ -672,6 +672,11 @@ cgraph_node::find_replacement (void)
          n->clone_of = next_inline_clone;
          n = n->next_sibling_clone;
        }
+
+      /* Update order in order to be able to find a LTO section
+        with function body.  */
+      replacement->order = order;
+
       return replacement;
     }
   else
index 795e96566237d578100a4b42969919acd8b32055..5eee2416dd79906a31c2286569b22930c57a4103 100644 (file)
@@ -3712,9 +3712,9 @@ ipa_fn_summary_read (void)
   while ((file_data = file_data_vec[j++]))
     {
       size_t len;
-      const char *data = lto_get_section_data (file_data,
-                                              LTO_section_ipa_fn_summary,
-                                              NULL, &len);
+      const char *data
+       = lto_get_summary_section_data (file_data, LTO_section_ipa_fn_summary,
+                                       &len);
       if (data)
        inline_read_section (file_data, data, len);
       else
index 32280f3acac72a3d86638f8f5a15ad6c25acb0c4..654009bdf6fdee080ecf0d788578366c7fda18ad 100644 (file)
@@ -277,9 +277,8 @@ ipa_hsa_read_summary (void)
   while ((file_data = file_data_vec[j++]))
     {
       size_t len;
-      const char *data = lto_get_section_data (file_data, LTO_section_ipa_hsa,
-                                              NULL, &len);
-
+      const char *data
+       = lto_get_summary_section_data (file_data, LTO_section_ipa_hsa, &len);
       if (data)
        ipa_hsa_read_section (file_data, data, len);
     }
index 0d17fe990fc4fe01b830dc6c9043e7e711a028d5..13b46483f2dcce8a1245993cad03040c9bfe976e 100644 (file)
@@ -2386,9 +2386,8 @@ sem_item_optimizer::read_summary (void)
   while ((file_data = file_data_vec[j++]))
     {
       size_t len;
-      const char *data = lto_get_section_data (file_data,
-                        LTO_section_ipa_icf, NULL, &len);
-
+      const char *data
+       = lto_get_summary_section_data (file_data, LTO_section_ipa_icf, &len);
       if (data)
        read_section (file_data, data, len);
     }
index 637c7ae5d02d2ba4e654ef147f101f3bcd3c6eb1..336d271874d6621e606650866ae57a57d79163b3 100644 (file)
@@ -4626,8 +4626,9 @@ ipa_prop_read_jump_functions (void)
   while ((file_data = file_data_vec[j++]))
     {
       size_t len;
-      const char *data = lto_get_section_data (file_data, LTO_section_jump_functions, NULL, &len);
-
+      const char *data
+       = lto_get_summary_section_data (file_data, LTO_section_jump_functions,
+                                       &len);
       if (data)
         ipa_prop_read_section (file_data, data, len);
     }
@@ -4869,9 +4870,9 @@ ipcp_read_transformation_summaries (void)
   while ((file_data = file_data_vec[j++]))
     {
       size_t len;
-      const char *data = lto_get_section_data (file_data,
-                                              LTO_section_ipcp_transform,
-                                              NULL, &len);
+      const char *data
+       = lto_get_summary_section_data (file_data, LTO_section_ipcp_transform,
+                                       &len);
       if (data)
         read_replacements_section (file_data, data, len);
     }
index ad11d6f85555f7dc5f64a0ada602fa3935b30766..8f0284385561ca62751ebaa524ac25f6bee1e27b 100644 (file)
@@ -2812,8 +2812,8 @@ ipa_sra_read_summary (void)
   while ((file_data = file_data_vec[j++]))
     {
       size_t len;
-      const char *data = lto_get_section_data (file_data, LTO_section_ipa_sra,
-                                              NULL, &len);
+      const char *data
+       = lto_get_summary_section_data (file_data, LTO_section_ipa_sra, &len);
       if (data)
         isra_read_summary_section (file_data, data, len);
     }
index 5b11150bc2f76ea8affdefdd73d78d732fcf9a56..a4a70e7848c46a97b8fc9a549d3d050ffcc0051f 100644 (file)
@@ -49,9 +49,6 @@ static void input_cgraph_opt_summary (vec<symtab_node *>  nodes);
 /* Number of LDPR values known to GCC.  */
 #define LDPR_NUM_KNOWN (LDPR_PREVAILING_DEF_IRONLY_EXP + 1)
 
-/* All node orders are ofsetted by ORDER_BASE.  */
-static int order_base;
-
 /* Cgraph streaming is organized as set of record whose type
    is indicated by a tag.  */
 enum LTO_symtab_tags
@@ -1218,7 +1215,7 @@ input_node (struct lto_file_decl_data *file_data,
   int i, count;
   tree group;
   const char *section;
-  order = streamer_read_hwi (ib) + order_base;
+  order = streamer_read_hwi (ib) + file_data->order_base;
   clone_ref = streamer_read_hwi (ib);
 
   decl_index = streamer_read_uhwi (ib);
@@ -1337,7 +1334,7 @@ input_varpool_node (struct lto_file_decl_data *file_data,
   tree group;
   const char *section;
 
-  order = streamer_read_hwi (ib) + order_base;
+  order = streamer_read_hwi (ib) + file_data->order_base;
   decl_index = streamer_read_uhwi (ib);
   var_decl = lto_file_decl_data_get_var_decl (file_data, decl_index);
 
@@ -1504,7 +1501,7 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
   unsigned i;
 
   tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag);
-  order_base = symtab->order;
+  file_data->order_base = symtab->order;
   while (tag)
     {
       if (tag == LTO_symtab_edge)
@@ -1529,7 +1526,7 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
       tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag);
     }
 
-  lto_input_toplevel_asms (file_data, order_base);
+  lto_input_toplevel_asms (file_data, file_data->order_base);
 
   /* AUX pointers should be all non-zero for function nodes read from the stream.  */
   if (flag_checking)
@@ -2037,10 +2034,9 @@ input_cgraph_opt_summary (vec<symtab_node *> nodes)
   while ((file_data = file_data_vec[j++]))
     {
       size_t len;
-      const char *data =
-       lto_get_section_data (file_data, LTO_section_cgraph_opt_sum, NULL,
-                             &len);
-
+      const char *data
+       = lto_get_summary_section_data (file_data, LTO_section_cgraph_opt_sum,
+                                       &len);
       if (data)
        input_cgraph_opt_section (file_data, data, len, nodes);
     }
index 0e9f24e118990e0b6092f6f7ac336e3f3fbb60e0..99c6fe53923a9d597d01b1fa645f69c24747b584 100644 (file)
@@ -65,7 +65,7 @@ lto_write_options (void)
   char *args;
   bool first_p = true;
 
-  section_name = lto_get_section_name (LTO_section_opts, NULL, NULL);
+  section_name = lto_get_section_name (LTO_section_opts, NULL, 0, NULL);
   lto_begin_section (section_name, false);
 
   obstack_init (&temporary_obstack);
index 60f111f3f282cb271c7b634eb14d37d3676f4319..67d998472e08d14791884d94ca1df070ac45d31b 100644 (file)
@@ -131,10 +131,11 @@ struct lto_data_header
 const char *
 lto_get_section_data (struct lto_file_decl_data *file_data,
                      enum lto_section_type section_type,
-                     const char *name,
+                     const char *name, int order,
                      size_t *len, bool decompress)
 {
-  const char *data = (get_section_f) (file_data, section_type, name, len);
+  const char *data = (get_section_f) (file_data, section_type, name, order,
+                                     len);
   const size_t header_length = sizeof (struct lto_data_header);
   struct lto_data_header *header;
   struct lto_buffer buffer;
@@ -172,15 +173,27 @@ lto_get_section_data (struct lto_file_decl_data *file_data,
   return data;
 }
 
+/* Return a char pointer to the start of a data stream for an LTO pass.
+   FILE_DATA indicates where to obtain the data.
+   SECTION_TYPE is the type of information to be obtained.
+   LEN is the size of the data returned.  */
+
+const char *
+lto_get_summary_section_data (struct lto_file_decl_data *file_data,
+                             enum lto_section_type section_type, size_t *len)
+{
+  return lto_get_section_data (file_data, section_type, NULL, 0, len);
+}
+
 /* Get the section data without any header parsing or uncompression.  */
 
 const char *
 lto_get_raw_section_data (struct lto_file_decl_data *file_data,
                          enum lto_section_type section_type,
-                         const char *name,
+                         const char *name, int order,
                          size_t *len)
 {
-  return (get_section_f) (file_data, section_type, name, len);
+  return (get_section_f) (file_data, section_type, name, order, len);
 }
 
 /* Free the data found from the above call.  The first three
@@ -235,7 +248,8 @@ lto_create_simple_input_block (struct lto_file_decl_data *file_data,
                               enum lto_section_type section_type,
                               const char **datar, size_t *len)
 {
-  const char *data = lto_get_section_data (file_data, section_type, NULL, len);
+  const char *data = lto_get_section_data (file_data, section_type, NULL, 0,
+                                          len);
   const struct lto_simple_header * header
     = (const struct lto_simple_header *) data;
 
index 7ae102164eff25e2528c22aee894210c97b2c1b9..69fb8b7cffa1b1f15f46cfa84d896d9c700d02aa 100644 (file)
@@ -278,7 +278,7 @@ lto_destroy_simple_output_block (struct lto_simple_output_block *ob)
   char *section_name;
   struct lto_simple_header header;
 
-  section_name = lto_get_section_name (ob->section_type, NULL, NULL);
+  section_name = lto_get_section_name (ob->section_type, NULL, 0, NULL);
   lto_begin_section (section_name, !flag_wpa);
   free (section_name);
 
index 32b5d5fa50cab4bf0b53b228e11358e7ba576f29..76a005e71e201d40da732335d8c59254180366a5 100644 (file)
@@ -1562,8 +1562,8 @@ void
 lto_input_toplevel_asms (struct lto_file_decl_data *file_data, int order_base)
 {
   size_t len;
-  const char *data = lto_get_section_data (file_data, LTO_section_asm,
-                                          NULL, &len);
+  const char *data
+    = lto_get_summary_section_data (file_data, LTO_section_asm, &len);
   const struct lto_simple_header_with_strings *header
     = (const struct lto_simple_header_with_strings *) data;
   int string_offset;
@@ -1601,8 +1601,8 @@ void
 lto_input_mode_table (struct lto_file_decl_data *file_data)
 {
   size_t len;
-  const char *data = lto_get_section_data (file_data, LTO_section_mode_table,
-                                          NULL, &len);
+  const char *data
+    = lto_get_summary_section_data (file_data, LTO_section_mode_table, &len);
   if (! data)
     {
       internal_error ("cannot read LTO mode table from %s",
index 3ecadddec52832603bb3cbf17df9984509433560..cf45cc3af6446f3da4c431374f6a3d7dcb3ea950 100644 (file)
@@ -1972,10 +1972,12 @@ produce_asm (struct output_block *ob, tree fn)
   if (section_type == LTO_section_function_body)
     {
       const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
-      section_name = lto_get_section_name (section_type, name, NULL);
+      section_name = lto_get_section_name (section_type, name,
+                                          symtab_node::get (fn)->order,
+                                          NULL);
     }
   else
-    section_name = lto_get_section_name (section_type, NULL, NULL);
+    section_name = lto_get_section_name (section_type, NULL, 0, NULL);
 
   lto_begin_section (section_name, !flag_wpa);
   free (section_name);
@@ -2278,7 +2280,7 @@ lto_output_toplevel_asms (void)
 
   streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
 
-  section_name = lto_get_section_name (LTO_section_asm, NULL, NULL);
+  section_name = lto_get_section_name (LTO_section_asm, NULL, 0, NULL);
   lto_begin_section (section_name, !flag_wpa);
   free (section_name);
 
@@ -2311,7 +2313,7 @@ copy_function_or_variable (struct symtab_node *node)
   size_t len;
   const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
   char *section_name =
-    lto_get_section_name (LTO_section_function_body, name, NULL);
+    lto_get_section_name (LTO_section_function_body, name, node->order, NULL);
   size_t i, j;
   struct lto_in_decl_state *in_state;
   struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
@@ -2325,7 +2327,8 @@ copy_function_or_variable (struct symtab_node *node)
   name = lto_get_decl_name_mapping (file_data, name);
 
   data = lto_get_raw_section_data (file_data, LTO_section_function_body,
-                                   name, &len);
+                                  name, node->order - file_data->order_base,
+                                  &len);
   gcc_assert (data);
 
   /* Do a bit copy of the function body.  */
@@ -2410,7 +2413,7 @@ produce_lto_section ()
   /* Stream LTO meta section.  */
   output_block *ob = create_output_block (LTO_section_lto);
 
-  char * section_name = lto_get_section_name (LTO_section_lto, NULL, NULL);
+  char * section_name = lto_get_section_name (LTO_section_lto, NULL, 0, NULL);
   lto_begin_section (section_name, false);
   free (section_name);
 
@@ -2784,7 +2787,7 @@ static void
 produce_symtab (struct output_block *ob)
 {
   struct streamer_tree_cache_d *cache = ob->writer_cache;
-  char *section_name = lto_get_section_name (LTO_section_symtab, NULL, NULL);
+  char *section_name = lto_get_section_name (LTO_section_symtab, NULL, 0, NULL);
   lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
   lto_symtab_encoder_iterator lsei;
 
@@ -2884,7 +2887,7 @@ lto_write_mode_table (void)
   streamer_write_bitpack (&bp);
 
   char *section_name
-    = lto_get_section_name (LTO_section_mode_table, NULL, NULL);
+    = lto_get_section_name (LTO_section_mode_table, NULL, 0, NULL);
   lto_begin_section (section_name, !flag_wpa);
   free (section_name);
 
@@ -2928,7 +2931,7 @@ produce_asm_for_decls (void)
 
   memset (&header, 0, sizeof (struct lto_decl_header));
 
-  section_name = lto_get_section_name (LTO_section_decls, NULL, NULL);
+  section_name = lto_get_section_name (LTO_section_decls, NULL, 0, NULL);
   lto_begin_section (section_name, !flag_wpa);
   free (section_name);
 
index bd0126faebbd4d0d182f9c4ba9dfca6468249e1f..2ad979fdf34c8f194c9fbd125bc18ae836eb7b0a 100644 (file)
@@ -114,7 +114,8 @@ lto_tag_name (enum LTO_tags tag)
    to free the returned name.  */
 
 char *
-lto_get_section_name (int section_type, const char *name, struct lto_file_decl_data *f)
+lto_get_section_name (int section_type, const char *name,
+                     int node_order, struct lto_file_decl_data *f)
 {
   const char *add;
   char post[32];
@@ -125,7 +126,11 @@ lto_get_section_name (int section_type, const char *name, struct lto_file_decl_d
       gcc_assert (name != NULL);
       if (name[0] == '*')
        name++;
-      add = name;
+
+      char *buffer = (char *)xmalloc (strlen (name) + 32);
+      sprintf (buffer, "%s.%d", name, node_order);
+
+      add = buffer;
       sep = "";
     }
   else if (section_type < LTO_N_SECTION_TYPES)
index 3e4308aab15fad29deef10967b9526c2f0a69b41..116642740f4defd0b26da4aa66966b722deca74a 100644 (file)
@@ -283,6 +283,7 @@ lto_file_decl_data_num_ ## name ## s (struct lto_file_decl_data *data) \
 typedef const char* (lto_get_section_data_f) (struct lto_file_decl_data *,
                                              enum lto_section_type,
                                              const char *,
+                                             int,
                                              size_t *);
 
 /* Return the data found from the above call.  The first three
@@ -623,6 +624,8 @@ struct GTY(()) lto_file_decl_data
 
   /* Read LTO section.  */
   lto_section lto_section_header;
+
+  int order_base;
 };
 
 typedef struct lto_file_decl_data *lto_file_decl_data_ptr;
@@ -789,11 +792,14 @@ extern void lto_set_in_hooks (struct lto_file_decl_data **,
 extern struct lto_file_decl_data **lto_get_file_decl_data (void);
 extern const char *lto_get_section_data (struct lto_file_decl_data *,
                                         enum lto_section_type,
-                                        const char *, size_t *,
+                                        const char *, int, size_t *,
                                         bool decompress = false);
+extern const char *lto_get_summary_section_data (struct lto_file_decl_data *,
+                                                enum lto_section_type,
+                                                size_t *);
 extern const char *lto_get_raw_section_data (struct lto_file_decl_data *,
                                             enum lto_section_type,
-                                            const char *, size_t *);
+                                            const char *, int, size_t *);
 extern void lto_free_section_data (struct lto_file_decl_data *,
                                   enum lto_section_type,
                                   const char *, const char *, size_t,
@@ -857,7 +863,8 @@ extern void lto_append_block (struct lto_output_stream *);
 extern bool lto_stream_offload_p;
 
 extern const char *lto_tag_name (enum LTO_tags);
-extern char *lto_get_section_name (int, const char *, struct lto_file_decl_data *);
+extern char *lto_get_section_name (int, const char *, int,
+                                  struct lto_file_decl_data *);
 extern void print_lto_report (const char *);
 extern void lto_streamer_init (void);
 extern bool gate_lto_out (void);
index 3592dda25593a12c371259a7a1c11f04e952f405..a20e2d496fefdc232adcdb9327dfbfd7568fb700 100644 (file)
@@ -1,3 +1,10 @@
+2019-10-30  Martin Liska  <mliska@suse.cz>
+
+       PR lto/91393
+       PR lto/88220
+       * lto-common.c (lto_file_finalize): Use lto_get_summary_section_data.
+       (get_section_data): Add order argument.
+
 2019-10-29  Martin Liska  <mliska@suse.cz>
 
        * lto.c (do_whole_program_analysis): Pass
index cdfc7b0771911d022c38bb70d362977148751371..fc189ffcf0154c6f7b9c9de058398a818b278348 100644 (file)
@@ -2204,7 +2204,7 @@ lto_file_finalize (struct lto_file_decl_data *file_data, lto_file *file,
 #endif
 
   /* Read and verify LTO section.  */
-  data = lto_get_section_data (file_data, LTO_section_lto, NULL, &len, false);
+  data = lto_get_summary_section_data (file_data, LTO_section_lto, &len);
   if (data == NULL)
     {
       fatal_error (input_location, "bytecode stream in file %qs generated "
@@ -2217,7 +2217,7 @@ lto_file_finalize (struct lto_file_decl_data *file_data, lto_file *file,
                     file_data->lto_section_header.minor_version,
                     file_data->file_name);
 
-  data = lto_get_section_data (file_data, LTO_section_decls, NULL, &len);
+  data = lto_get_summary_section_data (file_data, LTO_section_decls, &len);
   if (data == NULL)
     {
       internal_error ("cannot read %<LTO_section_decls%> from %s",
@@ -2396,15 +2396,15 @@ lto_read_section_data (struct lto_file_decl_data *file_data,
 
 static const char *
 get_section_data (struct lto_file_decl_data *file_data,
-                     enum lto_section_type section_type,
-                     const char *name,
-                     size_t *len)
+                 enum lto_section_type section_type,
+                 const char *name, int order,
+                 size_t *len)
 {
   htab_t section_hash_table = file_data->section_hash_table;
   struct lto_section_slot *f_slot;
   struct lto_section_slot s_slot;
   const char *section_name = lto_get_section_name (section_type, name,
-                                                  file_data);
+                                                  order, file_data);
   char *data = NULL;
 
   *len = 0;
index 2d1d47ab26b17f7492b08cf8e4188e38e5317138..65729622b8c62a302eb6f64021dbd627abf89231 100644 (file)
@@ -1,3 +1,9 @@
+2019-10-30  Martin Liska  <mliska@suse.cz>
+
+       PR lto/91393
+       PR lto/88220
+       * gcc.dg/lto/pr91393_0.c: New test.
+
 2019-10-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/92262
diff --git a/gcc/testsuite/gcc.dg/lto/pr91393_0.c b/gcc/testsuite/gcc.dg/lto/pr91393_0.c
new file mode 100644 (file)
index 0000000..43b2426
--- /dev/null
@@ -0,0 +1,11 @@
+void __open_alias(int, ...) __asm__("open");
+void __open_alias(int flags, ...) {}
+extern __inline __attribute__((__gnu_inline__)) int open() {}
+struct {
+  void *func;
+} a = {open};
+
+int main()
+{
+  return 0;
+}
index 8e5a93726565550b7a2c064861898e01d51ee685..d4b83429c126643deef7b1c35b7ef4ac473ead3e 100644 (file)
@@ -299,11 +299,12 @@ varpool_node::get_constructor (void)
         = lto_get_function_in_decl_state (file_data, decl);
 
   data = lto_get_section_data (file_data, LTO_section_function_body,
-                              name, &len, decl_state->compressed);
+                              name, order - file_data->order_base,
+                              &len, decl_state->compressed);
   if (!data)
-    fatal_error (input_location, "%s: section %s is missing",
+    fatal_error (input_location, "%s: section %s.%d is missing",
                 file_data->file_name,
-                name);
+                name, order - file_data->order_base);
 
   if (!quiet_flag)
     fprintf (stderr, " in:%s", IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));