From 54e774c010842d336124426aec671a96712cc1d7 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Fri, 14 Nov 2014 16:47:53 +0100 Subject: [PATCH] optc-save-gen.awk: Output cl_target_option_eq... * optc-save-gen.awk: Output cl_target_option_eq, cl_target_option_hash, cl_target_option_stream_out, cl_target_option_stream_in functions. * opth-gen.awk: Output prototypes for cl_target_option_eq and cl_target_option_hash. * lto-streamer.h (cl_target_option_stream_out, cl_target_option_stream_in): Declare. * tree.c (cl_option_hash_hash): Use cl_target_option_hash. (cl_option_hash_eq): Use cl_target_option_eq. * tree-streamer-in.c (unpack_value_fields): Stream in TREE_TARGET_OPTION. * lto-streamer-out.c (DFS::DFS_write_tree_body): Follow DECL_FUNCTION_SPECIFIC_TARGET. (hash_tree): Hash TREE_TARGET_OPTION; visit DECL_FUNCTION_SPECIFIC_TARGET. * tree-streamer-out.c (streamer_pack_tree_bitfields): Skip TS_TARGET_OPTION. (streamer_write_tree_body): Output TS_TARGET_OPTION. * lto.c (compare_tree_sccs_1): Compare cl_target_option_eq. From-SVN: r217571 --- gcc/ChangeLog | 21 +++++++ gcc/lto/ChangeLog | 4 ++ gcc/lto/lto.c | 3 +- gcc/optc-save-gen.awk | 134 ++++++++++++++++++++++++++++++++++++++++ gcc/opth-gen.awk | 6 ++ gcc/tree-streamer-in.c | 6 +- gcc/tree-streamer-out.c | 6 +- gcc/tree.c | 10 +-- 8 files changed, 176 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a1a54aac5c..5fd3ca89461 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2014-11-14 Jan Hubicka + + * optc-save-gen.awk: Output cl_target_option_eq, + cl_target_option_hash, cl_target_option_stream_out, + cl_target_option_stream_in functions. + * opth-gen.awk: Output prototypes for + cl_target_option_eq and cl_target_option_hash. + * lto-streamer.h (cl_target_option_stream_out, + cl_target_option_stream_in): Declare. + * tree.c (cl_option_hash_hash): Use cl_target_option_hash. + (cl_option_hash_eq): Use cl_target_option_eq. + * tree-streamer-in.c (unpack_value_fields): Stream in + TREE_TARGET_OPTION. + * lto-streamer-out.c (DFS::DFS_write_tree_body): Follow + DECL_FUNCTION_SPECIFIC_TARGET. + (hash_tree): Hash TREE_TARGET_OPTION; visit + DECL_FUNCTION_SPECIFIC_TARGET. + * tree-streamer-out.c (streamer_pack_tree_bitfields): Skip + TS_TARGET_OPTION. + (streamer_write_tree_body): Output TS_TARGET_OPTION. + 2014-11-14 Richard Biener * gimple-fold.h (gimple_fold_stmt_to_constant_1): Add 2nd diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 96362e13369..6975042cf27 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,7 @@ +2014-11-14 Jan Hubicka + + * lto.c (compare_tree_sccs_1): Compare cl_target_option_eq. + 2014-11-13 Ilya Verbin Bernd Schmidt Andrey Turetskiy diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index 98d48fb7aa9..ff7f9f63453 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -1377,7 +1377,8 @@ compare_tree_sccs_1 (tree t1, tree t2, tree **map) return false; if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)) - gcc_unreachable (); + if (!cl_target_option_eq (TREE_TARGET_OPTION (t1), TREE_TARGET_OPTION (t2))) + return false; if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION)) if (memcmp (TREE_OPTIMIZATION (t1), TREE_OPTIMIZATION (t2), diff --git a/gcc/optc-save-gen.awk b/gcc/optc-save-gen.awk index a5ec7e48660..861683460ad 100644 --- a/gcc/optc-save-gen.awk +++ b/gcc/optc-save-gen.awk @@ -39,6 +39,18 @@ print "#include " quote "intl.h" quote print "" print "#include " quote "flags.h" quote print "#include " quote "target.h" quote +print "#include " quote "inchash.h" quote +print "#include " quote "tree.h" quote +print "#include " quote "tree-ssa-alias.h" quote +print "#include " quote "is-a.h" quote +print "#include " quote "predict.h" quote +print "#include " quote "function.h" quote +print "#include " quote "basic-block.h" quote +print "#include " quote "gimple-expr.h" quote +print "#include " quote "gimple.h" quote +print "#include " quote "data-streamer.h" quote +print "#include " quote "ipa-ref.h" quote +print "#include " quote "cgraph.h" quote print "" if (n_extra_c_includes > 0) { @@ -417,4 +429,126 @@ print " targetm.target_option.print (file, indent, ptr);"; print "}"; +print ""; +print "/* Compare two target options */"; +print "bool"; +print "cl_target_option_eq (struct cl_target_option const *ptr1 ATTRIBUTE_UNUSED,"; +print " struct cl_target_option const *ptr2 ATTRIBUTE_UNUSED)"; +print "{"; +n_target_val = 0; +n_target_str = 0; + +for (i = 0; i < n_target_save; i++) { + var = target_save_decl[i]; + sub (" *=.*", "", var); + name = var; + type = var; + sub("^.*[ *]", "", name) + sub(" *" name "$", "", type) + if (target_save_decl[i] ~ "^const char \\*+[_" alnum "]+$") + var_target_str[n_target_str++] = name; + else { + var_target_val_type[n_target_val] = type; + var_target_val[n_target_val++] = name; + } +} +if (have_save) { + for (i = 0; i < n_opts; i++) { + if (flag_set_p("Save", flags[i])) { + name = var_name(flags[i]) + if(name == "") + name = "target_flags"; + + if(name in var_list_seen) + continue; + + var_list_seen[name]++; + otype = var_type_struct(flags[i]) + if (otype ~ "^const char \\**$") + var_target_str[n_target_str++] = "x_" name; + else { + var_target_val_type[n_target_val] = otype; + var_target_val[n_target_val++] = "x_" name; + } + } + } +} else { + var_target_val_type[n_target_val] = "int"; + var_target_val[n_target_val++] = "x_target_flags"; +} + +for (i = 0; i < n_target_str; i++) { + name = var_target_str[i] + print " if (ptr1->" name" != ptr2->" name; + print " && (!ptr1->" name" || !ptr2->" name + print " || strcmp (ptr1->" name", ptr2->" name ")))"; + print " return false;"; +} +for (i = 0; i < n_target_val; i++) { + name = var_target_val[i] + print " if (ptr1->" name" != ptr2->" name ")"; + print " return false;"; +} + +print " return true;"; + +print "}"; + +print ""; +print "/* Hash target options */"; +print "hashval_t"; +print "cl_target_option_hash (struct cl_target_option const *ptr ATTRIBUTE_UNUSED)"; +print "{"; +print " inchash::hash hstate;"; +for (i = 0; i < n_target_str; i++) { + name = var_target_str[i] + print " if (ptr->" name")"; + print " hstate.add (ptr->" name", strlen (ptr->" name"));"; + print " else"; + print " hstate.add_int (0);"; +} +for (i = 0; i < n_target_val; i++) { + name = var_target_val[i] + print " hstate.add_wide_int (ptr->" name");"; +} +print " return hstate.end ();"; +print "}"; + +print ""; +print "/* Stream out target options */"; +print "void"; +print "cl_target_option_stream_out (struct output_block *ob ATTRIBUTE_UNUSED,"; +print " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; +print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)"; +print "{"; +for (i = 0; i < n_target_str; i++) { + name = var_target_str[i] + print " bp_pack_string (ob, bp, ptr->" name", true);"; +} +for (i = 0; i < n_target_val; i++) { + name = var_target_val[i] + print " bp_pack_value (bp, ptr->" name", 64);"; +} +print "}"; + +print ""; +print "/* Stream in target options */"; +print "void"; +print "cl_target_option_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,"; +print " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; +print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)"; +print "{"; +for (i = 0; i < n_target_str; i++) { + name = var_target_str[i] + print " ptr->" name" = bp_unpack_string (data_in, bp);"; + print " if (ptr->" name")"; + print " ptr->" name" = xstrdup (ptr->" name");"; +} +for (i = 0; i < n_target_val; i++) { + name = var_target_val[i] + print " ptr->" name" = (" var_target_val_type[i] ") bp_unpack_value (bp, 64);"; +} + +print "}"; + } diff --git a/gcc/opth-gen.awk b/gcc/opth-gen.awk index cbc7ab53b88..a8a04b789ec 100644 --- a/gcc/opth-gen.awk +++ b/gcc/opth-gen.awk @@ -293,6 +293,12 @@ print ""; print "/* Print target option variables from a structure. */"; print "extern void cl_target_option_print (FILE *, int, struct cl_target_option *);"; print ""; +print "/* Compare two target option variables from a structure. */"; +print "extern bool cl_target_option_eq (const struct cl_target_option *, const struct cl_target_option *);"; +print ""; +print "/* Hash option variables from a structure. */"; +print "extern hashval_t cl_target_option_hash (const struct cl_target_option *);"; +print ""; print "/* Anything that includes tm.h, does not necessarily need this. */" print "#if !defined(GCC_TM_H)" print "#include \"input.h\" /* for location_t */" diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c index 371e3164822..c63bc607d8a 100644 --- a/gcc/tree-streamer-in.c +++ b/gcc/tree-streamer-in.c @@ -506,9 +506,6 @@ unpack_value_fields (struct data_in *data_in, struct bitpack_d *bp, tree expr) if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL)) unpack_ts_translation_unit_decl_value_fields (data_in, bp, expr); - if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)) - gcc_unreachable (); - if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION)) unpack_ts_optimization (bp, expr); @@ -526,6 +523,9 @@ unpack_value_fields (struct data_in *data_in, struct bitpack_d *bp, tree expr) vec_safe_grow (CONSTRUCTOR_ELTS (expr), length); } + if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)) + cl_target_option_stream_in (data_in, bp, TREE_TARGET_OPTION (expr)); + if (code == OMP_CLAUSE) unpack_ts_omp_clause_value_fields (data_in, bp, expr); } diff --git a/gcc/tree-streamer-out.c b/gcc/tree-streamer-out.c index 7419f5ae34f..41dca6e6abd 100644 --- a/gcc/tree-streamer-out.c +++ b/gcc/tree-streamer-out.c @@ -472,9 +472,6 @@ streamer_pack_tree_bitfields (struct output_block *ob, if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL)) pack_ts_translation_unit_decl_value_fields (ob, bp, expr); - if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)) - gcc_unreachable (); - if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION)) pack_ts_optimization (bp, expr); @@ -484,6 +481,9 @@ streamer_pack_tree_bitfields (struct output_block *ob, if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) bp_pack_var_len_unsigned (bp, CONSTRUCTOR_NELTS (expr)); + if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)) + cl_target_option_stream_out (ob, bp, TREE_TARGET_OPTION (expr)); + if (code == OMP_CLAUSE) pack_ts_omp_clause_value_fields (ob, bp, expr); } diff --git a/gcc/tree.c b/gcc/tree.c index 5c6fe0bee30..933e8eb4d61 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -11486,10 +11486,7 @@ cl_option_hash_hash (const void *x) } else if (TREE_CODE (t) == TARGET_OPTION_NODE) - { - p = (const char *)TREE_TARGET_OPTION (t); - len = sizeof (struct cl_target_option); - } + return cl_target_option_hash (TREE_TARGET_OPTION (t)); else gcc_unreachable (); @@ -11528,9 +11525,8 @@ cl_option_hash_eq (const void *x, const void *y) else if (TREE_CODE (xt) == TARGET_OPTION_NODE) { - xp = (const char *)TREE_TARGET_OPTION (xt); - yp = (const char *)TREE_TARGET_OPTION (yt); - len = sizeof (struct cl_target_option); + return cl_target_option_eq (TREE_TARGET_OPTION (xt), + TREE_TARGET_OPTION (yt)); } else -- 2.30.2