138fd1498Szrj# Copyright (C) 2003-2018 Free Software Foundation, Inc. 238fd1498Szrj# Contributed by Kelley Cook, June 2004. 338fd1498Szrj# Original code from Neil Booth, May 2003. 438fd1498Szrj# 538fd1498Szrj# This program is free software; you can redistribute it and/or modify it 638fd1498Szrj# under the terms of the GNU General Public License as published by the 738fd1498Szrj# Free Software Foundation; either version 3, or (at your option) any 838fd1498Szrj# later version. 938fd1498Szrj# 1038fd1498Szrj# This program is distributed in the hope that it will be useful, 1138fd1498Szrj# but WITHOUT ANY WARRANTY; without even the implied warranty of 1238fd1498Szrj# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1338fd1498Szrj# GNU General Public License for more details. 1438fd1498Szrj# 1538fd1498Szrj# You should have received a copy of the GNU General Public License 1638fd1498Szrj# along with this program; see the file COPYING3. If not see 1738fd1498Szrj# <http://www.gnu.org/licenses/>. 1838fd1498Szrj 1938fd1498Szrj# This Awk script reads in the option records generated from 2038fd1498Szrj# opt-gather.awk, combines the flags of duplicate options and generates a 2138fd1498Szrj# C file. 2238fd1498Szrj# 2338fd1498Szrj 2438fd1498Szrj# This program uses functions from opt-functions.awk and code from 2538fd1498Szrj# opt-read.awk. 2638fd1498Szrj# 2738fd1498Szrj# Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-save-gen.awk \ 2838fd1498Szrj# [-v header_name=header.h] < inputfile > options-save.c 2938fd1498Szrj 3038fd1498Szrj# Dump that array of options into a C file. 3138fd1498SzrjEND { 3238fd1498Szrjprint "/* This file is auto-generated by optc-save-gen.awk. */" 3338fd1498Szrjprint "" 3438fd1498Szrjn_headers = split(header_name, headers, " ") 3538fd1498Szrjfor (i = 1; i <= n_headers; i++) 3638fd1498Szrj print "#include " quote headers[i] quote 3738fd1498Szrjprint "#include " quote "opts.h" quote 3838fd1498Szrjprint "#include " quote "intl.h" quote 3938fd1498Szrjprint "" 4038fd1498Szrjprint "#include " quote "flags.h" quote 4138fd1498Szrjprint "#include " quote "target.h" quote 4238fd1498Szrjprint "#include " quote "inchash.h" quote 4338fd1498Szrjprint "#include " quote "hash-set.h" quote 4438fd1498Szrjprint "#include " quote "vec.h" quote 4538fd1498Szrjprint "#include " quote "input.h" quote 4638fd1498Szrjprint "#include " quote "alias.h" quote 4738fd1498Szrjprint "#include " quote "symtab.h" quote 4838fd1498Szrjprint "#include " quote "inchash.h" quote 4938fd1498Szrjprint "#include " quote "tree.h" quote 5038fd1498Szrjprint "#include " quote "fold-const.h" quote 5138fd1498Szrjprint "#include " quote "tree-ssa-alias.h" quote 5238fd1498Szrjprint "#include " quote "is-a.h" quote 5338fd1498Szrjprint "#include " quote "predict.h" quote 5438fd1498Szrjprint "#include " quote "function.h" quote 5538fd1498Szrjprint "#include " quote "basic-block.h" quote 5638fd1498Szrjprint "#include " quote "gimple-expr.h" quote 5738fd1498Szrjprint "#include " quote "gimple.h" quote 5838fd1498Szrjprint "#include " quote "data-streamer.h" quote 5938fd1498Szrjprint "#include " quote "ipa-ref.h" quote 6038fd1498Szrjprint "#include " quote "cgraph.h" quote 6138fd1498Szrjprint "" 6238fd1498Szrj 6338fd1498Szrjif (n_extra_c_includes > 0) { 6438fd1498Szrj for (i = 0; i < n_extra_c_includes; i++) { 6538fd1498Szrj print "#include " quote extra_c_includes[i] quote 6638fd1498Szrj } 6738fd1498Szrj print "" 6838fd1498Szrj} 6938fd1498Szrj 7038fd1498Szrjhave_save = 0; 7138fd1498Szrjif (n_extra_target_vars) 7238fd1498Szrj have_save = 1 7338fd1498Szrj 7438fd1498Szrjfor (i = 0; i < n_opts; i++) { 7538fd1498Szrj if (flag_set_p("Save", flags[i])) 7638fd1498Szrj have_save = 1; 7738fd1498Szrj} 7838fd1498Szrj 7938fd1498Szrjprint "/* Save optimization variables into a structure. */" 8038fd1498Szrjprint "void"; 8138fd1498Szrjprint "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts)"; 8238fd1498Szrjprint "{"; 8338fd1498Szrj 84*58e805e6Szrjn_opt_char = 4; 8538fd1498Szrjn_opt_short = 0; 8638fd1498Szrjn_opt_int = 0; 8738fd1498Szrjn_opt_enum = 0; 8838fd1498Szrjn_opt_other = 0; 8938fd1498Szrjvar_opt_char[0] = "optimize"; 9038fd1498Szrjvar_opt_char[1] = "optimize_size"; 9138fd1498Szrjvar_opt_char[2] = "optimize_debug"; 92*58e805e6Szrjvar_opt_char[3] = "optimize_fast"; 9338fd1498Szrjvar_opt_range["optimize"] = "0, 255"; 9438fd1498Szrjvar_opt_range["optimize_size"] = "0, 1"; 9538fd1498Szrjvar_opt_range["optimize_debug"] = "0, 1"; 96*58e805e6Szrjvar_opt_range["optimize_fast"] = "0, 1"; 9738fd1498Szrj 9838fd1498Szrj# Sort by size to mimic how the structure is laid out to be friendlier to the 9938fd1498Szrj# cache. 10038fd1498Szrj 10138fd1498Szrjfor (i = 0; i < n_opts; i++) { 10238fd1498Szrj if (flag_set_p("(Optimization|PerFunction)", flags[i])) { 10338fd1498Szrj name = var_name(flags[i]) 10438fd1498Szrj if(name == "") 10538fd1498Szrj continue; 10638fd1498Szrj 10738fd1498Szrj if(name in var_opt_seen) 10838fd1498Szrj continue; 10938fd1498Szrj 11038fd1498Szrj var_opt_seen[name]++; 11138fd1498Szrj otype = var_type_struct(flags[i]); 11238fd1498Szrj if (otype ~ "^((un)?signed +)?int *$") 11338fd1498Szrj var_opt_int[n_opt_int++] = name; 11438fd1498Szrj 11538fd1498Szrj else if (otype ~ "^((un)?signed +)?short *$") 11638fd1498Szrj var_opt_short[n_opt_short++] = name; 11738fd1498Szrj 11838fd1498Szrj else if (otype ~ ("^enum +[_" alnum "]+ *")) 11938fd1498Szrj var_opt_enum[n_opt_enum++] = name; 12038fd1498Szrj 12138fd1498Szrj else if (otype ~ "^((un)?signed +)?char *$") { 12238fd1498Szrj var_opt_char[n_opt_char++] = name; 12338fd1498Szrj if (otype ~ "^unsigned +char *$") 12438fd1498Szrj var_opt_range[name] = "0, 255" 12538fd1498Szrj else if (otype ~ "^signed +char *$") 12638fd1498Szrj var_opt_range[name] = "-128, 127" 12738fd1498Szrj } 12838fd1498Szrj else 12938fd1498Szrj var_opt_other[n_opt_other++] = name; 13038fd1498Szrj } 13138fd1498Szrj} 13238fd1498Szrj 13338fd1498Szrjfor (i = 0; i < n_opt_char; i++) { 13438fd1498Szrj name = var_opt_char[i]; 13538fd1498Szrj if (var_opt_range[name] != "") 13638fd1498Szrj print " gcc_assert (IN_RANGE (opts->x_" name ", " var_opt_range[name] "));"; 13738fd1498Szrj} 13838fd1498Szrj 13938fd1498Szrjprint ""; 14038fd1498Szrjfor (i = 0; i < n_opt_other; i++) { 14138fd1498Szrj print " ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";"; 14238fd1498Szrj} 14338fd1498Szrj 14438fd1498Szrjfor (i = 0; i < n_opt_int; i++) { 14538fd1498Szrj print " ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";"; 14638fd1498Szrj} 14738fd1498Szrj 14838fd1498Szrjfor (i = 0; i < n_opt_enum; i++) { 14938fd1498Szrj print " ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";"; 15038fd1498Szrj} 15138fd1498Szrj 15238fd1498Szrjfor (i = 0; i < n_opt_short; i++) { 15338fd1498Szrj print " ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";"; 15438fd1498Szrj} 15538fd1498Szrj 15638fd1498Szrjfor (i = 0; i < n_opt_char; i++) { 15738fd1498Szrj print " ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";"; 15838fd1498Szrj} 15938fd1498Szrj 16038fd1498Szrjprint "}"; 16138fd1498Szrj 16238fd1498Szrjprint ""; 16338fd1498Szrjprint "/* Restore optimization options from a structure. */"; 16438fd1498Szrjprint "void"; 16538fd1498Szrjprint "cl_optimization_restore (struct gcc_options *opts, struct cl_optimization *ptr)"; 16638fd1498Szrjprint "{"; 16738fd1498Szrj 16838fd1498Szrjfor (i = 0; i < n_opt_other; i++) { 16938fd1498Szrj print " opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";"; 17038fd1498Szrj} 17138fd1498Szrj 17238fd1498Szrjfor (i = 0; i < n_opt_int; i++) { 17338fd1498Szrj print " opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";"; 17438fd1498Szrj} 17538fd1498Szrj 17638fd1498Szrjfor (i = 0; i < n_opt_enum; i++) { 17738fd1498Szrj print " opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";"; 17838fd1498Szrj} 17938fd1498Szrj 18038fd1498Szrjfor (i = 0; i < n_opt_short; i++) { 18138fd1498Szrj print " opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";"; 18238fd1498Szrj} 18338fd1498Szrj 18438fd1498Szrjfor (i = 0; i < n_opt_char; i++) { 18538fd1498Szrj print " opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";"; 18638fd1498Szrj} 18738fd1498Szrj 18838fd1498Szrjprint " targetm.override_options_after_change ();"; 18938fd1498Szrjprint "}"; 19038fd1498Szrj 19138fd1498Szrjprint ""; 19238fd1498Szrjprint "/* Print optimization options from a structure. */"; 19338fd1498Szrjprint "void"; 19438fd1498Szrjprint "cl_optimization_print (FILE *file,"; 19538fd1498Szrjprint " int indent_to,"; 19638fd1498Szrjprint " struct cl_optimization *ptr)"; 19738fd1498Szrjprint "{"; 19838fd1498Szrj 19938fd1498Szrjprint " fputs (\"\\n\", file);"; 20038fd1498Szrjfor (i = 0; i < n_opt_other; i++) { 20138fd1498Szrj print " if (ptr->x_" var_opt_other[i] ")"; 20238fd1498Szrj print " fprintf (file, \"%*s%s (%#lx)\\n\","; 20338fd1498Szrj print " indent_to, \"\","; 20438fd1498Szrj print " \"" var_opt_other[i] "\","; 20538fd1498Szrj print " (unsigned long)ptr->x_" var_opt_other[i] ");"; 20638fd1498Szrj print ""; 20738fd1498Szrj} 20838fd1498Szrj 20938fd1498Szrjfor (i = 0; i < n_opt_int; i++) { 21038fd1498Szrj print " if (ptr->x_" var_opt_int[i] ")"; 21138fd1498Szrj print " fprintf (file, \"%*s%s (%#x)\\n\","; 21238fd1498Szrj print " indent_to, \"\","; 21338fd1498Szrj print " \"" var_opt_int[i] "\","; 21438fd1498Szrj print " ptr->x_" var_opt_int[i] ");"; 21538fd1498Szrj print ""; 21638fd1498Szrj} 21738fd1498Szrj 21838fd1498Szrjfor (i = 0; i < n_opt_enum; i++) { 21938fd1498Szrj print " fprintf (file, \"%*s%s (%#x)\\n\","; 22038fd1498Szrj print " indent_to, \"\","; 22138fd1498Szrj print " \"" var_opt_enum[i] "\","; 22238fd1498Szrj print " (int) ptr->x_" var_opt_enum[i] ");"; 22338fd1498Szrj print ""; 22438fd1498Szrj} 22538fd1498Szrj 22638fd1498Szrjfor (i = 0; i < n_opt_short; i++) { 22738fd1498Szrj print " if (ptr->x_" var_opt_short[i] ")"; 22838fd1498Szrj print " fprintf (file, \"%*s%s (%#x)\\n\","; 22938fd1498Szrj print " indent_to, \"\","; 23038fd1498Szrj print " \"" var_opt_short[i] "\","; 23138fd1498Szrj print " ptr->x_" var_opt_short[i] ");"; 23238fd1498Szrj print ""; 23338fd1498Szrj} 23438fd1498Szrj 23538fd1498Szrjfor (i = 0; i < n_opt_char; i++) { 23638fd1498Szrj print " if (ptr->x_" var_opt_char[i] ")"; 23738fd1498Szrj print " fprintf (file, \"%*s%s (%#x)\\n\","; 23838fd1498Szrj print " indent_to, \"\","; 23938fd1498Szrj print " \"" var_opt_char[i] "\","; 24038fd1498Szrj print " ptr->x_" var_opt_char[i] ");"; 24138fd1498Szrj print ""; 24238fd1498Szrj} 24338fd1498Szrj 24438fd1498Szrjprint "}"; 24538fd1498Szrj 24638fd1498Szrjprint ""; 24738fd1498Szrjprint "/* Print different optimization variables from structures provided as arguments. */"; 24838fd1498Szrjprint "void"; 24938fd1498Szrjprint "cl_optimization_print_diff (FILE *file,"; 25038fd1498Szrjprint " int indent_to,"; 25138fd1498Szrjprint " struct cl_optimization *ptr1,"; 25238fd1498Szrjprint " struct cl_optimization *ptr2)"; 25338fd1498Szrjprint "{"; 25438fd1498Szrj 25538fd1498Szrjprint " fputs (\"\\n\", file);"; 25638fd1498Szrjfor (i = 0; i < n_opt_other; i++) { 25738fd1498Szrj print " if (ptr1->x_" var_opt_other[i] " != ptr2->x_" var_opt_other[i] ")"; 25838fd1498Szrj print " fprintf (file, \"%*s%s (%#lx/%#lx)\\n\","; 25938fd1498Szrj print " indent_to, \"\","; 26038fd1498Szrj print " \"" var_opt_other[i] "\","; 26138fd1498Szrj print " (unsigned long)ptr1->x_" var_opt_other[i] ","; 26238fd1498Szrj print " (unsigned long)ptr2->x_" var_opt_other[i] ");"; 26338fd1498Szrj print ""; 26438fd1498Szrj} 26538fd1498Szrj 26638fd1498Szrjfor (i = 0; i < n_opt_int; i++) { 26738fd1498Szrj print " if (ptr1->x_" var_opt_int[i] " != ptr2->x_" var_opt_int[i] ")"; 26838fd1498Szrj print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 26938fd1498Szrj print " indent_to, \"\","; 27038fd1498Szrj print " \"" var_opt_int[i] "\","; 27138fd1498Szrj print " ptr1->x_" var_opt_int[i] ","; 27238fd1498Szrj print " ptr2->x_" var_opt_int[i] ");"; 27338fd1498Szrj print ""; 27438fd1498Szrj} 27538fd1498Szrj 27638fd1498Szrjfor (i = 0; i < n_opt_enum; i++) { 27738fd1498Szrj print " if (ptr1->x_" var_opt_enum[i] " != ptr2->x_" var_opt_enum[i] ")"; 27838fd1498Szrj print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 27938fd1498Szrj print " indent_to, \"\","; 28038fd1498Szrj print " \"" var_opt_enum[i] "\","; 28138fd1498Szrj print " (int) ptr1->x_" var_opt_enum[i] ","; 28238fd1498Szrj print " (int) ptr2->x_" var_opt_enum[i] ");"; 28338fd1498Szrj print ""; 28438fd1498Szrj} 28538fd1498Szrj 28638fd1498Szrjfor (i = 0; i < n_opt_short; i++) { 28738fd1498Szrj print " if (ptr1->x_" var_opt_short[i] " != ptr2->x_" var_opt_short[i] ")"; 28838fd1498Szrj print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 28938fd1498Szrj print " indent_to, \"\","; 29038fd1498Szrj print " \"" var_opt_short[i] "\","; 29138fd1498Szrj print " ptr1->x_" var_opt_short[i] ","; 29238fd1498Szrj print " ptr2->x_" var_opt_short[i] ");"; 29338fd1498Szrj print ""; 29438fd1498Szrj} 29538fd1498Szrj 29638fd1498Szrjfor (i = 0; i < n_opt_char; i++) { 29738fd1498Szrj print " if (ptr1->x_" var_opt_char[i] " != ptr2->x_" var_opt_char[i] ")"; 29838fd1498Szrj print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 29938fd1498Szrj print " indent_to, \"\","; 30038fd1498Szrj print " \"" var_opt_char[i] "\","; 30138fd1498Szrj print " ptr1->x_" var_opt_char[i] ","; 30238fd1498Szrj print " ptr2->x_" var_opt_char[i] ");"; 30338fd1498Szrj print ""; 30438fd1498Szrj} 30538fd1498Szrj 30638fd1498Szrjprint "}"; 30738fd1498Szrj 30838fd1498Szrj 30938fd1498Szrjprint ""; 31038fd1498Szrjprint "/* Save selected option variables into a structure. */" 31138fd1498Szrjprint "void"; 31238fd1498Szrjprint "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts)"; 31338fd1498Szrjprint "{"; 31438fd1498Szrj 31538fd1498Szrjn_target_char = 0; 31638fd1498Szrjn_target_short = 0; 31738fd1498Szrjn_target_int = 0; 31838fd1498Szrjn_target_enum = 0; 31938fd1498Szrjn_target_other = 0; 32038fd1498Szrj 32138fd1498Szrjif (have_save) { 32238fd1498Szrj for (i = 0; i < n_opts; i++) { 32338fd1498Szrj if (flag_set_p("Save", flags[i])) { 32438fd1498Szrj name = var_name(flags[i]) 32538fd1498Szrj if(name == "") 32638fd1498Szrj name = "target_flags"; 32738fd1498Szrj 32838fd1498Szrj if(name in var_save_seen) 32938fd1498Szrj continue; 33038fd1498Szrj 33138fd1498Szrj var_save_seen[name]++; 33238fd1498Szrj otype = var_type_struct(flags[i]) 33338fd1498Szrj if (otype ~ "^((un)?signed +)?int *$") 33438fd1498Szrj var_target_int[n_target_int++] = name; 33538fd1498Szrj 33638fd1498Szrj else if (otype ~ "^((un)?signed +)?short *$") 33738fd1498Szrj var_target_short[n_target_short++] = name; 33838fd1498Szrj 33938fd1498Szrj else if (otype ~ ("^enum +[_" alnum "]+ *$")) 34038fd1498Szrj var_target_enum[n_target_enum++] = name; 34138fd1498Szrj 34238fd1498Szrj else if (otype ~ "^((un)?signed +)?char *$") { 34338fd1498Szrj var_target_char[n_target_char++] = name; 34438fd1498Szrj if (otype ~ "^unsigned +char *$") 34538fd1498Szrj var_target_range[name] = "0, 255" 34638fd1498Szrj else if (otype ~ "^signed +char *$") 34738fd1498Szrj var_target_range[name] = "-128, 127" 34838fd1498Szrj if (otype == var_type(flags[i])) 34938fd1498Szrj var_target_range[name] = "" 35038fd1498Szrj } 35138fd1498Szrj else 35238fd1498Szrj var_target_other[n_target_other++] = name; 35338fd1498Szrj } 35438fd1498Szrj } 35538fd1498Szrj} else { 35638fd1498Szrj var_target_int[n_target_int++] = "target_flags"; 35738fd1498Szrj} 35838fd1498Szrj 35938fd1498Szrjhave_assert = 0; 36038fd1498Szrjfor (i = 0; i < n_target_char; i++) { 36138fd1498Szrj name = var_target_char[i]; 36238fd1498Szrj if (var_target_range[name] != "") { 36338fd1498Szrj have_assert = 1; 36438fd1498Szrj print " gcc_assert (IN_RANGE (opts->x_" name ", " var_target_range[name] "));"; 36538fd1498Szrj } 36638fd1498Szrj} 36738fd1498Szrj 36838fd1498Szrjif (have_assert) 36938fd1498Szrj print ""; 37038fd1498Szrj 37138fd1498Szrjprint " if (targetm.target_option.save)"; 37238fd1498Szrjprint " targetm.target_option.save (ptr, opts);"; 37338fd1498Szrjprint ""; 37438fd1498Szrj 37538fd1498Szrjfor (i = 0; i < n_extra_target_vars; i++) { 37638fd1498Szrj print " ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";"; 37738fd1498Szrj} 37838fd1498Szrj 37938fd1498Szrjfor (i = 0; i < n_target_other; i++) { 38038fd1498Szrj print " ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";"; 38138fd1498Szrj} 38238fd1498Szrj 38338fd1498Szrjfor (i = 0; i < n_target_enum; i++) { 38438fd1498Szrj print " ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";"; 38538fd1498Szrj} 38638fd1498Szrj 38738fd1498Szrjfor (i = 0; i < n_target_int; i++) { 38838fd1498Szrj print " ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";"; 38938fd1498Szrj} 39038fd1498Szrj 39138fd1498Szrjfor (i = 0; i < n_target_short; i++) { 39238fd1498Szrj print " ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";"; 39338fd1498Szrj} 39438fd1498Szrj 39538fd1498Szrjfor (i = 0; i < n_target_char; i++) { 39638fd1498Szrj print " ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";"; 39738fd1498Szrj} 39838fd1498Szrj 39938fd1498Szrjprint "}"; 40038fd1498Szrj 40138fd1498Szrjprint ""; 40238fd1498Szrjprint "/* Restore selected current options from a structure. */"; 40338fd1498Szrjprint "void"; 40438fd1498Szrjprint "cl_target_option_restore (struct gcc_options *opts, struct cl_target_option *ptr)"; 40538fd1498Szrjprint "{"; 40638fd1498Szrj 40738fd1498Szrjfor (i = 0; i < n_extra_target_vars; i++) { 40838fd1498Szrj print " opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";"; 40938fd1498Szrj} 41038fd1498Szrj 41138fd1498Szrjfor (i = 0; i < n_target_other; i++) { 41238fd1498Szrj print " opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";"; 41338fd1498Szrj} 41438fd1498Szrj 41538fd1498Szrjfor (i = 0; i < n_target_enum; i++) { 41638fd1498Szrj print " opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";"; 41738fd1498Szrj} 41838fd1498Szrj 41938fd1498Szrjfor (i = 0; i < n_target_int; i++) { 42038fd1498Szrj print " opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";"; 42138fd1498Szrj} 42238fd1498Szrj 42338fd1498Szrjfor (i = 0; i < n_target_short; i++) { 42438fd1498Szrj print " opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";"; 42538fd1498Szrj} 42638fd1498Szrj 42738fd1498Szrjfor (i = 0; i < n_target_char; i++) { 42838fd1498Szrj print " opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";"; 42938fd1498Szrj} 43038fd1498Szrj 43138fd1498Szrj# This must occur after the normal variables in case the code depends on those 43238fd1498Szrj# variables. 43338fd1498Szrjprint ""; 43438fd1498Szrjprint " if (targetm.target_option.restore)"; 43538fd1498Szrjprint " targetm.target_option.restore (opts, ptr);"; 43638fd1498Szrj 43738fd1498Szrjprint "}"; 43838fd1498Szrj 43938fd1498Szrjprint ""; 44038fd1498Szrjprint "/* Print optimization options from a structure. */"; 44138fd1498Szrjprint "void"; 44238fd1498Szrjprint "cl_target_option_print (FILE *file,"; 44338fd1498Szrjprint " int indent,"; 44438fd1498Szrjprint " struct cl_target_option *ptr)"; 44538fd1498Szrjprint "{"; 44638fd1498Szrj 44738fd1498Szrjprint " fputs (\"\\n\", file);"; 44838fd1498Szrjfor (i = 0; i < n_target_other; i++) { 44938fd1498Szrj print " if (ptr->x_" var_target_other[i] ")"; 45038fd1498Szrj if (host_wide_int[var_target_other[i]] == "yes") 45138fd1498Szrj print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x)\\n\","; 45238fd1498Szrj else 45338fd1498Szrj print " fprintf (file, \"%*s%s (%#x)\\n\","; 45438fd1498Szrj print " indent, \"\","; 45538fd1498Szrj print " \"" var_target_other[i] "\","; 45638fd1498Szrj if (host_wide_int[var_target_other[i]] == "yes") 45738fd1498Szrj print " ptr->x_" var_target_other[i] ");"; 45838fd1498Szrj else 45938fd1498Szrj print " (unsigned long)ptr->x_" var_target_other[i] ");"; 46038fd1498Szrj print ""; 46138fd1498Szrj} 46238fd1498Szrj 46338fd1498Szrjfor (i = 0; i < n_target_enum; i++) { 46438fd1498Szrj print " if (ptr->x_" var_target_enum[i] ")"; 46538fd1498Szrj print " fprintf (file, \"%*s%s (%#x)\\n\","; 46638fd1498Szrj print " indent, \"\","; 46738fd1498Szrj print " \"" var_target_enum[i] "\","; 46838fd1498Szrj print " ptr->x_" var_target_enum[i] ");"; 46938fd1498Szrj print ""; 47038fd1498Szrj} 47138fd1498Szrj 47238fd1498Szrjfor (i = 0; i < n_target_int; i++) { 47338fd1498Szrj print " if (ptr->x_" var_target_int[i] ")"; 47438fd1498Szrj print " fprintf (file, \"%*s%s (%#x)\\n\","; 47538fd1498Szrj print " indent, \"\","; 47638fd1498Szrj print " \"" var_target_int[i] "\","; 47738fd1498Szrj print " ptr->x_" var_target_int[i] ");"; 47838fd1498Szrj print ""; 47938fd1498Szrj} 48038fd1498Szrj 48138fd1498Szrjfor (i = 0; i < n_target_short; i++) { 48238fd1498Szrj print " if (ptr->x_" var_target_short[i] ")"; 48338fd1498Szrj print " fprintf (file, \"%*s%s (%#x)\\n\","; 48438fd1498Szrj print " indent, \"\","; 48538fd1498Szrj print " \"" var_target_short[i] "\","; 48638fd1498Szrj print " ptr->x_" var_target_short[i] ");"; 48738fd1498Szrj print ""; 48838fd1498Szrj} 48938fd1498Szrj 49038fd1498Szrjfor (i = 0; i < n_target_char; i++) { 49138fd1498Szrj print " if (ptr->x_" var_target_char[i] ")"; 49238fd1498Szrj print " fprintf (file, \"%*s%s (%#x)\\n\","; 49338fd1498Szrj print " indent, \"\","; 49438fd1498Szrj print " \"" var_target_char[i] "\","; 49538fd1498Szrj print " ptr->x_" var_target_char[i] ");"; 49638fd1498Szrj print ""; 49738fd1498Szrj} 49838fd1498Szrj 49938fd1498Szrjprint ""; 50038fd1498Szrjprint " if (targetm.target_option.print)"; 50138fd1498Szrjprint " targetm.target_option.print (file, indent, ptr);"; 50238fd1498Szrjprint "}"; 50338fd1498Szrj 50438fd1498Szrjprint ""; 50538fd1498Szrjprint "/* Print different target option variables from structures provided as arguments. */"; 50638fd1498Szrjprint "void"; 50738fd1498Szrjprint "cl_target_option_print_diff (FILE *file,"; 50838fd1498Szrjprint " int indent ATTRIBUTE_UNUSED,"; 50938fd1498Szrjprint " struct cl_target_option *ptr1 ATTRIBUTE_UNUSED,"; 51038fd1498Szrjprint " struct cl_target_option *ptr2 ATTRIBUTE_UNUSED)"; 51138fd1498Szrjprint "{"; 51238fd1498Szrj 51338fd1498Szrjprint " fputs (\"\\n\", file);"; 51438fd1498Szrjfor (i = 0; i < n_target_other; i++) { 51538fd1498Szrj print " if (ptr1->x_" var_target_other[i] " != ptr2->x_" var_target_other[i] ")"; 51638fd1498Szrj if (host_wide_int[var_target_other[i]] == "yes") 51738fd1498Szrj print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x/%#\" HOST_WIDE_INT_PRINT \"x)\\n\","; 51838fd1498Szrj else 51938fd1498Szrj print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 52038fd1498Szrj print " indent, \"\","; 52138fd1498Szrj print " \"" var_target_other[i] "\","; 52238fd1498Szrj if (host_wide_int[var_target_other[i]] == "yes") { 52338fd1498Szrj print " ptr1->x_" var_target_other[i] ","; 52438fd1498Szrj print " ptr2->x_" var_target_other[i] ");"; 52538fd1498Szrj } 52638fd1498Szrj else { 52738fd1498Szrj print " (unsigned long)ptr1->x_" var_target_other[i] ","; 52838fd1498Szrj print " (unsigned long)ptr2->x_" var_target_other[i] ");"; 52938fd1498Szrj } 53038fd1498Szrj print ""; 53138fd1498Szrj} 53238fd1498Szrj 53338fd1498Szrjfor (i = 0; i < n_target_enum; i++) { 53438fd1498Szrj print " if (ptr1->x_" var_target_enum[i] " != ptr2->x_" var_target_enum[i] ")"; 53538fd1498Szrj print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 53638fd1498Szrj print " indent, \"\","; 53738fd1498Szrj print " \"" var_target_enum[i] "\","; 53838fd1498Szrj print " ptr1->x_" var_target_enum[i] ","; 53938fd1498Szrj print " ptr2->x_" var_target_enum[i] ");"; 54038fd1498Szrj print ""; 54138fd1498Szrj} 54238fd1498Szrj 54338fd1498Szrjfor (i = 0; i < n_target_int; i++) { 54438fd1498Szrj print " if (ptr1->x_" var_target_int[i] " != ptr2->x_" var_target_int[i] ")"; 54538fd1498Szrj print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 54638fd1498Szrj print " indent, \"\","; 54738fd1498Szrj print " \"" var_target_int[i] "\","; 54838fd1498Szrj print " ptr1->x_" var_target_int[i] ","; 54938fd1498Szrj print " ptr2->x_" var_target_int[i] ");"; 55038fd1498Szrj print ""; 55138fd1498Szrj} 55238fd1498Szrj 55338fd1498Szrjfor (i = 0; i < n_target_short; i++) { 55438fd1498Szrj print " if (ptr1->x_" var_target_short[i] " != ptr2->x_" var_target_short[i] ")"; 55538fd1498Szrj print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 55638fd1498Szrj print " indent, \"\","; 55738fd1498Szrj print " \"" var_target_short[i] "\","; 55838fd1498Szrj print " ptr1->x_" var_target_short[i] ","; 55938fd1498Szrj print " ptr2->x_" var_target_short[i] ");"; 56038fd1498Szrj print ""; 56138fd1498Szrj} 56238fd1498Szrj 56338fd1498Szrjfor (i = 0; i < n_target_char; i++) { 56438fd1498Szrj print " if (ptr1->x_" var_target_char[i] " != ptr2->x_" var_target_char[i] ")"; 56538fd1498Szrj print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 56638fd1498Szrj print " indent, \"\","; 56738fd1498Szrj print " \"" var_target_char[i] "\","; 56838fd1498Szrj print " ptr1->x_" var_target_char[i] ","; 56938fd1498Szrj print " ptr2->x_" var_target_char[i] ");"; 57038fd1498Szrj print ""; 57138fd1498Szrj} 57238fd1498Szrj 57338fd1498Szrjprint "}"; 57438fd1498Szrj 57538fd1498Szrjprint ""; 57638fd1498Szrjprint "/* Compare two target options */"; 57738fd1498Szrjprint "bool"; 57838fd1498Szrjprint "cl_target_option_eq (struct cl_target_option const *ptr1 ATTRIBUTE_UNUSED,"; 57938fd1498Szrjprint " struct cl_target_option const *ptr2 ATTRIBUTE_UNUSED)"; 58038fd1498Szrjprint "{"; 58138fd1498Szrjn_target_val = 0; 58238fd1498Szrjn_target_str = 0; 58338fd1498Szrjn_target_array = 0; 58438fd1498Szrj 58538fd1498Szrjfor (i = 0; i < n_target_save; i++) { 58638fd1498Szrj var = target_save_decl[i]; 58738fd1498Szrj sub (" *=.*", "", var); 58838fd1498Szrj name = var; 58938fd1498Szrj type = var; 59038fd1498Szrj sub("^.*[ *]", "", name) 59138fd1498Szrj sub(" *" name "$", "", type) 59238fd1498Szrj if (target_save_decl[i] ~ "^const char \\*+[_" alnum "]+$") 59338fd1498Szrj var_target_str[n_target_str++] = name; 59438fd1498Szrj else { 59538fd1498Szrj if (target_save_decl[i] ~ " .*\\[.+\\]+$") { 59638fd1498Szrj size = name; 59738fd1498Szrj sub("[^\\[]+\\[", "", size); 59838fd1498Szrj sub("\\]$", "", size); 59938fd1498Szrj sub("\\[.+", "", name) 60038fd1498Szrj sub(" [^ ]+$", "", type) 60138fd1498Szrj var_target_array[n_target_array] = name 60238fd1498Szrj var_target_array_type[n_target_array] = type 60338fd1498Szrj var_target_array_size[n_target_array++] = size 60438fd1498Szrj } 60538fd1498Szrj else { 60638fd1498Szrj var_target_val_type[n_target_val] = type; 60738fd1498Szrj var_target_val[n_target_val++] = name; 60838fd1498Szrj } 60938fd1498Szrj } 61038fd1498Szrj} 61138fd1498Szrjif (have_save) { 61238fd1498Szrj for (i = 0; i < n_opts; i++) { 61338fd1498Szrj if (flag_set_p("Save", flags[i])) { 61438fd1498Szrj name = var_name(flags[i]) 61538fd1498Szrj if(name == "") 61638fd1498Szrj name = "target_flags"; 61738fd1498Szrj 61838fd1498Szrj if(name in var_list_seen) 61938fd1498Szrj continue; 62038fd1498Szrj 62138fd1498Szrj var_list_seen[name]++; 62238fd1498Szrj otype = var_type_struct(flags[i]) 62338fd1498Szrj if (otype ~ "^const char \\**$") 62438fd1498Szrj var_target_str[n_target_str++] = "x_" name; 62538fd1498Szrj else { 62638fd1498Szrj var_target_val_type[n_target_val] = otype; 62738fd1498Szrj var_target_val[n_target_val++] = "x_" name; 62838fd1498Szrj } 62938fd1498Szrj } 63038fd1498Szrj } 63138fd1498Szrj} else { 63238fd1498Szrj var_target_val_type[n_target_val] = "int"; 63338fd1498Szrj var_target_val[n_target_val++] = "x_target_flags"; 63438fd1498Szrj} 63538fd1498Szrj 63638fd1498Szrjfor (i = 0; i < n_target_str; i++) { 63738fd1498Szrj name = var_target_str[i] 63838fd1498Szrj print " if (ptr1->" name" != ptr2->" name; 63938fd1498Szrj print " && (!ptr1->" name" || !ptr2->" name 64038fd1498Szrj print " || strcmp (ptr1->" name", ptr2->" name ")))"; 64138fd1498Szrj print " return false;"; 64238fd1498Szrj} 64338fd1498Szrjfor (i = 0; i < n_target_array; i++) { 64438fd1498Szrj name = var_target_array[i] 64538fd1498Szrj size = var_target_array_size[i] 64638fd1498Szrj type = var_target_array_type[i] 64738fd1498Szrj print " if (ptr1->" name" != ptr2->" name ""; 64838fd1498Szrj print " || memcmp (ptr1->" name ", ptr2->" name ", " size " * sizeof(" type ")))" 64938fd1498Szrj print " return false;"; 65038fd1498Szrj} 65138fd1498Szrjfor (i = 0; i < n_target_val; i++) { 65238fd1498Szrj name = var_target_val[i] 65338fd1498Szrj print " if (ptr1->" name" != ptr2->" name ")"; 65438fd1498Szrj print " return false;"; 65538fd1498Szrj} 65638fd1498Szrj 65738fd1498Szrjprint " return true;"; 65838fd1498Szrj 65938fd1498Szrjprint "}"; 66038fd1498Szrj 66138fd1498Szrjprint ""; 66238fd1498Szrjprint "/* Hash target options */"; 66338fd1498Szrjprint "hashval_t"; 66438fd1498Szrjprint "cl_target_option_hash (struct cl_target_option const *ptr ATTRIBUTE_UNUSED)"; 66538fd1498Szrjprint "{"; 66638fd1498Szrjprint " inchash::hash hstate;"; 66738fd1498Szrjfor (i = 0; i < n_target_str; i++) { 66838fd1498Szrj name = var_target_str[i] 66938fd1498Szrj print " if (ptr->" name")"; 67038fd1498Szrj print " hstate.add (ptr->" name", strlen (ptr->" name"));"; 67138fd1498Szrj print " else"; 67238fd1498Szrj print " hstate.add_int (0);"; 67338fd1498Szrj} 67438fd1498Szrjfor (i = 0; i < n_target_array; i++) { 67538fd1498Szrj name= var_target_array[i] 67638fd1498Szrj size = var_target_array_size[i] 67738fd1498Szrj type = var_target_array_type[i] 67838fd1498Szrj print " hstate.add_int (" size ");"; 67938fd1498Szrj print " hstate.add (ptr->" name ", sizeof (" type ") * " size ");"; 68038fd1498Szrj} 68138fd1498Szrjfor (i = 0; i < n_target_val; i++) { 68238fd1498Szrj name = var_target_val[i] 68338fd1498Szrj print " hstate.add_hwi (ptr->" name");"; 68438fd1498Szrj} 68538fd1498Szrjprint " return hstate.end ();"; 68638fd1498Szrjprint "}"; 68738fd1498Szrj 68838fd1498Szrjprint ""; 68938fd1498Szrjprint "/* Stream out target options */"; 69038fd1498Szrjprint "void"; 69138fd1498Szrjprint "cl_target_option_stream_out (struct output_block *ob ATTRIBUTE_UNUSED,"; 69238fd1498Szrjprint " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; 69338fd1498Szrjprint " struct cl_target_option *ptr ATTRIBUTE_UNUSED)"; 69438fd1498Szrjprint "{"; 69538fd1498Szrjfor (i = 0; i < n_target_str; i++) { 69638fd1498Szrj name = var_target_str[i] 69738fd1498Szrj print " bp_pack_string (ob, bp, ptr->" name", true);"; 69838fd1498Szrj} 69938fd1498Szrjfor (i = 0; i < n_target_array; i++) { 70038fd1498Szrj name = var_target_array[i] 70138fd1498Szrj size = var_target_array_size[i] 70238fd1498Szrj print " for (unsigned i = 0; i < " size "; i++)" 70338fd1498Szrj print " bp_pack_value (bp, ptr->" name "[i], 64);"; 70438fd1498Szrj} 70538fd1498Szrjfor (i = 0; i < n_target_val; i++) { 70638fd1498Szrj name = var_target_val[i] 70738fd1498Szrj print " bp_pack_value (bp, ptr->" name", 64);"; 70838fd1498Szrj} 70938fd1498Szrjprint "}"; 71038fd1498Szrj 71138fd1498Szrjprint ""; 71238fd1498Szrjprint "/* Stream in target options */"; 71338fd1498Szrjprint "void"; 71438fd1498Szrjprint "cl_target_option_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,"; 71538fd1498Szrjprint " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; 71638fd1498Szrjprint " struct cl_target_option *ptr ATTRIBUTE_UNUSED)"; 71738fd1498Szrjprint "{"; 71838fd1498Szrjfor (i = 0; i < n_target_str; i++) { 71938fd1498Szrj name = var_target_str[i] 72038fd1498Szrj print " ptr->" name" = bp_unpack_string (data_in, bp);"; 72138fd1498Szrj print " if (ptr->" name")"; 72238fd1498Szrj print " ptr->" name" = xstrdup (ptr->" name");"; 72338fd1498Szrj} 72438fd1498Szrjfor (i = 0; i < n_target_array; i++) { 72538fd1498Szrj name = var_target_array[i] 72638fd1498Szrj size = var_target_array_size[i] 72738fd1498Szrj print " for (int i = " size " - 1; i >= 0; i--)" 72838fd1498Szrj print " ptr->" name "[i] = (" var_target_array_type[i] ") bp_unpack_value (bp, 64);"; 72938fd1498Szrj} 73038fd1498Szrjfor (i = 0; i < n_target_val; i++) { 73138fd1498Szrj name = var_target_val[i] 73238fd1498Szrj print " ptr->" name" = (" var_target_val_type[i] ") bp_unpack_value (bp, 64);"; 73338fd1498Szrj} 73438fd1498Szrj 73538fd1498Szrjprint "}"; 73638fd1498Szrj 737*58e805e6Szrjn_opt_val = 4; 73838fd1498Szrjvar_opt_val[0] = "x_optimize" 73938fd1498Szrjvar_opt_val_type[0] = "char " 74038fd1498Szrjvar_opt_val[1] = "x_optimize_size" 74138fd1498Szrjvar_opt_val_type[1] = "char " 742*58e805e6Szrjvar_opt_val[2] = "x_optimize_debug" 74338fd1498Szrjvar_opt_val_type[2] = "char " 744*58e805e6Szrjvar_opt_val[3] = "x_optimize_fast" 745*58e805e6Szrjvar_opt_val_type[3] = "char " 74638fd1498Szrjfor (i = 0; i < n_opts; i++) { 74738fd1498Szrj if (flag_set_p("(Optimization|PerFunction)", flags[i])) { 74838fd1498Szrj name = var_name(flags[i]) 74938fd1498Szrj if(name == "") 75038fd1498Szrj continue; 75138fd1498Szrj 75238fd1498Szrj if(name in var_opt_list_seen) 75338fd1498Szrj continue; 75438fd1498Szrj 75538fd1498Szrj var_opt_list_seen[name]++; 75638fd1498Szrj 75738fd1498Szrj otype = var_type_struct(flags[i]) 75838fd1498Szrj var_opt_val_type[n_opt_val] = otype; 75938fd1498Szrj var_opt_val[n_opt_val++] = "x_" name; 76038fd1498Szrj var_opt_hash[n_opt_val] = flag_set_p("Optimization", flags[i]); 76138fd1498Szrj } 76238fd1498Szrj} 76338fd1498Szrjprint ""; 76438fd1498Szrjprint "/* Hash optimization options */"; 76538fd1498Szrjprint "hashval_t"; 76638fd1498Szrjprint "cl_optimization_hash (struct cl_optimization const *ptr ATTRIBUTE_UNUSED)"; 76738fd1498Szrjprint "{"; 76838fd1498Szrjprint " inchash::hash hstate;"; 76938fd1498Szrjfor (i = 0; i < n_opt_val; i++) { 77038fd1498Szrj if (!var_opt_hash[i]) 77138fd1498Szrj continue; 77238fd1498Szrj name = var_opt_val[i] 77338fd1498Szrj print " hstate.add_hwi (ptr->" name");"; 77438fd1498Szrj} 77538fd1498Szrjprint " return hstate.end ();"; 77638fd1498Szrjprint "}"; 77738fd1498Szrj 77838fd1498Szrjprint ""; 77938fd1498Szrjprint "/* Stream out optimization options */"; 78038fd1498Szrjprint "void"; 78138fd1498Szrjprint "cl_optimization_stream_out (struct bitpack_d *bp,"; 78238fd1498Szrjprint " struct cl_optimization *ptr)"; 78338fd1498Szrjprint "{"; 78438fd1498Szrjfor (i = 0; i < n_opt_val; i++) { 78538fd1498Szrj name = var_opt_val[i] 78638fd1498Szrj print " bp_pack_value (bp, ptr->" name", 64);"; 78738fd1498Szrj} 78838fd1498Szrjprint "}"; 78938fd1498Szrj 79038fd1498Szrjprint ""; 79138fd1498Szrjprint "/* Stream in optimization options */"; 79238fd1498Szrjprint "void"; 79338fd1498Szrjprint "cl_optimization_stream_in (struct bitpack_d *bp,"; 79438fd1498Szrjprint " struct cl_optimization *ptr)"; 79538fd1498Szrjprint "{"; 79638fd1498Szrjfor (i = 0; i < n_opt_val; i++) { 79738fd1498Szrj name = var_opt_val[i] 79838fd1498Szrj print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_value (bp, 64);"; 79938fd1498Szrj} 80038fd1498Szrjprint "}"; 80138fd1498Szrj} 802