optc-save-gen.awk: Output cl_target_option_eq...
authorJan Hubicka <hubicka@ucw.cz>
Fri, 14 Nov 2014 15:47:53 +0000 (16:47 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 14 Nov 2014 15:47:53 +0000 (15:47 +0000)
* 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
gcc/lto/ChangeLog
gcc/lto/lto.c
gcc/optc-save-gen.awk
gcc/opth-gen.awk
gcc/tree-streamer-in.c
gcc/tree-streamer-out.c
gcc/tree.c

index 7a1a54aac5c59f225fdaf61448730e699945ac67..5fd3ca894616d589a3acfc7668ddad8326f57aad 100644 (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
index 96362e1336912651682ce8a0112eb5045b35d78b..6975042cf279c121d19aaef49ce2e798c1cd1ba8 100644 (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>
index 98d48fb7aa9c72da6fbf5398f3d5a8702fbd62cc..ff7f9f63453d438ae4a41cb41268aa00c4c2c942 100644 (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),
index a5ec7e486600b6bb47c4d3803bc5e03137d3a7ce..861683460ad5364ca7640edf32499dfca92232ff 100644 (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 "}";
+
 }
index cbc7ab53b881a34a343dea5ab8ebe11412732568..a8a04b789ec0079a61c7e71819ae3908c2998d0d 100644 (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 */"
index 371e31648220d529636e4ceff12580d3aa4a06f3..c63bc607d8af85a2b85bf46a77cfb834266b8f75 100644 (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);
 }
index 7419f5ae34f8b8671dd03af26a8c0e910a62d645..41dca6e6abd963965639ce5dccf2c7ce17334366 100644 (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);
 }
index 5c6fe0bee30de6a9c36d1091adc0e485ac8f422c..933e8eb4d615b5e70ae5f3df4577f801534d9002 100644 (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