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
This commit is contained in:
Jan Hubicka 2014-11-14 16:47:53 +01:00 committed by Jan Hubicka
parent 7f201a67fb
commit 54e774c010
8 changed files with 176 additions and 14 deletions

View File

@ -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

View File

@ -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>

View File

@ -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),

View File

@ -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 "}";
}

View File

@ -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 */"

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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