18feb0f0bSmrg# Copyright (C) 2003-2020 Free Software Foundation, Inc. 21debfc3dSmrg# Contributed by Kelley Cook, June 2004. 31debfc3dSmrg# Original code from Neil Booth, May 2003. 41debfc3dSmrg# 51debfc3dSmrg# This program is free software; you can redistribute it and/or modify it 61debfc3dSmrg# under the terms of the GNU General Public License as published by the 71debfc3dSmrg# Free Software Foundation; either version 3, or (at your option) any 81debfc3dSmrg# later version. 91debfc3dSmrg# 101debfc3dSmrg# This program is distributed in the hope that it will be useful, 111debfc3dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 121debfc3dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 131debfc3dSmrg# GNU General Public License for more details. 141debfc3dSmrg# 151debfc3dSmrg# You should have received a copy of the GNU General Public License 161debfc3dSmrg# along with this program; see the file COPYING3. If not see 171debfc3dSmrg# <http://www.gnu.org/licenses/>. 181debfc3dSmrg 191debfc3dSmrg# This Awk script reads in the option records generated from 201debfc3dSmrg# opt-gather.awk, combines the flags of duplicate options and generates a 211debfc3dSmrg# C file. 221debfc3dSmrg# 231debfc3dSmrg 241debfc3dSmrg# This program uses functions from opt-functions.awk and code from 251debfc3dSmrg# opt-read.awk. 261debfc3dSmrg# 271debfc3dSmrg# Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-save-gen.awk \ 281debfc3dSmrg# [-v header_name=header.h] < inputfile > options-save.c 291debfc3dSmrg 301debfc3dSmrg# Dump that array of options into a C file. 311debfc3dSmrgEND { 321debfc3dSmrgprint "/* This file is auto-generated by optc-save-gen.awk. */" 331debfc3dSmrgprint "" 341debfc3dSmrgn_headers = split(header_name, headers, " ") 351debfc3dSmrgfor (i = 1; i <= n_headers; i++) 361debfc3dSmrg print "#include " quote headers[i] quote 371debfc3dSmrgprint "#include " quote "opts.h" quote 381debfc3dSmrgprint "#include " quote "intl.h" quote 391debfc3dSmrgprint "" 401debfc3dSmrgprint "#include " quote "flags.h" quote 411debfc3dSmrgprint "#include " quote "target.h" quote 421debfc3dSmrgprint "#include " quote "inchash.h" quote 431debfc3dSmrgprint "#include " quote "hash-set.h" quote 441debfc3dSmrgprint "#include " quote "vec.h" quote 451debfc3dSmrgprint "#include " quote "input.h" quote 461debfc3dSmrgprint "#include " quote "alias.h" quote 471debfc3dSmrgprint "#include " quote "symtab.h" quote 481debfc3dSmrgprint "#include " quote "inchash.h" quote 491debfc3dSmrgprint "#include " quote "tree.h" quote 501debfc3dSmrgprint "#include " quote "fold-const.h" quote 511debfc3dSmrgprint "#include " quote "tree-ssa-alias.h" quote 521debfc3dSmrgprint "#include " quote "is-a.h" quote 531debfc3dSmrgprint "#include " quote "predict.h" quote 541debfc3dSmrgprint "#include " quote "function.h" quote 551debfc3dSmrgprint "#include " quote "basic-block.h" quote 561debfc3dSmrgprint "#include " quote "gimple-expr.h" quote 571debfc3dSmrgprint "#include " quote "gimple.h" quote 581debfc3dSmrgprint "#include " quote "data-streamer.h" quote 591debfc3dSmrgprint "#include " quote "ipa-ref.h" quote 601debfc3dSmrgprint "#include " quote "cgraph.h" quote 611debfc3dSmrgprint "" 621debfc3dSmrg 631debfc3dSmrgif (n_extra_c_includes > 0) { 641debfc3dSmrg for (i = 0; i < n_extra_c_includes; i++) { 651debfc3dSmrg print "#include " quote extra_c_includes[i] quote 661debfc3dSmrg } 671debfc3dSmrg print "" 681debfc3dSmrg} 691debfc3dSmrg 701debfc3dSmrghave_save = 0; 711debfc3dSmrgif (n_extra_target_vars) 721debfc3dSmrg have_save = 1 731debfc3dSmrg 741debfc3dSmrgfor (i = 0; i < n_opts; i++) { 751debfc3dSmrg if (flag_set_p("Save", flags[i])) 761debfc3dSmrg have_save = 1; 771debfc3dSmrg} 781debfc3dSmrg 791debfc3dSmrgprint "/* Save optimization variables into a structure. */" 801debfc3dSmrgprint "void"; 811debfc3dSmrgprint "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts)"; 821debfc3dSmrgprint "{"; 831debfc3dSmrg 84a05ac97eSmrgn_opt_char = 4; 851debfc3dSmrgn_opt_short = 0; 861debfc3dSmrgn_opt_int = 0; 871debfc3dSmrgn_opt_enum = 0; 88c0a68be4Smrgn_opt_string = 0; 891debfc3dSmrgn_opt_other = 0; 901debfc3dSmrgvar_opt_char[0] = "optimize"; 911debfc3dSmrgvar_opt_char[1] = "optimize_size"; 921debfc3dSmrgvar_opt_char[2] = "optimize_debug"; 93a05ac97eSmrgvar_opt_char[3] = "optimize_fast"; 941debfc3dSmrgvar_opt_range["optimize"] = "0, 255"; 951debfc3dSmrgvar_opt_range["optimize_size"] = "0, 1"; 961debfc3dSmrgvar_opt_range["optimize_debug"] = "0, 1"; 97a05ac97eSmrgvar_opt_range["optimize_fast"] = "0, 1"; 981debfc3dSmrg 991debfc3dSmrg# Sort by size to mimic how the structure is laid out to be friendlier to the 1001debfc3dSmrg# cache. 1011debfc3dSmrg 1021debfc3dSmrgfor (i = 0; i < n_opts; i++) { 1031debfc3dSmrg if (flag_set_p("(Optimization|PerFunction)", flags[i])) { 1041debfc3dSmrg name = var_name(flags[i]) 1051debfc3dSmrg if(name == "") 1061debfc3dSmrg continue; 1071debfc3dSmrg 1081debfc3dSmrg if(name in var_opt_seen) 1091debfc3dSmrg continue; 1101debfc3dSmrg 1111debfc3dSmrg var_opt_seen[name]++; 1121debfc3dSmrg otype = var_type_struct(flags[i]); 1131debfc3dSmrg if (otype ~ "^((un)?signed +)?int *$") 1141debfc3dSmrg var_opt_int[n_opt_int++] = name; 1151debfc3dSmrg 1161debfc3dSmrg else if (otype ~ "^((un)?signed +)?short *$") 1171debfc3dSmrg var_opt_short[n_opt_short++] = name; 1181debfc3dSmrg 1191debfc3dSmrg else if (otype ~ ("^enum +[_" alnum "]+ *")) 1201debfc3dSmrg var_opt_enum[n_opt_enum++] = name; 1211debfc3dSmrg 1221debfc3dSmrg else if (otype ~ "^((un)?signed +)?char *$") { 1231debfc3dSmrg var_opt_char[n_opt_char++] = name; 1241debfc3dSmrg if (otype ~ "^unsigned +char *$") 1251debfc3dSmrg var_opt_range[name] = "0, 255" 1261debfc3dSmrg else if (otype ~ "^signed +char *$") 1271debfc3dSmrg var_opt_range[name] = "-128, 127" 1281debfc3dSmrg } 129c0a68be4Smrg else if (otype ~ "^const char \\**$") 130c0a68be4Smrg var_opt_string[n_opt_string++] = name; 1311debfc3dSmrg else 1321debfc3dSmrg var_opt_other[n_opt_other++] = name; 1331debfc3dSmrg } 1341debfc3dSmrg} 1351debfc3dSmrg 1361debfc3dSmrgfor (i = 0; i < n_opt_char; i++) { 1371debfc3dSmrg name = var_opt_char[i]; 1381debfc3dSmrg if (var_opt_range[name] != "") 1391debfc3dSmrg print " gcc_assert (IN_RANGE (opts->x_" name ", " var_opt_range[name] "));"; 1401debfc3dSmrg} 1411debfc3dSmrg 1421debfc3dSmrgprint ""; 1431debfc3dSmrgfor (i = 0; i < n_opt_other; i++) { 1441debfc3dSmrg print " ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";"; 1451debfc3dSmrg} 1461debfc3dSmrg 1471debfc3dSmrgfor (i = 0; i < n_opt_int; i++) { 1481debfc3dSmrg print " ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";"; 1491debfc3dSmrg} 1501debfc3dSmrg 1511debfc3dSmrgfor (i = 0; i < n_opt_enum; i++) { 1521debfc3dSmrg print " ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";"; 1531debfc3dSmrg} 1541debfc3dSmrg 1551debfc3dSmrgfor (i = 0; i < n_opt_short; i++) { 1561debfc3dSmrg print " ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";"; 1571debfc3dSmrg} 1581debfc3dSmrg 1591debfc3dSmrgfor (i = 0; i < n_opt_char; i++) { 1601debfc3dSmrg print " ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";"; 1611debfc3dSmrg} 1621debfc3dSmrg 163c0a68be4Smrgfor (i = 0; i < n_opt_string; i++) { 164c0a68be4Smrg print " ptr->x_" var_opt_string[i] " = opts->x_" var_opt_string[i] ";"; 165c0a68be4Smrg} 166c0a68be4Smrg 1671debfc3dSmrgprint "}"; 1681debfc3dSmrg 1691debfc3dSmrgprint ""; 1701debfc3dSmrgprint "/* Restore optimization options from a structure. */"; 1711debfc3dSmrgprint "void"; 1721debfc3dSmrgprint "cl_optimization_restore (struct gcc_options *opts, struct cl_optimization *ptr)"; 1731debfc3dSmrgprint "{"; 1741debfc3dSmrg 1751debfc3dSmrgfor (i = 0; i < n_opt_other; i++) { 1761debfc3dSmrg print " opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";"; 1771debfc3dSmrg} 1781debfc3dSmrg 1791debfc3dSmrgfor (i = 0; i < n_opt_int; i++) { 1801debfc3dSmrg print " opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";"; 1811debfc3dSmrg} 1821debfc3dSmrg 1831debfc3dSmrgfor (i = 0; i < n_opt_enum; i++) { 1841debfc3dSmrg print " opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";"; 1851debfc3dSmrg} 1861debfc3dSmrg 1871debfc3dSmrgfor (i = 0; i < n_opt_short; i++) { 1881debfc3dSmrg print " opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";"; 1891debfc3dSmrg} 1901debfc3dSmrg 1911debfc3dSmrgfor (i = 0; i < n_opt_char; i++) { 1921debfc3dSmrg print " opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";"; 1931debfc3dSmrg} 1941debfc3dSmrg 195c0a68be4Smrgfor (i = 0; i < n_opt_string; i++) { 196c0a68be4Smrg print " opts->x_" var_opt_string[i] " = ptr->x_" var_opt_string[i] ";"; 197c0a68be4Smrg} 198c0a68be4Smrg 1991debfc3dSmrgprint " targetm.override_options_after_change ();"; 2001debfc3dSmrgprint "}"; 2011debfc3dSmrg 2021debfc3dSmrgprint ""; 2031debfc3dSmrgprint "/* Print optimization options from a structure. */"; 2041debfc3dSmrgprint "void"; 2051debfc3dSmrgprint "cl_optimization_print (FILE *file,"; 2061debfc3dSmrgprint " int indent_to,"; 2071debfc3dSmrgprint " struct cl_optimization *ptr)"; 2081debfc3dSmrgprint "{"; 2091debfc3dSmrg 2101debfc3dSmrgprint " fputs (\"\\n\", file);"; 2111debfc3dSmrgfor (i = 0; i < n_opt_other; i++) { 2121debfc3dSmrg print " if (ptr->x_" var_opt_other[i] ")"; 2131debfc3dSmrg print " fprintf (file, \"%*s%s (%#lx)\\n\","; 2141debfc3dSmrg print " indent_to, \"\","; 2151debfc3dSmrg print " \"" var_opt_other[i] "\","; 2161debfc3dSmrg print " (unsigned long)ptr->x_" var_opt_other[i] ");"; 2171debfc3dSmrg print ""; 2181debfc3dSmrg} 2191debfc3dSmrg 2201debfc3dSmrgfor (i = 0; i < n_opt_int; i++) { 2211debfc3dSmrg print " if (ptr->x_" var_opt_int[i] ")"; 2221debfc3dSmrg print " fprintf (file, \"%*s%s (%#x)\\n\","; 2231debfc3dSmrg print " indent_to, \"\","; 2241debfc3dSmrg print " \"" var_opt_int[i] "\","; 2251debfc3dSmrg print " ptr->x_" var_opt_int[i] ");"; 2261debfc3dSmrg print ""; 2271debfc3dSmrg} 2281debfc3dSmrg 2291debfc3dSmrgfor (i = 0; i < n_opt_enum; i++) { 2301debfc3dSmrg print " fprintf (file, \"%*s%s (%#x)\\n\","; 2311debfc3dSmrg print " indent_to, \"\","; 2321debfc3dSmrg print " \"" var_opt_enum[i] "\","; 2331debfc3dSmrg print " (int) ptr->x_" var_opt_enum[i] ");"; 2341debfc3dSmrg print ""; 2351debfc3dSmrg} 2361debfc3dSmrg 2371debfc3dSmrgfor (i = 0; i < n_opt_short; i++) { 2381debfc3dSmrg print " if (ptr->x_" var_opt_short[i] ")"; 2391debfc3dSmrg print " fprintf (file, \"%*s%s (%#x)\\n\","; 2401debfc3dSmrg print " indent_to, \"\","; 2411debfc3dSmrg print " \"" var_opt_short[i] "\","; 2421debfc3dSmrg print " ptr->x_" var_opt_short[i] ");"; 2431debfc3dSmrg print ""; 2441debfc3dSmrg} 2451debfc3dSmrg 2461debfc3dSmrgfor (i = 0; i < n_opt_char; i++) { 2471debfc3dSmrg print " if (ptr->x_" var_opt_char[i] ")"; 2481debfc3dSmrg print " fprintf (file, \"%*s%s (%#x)\\n\","; 2491debfc3dSmrg print " indent_to, \"\","; 2501debfc3dSmrg print " \"" var_opt_char[i] "\","; 2511debfc3dSmrg print " ptr->x_" var_opt_char[i] ");"; 2521debfc3dSmrg print ""; 2531debfc3dSmrg} 2541debfc3dSmrg 255c0a68be4Smrgfor (i = 0; i < n_opt_string; i++) { 256c0a68be4Smrg print " if (ptr->x_" var_opt_string[i] ")"; 257c0a68be4Smrg print " fprintf (file, \"%*s%s (%s)\\n\","; 258c0a68be4Smrg print " indent_to, \"\","; 259c0a68be4Smrg print " \"" var_opt_string[i] "\","; 260c0a68be4Smrg print " ptr->x_" var_opt_string[i] ");"; 261c0a68be4Smrg print ""; 262c0a68be4Smrg} 263c0a68be4Smrg 2641debfc3dSmrgprint "}"; 2651debfc3dSmrg 2661debfc3dSmrgprint ""; 2671debfc3dSmrgprint "/* Print different optimization variables from structures provided as arguments. */"; 2681debfc3dSmrgprint "void"; 2691debfc3dSmrgprint "cl_optimization_print_diff (FILE *file,"; 2701debfc3dSmrgprint " int indent_to,"; 2711debfc3dSmrgprint " struct cl_optimization *ptr1,"; 2721debfc3dSmrgprint " struct cl_optimization *ptr2)"; 2731debfc3dSmrgprint "{"; 2741debfc3dSmrg 2751debfc3dSmrgprint " fputs (\"\\n\", file);"; 2761debfc3dSmrgfor (i = 0; i < n_opt_other; i++) { 2771debfc3dSmrg print " if (ptr1->x_" var_opt_other[i] " != ptr2->x_" var_opt_other[i] ")"; 2781debfc3dSmrg print " fprintf (file, \"%*s%s (%#lx/%#lx)\\n\","; 2791debfc3dSmrg print " indent_to, \"\","; 2801debfc3dSmrg print " \"" var_opt_other[i] "\","; 2811debfc3dSmrg print " (unsigned long)ptr1->x_" var_opt_other[i] ","; 2821debfc3dSmrg print " (unsigned long)ptr2->x_" var_opt_other[i] ");"; 2831debfc3dSmrg print ""; 2841debfc3dSmrg} 2851debfc3dSmrg 2861debfc3dSmrgfor (i = 0; i < n_opt_int; i++) { 2871debfc3dSmrg print " if (ptr1->x_" var_opt_int[i] " != ptr2->x_" var_opt_int[i] ")"; 2881debfc3dSmrg print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 2891debfc3dSmrg print " indent_to, \"\","; 2901debfc3dSmrg print " \"" var_opt_int[i] "\","; 2911debfc3dSmrg print " ptr1->x_" var_opt_int[i] ","; 2921debfc3dSmrg print " ptr2->x_" var_opt_int[i] ");"; 2931debfc3dSmrg print ""; 2941debfc3dSmrg} 2951debfc3dSmrg 2961debfc3dSmrgfor (i = 0; i < n_opt_enum; i++) { 2971debfc3dSmrg print " if (ptr1->x_" var_opt_enum[i] " != ptr2->x_" var_opt_enum[i] ")"; 2981debfc3dSmrg print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 2991debfc3dSmrg print " indent_to, \"\","; 3001debfc3dSmrg print " \"" var_opt_enum[i] "\","; 3011debfc3dSmrg print " (int) ptr1->x_" var_opt_enum[i] ","; 3021debfc3dSmrg print " (int) ptr2->x_" var_opt_enum[i] ");"; 3031debfc3dSmrg print ""; 3041debfc3dSmrg} 3051debfc3dSmrg 3061debfc3dSmrgfor (i = 0; i < n_opt_short; i++) { 3071debfc3dSmrg print " if (ptr1->x_" var_opt_short[i] " != ptr2->x_" var_opt_short[i] ")"; 3081debfc3dSmrg print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 3091debfc3dSmrg print " indent_to, \"\","; 3101debfc3dSmrg print " \"" var_opt_short[i] "\","; 3111debfc3dSmrg print " ptr1->x_" var_opt_short[i] ","; 3121debfc3dSmrg print " ptr2->x_" var_opt_short[i] ");"; 3131debfc3dSmrg print ""; 3141debfc3dSmrg} 3151debfc3dSmrg 3161debfc3dSmrgfor (i = 0; i < n_opt_char; i++) { 3171debfc3dSmrg print " if (ptr1->x_" var_opt_char[i] " != ptr2->x_" var_opt_char[i] ")"; 3181debfc3dSmrg print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 3191debfc3dSmrg print " indent_to, \"\","; 3201debfc3dSmrg print " \"" var_opt_char[i] "\","; 3211debfc3dSmrg print " ptr1->x_" var_opt_char[i] ","; 3221debfc3dSmrg print " ptr2->x_" var_opt_char[i] ");"; 3231debfc3dSmrg print ""; 3241debfc3dSmrg} 3251debfc3dSmrg 326c0a68be4Smrgfor (i = 0; i < n_opt_string; i++) { 327c0a68be4Smrg name = var_opt_string[i] 328c0a68be4Smrg print " if (ptr1->x_" name " != ptr2->x_" name ""; 329c0a68be4Smrg print " && (!ptr1->x_" name" || !ptr2->x_" name 330c0a68be4Smrg print " || strcmp (ptr1->x_" name", ptr2->x_" name ")))"; 331c0a68be4Smrg print " fprintf (file, \"%*s%s (%s/%s)\\n\","; 332c0a68be4Smrg print " indent_to, \"\","; 333c0a68be4Smrg print " \"" name "\","; 334c0a68be4Smrg print " ptr1->x_" name " ? ptr1->x_" name " : \"(null)\","; 335c0a68be4Smrg print " ptr2->x_" name " ? ptr2->x_" name " : \"(null)\");"; 336c0a68be4Smrg print ""; 337c0a68be4Smrg} 338c0a68be4Smrg 3391debfc3dSmrgprint "}"; 3401debfc3dSmrg 3411debfc3dSmrg 3421debfc3dSmrgprint ""; 3431debfc3dSmrgprint "/* Save selected option variables into a structure. */" 3441debfc3dSmrgprint "void"; 3451debfc3dSmrgprint "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts)"; 3461debfc3dSmrgprint "{"; 3471debfc3dSmrg 3481debfc3dSmrgn_target_char = 0; 3491debfc3dSmrgn_target_short = 0; 3501debfc3dSmrgn_target_int = 0; 3511debfc3dSmrgn_target_enum = 0; 352c0a68be4Smrgn_target_string = 0; 3531debfc3dSmrgn_target_other = 0; 3541debfc3dSmrg 3551debfc3dSmrgif (have_save) { 3561debfc3dSmrg for (i = 0; i < n_opts; i++) { 3571debfc3dSmrg if (flag_set_p("Save", flags[i])) { 3581debfc3dSmrg name = var_name(flags[i]) 3591debfc3dSmrg if(name == "") 3601debfc3dSmrg name = "target_flags"; 3611debfc3dSmrg 3621debfc3dSmrg if(name in var_save_seen) 3631debfc3dSmrg continue; 3641debfc3dSmrg 3651debfc3dSmrg var_save_seen[name]++; 3661debfc3dSmrg otype = var_type_struct(flags[i]) 3671debfc3dSmrg if (otype ~ "^((un)?signed +)?int *$") 3681debfc3dSmrg var_target_int[n_target_int++] = name; 3691debfc3dSmrg 3701debfc3dSmrg else if (otype ~ "^((un)?signed +)?short *$") 3711debfc3dSmrg var_target_short[n_target_short++] = name; 3721debfc3dSmrg 3731debfc3dSmrg else if (otype ~ ("^enum +[_" alnum "]+ *$")) 3741debfc3dSmrg var_target_enum[n_target_enum++] = name; 3751debfc3dSmrg 3761debfc3dSmrg else if (otype ~ "^((un)?signed +)?char *$") { 3771debfc3dSmrg var_target_char[n_target_char++] = name; 3781debfc3dSmrg if (otype ~ "^unsigned +char *$") 3791debfc3dSmrg var_target_range[name] = "0, 255" 3801debfc3dSmrg else if (otype ~ "^signed +char *$") 3811debfc3dSmrg var_target_range[name] = "-128, 127" 3821debfc3dSmrg if (otype == var_type(flags[i])) 3831debfc3dSmrg var_target_range[name] = "" 3841debfc3dSmrg } 385c0a68be4Smrg else if (otype ~ "^const char \\**$") 386c0a68be4Smrg var_target_string[n_target_string++] = name; 3871debfc3dSmrg else 3881debfc3dSmrg var_target_other[n_target_other++] = name; 3891debfc3dSmrg } 3901debfc3dSmrg } 3911debfc3dSmrg} else { 3921debfc3dSmrg var_target_int[n_target_int++] = "target_flags"; 3931debfc3dSmrg} 3941debfc3dSmrg 3951debfc3dSmrghave_assert = 0; 3961debfc3dSmrgfor (i = 0; i < n_target_char; i++) { 3971debfc3dSmrg name = var_target_char[i]; 3981debfc3dSmrg if (var_target_range[name] != "") { 3991debfc3dSmrg have_assert = 1; 4001debfc3dSmrg print " gcc_assert (IN_RANGE (opts->x_" name ", " var_target_range[name] "));"; 4011debfc3dSmrg } 4021debfc3dSmrg} 4031debfc3dSmrg 4041debfc3dSmrgif (have_assert) 4051debfc3dSmrg print ""; 4061debfc3dSmrg 4071debfc3dSmrgprint " if (targetm.target_option.save)"; 4081debfc3dSmrgprint " targetm.target_option.save (ptr, opts);"; 4091debfc3dSmrgprint ""; 4101debfc3dSmrg 4111debfc3dSmrgfor (i = 0; i < n_extra_target_vars; i++) { 4121debfc3dSmrg print " ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";"; 4131debfc3dSmrg} 4141debfc3dSmrg 4151debfc3dSmrgfor (i = 0; i < n_target_other; i++) { 4161debfc3dSmrg print " ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";"; 4171debfc3dSmrg} 4181debfc3dSmrg 4191debfc3dSmrgfor (i = 0; i < n_target_enum; i++) { 4201debfc3dSmrg print " ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";"; 4211debfc3dSmrg} 4221debfc3dSmrg 4231debfc3dSmrgfor (i = 0; i < n_target_int; i++) { 4241debfc3dSmrg print " ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";"; 4251debfc3dSmrg} 4261debfc3dSmrg 4271debfc3dSmrgfor (i = 0; i < n_target_short; i++) { 4281debfc3dSmrg print " ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";"; 4291debfc3dSmrg} 4301debfc3dSmrg 4311debfc3dSmrgfor (i = 0; i < n_target_char; i++) { 4321debfc3dSmrg print " ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";"; 4331debfc3dSmrg} 4341debfc3dSmrg 435c0a68be4Smrgfor (i = 0; i < n_target_string; i++) { 436c0a68be4Smrg print " ptr->x_" var_target_string[i] " = opts->x_" var_target_string[i] ";"; 437c0a68be4Smrg} 438c0a68be4Smrg 4391debfc3dSmrgprint "}"; 4401debfc3dSmrg 4411debfc3dSmrgprint ""; 4421debfc3dSmrgprint "/* Restore selected current options from a structure. */"; 4431debfc3dSmrgprint "void"; 4441debfc3dSmrgprint "cl_target_option_restore (struct gcc_options *opts, struct cl_target_option *ptr)"; 4451debfc3dSmrgprint "{"; 4461debfc3dSmrg 4471debfc3dSmrgfor (i = 0; i < n_extra_target_vars; i++) { 4481debfc3dSmrg print " opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";"; 4491debfc3dSmrg} 4501debfc3dSmrg 4511debfc3dSmrgfor (i = 0; i < n_target_other; i++) { 4521debfc3dSmrg print " opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";"; 4531debfc3dSmrg} 4541debfc3dSmrg 4551debfc3dSmrgfor (i = 0; i < n_target_enum; i++) { 4561debfc3dSmrg print " opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";"; 4571debfc3dSmrg} 4581debfc3dSmrg 4591debfc3dSmrgfor (i = 0; i < n_target_int; i++) { 4601debfc3dSmrg print " opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";"; 4611debfc3dSmrg} 4621debfc3dSmrg 4631debfc3dSmrgfor (i = 0; i < n_target_short; i++) { 4641debfc3dSmrg print " opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";"; 4651debfc3dSmrg} 4661debfc3dSmrg 4671debfc3dSmrgfor (i = 0; i < n_target_char; i++) { 4681debfc3dSmrg print " opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";"; 4691debfc3dSmrg} 4701debfc3dSmrg 471c0a68be4Smrgfor (i = 0; i < n_target_string; i++) { 472c0a68be4Smrg print " opts->x_" var_target_string[i] " = ptr->x_" var_target_string[i] ";"; 473c0a68be4Smrg} 474c0a68be4Smrg 4751debfc3dSmrg# This must occur after the normal variables in case the code depends on those 4761debfc3dSmrg# variables. 4771debfc3dSmrgprint ""; 4781debfc3dSmrgprint " if (targetm.target_option.restore)"; 4791debfc3dSmrgprint " targetm.target_option.restore (opts, ptr);"; 4801debfc3dSmrg 4811debfc3dSmrgprint "}"; 4821debfc3dSmrg 4831debfc3dSmrgprint ""; 4841debfc3dSmrgprint "/* Print optimization options from a structure. */"; 4851debfc3dSmrgprint "void"; 4861debfc3dSmrgprint "cl_target_option_print (FILE *file,"; 4871debfc3dSmrgprint " int indent,"; 4881debfc3dSmrgprint " struct cl_target_option *ptr)"; 4891debfc3dSmrgprint "{"; 4901debfc3dSmrg 4911debfc3dSmrgprint " fputs (\"\\n\", file);"; 4921debfc3dSmrgfor (i = 0; i < n_target_other; i++) { 4931debfc3dSmrg print " if (ptr->x_" var_target_other[i] ")"; 494c0a68be4Smrg hwi = host_wide_int[var_target_other[i]] 495c0a68be4Smrg if (hwi == "yes") 4961debfc3dSmrg print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x)\\n\","; 4971debfc3dSmrg else 498c0a68be4Smrg print " fprintf (file, \"%*s%s (%#lx)\\n\","; 4991debfc3dSmrg print " indent, \"\","; 5001debfc3dSmrg print " \"" var_target_other[i] "\","; 501c0a68be4Smrg if (hwi == "yes") 5021debfc3dSmrg print " ptr->x_" var_target_other[i] ");"; 5031debfc3dSmrg else 5041debfc3dSmrg print " (unsigned long)ptr->x_" var_target_other[i] ");"; 5051debfc3dSmrg print ""; 5061debfc3dSmrg} 5071debfc3dSmrg 5081debfc3dSmrgfor (i = 0; i < n_target_enum; i++) { 5091debfc3dSmrg print " if (ptr->x_" var_target_enum[i] ")"; 5101debfc3dSmrg print " fprintf (file, \"%*s%s (%#x)\\n\","; 5111debfc3dSmrg print " indent, \"\","; 5121debfc3dSmrg print " \"" var_target_enum[i] "\","; 5131debfc3dSmrg print " ptr->x_" var_target_enum[i] ");"; 5141debfc3dSmrg print ""; 5151debfc3dSmrg} 5161debfc3dSmrg 5171debfc3dSmrgfor (i = 0; i < n_target_int; i++) { 5181debfc3dSmrg print " if (ptr->x_" var_target_int[i] ")"; 5191debfc3dSmrg print " fprintf (file, \"%*s%s (%#x)\\n\","; 5201debfc3dSmrg print " indent, \"\","; 5211debfc3dSmrg print " \"" var_target_int[i] "\","; 5221debfc3dSmrg print " ptr->x_" var_target_int[i] ");"; 5231debfc3dSmrg print ""; 5241debfc3dSmrg} 5251debfc3dSmrg 5261debfc3dSmrgfor (i = 0; i < n_target_short; i++) { 5271debfc3dSmrg print " if (ptr->x_" var_target_short[i] ")"; 5281debfc3dSmrg print " fprintf (file, \"%*s%s (%#x)\\n\","; 5291debfc3dSmrg print " indent, \"\","; 5301debfc3dSmrg print " \"" var_target_short[i] "\","; 5311debfc3dSmrg print " ptr->x_" var_target_short[i] ");"; 5321debfc3dSmrg print ""; 5331debfc3dSmrg} 5341debfc3dSmrg 5351debfc3dSmrgfor (i = 0; i < n_target_char; i++) { 5361debfc3dSmrg print " if (ptr->x_" var_target_char[i] ")"; 5371debfc3dSmrg print " fprintf (file, \"%*s%s (%#x)\\n\","; 5381debfc3dSmrg print " indent, \"\","; 5391debfc3dSmrg print " \"" var_target_char[i] "\","; 5401debfc3dSmrg print " ptr->x_" var_target_char[i] ");"; 5411debfc3dSmrg print ""; 5421debfc3dSmrg} 5431debfc3dSmrg 544c0a68be4Smrgfor (i = 0; i < n_target_string; i++) { 545c0a68be4Smrg print " if (ptr->x_" var_target_string[i] ")"; 546c0a68be4Smrg print " fprintf (file, \"%*s%s (%s)\\n\","; 547c0a68be4Smrg print " indent, \"\","; 548c0a68be4Smrg print " \"" var_target_string[i] "\","; 549c0a68be4Smrg print " ptr->x_" var_target_string[i] ");"; 550c0a68be4Smrg print ""; 551c0a68be4Smrg} 552c0a68be4Smrg 5531debfc3dSmrgprint ""; 5541debfc3dSmrgprint " if (targetm.target_option.print)"; 5551debfc3dSmrgprint " targetm.target_option.print (file, indent, ptr);"; 5561debfc3dSmrgprint "}"; 5571debfc3dSmrg 5581debfc3dSmrgprint ""; 5591debfc3dSmrgprint "/* Print different target option variables from structures provided as arguments. */"; 5601debfc3dSmrgprint "void"; 5611debfc3dSmrgprint "cl_target_option_print_diff (FILE *file,"; 5621debfc3dSmrgprint " int indent ATTRIBUTE_UNUSED,"; 5631debfc3dSmrgprint " struct cl_target_option *ptr1 ATTRIBUTE_UNUSED,"; 5641debfc3dSmrgprint " struct cl_target_option *ptr2 ATTRIBUTE_UNUSED)"; 5651debfc3dSmrgprint "{"; 5661debfc3dSmrg 5671debfc3dSmrgprint " fputs (\"\\n\", file);"; 5681debfc3dSmrgfor (i = 0; i < n_target_other; i++) { 5691debfc3dSmrg print " if (ptr1->x_" var_target_other[i] " != ptr2->x_" var_target_other[i] ")"; 570c0a68be4Smrg hwi = host_wide_int[var_target_other[i]] 571c0a68be4Smrg if (hwi == "yes") 5721debfc3dSmrg print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x/%#\" HOST_WIDE_INT_PRINT \"x)\\n\","; 5731debfc3dSmrg else 574c0a68be4Smrg print " fprintf (file, \"%*s%s (%#lx/%#lx)\\n\","; 5751debfc3dSmrg print " indent, \"\","; 5761debfc3dSmrg print " \"" var_target_other[i] "\","; 577c0a68be4Smrg if (hwi == "yes") { 5781debfc3dSmrg print " ptr1->x_" var_target_other[i] ","; 5791debfc3dSmrg print " ptr2->x_" var_target_other[i] ");"; 5801debfc3dSmrg } 5811debfc3dSmrg else { 5821debfc3dSmrg print " (unsigned long)ptr1->x_" var_target_other[i] ","; 5831debfc3dSmrg print " (unsigned long)ptr2->x_" var_target_other[i] ");"; 5841debfc3dSmrg } 5851debfc3dSmrg print ""; 5861debfc3dSmrg} 5871debfc3dSmrg 5881debfc3dSmrgfor (i = 0; i < n_target_enum; i++) { 5891debfc3dSmrg print " if (ptr1->x_" var_target_enum[i] " != ptr2->x_" var_target_enum[i] ")"; 5901debfc3dSmrg print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 5911debfc3dSmrg print " indent, \"\","; 5921debfc3dSmrg print " \"" var_target_enum[i] "\","; 5931debfc3dSmrg print " ptr1->x_" var_target_enum[i] ","; 5941debfc3dSmrg print " ptr2->x_" var_target_enum[i] ");"; 5951debfc3dSmrg print ""; 5961debfc3dSmrg} 5971debfc3dSmrg 5981debfc3dSmrgfor (i = 0; i < n_target_int; i++) { 5991debfc3dSmrg print " if (ptr1->x_" var_target_int[i] " != ptr2->x_" var_target_int[i] ")"; 6001debfc3dSmrg print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 6011debfc3dSmrg print " indent, \"\","; 6021debfc3dSmrg print " \"" var_target_int[i] "\","; 6031debfc3dSmrg print " ptr1->x_" var_target_int[i] ","; 6041debfc3dSmrg print " ptr2->x_" var_target_int[i] ");"; 6051debfc3dSmrg print ""; 6061debfc3dSmrg} 6071debfc3dSmrg 6081debfc3dSmrgfor (i = 0; i < n_target_short; i++) { 6091debfc3dSmrg print " if (ptr1->x_" var_target_short[i] " != ptr2->x_" var_target_short[i] ")"; 6101debfc3dSmrg print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 6111debfc3dSmrg print " indent, \"\","; 6121debfc3dSmrg print " \"" var_target_short[i] "\","; 6131debfc3dSmrg print " ptr1->x_" var_target_short[i] ","; 6141debfc3dSmrg print " ptr2->x_" var_target_short[i] ");"; 6151debfc3dSmrg print ""; 6161debfc3dSmrg} 6171debfc3dSmrg 6181debfc3dSmrgfor (i = 0; i < n_target_char; i++) { 6191debfc3dSmrg print " if (ptr1->x_" var_target_char[i] " != ptr2->x_" var_target_char[i] ")"; 6201debfc3dSmrg print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 6211debfc3dSmrg print " indent, \"\","; 6221debfc3dSmrg print " \"" var_target_char[i] "\","; 6231debfc3dSmrg print " ptr1->x_" var_target_char[i] ","; 6241debfc3dSmrg print " ptr2->x_" var_target_char[i] ");"; 6251debfc3dSmrg print ""; 6261debfc3dSmrg} 6271debfc3dSmrg 628c0a68be4Smrgfor (i = 0; i < n_target_string; i++) { 629c0a68be4Smrg name = var_target_string[i] 630c0a68be4Smrg print " if (ptr1->x_" name " != ptr2->x_" name ""; 631c0a68be4Smrg print " && (!ptr1->x_" name" || !ptr2->x_" name 632c0a68be4Smrg print " || strcmp (ptr1->x_" name", ptr2->x_" name ")))"; 633c0a68be4Smrg print " fprintf (file, \"%*s%s (%s/%s)\\n\","; 634c0a68be4Smrg print " indent, \"\","; 635c0a68be4Smrg print " \"" name "\","; 636c0a68be4Smrg print " ptr1->x_" name " ? ptr1->x_" name " : \"(null)\","; 637*23f5f463Smrg print " ptr2->x_" name " ? ptr2->x_" name " : \"(null)\");"; 638c0a68be4Smrg print ""; 639c0a68be4Smrg} 640c0a68be4Smrg 6411debfc3dSmrgprint "}"; 6421debfc3dSmrg 6431debfc3dSmrgprint ""; 6441debfc3dSmrgprint "/* Compare two target options */"; 6451debfc3dSmrgprint "bool"; 6461debfc3dSmrgprint "cl_target_option_eq (struct cl_target_option const *ptr1 ATTRIBUTE_UNUSED,"; 6471debfc3dSmrgprint " struct cl_target_option const *ptr2 ATTRIBUTE_UNUSED)"; 6481debfc3dSmrgprint "{"; 6491debfc3dSmrgn_target_val = 0; 6501debfc3dSmrgn_target_str = 0; 6511debfc3dSmrgn_target_array = 0; 6521debfc3dSmrg 6531debfc3dSmrgfor (i = 0; i < n_target_save; i++) { 6541debfc3dSmrg var = target_save_decl[i]; 6551debfc3dSmrg sub (" *=.*", "", var); 6561debfc3dSmrg name = var; 6571debfc3dSmrg type = var; 6581debfc3dSmrg sub("^.*[ *]", "", name) 6591debfc3dSmrg sub(" *" name "$", "", type) 6601debfc3dSmrg if (target_save_decl[i] ~ "^const char \\*+[_" alnum "]+$") 6611debfc3dSmrg var_target_str[n_target_str++] = name; 6621debfc3dSmrg else { 6631debfc3dSmrg if (target_save_decl[i] ~ " .*\\[.+\\]+$") { 6641debfc3dSmrg size = name; 6651debfc3dSmrg sub("[^\\[]+\\[", "", size); 6661debfc3dSmrg sub("\\]$", "", size); 6671debfc3dSmrg sub("\\[.+", "", name) 6681debfc3dSmrg sub(" [^ ]+$", "", type) 6691debfc3dSmrg var_target_array[n_target_array] = name 6701debfc3dSmrg var_target_array_type[n_target_array] = type 6711debfc3dSmrg var_target_array_size[n_target_array++] = size 6721debfc3dSmrg } 6731debfc3dSmrg else { 6741debfc3dSmrg var_target_val_type[n_target_val] = type; 6751debfc3dSmrg var_target_val[n_target_val++] = name; 6761debfc3dSmrg } 6771debfc3dSmrg } 6781debfc3dSmrg} 6791debfc3dSmrgif (have_save) { 6801debfc3dSmrg for (i = 0; i < n_opts; i++) { 6811debfc3dSmrg if (flag_set_p("Save", flags[i])) { 6821debfc3dSmrg name = var_name(flags[i]) 6831debfc3dSmrg if(name == "") 6841debfc3dSmrg name = "target_flags"; 6851debfc3dSmrg 6861debfc3dSmrg if(name in var_list_seen) 6871debfc3dSmrg continue; 6881debfc3dSmrg 6891debfc3dSmrg var_list_seen[name]++; 6901debfc3dSmrg otype = var_type_struct(flags[i]) 6911debfc3dSmrg if (otype ~ "^const char \\**$") 6921debfc3dSmrg var_target_str[n_target_str++] = "x_" name; 6931debfc3dSmrg else { 6941debfc3dSmrg var_target_val_type[n_target_val] = otype; 6951debfc3dSmrg var_target_val[n_target_val++] = "x_" name; 6961debfc3dSmrg } 6971debfc3dSmrg } 6981debfc3dSmrg } 6991debfc3dSmrg} else { 7001debfc3dSmrg var_target_val_type[n_target_val] = "int"; 7011debfc3dSmrg var_target_val[n_target_val++] = "x_target_flags"; 7021debfc3dSmrg} 7031debfc3dSmrg 7041debfc3dSmrgfor (i = 0; i < n_target_str; i++) { 7051debfc3dSmrg name = var_target_str[i] 7061debfc3dSmrg print " if (ptr1->" name" != ptr2->" name; 7071debfc3dSmrg print " && (!ptr1->" name" || !ptr2->" name 7081debfc3dSmrg print " || strcmp (ptr1->" name", ptr2->" name ")))"; 7091debfc3dSmrg print " return false;"; 7101debfc3dSmrg} 7111debfc3dSmrgfor (i = 0; i < n_target_array; i++) { 7121debfc3dSmrg name = var_target_array[i] 7131debfc3dSmrg size = var_target_array_size[i] 7141debfc3dSmrg type = var_target_array_type[i] 7151debfc3dSmrg print " if (ptr1->" name" != ptr2->" name ""; 7161debfc3dSmrg print " || memcmp (ptr1->" name ", ptr2->" name ", " size " * sizeof(" type ")))" 7171debfc3dSmrg print " return false;"; 7181debfc3dSmrg} 7191debfc3dSmrgfor (i = 0; i < n_target_val; i++) { 7201debfc3dSmrg name = var_target_val[i] 7211debfc3dSmrg print " if (ptr1->" name" != ptr2->" name ")"; 7221debfc3dSmrg print " return false;"; 7231debfc3dSmrg} 7241debfc3dSmrg 7251debfc3dSmrgprint " return true;"; 7261debfc3dSmrg 7271debfc3dSmrgprint "}"; 7281debfc3dSmrg 7291debfc3dSmrgprint ""; 7301debfc3dSmrgprint "/* Hash target options */"; 7311debfc3dSmrgprint "hashval_t"; 7321debfc3dSmrgprint "cl_target_option_hash (struct cl_target_option const *ptr ATTRIBUTE_UNUSED)"; 7331debfc3dSmrgprint "{"; 7341debfc3dSmrgprint " inchash::hash hstate;"; 7351debfc3dSmrgfor (i = 0; i < n_target_str; i++) { 7361debfc3dSmrg name = var_target_str[i] 7371debfc3dSmrg print " if (ptr->" name")"; 7381debfc3dSmrg print " hstate.add (ptr->" name", strlen (ptr->" name"));"; 7391debfc3dSmrg print " else"; 7401debfc3dSmrg print " hstate.add_int (0);"; 7411debfc3dSmrg} 7421debfc3dSmrgfor (i = 0; i < n_target_array; i++) { 7431debfc3dSmrg name= var_target_array[i] 7441debfc3dSmrg size = var_target_array_size[i] 7451debfc3dSmrg type = var_target_array_type[i] 7461debfc3dSmrg print " hstate.add_int (" size ");"; 7471debfc3dSmrg print " hstate.add (ptr->" name ", sizeof (" type ") * " size ");"; 7481debfc3dSmrg} 7491debfc3dSmrgfor (i = 0; i < n_target_val; i++) { 7501debfc3dSmrg name = var_target_val[i] 751a2dc1f3fSmrg print " hstate.add_hwi (ptr->" name");"; 7521debfc3dSmrg} 7531debfc3dSmrgprint " return hstate.end ();"; 7541debfc3dSmrgprint "}"; 7551debfc3dSmrg 7561debfc3dSmrgprint ""; 7571debfc3dSmrgprint "/* Stream out target options */"; 7581debfc3dSmrgprint "void"; 7591debfc3dSmrgprint "cl_target_option_stream_out (struct output_block *ob ATTRIBUTE_UNUSED,"; 7601debfc3dSmrgprint " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; 7611debfc3dSmrgprint " struct cl_target_option *ptr ATTRIBUTE_UNUSED)"; 7621debfc3dSmrgprint "{"; 7631debfc3dSmrgfor (i = 0; i < n_target_str; i++) { 7641debfc3dSmrg name = var_target_str[i] 7651debfc3dSmrg print " bp_pack_string (ob, bp, ptr->" name", true);"; 7661debfc3dSmrg} 7671debfc3dSmrgfor (i = 0; i < n_target_array; i++) { 7681debfc3dSmrg name = var_target_array[i] 7691debfc3dSmrg size = var_target_array_size[i] 7701debfc3dSmrg print " for (unsigned i = 0; i < " size "; i++)" 7711debfc3dSmrg print " bp_pack_value (bp, ptr->" name "[i], 64);"; 7721debfc3dSmrg} 7731debfc3dSmrgfor (i = 0; i < n_target_val; i++) { 7741debfc3dSmrg name = var_target_val[i] 7751debfc3dSmrg print " bp_pack_value (bp, ptr->" name", 64);"; 7761debfc3dSmrg} 7771debfc3dSmrgprint "}"; 7781debfc3dSmrg 7791debfc3dSmrgprint ""; 7801debfc3dSmrgprint "/* Stream in target options */"; 7811debfc3dSmrgprint "void"; 7821debfc3dSmrgprint "cl_target_option_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,"; 7831debfc3dSmrgprint " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; 7841debfc3dSmrgprint " struct cl_target_option *ptr ATTRIBUTE_UNUSED)"; 7851debfc3dSmrgprint "{"; 7861debfc3dSmrgfor (i = 0; i < n_target_str; i++) { 7871debfc3dSmrg name = var_target_str[i] 7881debfc3dSmrg print " ptr->" name" = bp_unpack_string (data_in, bp);"; 7891debfc3dSmrg print " if (ptr->" name")"; 7901debfc3dSmrg print " ptr->" name" = xstrdup (ptr->" name");"; 7911debfc3dSmrg} 7921debfc3dSmrgfor (i = 0; i < n_target_array; i++) { 7931debfc3dSmrg name = var_target_array[i] 7941debfc3dSmrg size = var_target_array_size[i] 7951debfc3dSmrg print " for (int i = " size " - 1; i >= 0; i--)" 7961debfc3dSmrg print " ptr->" name "[i] = (" var_target_array_type[i] ") bp_unpack_value (bp, 64);"; 7971debfc3dSmrg} 7981debfc3dSmrgfor (i = 0; i < n_target_val; i++) { 7991debfc3dSmrg name = var_target_val[i] 8001debfc3dSmrg print " ptr->" name" = (" var_target_val_type[i] ") bp_unpack_value (bp, 64);"; 8011debfc3dSmrg} 8021debfc3dSmrg 8031debfc3dSmrgprint "}"; 8041debfc3dSmrg 8058feb0f0bSmrgprint "/* free heap memory used by target options */"; 8068feb0f0bSmrgprint "void"; 8078feb0f0bSmrgprint "cl_target_option_free (struct cl_target_option *ptr ATTRIBUTE_UNUSED)"; 8088feb0f0bSmrgprint "{"; 8098feb0f0bSmrgfor (i = 0; i < n_target_str; i++) { 8108feb0f0bSmrg name = var_target_str[i] 8118feb0f0bSmrg print " if (ptr->" name")"; 8128feb0f0bSmrg print " free (const_cast <char *>(ptr->" name"));"; 8138feb0f0bSmrg} 8148feb0f0bSmrgprint "}"; 8158feb0f0bSmrg 816a05ac97eSmrgn_opt_val = 4; 8171debfc3dSmrgvar_opt_val[0] = "x_optimize" 8181debfc3dSmrgvar_opt_val_type[0] = "char " 819c0a68be4Smrgvar_opt_hash[0] = 1; 8201debfc3dSmrgvar_opt_val[1] = "x_optimize_size" 8211debfc3dSmrgvar_opt_val_type[1] = "char " 822c0a68be4Smrgvar_opt_hash[1] = 1; 823a05ac97eSmrgvar_opt_val[2] = "x_optimize_debug" 8241debfc3dSmrgvar_opt_val_type[2] = "char " 825c0a68be4Smrgvar_opt_hash[2] = 1; 826a05ac97eSmrgvar_opt_val[3] = "x_optimize_fast" 827a05ac97eSmrgvar_opt_val_type[3] = "char " 828c0a68be4Smrgvar_opt_hash[3] = 1; 8291debfc3dSmrgfor (i = 0; i < n_opts; i++) { 8301debfc3dSmrg if (flag_set_p("(Optimization|PerFunction)", flags[i])) { 8311debfc3dSmrg name = var_name(flags[i]) 8321debfc3dSmrg if(name == "") 8331debfc3dSmrg continue; 8341debfc3dSmrg 8351debfc3dSmrg if(name in var_opt_list_seen) 8361debfc3dSmrg continue; 8371debfc3dSmrg 8381debfc3dSmrg var_opt_list_seen[name]++; 8391debfc3dSmrg 8401debfc3dSmrg otype = var_type_struct(flags[i]) 8411debfc3dSmrg var_opt_val_type[n_opt_val] = otype; 842c0a68be4Smrg var_opt_val[n_opt_val] = "x_" name; 8431debfc3dSmrg var_opt_hash[n_opt_val] = flag_set_p("Optimization", flags[i]); 844c0a68be4Smrg n_opt_val++; 8451debfc3dSmrg } 8461debfc3dSmrg} 8471debfc3dSmrgprint ""; 8481debfc3dSmrgprint "/* Hash optimization options */"; 8491debfc3dSmrgprint "hashval_t"; 8501debfc3dSmrgprint "cl_optimization_hash (struct cl_optimization const *ptr ATTRIBUTE_UNUSED)"; 8511debfc3dSmrgprint "{"; 8521debfc3dSmrgprint " inchash::hash hstate;"; 8531debfc3dSmrgfor (i = 0; i < n_opt_val; i++) { 8541debfc3dSmrg if (!var_opt_hash[i]) 8551debfc3dSmrg continue; 8561debfc3dSmrg name = var_opt_val[i] 857c0a68be4Smrg otype = var_opt_val_type[i]; 858c0a68be4Smrg if (otype ~ "^const char \\**$") 859c0a68be4Smrg { 860c0a68be4Smrg print " if (ptr->" name")"; 861c0a68be4Smrg print " hstate.add (ptr->" name", strlen (ptr->" name"));"; 862c0a68be4Smrg print " else"; 863c0a68be4Smrg print " hstate.add_int (0);"; 864c0a68be4Smrg } 865c0a68be4Smrg else 866a2dc1f3fSmrg print " hstate.add_hwi (ptr->" name");"; 8671debfc3dSmrg} 8681debfc3dSmrgprint " return hstate.end ();"; 8691debfc3dSmrgprint "}"; 8701debfc3dSmrg 8711debfc3dSmrgprint ""; 872c0a68be4Smrgprint "/* Compare two optimization options */"; 873c0a68be4Smrgprint "bool"; 874c0a68be4Smrgprint "cl_optimization_option_eq (cl_optimization const *ptr1,"; 875c0a68be4Smrgprint " cl_optimization const *ptr2)"; 876c0a68be4Smrgprint "{"; 877c0a68be4Smrgfor (i = 0; i < n_opt_val; i++) { 878c0a68be4Smrg if (!var_opt_hash[i]) 879c0a68be4Smrg continue; 880c0a68be4Smrg name = var_opt_val[i] 881c0a68be4Smrg otype = var_opt_val_type[i]; 882c0a68be4Smrg if (otype ~ "^const char \\**$") 883c0a68be4Smrg { 884c0a68be4Smrg print " if (ptr1->" name" != ptr2->" name; 885c0a68be4Smrg print " && (!ptr1->" name" || !ptr2->" name 886c0a68be4Smrg print " || strcmp (ptr1->" name", ptr2->" name ")))"; 887c0a68be4Smrg print " return false;"; 888c0a68be4Smrg } 889c0a68be4Smrg else 890c0a68be4Smrg { 891c0a68be4Smrg print " if (ptr1->" name" != ptr2->" name ")"; 892c0a68be4Smrg print " return false;"; 893c0a68be4Smrg } 894c0a68be4Smrg} 895c0a68be4Smrgprint " return true;"; 896c0a68be4Smrgprint "}"; 897c0a68be4Smrg 898c0a68be4Smrgprint ""; 8991debfc3dSmrgprint "/* Stream out optimization options */"; 9001debfc3dSmrgprint "void"; 901c0a68be4Smrgprint "cl_optimization_stream_out (struct output_block *ob,"; 902c0a68be4Smrgprint " struct bitpack_d *bp,"; 9031debfc3dSmrgprint " struct cl_optimization *ptr)"; 9041debfc3dSmrgprint "{"; 9051debfc3dSmrgfor (i = 0; i < n_opt_val; i++) { 9061debfc3dSmrg name = var_opt_val[i] 907c0a68be4Smrg otype = var_opt_val_type[i]; 908c0a68be4Smrg if (otype ~ "^const char \\**$") 909c0a68be4Smrg print " bp_pack_string (ob, bp, ptr->" name", true);"; 910c0a68be4Smrg else 9111debfc3dSmrg print " bp_pack_value (bp, ptr->" name", 64);"; 9121debfc3dSmrg} 9131debfc3dSmrgprint "}"; 9141debfc3dSmrg 9151debfc3dSmrgprint ""; 9161debfc3dSmrgprint "/* Stream in optimization options */"; 9171debfc3dSmrgprint "void"; 918c0a68be4Smrgprint "cl_optimization_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,"; 919c0a68be4Smrgprint " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; 920c0a68be4Smrgprint " struct cl_optimization *ptr ATTRIBUTE_UNUSED)"; 9211debfc3dSmrgprint "{"; 9221debfc3dSmrgfor (i = 0; i < n_opt_val; i++) { 9231debfc3dSmrg name = var_opt_val[i] 924c0a68be4Smrg otype = var_opt_val_type[i]; 925c0a68be4Smrg if (otype ~ "^const char \\**$") 926c0a68be4Smrg { 927c0a68be4Smrg print " ptr->" name" = bp_unpack_string (data_in, bp);"; 928c0a68be4Smrg print " if (ptr->" name")"; 929c0a68be4Smrg print " ptr->" name" = xstrdup (ptr->" name");"; 930c0a68be4Smrg } 931c0a68be4Smrg else 9321debfc3dSmrg print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_value (bp, 64);"; 9331debfc3dSmrg} 9341debfc3dSmrgprint "}"; 9358feb0f0bSmrgprint "/* Free heap memory used by optimization options */"; 9368feb0f0bSmrgprint "void"; 9378feb0f0bSmrgprint "cl_optimization_option_free (struct cl_optimization *ptr ATTRIBUTE_UNUSED)"; 9388feb0f0bSmrgprint "{"; 9398feb0f0bSmrgfor (i = 0; i < n_opt_val; i++) { 9408feb0f0bSmrg name = var_opt_val[i] 9418feb0f0bSmrg otype = var_opt_val_type[i]; 9428feb0f0bSmrg if (otype ~ "^const char \\**$") 9438feb0f0bSmrg { 9448feb0f0bSmrg print " if (ptr->" name")"; 9458feb0f0bSmrg print " free (const_cast <char *>(ptr->" name"));"; 9468feb0f0bSmrg } 9478feb0f0bSmrg} 9488feb0f0bSmrgprint "}"; 9491debfc3dSmrg} 950