diff options
author | Jakub Jelinek <jakub@redhat.com> | 2015-02-26 13:26:11 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2015-02-26 13:26:11 +0100 |
commit | db847fa8f2cca6139188b8dfa0a7064319b19193 (patch) | |
tree | 4cfafb39979c3cd73421161d2411ccb6693f4928 /gcc/lto-streamer-in.c | |
parent | 948f9b763d00ae77117179edf1980eb40d284326 (diff) | |
download | gcc-db847fa8f2cca6139188b8dfa0a7064319b19193.zip gcc-db847fa8f2cca6139188b8dfa0a7064319b19193.tar.gz gcc-db847fa8f2cca6139188b8dfa0a7064319b19193.tar.bz2 |
passes.c (ipa_write_summaries_1): Call lto_output_init_mode_table.
* passes.c (ipa_write_summaries_1): Call lto_output_init_mode_table.
(ipa_write_optimization_summaries): Likewise.
* tree-streamer.h: Include data-streamer.h.
(streamer_mode_table): Declare extern variable.
(bp_pack_machine_mode, bp_unpack_machine_mode): New inline functions.
* lto-streamer-out.c (lto_output_init_mode_table,
lto_write_mode_table): New functions.
(produce_asm_for_decls): Call lto_write_mode_table when streaming
offloading LTO.
* lto-section-in.c (lto_section_name): Add "mode_table" entry.
(lto_create_simple_input_block): Add mode_table argument to the
lto_input_block constructors.
* ipa-prop.c (ipa_prop_read_section, read_replacements_section):
Likewise.
* data-streamer-in.c (string_for_index): Likewise.
* ipa-inline-analysis.c (inline_read_section): Likewise.
* ipa-icf.c (sem_item_optimizer::read_section): Likewise.
* lto-cgraph.c (input_cgraph_opt_section): Likewise.
* lto-streamer-in.c (lto_read_body_or_constructor,
lto_input_toplevel_asms): Likewise.
(lto_input_mode_table): New function.
* tree-streamer-out.c (pack_ts_fixed_cst_value_fields,
pack_ts_decl_common_value_fields, pack_ts_type_common_value_fields):
Use bp_pack_machine_mode.
* real.h (struct real_format): Add name field.
* lto-streamer.h (enum lto_section_type): Add LTO_section_mode_table.
(class lto_input_block): Add mode_table member.
(lto_input_block::lto_input_block): Add mode_table_ argument,
initialize mode_table.
(struct lto_file_decl_data): Add mode_table field.
(lto_input_mode_table, lto_output_init_mode_table): New prototypes.
* tree-streamer-in.c (unpack_ts_fixed_cst_value_fields,
unpack_ts_decl_common_value_fields,
unpack_ts_type_common_value_fields): Call bp_unpack_machine_mode.
* tree-streamer.c (streamer_mode_table): New variable.
* real.c (ieee_single_format, mips_single_format,
motorola_single_format, spu_single_format, ieee_double_format,
mips_double_format, motorola_double_format,
ieee_extended_motorola_format, ieee_extended_intel_96_format,
ieee_extended_intel_128_format, ieee_extended_intel_96_round_53_format,
ibm_extended_format, mips_extended_format, ieee_quad_format,
mips_quad_format, vax_f_format, vax_d_format, vax_g_format,
decimal_single_format, decimal_double_format, decimal_quad_format,
ieee_half_format, arm_half_format, real_internal_format): Add name
field.
* config/pdp11/pdp11.c (pdp11_f_format, pdp11_d_format): Likewise.
lto/
* lto.c (lto_mode_identity_table): New variable.
(lto_read_decls): Add mode_table argument to the lto_input_block
constructor.
(lto_file_finalize): Initialize mode_table.
(lto_init): Initialize lto_mode_identity_table.
From-SVN: r221005
Diffstat (limited to 'gcc/lto-streamer-in.c')
-rw-r--r-- | gcc/lto-streamer-in.c | 126 |
1 files changed, 123 insertions, 3 deletions
diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index e12d00a..a045b97 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -1116,10 +1116,12 @@ lto_read_body_or_constructor (struct lto_file_decl_data *file_data, struct symta /* Set up the struct function. */ from = data_in->reader_cache->nodes.length (); - lto_input_block ib_main (data + main_offset, header->main_size); + lto_input_block ib_main (data + main_offset, header->main_size, + file_data->mode_table); if (TREE_CODE (node->decl) == FUNCTION_DECL) { - lto_input_block ib_cfg (data + cfg_offset, header->cfg_size); + lto_input_block ib_cfg (data + cfg_offset, header->cfg_size, + file_data->mode_table); input_function (fn_decl, data_in, &ib_main, &ib_cfg); } else @@ -1384,7 +1386,8 @@ lto_input_toplevel_asms (struct lto_file_decl_data *file_data, int order_base) string_offset = sizeof (*header) + header->main_size; - lto_input_block ib (data + sizeof (*header), header->main_size); + lto_input_block ib (data + sizeof (*header), header->main_size, + file_data->mode_table); data_in = lto_data_in_create (file_data, data + string_offset, header->string_size, vNULL); @@ -1403,6 +1406,123 @@ lto_input_toplevel_asms (struct lto_file_decl_data *file_data, int order_base) } +/* Input mode table. */ + +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); + if (! data) + { + internal_error ("cannot read LTO mode table from %s", + file_data->file_name); + return; + } + + unsigned char *table = ggc_cleared_vec_alloc<unsigned char> (1 << 8); + file_data->mode_table = table; + const struct lto_simple_header_with_strings *header + = (const struct lto_simple_header_with_strings *) data; + int string_offset; + struct data_in *data_in; + string_offset = sizeof (*header) + header->main_size; + + lto_input_block ib (data + sizeof (*header), header->main_size, NULL); + data_in = lto_data_in_create (file_data, data + string_offset, + header->string_size, vNULL); + bitpack_d bp = streamer_read_bitpack (&ib); + + table[VOIDmode] = VOIDmode; + table[BLKmode] = BLKmode; + unsigned int m; + while ((m = bp_unpack_value (&bp, 8)) != VOIDmode) + { + enum mode_class mclass + = bp_unpack_enum (&bp, mode_class, MAX_MODE_CLASS); + unsigned int size = bp_unpack_value (&bp, 8); + unsigned int prec = bp_unpack_value (&bp, 16); + machine_mode inner = (machine_mode) table[bp_unpack_value (&bp, 8)]; + unsigned int nunits = bp_unpack_value (&bp, 8); + unsigned int ibit = 0, fbit = 0; + unsigned int real_fmt_len = 0; + const char *real_fmt_name = NULL; + switch (mclass) + { + case MODE_FRACT: + case MODE_UFRACT: + case MODE_ACCUM: + case MODE_UACCUM: + ibit = bp_unpack_value (&bp, 8); + fbit = bp_unpack_value (&bp, 8); + break; + case MODE_FLOAT: + case MODE_DECIMAL_FLOAT: + real_fmt_name = bp_unpack_indexed_string (data_in, &bp, + &real_fmt_len); + break; + default: + break; + } + /* First search just the GET_CLASS_NARROWEST_MODE to wider modes, + if not found, fallback to all modes. */ + int pass; + for (pass = 0; pass < 2; pass++) + for (machine_mode mr = pass ? VOIDmode + : GET_CLASS_NARROWEST_MODE (mclass); + pass ? mr < MAX_MACHINE_MODE : mr != VOIDmode; + pass ? mr = (machine_mode) (m + 1) + : mr = GET_MODE_WIDER_MODE (mr)) + if (GET_MODE_CLASS (mr) != mclass + || GET_MODE_SIZE (mr) != size + || GET_MODE_PRECISION (mr) != prec + || GET_MODE_INNER (mr) != inner + || GET_MODE_IBIT (mr) != ibit + || GET_MODE_FBIT (mr) != fbit + || GET_MODE_NUNITS (mr) != nunits) + continue; + else if ((mclass == MODE_FLOAT || mclass == MODE_DECIMAL_FLOAT) + && strcmp (REAL_MODE_FORMAT (mr)->name, real_fmt_name) != 0) + continue; + else + { + table[m] = mr; + pass = 2; + break; + } + unsigned int mname_len; + const char *mname = bp_unpack_indexed_string (data_in, &bp, &mname_len); + if (pass == 2) + { + switch (mclass) + { + case MODE_VECTOR_INT: + case MODE_VECTOR_FLOAT: + case MODE_VECTOR_FRACT: + case MODE_VECTOR_UFRACT: + case MODE_VECTOR_ACCUM: + case MODE_VECTOR_UACCUM: + /* For unsupported vector modes just use BLKmode, + if the scalar mode is supported. */ + if (inner != VOIDmode) + { + table[m] = BLKmode; + break; + } + /* FALLTHRU */ + default: + fatal_error (UNKNOWN_LOCATION, "unsupported mode %s\n", mname); + break; + } + } + } + lto_data_in_delete (data_in); + + lto_free_section_data (file_data, LTO_section_mode_table, NULL, data, len); +} + + /* Initialization for the LTO reader. */ void |