summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-14 15:47:53 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-14 15:47:53 +0000
commitab90b67e5730e294179da11c4fa1680cc19febf5 (patch)
treeb9b240b3b0e9c9a5fc0a8dd259d3fa2ad0e27aa0
parentec485a18f6a7572976b8c1950c60fad73e4c4976 (diff)
downloadgcc-ab90b67e5730e294179da11c4fa1680cc19febf5.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217571 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog21
-rw-r--r--gcc/lto/ChangeLog4
-rw-r--r--gcc/lto/lto.c3
-rw-r--r--gcc/optc-save-gen.awk134
-rw-r--r--gcc/opth-gen.awk6
-rw-r--r--gcc/tree-streamer-in.c6
-rw-r--r--gcc/tree-streamer-out.c6
-rw-r--r--gcc/tree.c10
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 <hubicka@ucw.cz>
+
+ * 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 <rguenther@suse.de>
* 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 <hubicka@ucw.cz>
+
+ * lto.c (compare_tree_sccs_1): Compare cl_target_option_eq.
+
2014-11-13 Ilya Verbin <ilya.verbin@intel.com>
Bernd Schmidt <bernds@codesourcery.com>
Andrey Turetskiy <andrey.turetskiy@intel.com>
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