#  Copyright (C) 2003-2021 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.c

# 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, 1";
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 "}";
}
