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:
parent
7f201a67fb
commit
54e774c010
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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),
|
||||
|
@ -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 "}";
|
||||
|
||||
}
|
||||
|
@ -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 */"
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
10
gcc/tree.c
10
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
|
||||
|
Loading…
Reference in New Issue
Block a user