#  Copyright (C) 2003-2022 Free Software Foundation, Inc.
#  Contributed by Kelley Cook, June 2004.
#  Original code from Neil Booth, May 2003.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3, or (at your option) any
# later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# This Awk script reads in the option records generated from 
# opt-gather.awk, combines the flags of duplicate options and generates a
# C file.
#

# This program uses functions from opt-functions.awk and code from
# opt-read.awk.
#
# Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-save-gen.awk \
#            [-v header_name=header.h] < inputfile > options-save.cc

# Dump that array of options into a C file.
END {
print "/* This file is auto-generated by optc-save-gen.awk.  */"
print ""
n_headers = split(header_name, headers, " ")
for (i = 1; i <= n_headers; i++)
	print "#include " quote headers[i] quote
print "#include " quote "opts.h" quote
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 "hash-set.h" quote
print "#include " quote "vec.h" quote
print "#include " quote "input.h" quote
print "#include " quote "alias.h" quote
print "#include " quote "symtab.h" quote
print "#include " quote "inchash.h" quote
print "#include " quote "tree.h" quote
print "#include " quote "fold-const.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) {
	for (i = 0; i < n_extra_c_includes; i++) {
		print "#include " quote extra_c_includes[i] quote
	}
	print ""
}

have_save = 0;
if (n_extra_target_vars)
	have_save = 1

for (i = 0; i < n_opts; i++) {
	if (flag_set_p("Save", flags[i]))
		have_save = 1;
}

print "/* Save optimization variables into a structure.  */"
print "void";
print "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts,";
print "		      struct gcc_options *opts_set)";
print "{";

n_opt_char = 4;
n_opt_short = 0;
n_opt_int = 0;
n_opt_enum = 0;
n_opt_string = 0;
n_opt_other = 0;
var_opt_char[0] = "optimize";
var_opt_char[1] = "optimize_size";
var_opt_char[2] = "optimize_debug";
var_opt_char[3] = "optimize_fast";
var_opt_range["optimize"] = "0, 255";
var_opt_range["optimize_size"] = "0, 2";
var_opt_range["optimize_debug"] = "0, 1";
var_opt_range["optimize_fast"] = "0, 1";

# Sort by size to mimic how the structure is laid out to be friendlier to the
# cache.

for (i = 0; i < n_opts; i++) {
	if (flag_set_p("(Optimization|PerFunction)", flags[i])) {
		name = var_name(flags[i])
		if(name == "")
			continue;

		if(name in var_opt_seen)
			continue;

		var_opt_seen[name]++;
		otype = var_type_struct(flags[i]);
		if (otype ~ "^((un)?signed +)?int *$")
			var_opt_int[n_opt_int++] = name;

		else if (otype ~ "^((un)?signed +)?short *$")
			var_opt_short[n_opt_short++] = name;

		else if (otype ~ ("^enum +[_" alnum "]+ *")) {
			var_opt_enum_type[n_opt_enum] = otype;
			var_opt_enum[n_opt_enum++] = name;
		}
		else if (otype ~ "^((un)?signed +)?char *$") {
			var_opt_char[n_opt_char++] = name;
			if (otype ~ "^unsigned +char *$")
				var_opt_range[name] = "0, 255"
			else if (otype ~ "^signed +char *$")
				var_opt_range[name] = "-128, 127"
		}
		else if (otype ~ "^const char \\**$") {
			var_opt_string[n_opt_string++] = name;
			string_options_names[name]++
		}
		else
			var_opt_other[n_opt_other++] = name;
	}
}

for (i = 0; i < n_opt_char; i++) {
	name = var_opt_char[i];
	if (var_opt_range[name] != "")
		print "  gcc_assert (IN_RANGE (opts->x_" name ", " var_opt_range[name] "));";
}

print "";
for (i = 0; i < n_opt_other; i++) {
	print "  ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";";
}

for (i = 0; i < n_opt_int; i++) {
	print "  ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";";
}

for (i = 0; i < n_opt_enum; i++) {
	print "  ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";";
}

for (i = 0; i < n_opt_short; i++) {
	print "  ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";";
}

for (i = 0; i < n_opt_char; i++) {
	print "  ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";";
}

for (i = 0; i < n_opt_string; i++) {
	print "  ptr->x_" var_opt_string[i] " = opts->x_" var_opt_string[i] ";";
}

print "";
print "  unsigned HOST_WIDE_INT mask = 0;";

j = 0;
k = 0;
for (i = 0; i < n_opt_other; i++) {
	print "  if (opts_set->x_" var_opt_other[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

for (i = 0; i < n_opt_int; i++) {
	print "  if (opts_set->x_" var_opt_int[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

for (i = 0; i < n_opt_enum; i++) {
	print "  if (opts_set->x_" var_opt_enum[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

for (i = 0; i < n_opt_short; i++) {
	print "  if (opts_set->x_" var_opt_short[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

for (i = 0; i < n_opt_char; i++) {
	print "  if (opts_set->x_" var_opt_char[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

for (i = 0; i < n_opt_string; i++) {
	print "  if (opts_set->x_" var_opt_string[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

if (j != 0) {
	print "  ptr->explicit_mask[" k "] = mask;";
}

print "}";

print "";
print "/* Restore optimization options from a structure.  */";
print "void";
print "cl_optimization_restore (struct gcc_options *opts, struct gcc_options *opts_set,";
print "			 struct cl_optimization *ptr)";
print "{";

for (i = 0; i < n_opt_other; i++) {
	print "  opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";";
}

for (i = 0; i < n_opt_int; i++) {
	print "  opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";";
}

for (i = 0; i < n_opt_enum; i++) {
	print "  opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";";
}

for (i = 0; i < n_opt_short; i++) {
	print "  opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";";
}

for (i = 0; i < n_opt_char; i++) {
	print "  opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";";
}

for (i = 0; i < n_opt_string; i++) {
	print "  opts->x_" var_opt_string[i] " = ptr->x_" var_opt_string[i] ";";
}

print "";
print "  unsigned HOST_WIDE_INT mask;";

j = 64;
k = 0;
for (i = 0; i < n_opt_other; i++) {
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_opt_other[i] " = (mask & 1) != 0;";
	print "  mask >>= 1;"
	j++;
}

for (i = 0; i < n_opt_int; i++) {
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_opt_int[i] " = (mask & 1) != 0;";
	print "  mask >>= 1;"
	j++;
}

for (i = 0; i < n_opt_enum; i++) {
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_opt_enum[i] " = static_cast<" var_opt_enum_type[i] ">((mask & 1) != 0);";
	print "  mask >>= 1;"
	j++;
}

for (i = 0; i < n_opt_short; i++) {
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_opt_short[i] " = (mask & 1) != 0;";
	print "  mask >>= 1;"
	j++;
}

for (i = 0; i < n_opt_char; i++) {
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_opt_char[i] " = (mask & 1) != 0;";
	print "  mask >>= 1;"
	j++;
}

for (i = 0; i < n_opt_string; i++) {
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_opt_string[i] " = (mask & 1) ? \"\" : nullptr;";
	print "  mask >>= 1;"
	j++;
}

print "  targetm.override_options_after_change ();";
print "}";

print "";
print "/* Print optimization options from a structure.  */";
print "void";
print "cl_optimization_print (FILE *file,";
print "                       int indent_to,";
print "                       struct cl_optimization *ptr)";
print "{";

print "  fputs (\"\\n\", file);";
for (i = 0; i < n_opt_other; i++) {
	print "  if (ptr->x_" var_opt_other[i] ")";
	print "    fprintf (file, \"%*s%s (%#lx)\\n\",";
	print "             indent_to, \"\",";
	print "             \"" var_opt_other[i] "\",";
	print "             (unsigned long)ptr->x_" var_opt_other[i] ");";
	print "";
}

for (i = 0; i < n_opt_int; i++) {
	print "  if (ptr->x_" var_opt_int[i] ")";
	print "    fprintf (file, \"%*s%s (%#x)\\n\",";
	print "             indent_to, \"\",";
	print "             \"" var_opt_int[i] "\",";
	print "             ptr->x_" var_opt_int[i] ");";
	print "";
}

for (i = 0; i < n_opt_enum; i++) {
	print "  fprintf (file, \"%*s%s (%#x)\\n\",";
	print "           indent_to, \"\",";
	print "           \"" var_opt_enum[i] "\",";
	print "           (int) ptr->x_" var_opt_enum[i] ");";
	print "";
}

for (i = 0; i < n_opt_short; i++) {
	print "  if (ptr->x_" var_opt_short[i] ")";
	print "    fprintf (file, \"%*s%s (%#x)\\n\",";
	print "             indent_to, \"\",";
	print "             \"" var_opt_short[i] "\",";
	print "             ptr->x_" var_opt_short[i] ");";
	print "";
}

for (i = 0; i < n_opt_char; i++) {
	print "  if (ptr->x_" var_opt_char[i] ")";
	print "    fprintf (file, \"%*s%s (%#x)\\n\",";
	print "             indent_to, \"\",";
	print "             \"" var_opt_char[i] "\",";
	print "             ptr->x_" var_opt_char[i] ");";
	print "";
}

for (i = 0; i < n_opt_string; i++) {
	print "  if (ptr->x_" var_opt_string[i] ")";
	print "    fprintf (file, \"%*s%s (%s)\\n\",";
	print "             indent_to, \"\",";
	print "             \"" var_opt_string[i] "\",";
	print "             ptr->x_" var_opt_string[i] ");";
	print "";
}

print "}";

print "";
print "/* Print different optimization variables from structures provided as arguments.  */";
print "void";
print "cl_optimization_print_diff (FILE *file,";
print "                            int indent_to,";
print "                            struct cl_optimization *ptr1,";
print "                            struct cl_optimization *ptr2)";
print "{";

print "  fputs (\"\\n\", file);";
for (i = 0; i < n_opt_other; i++) {
	print "  if (ptr1->x_" var_opt_other[i] " != ptr2->x_" var_opt_other[i] ")";
	print "    fprintf (file, \"%*s%s (%#lx/%#lx)\\n\",";
	print "             indent_to, \"\",";
	print "             \"" var_opt_other[i] "\",";
	print "             (unsigned long)ptr1->x_" var_opt_other[i] ",";
	print "             (unsigned long)ptr2->x_" var_opt_other[i] ");";
	print "";
}

for (i = 0; i < n_opt_int; i++) {
	print "  if (ptr1->x_" var_opt_int[i] " != ptr2->x_" var_opt_int[i] ")";
	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
	print "             indent_to, \"\",";
	print "             \"" var_opt_int[i] "\",";
	print "             ptr1->x_" var_opt_int[i] ",";
	print "             ptr2->x_" var_opt_int[i] ");";
	print "";
}

for (i = 0; i < n_opt_enum; i++) {
	print "  if (ptr1->x_" var_opt_enum[i] " != ptr2->x_" var_opt_enum[i] ")";
	print "  fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
	print "           indent_to, \"\",";
	print "           \"" var_opt_enum[i] "\",";
	print "           (int) ptr1->x_" var_opt_enum[i] ",";
	print "           (int) ptr2->x_" var_opt_enum[i] ");";
	print "";
}

for (i = 0; i < n_opt_short; i++) {
	print "  if (ptr1->x_" var_opt_short[i] " != ptr2->x_" var_opt_short[i] ")";
	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
	print "             indent_to, \"\",";
	print "             \"" var_opt_short[i] "\",";
	print "             ptr1->x_" var_opt_short[i] ",";
	print "             ptr2->x_" var_opt_short[i] ");";
	print "";
}

for (i = 0; i < n_opt_char; i++) {
	print "  if (ptr1->x_" var_opt_char[i] " != ptr2->x_" var_opt_char[i] ")";
	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
	print "             indent_to, \"\",";
	print "             \"" var_opt_char[i] "\",";
	print "             ptr1->x_" var_opt_char[i] ",";
	print "             ptr2->x_" var_opt_char[i] ");";
	print "";
}

for (i = 0; i < n_opt_string; i++) {
	name = var_opt_string[i]
	print "  if (ptr1->x_" name " != ptr2->x_" name "";
	print "      && (!ptr1->x_" name" || !ptr2->x_" name
	print "          || strcmp (ptr1->x_" name", ptr2->x_" name ")))";
	print "    fprintf (file, \"%*s%s (%s/%s)\\n\",";
	print "             indent_to, \"\",";
	print "             \"" name "\",";
	print "             ptr1->x_" name " ? ptr1->x_" name " : \"(null)\",";
	print "             ptr2->x_" name " ? ptr2->x_" name " : \"(null)\");";
	print "";
}

print "}";


print "";
print "/* Save selected option variables into a structure.  */"
print "void";
print "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts,";
print "		       struct gcc_options *opts_set)";
print "{";

n_target_char = 0;
n_target_short = 0;
n_target_int = 0;
n_target_enum = 0;
n_target_string = 0;
n_target_other = 0;

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_save_seen)
				continue;

			var_save_seen[name]++;
			otype = var_type_struct(flags[i])
			if (opt_args("Mask", flags[i]) != "" \
			    || opt_args("InverseMask", flags[i]))
				var_target_explicit_mask[name] = 1;

			if (otype ~ "^((un)?signed +)?int *$")
				var_target_int[n_target_int++] = name;

			else if (otype ~ "^((un)?signed +)?short *$")
				var_target_short[n_target_short++] = name;

			else if (otype ~ ("^enum +[_" alnum "]+ *$")) {
				var_target_enum_type[n_target_enum] = otype;
				var_target_enum[n_target_enum++] = name;
			}
			else if (otype ~ "^((un)?signed +)?char *$") {
				var_target_char[n_target_char++] = name;
				if (otype ~ "^unsigned +char *$")
					var_target_range[name] = "0, 255"
				else if (otype ~ "^signed +char *$")
					var_target_range[name] = "-128, 127"
				if (otype == var_type(flags[i]))
					var_target_range[name] = ""
			}
			else if (otype ~ "^const char \\**$") {
				var_target_string[n_target_string++] = name;
				string_options_names[name]++
			}
			else
				var_target_other[n_target_other++] = name;
		}
	}
} else {
	var_target_int[n_target_int++] = "target_flags";
	var_target_explicit_mask["target_flags"] = 1;
}

have_assert = 0;
for (i = 0; i < n_target_char; i++) {
	name = var_target_char[i];
	if (var_target_range[name] != "") {
		have_assert = 1;
		print "  gcc_assert (IN_RANGE (opts->x_" name ", " var_target_range[name] "));";
	}
}

if (have_assert)
	print "";

print "  if (targetm.target_option.save)";
print "    targetm.target_option.save (ptr, opts, opts_set);";
print "";

for (i = 0; i < n_extra_target_vars; i++) {
	print "  ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";";
}

for (i = 0; i < n_target_other; i++) {
	print "  ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";";
}

for (i = 0; i < n_target_enum; i++) {
	print "  ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";";
}

for (i = 0; i < n_target_int; i++) {
	print "  ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";";
}

for (i = 0; i < n_target_short; i++) {
	print "  ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";";
}

for (i = 0; i < n_target_char; i++) {
	print "  ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";";
}

for (i = 0; i < n_target_string; i++) {
	print "  ptr->x_" var_target_string[i] " = opts->x_" var_target_string[i] ";";
}

print "";

j = 0;
k = 0;
for (i = 0; i < n_extra_target_vars; i++) {
	if (j == 0 && k == 0) {
		print "  unsigned HOST_WIDE_INT mask = 0;";
	}
	print "  if (opts_set->x_" extra_target_vars[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

for (i = 0; i < n_target_other; i++) {
	if (var_target_other[i] in var_target_explicit_mask) {
		print "  ptr->explicit_mask_" var_target_other[i] " = opts_set->x_" var_target_other[i] ";";
		continue;
	}
	if (j == 0 && k == 0) {
		print "  unsigned HOST_WIDE_INT mask = 0;";
	}
	print "  if (opts_set->x_" var_target_other[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

for (i = 0; i < n_target_enum; i++) {
	if (j == 0 && k == 0) {
		print "  unsigned HOST_WIDE_INT mask = 0;";
	}
	print "  if (opts_set->x_" var_target_enum[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

for (i = 0; i < n_target_int; i++) {
	if (var_target_int[i] in var_target_explicit_mask) {
		print "  ptr->explicit_mask_" var_target_int[i] " = opts_set->x_" var_target_int[i] ";";
		continue;
	}
	if (j == 0 && k == 0) {
		print "  unsigned HOST_WIDE_INT mask = 0;";
	}
	print "  if (opts_set->x_" var_target_int[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

for (i = 0; i < n_target_short; i++) {
	if (j == 0 && k == 0) {
		print "  unsigned HOST_WIDE_INT mask = 0;";
	}
	print "  if (opts_set->x_" var_target_short[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

for (i = 0; i < n_target_char; i++) {
	if (j == 0 && k == 0) {
		print "  unsigned HOST_WIDE_INT mask = 0;";
	}
	print "  if (opts_set->x_" var_target_char[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

for (i = 0; i < n_target_string; i++) {
	if (j == 0 && k == 0) {
		print "  unsigned HOST_WIDE_INT mask = 0;";
	}
	print "  if (opts_set->x_" var_target_string[i] ") mask |= HOST_WIDE_INT_1U << " j ";";
	j++;
	if (j == 64) {
		print "  ptr->explicit_mask[" k "] = mask;";
		print "  mask = 0;";
		j = 0;
		k++;
	}
}

if (j != 0) {
	print "  ptr->explicit_mask[" k "] = mask;";
}
has_target_explicit_mask = 0;
if (j != 0 || k != 0) {
	has_target_explicit_mask = 1;
}

print "}";

print "";
print "/* Restore selected current options from a structure.  */";
print "void";
print "cl_target_option_restore (struct gcc_options *opts, struct gcc_options *opts_set,";
print "			  struct cl_target_option *ptr)";
print "{";

for (i = 0; i < n_extra_target_vars; i++) {
	print "  opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";";
}

for (i = 0; i < n_target_other; i++) {
	print "  opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";";
}

for (i = 0; i < n_target_enum; i++) {
	print "  opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";";
}

for (i = 0; i < n_target_int; i++) {
	print "  opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";";
}

for (i = 0; i < n_target_short; i++) {
	print "  opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";";
}

for (i = 0; i < n_target_char; i++) {
	print "  opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";";
}

for (i = 0; i < n_target_string; i++) {
	print "  opts->x_" var_target_string[i] " = ptr->x_" var_target_string[i] ";";
}

print "";
if (has_target_explicit_mask) {
	print "  unsigned HOST_WIDE_INT mask;";
}

j = 64;
k = 0;
for (i = 0; i < n_extra_target_vars; i++) {
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	if (extra_target_var_types[i] ~ ("^enum +[_" alnum "]+ *$")) {
		print "  opts_set->x_" extra_target_vars[i] " = static_cast<" extra_target_var_types[i] ">((mask & 1) != 0);";
	}
	else if (extra_target_var_types[i] ~ "^const char \\**$") {
		print "  opts_set->x_" extra_target_vars[i] " = (mask & 1) ? \"\" : nullptr;";
	}
	else {
		print "  opts_set->x_" extra_target_vars[i] " = (mask & 1) != 0;";
	}
	print "  mask >>= 1;"
	j++;
}

for (i = 0; i < n_target_other; i++) {
	if (var_target_other[i] in var_target_explicit_mask) {
		print "  opts_set->x_" var_target_other[i] " = ptr->explicit_mask_" var_target_other[i] ";";
		continue;
	}
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_target_other[i] " = (mask & 1) != 0;";
	print "  mask >>= 1;"
	j++;
}

for (i = 0; i < n_target_enum; i++) {
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_target_enum[i] " = static_cast<" var_target_enum_type[i] ">((mask & 1) != 0);";
	print "  mask >>= 1;"
	j++;
}

for (i = 0; i < n_target_int; i++) {
	if (var_target_int[i] in var_target_explicit_mask) {
		print "  opts_set->x_" var_target_int[i] " = ptr->explicit_mask_" var_target_int[i] ";";
		continue;
	}
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_target_int[i] " = (mask & 1) != 0;";
	print "  mask >>= 1;"
	j++;
}

for (i = 0; i < n_target_short; i++) {
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_target_short[i] " = (mask & 1) != 0;";
	print "  mask >>= 1;"
	j++;
}

for (i = 0; i < n_target_char; i++) {
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_target_char[i] " = (mask & 1) != 0;";
	print "  mask >>= 1;"
	j++;
}

for (i = 0; i < n_target_string; i++) {
	if (j == 64) {
		print "  mask = ptr->explicit_mask[" k "];";
		k++;
		j = 0;
	}
	print "  opts_set->x_" var_target_string[i] " = (mask & 1) ? \"\" : nullptr;";
	print "  mask >>= 1;"
	j++;
}

# This must occur after the normal variables in case the code depends on those
# variables.
print "";
print "  if (targetm.target_option.restore)";
print "    targetm.target_option.restore (opts, opts_set, ptr);";

print "}";

print "";
print "/* Print optimization options from a structure.  */";
print "void";
print "cl_target_option_print (FILE *file,";
print "                        int indent,";
print "                        struct cl_target_option *ptr)";
print "{";

print "  fputs (\"\\n\", file);";
for (i = 0; i < n_target_other; i++) {
	print "  if (ptr->x_" var_target_other[i] ")";
	hwi = host_wide_int[var_target_other[i]]
	if (hwi == "yes")
		print "    fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x)\\n\",";
	else
		print "    fprintf (file, \"%*s%s (%#lx)\\n\",";
	print "             indent, \"\",";
	print "             \"" var_target_other[i] "\",";
	if (hwi == "yes")
		print "             ptr->x_" var_target_other[i] ");";
	else
		print "             (unsigned long)ptr->x_" var_target_other[i] ");";
	print "";
}

for (i = 0; i < n_target_enum; i++) {
	print "  if (ptr->x_" var_target_enum[i] ")";
	print "    fprintf (file, \"%*s%s (%#x)\\n\",";
	print "             indent, \"\",";
	print "             \"" var_target_enum[i] "\",";
	print "             ptr->x_" var_target_enum[i] ");";
	print "";
}

for (i = 0; i < n_target_int; i++) {
	print "  if (ptr->x_" var_target_int[i] ")";
	print "    fprintf (file, \"%*s%s (%#x)\\n\",";
	print "             indent, \"\",";
	print "             \"" var_target_int[i] "\",";
	print "             ptr->x_" var_target_int[i] ");";
	print "";
}

for (i = 0; i < n_target_short; i++) {
	print "  if (ptr->x_" var_target_short[i] ")";
	print "    fprintf (file, \"%*s%s (%#x)\\n\",";
	print "             indent, \"\",";
	print "             \"" var_target_short[i] "\",";
	print "             ptr->x_" var_target_short[i] ");";
	print "";
}

for (i = 0; i < n_target_char; i++) {
	print "  if (ptr->x_" var_target_char[i] ")";
	print "    fprintf (file, \"%*s%s (%#x)\\n\",";
	print "             indent, \"\",";
	print "             \"" var_target_char[i] "\",";
	print "             ptr->x_" var_target_char[i] ");";
	print "";
}

for (i = 0; i < n_target_string; i++) {
	print "  if (ptr->x_" var_target_string[i] ")";
	print "    fprintf (file, \"%*s%s (%s)\\n\",";
	print "             indent, \"\",";
	print "             \"" var_target_string[i] "\",";
	print "             ptr->x_" var_target_string[i] ");";
	print "";
}

print "";
print "  if (targetm.target_option.print)";
print "    targetm.target_option.print (file, indent, ptr);";
print "}";

print "";
print "/* Print different target option variables from structures provided as arguments.  */";
print "void";
print "cl_target_option_print_diff (FILE *file,";
print "                             int indent ATTRIBUTE_UNUSED,";
print "                             struct cl_target_option *ptr1 ATTRIBUTE_UNUSED,";
print "                             struct cl_target_option *ptr2 ATTRIBUTE_UNUSED)";
print "{";

print "  fputs (\"\\n\", file);";
for (i = 0; i < n_target_other; i++) {
	print "  if (ptr1->x_" var_target_other[i] " != ptr2->x_" var_target_other[i] ")";
	hwi = host_wide_int[var_target_other[i]]
	if (hwi == "yes")
		print "    fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x/%#\" HOST_WIDE_INT_PRINT \"x)\\n\",";
	else
		print "    fprintf (file, \"%*s%s (%#lx/%#lx)\\n\",";
	print "             indent, \"\",";
	print "             \"" var_target_other[i] "\",";
	if (hwi == "yes") {
		print "             ptr1->x_" var_target_other[i] ",";
		print "             ptr2->x_" var_target_other[i] ");";
	}
	else {
		print "             (unsigned long)ptr1->x_" var_target_other[i] ",";
		print "             (unsigned long)ptr2->x_" var_target_other[i] ");";
	}
	print "";
}

for (i = 0; i < n_target_enum; i++) {
	print "  if (ptr1->x_" var_target_enum[i] " != ptr2->x_" var_target_enum[i] ")";
	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
	print "             indent, \"\",";
	print "             \"" var_target_enum[i] "\",";
	print "             ptr1->x_" var_target_enum[i] ",";
	print "             ptr2->x_" var_target_enum[i] ");";
	print "";
}

for (i = 0; i < n_target_int; i++) {
	print "  if (ptr1->x_" var_target_int[i] " != ptr2->x_" var_target_int[i] ")";
	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
	print "             indent, \"\",";
	print "             \"" var_target_int[i] "\",";
	print "             ptr1->x_" var_target_int[i] ",";
	print "             ptr2->x_" var_target_int[i] ");";
	print "";
}

for (i = 0; i < n_target_short; i++) {
	print "  if (ptr1->x_" var_target_short[i] " != ptr2->x_" var_target_short[i] ")";
	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
	print "             indent, \"\",";
	print "             \"" var_target_short[i] "\",";
	print "             ptr1->x_" var_target_short[i] ",";
	print "             ptr2->x_" var_target_short[i] ");";
	print "";
}

for (i = 0; i < n_target_char; i++) {
	print "  if (ptr1->x_" var_target_char[i] " != ptr2->x_" var_target_char[i] ")";
	print "    fprintf (file, \"%*s%s (%#x/%#x)\\n\",";
	print "             indent, \"\",";
	print "             \"" var_target_char[i] "\",";
	print "             ptr1->x_" var_target_char[i] ",";
	print "             ptr2->x_" var_target_char[i] ");";
	print "";
}

for (i = 0; i < n_target_string; i++) {
	name = var_target_string[i]
	print "  if (ptr1->x_" name " != ptr2->x_" name "";
	print "      && (!ptr1->x_" name" || !ptr2->x_" name
	print "          || strcmp (ptr1->x_" name", ptr2->x_" name ")))";
	print "    fprintf (file, \"%*s%s (%s/%s)\\n\",";
	print "             indent, \"\",";
	print "             \"" name "\",";
	print "             ptr1->x_" name " ? ptr1->x_" name " : \"(null)\",";
	print "             ptr2->x_" name " ? ptr1->x_" name " : \"(null)\");";
	print "";
}

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;
n_target_array = 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;
		string_options_names[name]++
	}
	else {
		if (target_save_decl[i] ~ " .*\\[.+\\]+$") {
			size = name;
			sub("[^\\[]+\\[", "", size);
			sub("\\]$", "", size);
			sub("\\[.+", "", name)
			sub(" [^ ]+$", "", type)
			var_target_array[n_target_array] = name
			var_target_array_type[n_target_array] = type
			var_target_array_size[n_target_array++] = size
		}
		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_array; i++) {
	name = var_target_array[i]
	size = var_target_array_size[i]
	type = var_target_array_type[i]
	print "  if (ptr1->" name" != ptr2->" name "";
	print "      || memcmp (ptr1->" name ", ptr2->" name ", " size " * sizeof(" type ")))"
	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;";
}

if (has_target_explicit_mask) {
	print "  for (size_t i = 0; i < sizeof (ptr1->explicit_mask) / sizeof (ptr1->explicit_mask[0]); i++)";
	print "    if (ptr1->explicit_mask[i] != ptr2->explicit_mask[i])";
	print "      return false;"
}

for (i = 0; i < n_target_other; i++) {
	if (var_target_other[i] in var_target_explicit_mask) {
		print "  if (ptr1->explicit_mask_" var_target_other[i] " != ptr2->explicit_mask_" var_target_other[i] ")";
		print "    return false;";
	}
}

for (i = 0; i < n_target_int; i++) {
	if (var_target_int[i] in var_target_explicit_mask) {
		print "  if (ptr1->explicit_mask_" var_target_int[i] " != ptr2->explicit_mask_" var_target_int[i] ")";
		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_array; i++) {
	name= var_target_array[i]
	size = var_target_array_size[i]
	type = var_target_array_type[i]
	print "  hstate.add_int (" size ");";
	print "  hstate.add (ptr->" name ", sizeof (" type ") * " size ");";
}
for (i = 0; i < n_target_val; i++) {
	name = var_target_val[i]
	print "  hstate.add_hwi (ptr->" name");";
}
if (has_target_explicit_mask) {
	print "  for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
	print "    hstate.add_hwi (ptr->explicit_mask[i]);";
}

for (i = 0; i < n_target_other; i++) {
	if (var_target_other[i] in var_target_explicit_mask)
		print "  hstate.add_hwi (ptr->explicit_mask_" var_target_other[i] ");";
}

for (i = 0; i < n_target_int; i++) {
	if (var_target_int[i] in var_target_explicit_mask)
		print "  hstate.add_hwi (ptr->explicit_mask_" var_target_int[i] ");";
}

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_array; i++) {
	name = var_target_array[i]
	size = var_target_array_size[i]
	print "  for (unsigned i = 0; i < " size "; i++)"
	print "    bp_pack_value (bp, ptr->" name "[i], 64);";
}
for (i = 0; i < n_target_val; i++) {
	name = var_target_val[i]
	print "  bp_pack_value (bp, ptr->" name", 64);";
}

if (has_target_explicit_mask) {
	print "  for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
	print "    bp_pack_value (bp, ptr->explicit_mask[i], 64);";
}

for (i = 0; i < n_target_other; i++) {
	if (var_target_other[i] in var_target_explicit_mask) {
		print "  bp_pack_value (bp, ptr->explicit_mask_" var_target_other[i] ", 64);";
	}
}

for (i = 0; i < n_target_int; i++) {
	if (var_target_int[i] in var_target_explicit_mask) {
		print "  bp_pack_value (bp, ptr->explicit_mask_" var_target_int[i] ", 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_array; i++) {
	name = var_target_array[i]
	size = var_target_array_size[i]
	print "  for (int i = " size " - 1; i >= 0; i--)"
	print "    ptr->" name "[i] = (" var_target_array_type[i] ") bp_unpack_value (bp, 64);";
}
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);";
}

if (has_target_explicit_mask) {
	print "  for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
	print "    ptr->explicit_mask[i] = bp_unpack_value (bp, 64);";
}

for (i = 0; i < n_target_other; i++) {
	if (var_target_other[i] in var_target_explicit_mask) {
		print "  ptr->explicit_mask_" var_target_other[i] " = bp_unpack_value (bp, 64);";
	}
}

for (i = 0; i < n_target_int; i++) {
	if (var_target_int[i] in var_target_explicit_mask) {
		print "  ptr->explicit_mask_" var_target_int[i] " = bp_unpack_value (bp, 64);";
	}
}

print "}";

print "/* free heap memory used by target options  */";
print "void";
print "cl_target_option_free (struct cl_target_option *ptr ATTRIBUTE_UNUSED)";
print "{";
for (i = 0; i < n_target_str; i++) {
	name = var_target_str[i]
	print "  if (ptr->" name")";
	print "    free (const_cast <char *>(ptr->" name"));";
}
print "}";

n_opt_val = 4;
var_opt_val[0] = "x_optimize"
var_opt_val_type[0] = "char "
var_opt_hash[0] = 1;
var_opt_val[1] = "x_optimize_size"
var_opt_val_type[1] = "char "
var_opt_hash[1] = 1;
var_opt_val[2] = "x_optimize_debug"
var_opt_val_type[2] = "char "
var_opt_hash[2] = 1;
var_opt_val[3] = "x_optimize_fast"
var_opt_val_type[3] = "char "
var_opt_hash[3] = 1;
for (i = 0; i < n_opts; i++) {
	if (flag_set_p("(Optimization|PerFunction)", flags[i])) {
		name = var_name(flags[i])
		if(name == "")
			continue;

		if(name in var_opt_list_seen)
			continue;

		var_opt_list_seen[name]++;

		otype = var_type_struct(flags[i])
		var_opt_val_type[n_opt_val] = otype;
		var_opt_val[n_opt_val] = "x_" name;
		var_opt_hash[n_opt_val] = flag_set_p("Optimization", flags[i]);
		var_opt_init[n_opt_val] = opt_args("Init", flags[i]);
		n_opt_val++;
	}
}
print "";
print "/* Hash optimization options  */";
print "hashval_t";
print "cl_optimization_hash (struct cl_optimization const *ptr ATTRIBUTE_UNUSED)";
print "{";
print "  inchash::hash hstate;";
for (i = 0; i < n_opt_val; i++) {
	if (!var_opt_hash[i])
		continue;
	name = var_opt_val[i]
	otype = var_opt_val_type[i];
	if (otype ~ "^const char \\**$")
	{
		print "  if (ptr->" name")";
		print "    hstate.add (ptr->" name", strlen (ptr->" name"));";
		print "  else";
		print "    hstate.add_int (0);";
	}
	else
		print "  hstate.add_hwi (ptr->" name");";
}
print "  for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
print "    hstate.add_hwi (ptr->explicit_mask[i]);";
print "  return hstate.end ();";
print "}";

print "";
print "/* Compare two optimization options  */";
print "bool";
print "cl_optimization_option_eq (cl_optimization const *ptr1,";
print "                           cl_optimization const *ptr2)";
print "{";
for (i = 0; i < n_opt_val; i++) {
	if (!var_opt_hash[i])
		continue;
	name = var_opt_val[i]
	otype = var_opt_val_type[i];
	if (otype ~ "^const char \\**$")
	{
		print "  if (ptr1->" name" != ptr2->" name;
		print "      && (!ptr1->" name" || !ptr2->" name
		print "          || strcmp (ptr1->" name", ptr2->" name ")))";
		print "    return false;";
	}
	else
	{
		print "  if (ptr1->" name" != ptr2->" name ")";
		print "    return false;";
	}
}
print "  for (size_t i = 0; i < sizeof (ptr1->explicit_mask) / sizeof (ptr1->explicit_mask[0]); i++)";
print "    if (ptr1->explicit_mask[i] != ptr2->explicit_mask[i])";
print "      return false;"
print "  return true;";
print "}";

print "";
print "/* Stream out optimization options  */";
print "void";
print "cl_optimization_stream_out (struct output_block *ob,";
print "                            struct bitpack_d *bp,";
print "                            struct cl_optimization *ptr)";
print "{";
for (i = 0; i < n_opt_val; i++) {
	name = var_opt_val[i]
	otype = var_opt_val_type[i];
	if (otype ~ "^const char \\**$")
		print "  bp_pack_string (ob, bp, ptr->" name", true);";
	else {
		if (otype ~ "^unsigned") {
			sgn = "unsigned";
		} else {
			sgn = "int";
		}
		if (name ~ "^x_param" && !(otype ~ "^enum ") && var_opt_init[i]) {
			print "  if (" var_opt_init[i] " > (" var_opt_val_type[i] ") 10)";
			print "    bp_pack_var_len_" sgn " (bp, ptr->" name" ^ " var_opt_init[i] ");";
			print "  else";
			print "    bp_pack_var_len_" sgn " (bp, ptr->" name");";
		} else {
			print "  bp_pack_var_len_" sgn " (bp, ptr->" name");";
		}
	}
}
print "  for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
print "    bp_pack_value (bp, ptr->explicit_mask[i], 64);";
print "}";

print "";
print "/* Stream in optimization options  */";
print "void";
print "cl_optimization_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,";
print "                           struct bitpack_d *bp ATTRIBUTE_UNUSED,";
print "                           struct cl_optimization *ptr ATTRIBUTE_UNUSED)";
print "{";
for (i = 0; i < n_opt_val; i++) {
	name = var_opt_val[i]
	otype = var_opt_val_type[i];
	if (otype ~ "^const char \\**$") {
		print "  ptr->" name" = bp_unpack_string (data_in, bp);";
		print "  if (ptr->" name")";
		print "    ptr->" name" = xstrdup (ptr->" name");";
	}
	else {
		if (otype ~ "^unsigned") {
			sgn = "unsigned";
		} else {
			sgn = "int";
		}
		print "  ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_var_len_" sgn " (bp);";
		if (name ~ "^x_param" && !(otype ~ "^enum ") && var_opt_init[i]) {
			print "  if (" var_opt_init[i] " > (" var_opt_val_type[i] ") 10)";
			print "    ptr->" name" ^= " var_opt_init[i] ";";
		}
	}
}
print "  for (size_t i = 0; i < sizeof (ptr->explicit_mask) / sizeof (ptr->explicit_mask[0]); i++)";
print "    ptr->explicit_mask[i] = bp_unpack_value (bp, 64);";
print "}";
print "/* Free heap memory used by optimization options  */";
print "void";
print "cl_optimization_option_free (struct cl_optimization *ptr ATTRIBUTE_UNUSED)";
print "{";
for (i = 0; i < n_opt_val; i++) {
	name = var_opt_val[i]
	otype = var_opt_val_type[i];
	if (otype ~ "^const char \\**$")
	{
	      print "  if (ptr->" name")";
	      print "    free (const_cast <char *>(ptr->" name"));";
	}
}
print "}";

print "void";
print "cl_optimization_compare (gcc_options *ptr1, gcc_options *ptr2)"
print "{"

# all these options are mentioned in PR92860
checked_options["flag_merge_constants"]++
checked_options["param_max_fields_for_field_sensitive"]++
checked_options["flag_omit_frame_pointer"]++
# arc exceptions
checked_options["TARGET_ALIGN_CALL"]++
checked_options["TARGET_CASE_VECTOR_PC_RELATIVE"]++
checked_options["arc_size_opt_level"]++
# arm exceptions
checked_options["arm_fp16_format"]++


for (i = 0; i < n_opts; i++) {
	name = var_name(flags[i]);
	if (name == "")
		continue;

	if (name in checked_options)
		continue;
	checked_options[name]++

	if (name in string_options_names || ("x_" name) in string_options_names) {
	  print "  if (ptr1->x_" name " != ptr2->x_" name "";
	  print "      && (!ptr1->x_" name" || !ptr2->x_" name
	  print "          || strcmp (ptr1->x_" name", ptr2->x_" name ")))";
	  print "    internal_error (\"%<global_options%> are modified in local context\");";
	}
	else {
	  print "  if (ptr1->x_" name " != ptr2->x_" name ")"
	  print "    internal_error (\"%<global_options%> are modified in local context\");";
	}
}

print "}";
}
