cgraph.c (cgraph_node::get_untransformed_body): Pass compressed flag to lto_get_secti...
authorJan Hubicka <hubicka@ucw.cz>
Sun, 13 Dec 2015 02:12:15 +0000 (03:12 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sun, 13 Dec 2015 02:12:15 +0000 (02:12 +0000)
* cgraph.c (cgraph_node::get_untransformed_body): Pass compressed
flag to lto_get_section_data.
* varpool.c (varpool_node::get_constructor): Likewise.
* lto-section-in.c (lto_get_section_data): Add new flag decompress.
(lto_free_section_data): Likewise.
(lto_get_raw_section_data): New function.
(lto_free_raw_section_data): New function.
(copy_function_or_variable): Copy sections w/o decompressing.
(lto_output_decl_state_refs): Picke compressed bit.
* lto-streamer.h (lto_in_decl_state): New flag compressed.
(lto_out_decl_state): Likewise.
(lto_get_section_data, lto_free_section_data): Update prototypes
(lto_get_raw_section_data, lto_free_raw_section_data): Declare.
(lto_write_raw_data): Declare.
(lto_begin_section): Remove FIXME.
(lto_write_raw_data): New function.
(lto_write_stream): Remove FIXME.
(lto_new_out_decl_state): Set compressed flag.

* lto.c (lto_read_in_decl_state): Unpickle compressed bit.

From-SVN: r231593

gcc/ChangeLog
gcc/cgraph.c
gcc/lto-section-in.c
gcc/lto-streamer.h
gcc/lto/ChangeLog
gcc/lto/lto.c
gcc/varpool.c

index 2ec0e5b4d5ef197733a95b991dd918a7e7dfea2d..1e68758cdac098c2bd149f650ff2fa92a37c7de6 100644 (file)
@@ -1,3 +1,24 @@
+2015-12-10  Jan Hubicka  <hubicka@ucw.cz>
+
+       * cgraph.c (cgraph_node::get_untransformed_body): Pass compressed
+       flag to lto_get_section_data.
+       * varpool.c (varpool_node::get_constructor): Likewise.
+       * lto-section-in.c (lto_get_section_data): Add new flag decompress.
+       (lto_free_section_data): Likewise.
+       (lto_get_raw_section_data): New function.
+       (lto_free_raw_section_data): New function.
+       (copy_function_or_variable): Copy sections w/o decompressing.
+       (lto_output_decl_state_refs): Picke compressed bit.
+       * lto-streamer.h (lto_in_decl_state): New flag compressed.
+       (lto_out_decl_state): Likewise.
+       (lto_get_section_data, lto_free_section_data): Update prototypes
+       (lto_get_raw_section_data, lto_free_raw_section_data): Declare.
+       (lto_write_raw_data): Declare.
+       (lto_begin_section): Remove FIXME.
+       (lto_write_raw_data): New function.
+       (lto_write_stream): Remove FIXME.
+       (lto_new_out_decl_state): Set compressed flag.
+
 2015-12-10  Jan Hubicka  <hubicka@ucw.cz>
 
        * tree.c (free_lang_data_in_type, find_decls_types_r): Also free
index 35cd98c12f833347563426ad175703154bed60b9..c8c337026128c29c4ed49541ab02f38336e453c2 100644 (file)
@@ -3251,9 +3251,11 @@ cgraph_node::get_untransformed_body (void)
 
   /* We may have renamed the declaration, e.g., a static function.  */
   name = lto_get_decl_name_mapping (file_data, name);
+  struct lto_in_decl_state *decl_state
+        = lto_get_function_in_decl_state (file_data, decl);
 
   data = lto_get_section_data (file_data, LTO_section_function_body,
-                              name, &len);
+                              name, &len, decl_state->compressed);
   if (!data)
     fatal_error (input_location, "%s: section %s is missing",
                 file_data->file_name,
@@ -3264,7 +3266,7 @@ cgraph_node::get_untransformed_body (void)
   lto_input_function_body (file_data, this, data);
   lto_stats.num_function_bodies++;
   lto_free_section_data (file_data, LTO_section_function_body, name,
-                        data, len);
+                        data, len, decl_state->compressed);
   lto_free_function_in_decl_state_for_node (this);
   /* Keep lto file data so ipa-inline-analysis knows about cross module
      inlining.  */
index e7ace09da64e0882fdae8f8b4bb93aed0400507f..1529fdd3bb15a0b4dd84134a0e56e27667cbbcce 100644 (file)
@@ -130,7 +130,7 @@ const char *
 lto_get_section_data (struct lto_file_decl_data *file_data,
                      enum lto_section_type section_type,
                      const char *name,
-                     size_t *len)
+                     size_t *len, bool decompress)
 {
   const char *data = (get_section_f) (file_data, section_type, name, len);
   const size_t header_length = sizeof (struct lto_data_header);
@@ -142,9 +142,10 @@ lto_get_section_data (struct lto_file_decl_data *file_data,
   if (data == NULL)
     return NULL;
 
-  /* FIXME lto: WPA mode does not write compressed sections, so for now
-     suppress uncompression if flag_ltrans.  */
-  if (!flag_ltrans)
+  /* WPA->ltrans streams are not compressed with exception of function bodies
+     and variable initializers that has been verbatim copied from earlier
+     compilations.  */
+  if (!flag_ltrans || decompress)
     {
       /* Create a mapping header containing the underlying data and length,
         and prepend this to the uncompression buffer.  The uncompressed data
@@ -170,6 +171,16 @@ lto_get_section_data (struct lto_file_decl_data *file_data,
   return data;
 }
 
+/* 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,
+                         size_t *len)
+{
+  return (get_section_f) (file_data, section_type, name, len);
+}
 
 /* Free the data found from the above call.  The first three
    parameters are the same as above.  DATA is the data to be freed and
@@ -180,7 +191,7 @@ lto_free_section_data (struct lto_file_decl_data *file_data,
                       enum lto_section_type section_type,
                       const char *name,
                       const char *data,
-                      size_t len)
+                      size_t len, bool decompress)
 {
   const size_t header_length = sizeof (struct lto_data_header);
   const char *real_data = data - header_length;
@@ -189,9 +200,7 @@ lto_free_section_data (struct lto_file_decl_data *file_data,
 
   gcc_assert (free_section_f);
 
-  /* FIXME lto: WPA mode does not write compressed sections, so for now
-     suppress uncompression mapping if flag_ltrans.  */
-  if (flag_ltrans)
+  if (flag_ltrans && !decompress)
     {
       (free_section_f) (file_data, section_type, name, data, len);
       return;
@@ -203,6 +212,17 @@ lto_free_section_data (struct lto_file_decl_data *file_data,
   free (CONST_CAST (char *, real_data));
 }
 
+/* Free data allocated by lto_get_raw_section_data.  */
+
+void
+lto_free_raw_section_data (struct lto_file_decl_data *file_data,
+                          enum lto_section_type section_type,
+                          const char *name,
+                          const char *data,
+                          size_t len)
+{
+  (free_section_f) (file_data, section_type, name, data, len);
+}
 
 /* Load a section of type SECTION_TYPE from FILE_DATA, parse the
    header and then return an input block pointing to the section.  The
index f4997aa318f1725f799ecab710b4389c7367f2a1..06c8d7a04e95704955aee05672613b4082cf6fa2 100644 (file)
@@ -501,6 +501,9 @@ struct GTY((for_user)) lto_in_decl_state
   /* If this in-decl state is associated with a function. FN_DECL
      point to the FUNCTION_DECL. */
   tree fn_decl;
+
+  /* True if decl state is compressed.  */
+  bool compressed;
 };
 
 typedef struct lto_in_decl_state *lto_in_decl_state_ptr;
@@ -534,6 +537,9 @@ struct lto_out_decl_state
   /* If this out-decl state belongs to a function, fn_decl points to that
      function.  Otherwise, it is NULL. */
   tree fn_decl;
+
+  /* True if decl state is compressed.  */
+  bool compressed;
 };
 
 typedef struct lto_out_decl_state *lto_out_decl_state_ptr;
@@ -758,10 +764,18 @@ 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 *, size_t *,
+                                        bool decompress = false);
+extern const char *lto_get_raw_section_data (struct lto_file_decl_data *,
+                                            enum lto_section_type,
+                                            const char *, size_t *);
 extern void lto_free_section_data (struct lto_file_decl_data *,
-                                  enum lto_section_type,
-                                  const char *, const char *, size_t);
+                                  enum lto_section_type,
+                                  const char *, const char *, size_t,
+                                  bool decompress = false);
+extern void lto_free_raw_section_data (struct lto_file_decl_data *,
+                                      enum lto_section_type,
+                                      const char *, const char *, size_t);
 extern htab_t lto_create_renaming_table (void);
 extern void lto_record_renamed_decl (struct lto_file_decl_data *,
                                     const char *, const char *);
@@ -782,6 +796,7 @@ extern void lto_value_range_error (const char *,
 extern void lto_begin_section (const char *, bool);
 extern void lto_end_section (void);
 extern void lto_write_data (const void *, unsigned int);
+extern void lto_write_raw_data (const void *, unsigned int);
 extern void lto_write_stream (struct lto_output_stream *);
 extern bool lto_output_decl_index (struct lto_output_stream *,
                            struct lto_tree_ref_encoder *,
index f0d90fc328b4f299aad5aa00219676a413f6e568..6e905276d3165e2b020a0147ebee66b119a2bb28 100644 (file)
@@ -1,3 +1,7 @@
+2015-12-10  Jan Hubicka  <hubicka@ucw.cz>
+
+       * lto.c (lto_read_in_decl_state): Unpickle compressed bit.
+
 2015-12-11  Jan Hubicka  <hubicka@ucw.cz>
 
        PR ipa/61886
index 1b11439f04fc74583c91477f817757eae2e06c6e..fcf7caf460ab3a99620602d7608e27be6e6d4880 100644 (file)
@@ -234,6 +234,8 @@ lto_read_in_decl_state (struct data_in *data_in, const uint32_t *data,
   uint32_t i, j;
 
   ix = *data++;
+  state->compressed = ix & 1;
+  ix /= 2;
   decl = streamer_tree_cache_get_tree (data_in->reader_cache, ix);
   if (!VAR_OR_FUNCTION_DECL_P (decl))
     {
index ac77269a7385e5e11c01667603ddb526907594d8..5e4fcbf2a4a3a7f087c38fa8eb54e7b9b7ea2125 100644 (file)
@@ -296,9 +296,11 @@ varpool_node::get_constructor (void)
 
   /* We may have renamed the declaration, e.g., a static function.  */
   name = lto_get_decl_name_mapping (file_data, name);
+  struct lto_in_decl_state *decl_state
+        = lto_get_function_in_decl_state (file_data, decl);
 
   data = lto_get_section_data (file_data, LTO_section_function_body,
-                              name, &len);
+                              name, &len, decl_state->compressed);
   if (!data)
     fatal_error (input_location, "%s: section %s is missing",
                 file_data->file_name,
@@ -308,7 +310,7 @@ varpool_node::get_constructor (void)
   gcc_assert (DECL_INITIAL (decl) != error_mark_node);
   lto_stats.num_function_bodies++;
   lto_free_section_data (file_data, LTO_section_function_body, name,
-                        data, len);
+                        data, len, decl_state->compressed);
   lto_free_function_in_decl_state_for_node (this);
   timevar_pop (TV_IPA_LTO_CTORS_IN);
   return DECL_INITIAL (decl);