ba948b3776
> Seems a latent issue. > Neither cl_optimization_{save,restore} nor cl_target_option_{save,restore} > (nor any of the target hooks they call) saves or restores any opts_set > values, so I think opts_set can be trusted only during option processing (if > at all), but not later. > So, short term a fix would be IMHO just stop using opts_set altogether in > arm_configure_build_target, it doesn't make much sense to me, it should test > if those strings are non-NULL instead, or at least do that when it is > invoked from arm_option_restore (e.g. could be done by calling it with > opts instead of &global_options_set ). > Longer term, the question is if cl_optimization_{save,restore} and > cl_target_option_{save,restore} shouldn't be changed not to only > save/restore the options, but also save the opts_set flags. > It could be done e.g. by adding a bool array or set of bool members > to struct cl_optimization and struct cl_target_option , or even more compact > by using bitmasks, pack each 64 adjacent option flags into a UHWI element > of an array. So, I've tried under debugger how it behaves and seems global_options_set is really an or of whether an option has been ever seen as explicit, either on the command line or in any of the option pragmas or optimize/target attributes seen so far, so it isn't something that can be relied on. The following patch implements the saving/restoring of the opts_set bits (though only for the options/variables saved by the generic options-save.c code, for the target specific stuff that isn't handled by the generic code the opts_set argument is now passed to the hook and the backends can choose e.g. to use a TargetSave variable to save the flags either individually or together in some bitmask (or ignore it if they never need opts_set for the options). This patch itself doesn't fix the testcase failing on arm, but a follow up patch will. 2020-09-14 Jakub Jelinek <jakub@redhat.com> gcc/ * opt-read.awk: Also initialize extra_target_var_types array. * opth-gen.awk: Emit explicit_mask arrays to struct cl_optimization and cl_target_option. Adjust cl_optimization_save, cl_optimization_restore, cl_target_option_save and cl_target_option_restore declarations. * optc-save-gen.awk: Add opts_set argument to cl_optimization_save, cl_optimization_restore, cl_target_option_save and cl_target_option_restore functions and save or restore opts_set next to the opts values into or from explicit_mask arrays. In cl_target_option_eq and cl_optimization_option_eq compare explicit_mask arrays, in cl_target_option_hash and cl_optimization_hash hash them and in cl_target_option_stream_out, cl_target_option_stream_in, cl_optimization_stream_out and cl_optimization_stream_in stream them. * tree.h (build_optimization_node, build_target_option_node): Add opts_set argument. * tree.c (build_optimization_node): Add opts_set argument, pass it to cl_optimization_save. (build_target_option_node): Add opts_set argument, pass it to cl_target_option_save. * function.c (invoke_set_current_function_hook): Adjust cl_optimization_restore caller. * ipa-inline-transform.c (inline_call): Adjust cl_optimization_restore and build_optimization_node callers. * target.def (TARGET_OPTION_SAVE, TARGET_OPTION_RESTORE): Add opts_set argument. * target-globals.c (save_target_globals_default_opts): Adjust cl_optimization_restore callers. * toplev.c (process_options): Adjust build_optimization_node and cl_optimization_restore callers. (target_reinit): Adjust cl_optimization_restore caller. * tree-streamer-in.c (lto_input_ts_function_decl_tree_pointers): Adjust build_optimization_node and cl_optimization_restore callers. * doc/tm.texi: Updated. * config/aarch64/aarch64.c (aarch64_override_options): Adjust build_target_option_node caller. (aarch64_option_save, aarch64_option_restore): Add opts_set argument. (aarch64_set_current_function): Adjust cl_target_option_restore caller. (aarch64_option_valid_attribute_p): Adjust cl_target_option_save, cl_target_option_restore, cl_optimization_restore, build_optimization_node and build_target_option_node callers. * config/aarch64/aarch64-c.c (aarch64_pragma_target_parse): Adjust cl_target_option_restore and build_target_option_node callers. * config/arm/arm.c (arm_option_save, arm_option_restore): Add opts_set argument. (arm_option_override): Adjust cl_target_option_save, build_optimization_node and build_target_option_node callers. (arm_set_current_function): Adjust cl_target_option_restore caller. (arm_valid_target_attribute_tree): Adjust build_target_option_node caller. (add_attribute): Formatting fix. (arm_valid_target_attribute_p): Adjust cl_optimization_restore, cl_target_option_restore, arm_valid_target_attribute_tree and build_optimization_node callers. * config/arm/arm-c.c (arm_pragma_target_parse): Adjust cl_target_option_restore callers. * config/csky/csky.c (csky_option_override): Adjust build_target_option_node and cl_target_option_save callers. * config/gcn/gcn.c (gcn_fixup_accel_lto_options): Adjust build_optimization_node and cl_optimization_restore callers. * config/i386/i386-builtins.c (get_builtin_code_for_version): Adjust cl_target_option_save and cl_target_option_restore callers. * config/i386/i386-c.c (ix86_pragma_target_parse): Adjust build_target_option_node and cl_target_option_restore callers. * config/i386/i386-options.c (ix86_function_specific_save, ix86_function_specific_restore): Add opts_set arguments. (ix86_valid_target_attribute_tree): Adjust build_target_option_node caller. (ix86_valid_target_attribute_p): Adjust build_optimization_node, cl_optimization_restore, cl_target_option_restore, ix86_valid_target_attribute_tree and build_optimization_node callers. (ix86_option_override_internal): Adjust build_target_option_node caller. (ix86_reset_previous_fndecl, ix86_set_current_function): Adjust cl_target_option_restore callers. * config/i386/i386-options.h (ix86_function_specific_save, ix86_function_specific_restore): Add opts_set argument. * config/nios2/nios2.c (nios2_option_override): Adjust build_target_option_node caller. (nios2_option_save, nios2_option_restore): Add opts_set argument. (nios2_valid_target_attribute_tree): Adjust build_target_option_node caller. (nios2_valid_target_attribute_p): Adjust build_optimization_node, cl_optimization_restore, cl_target_option_save and cl_target_option_restore callers. (nios2_set_current_function, nios2_pragma_target_parse): Adjust cl_target_option_restore callers. * config/pru/pru.c (pru_option_override): Adjust build_target_option_node caller. (pru_set_current_function): Adjust cl_target_option_restore callers. * config/rs6000/rs6000.c (rs6000_debug_reg_global): Adjust cl_target_option_save caller. (rs6000_option_override_internal): Adjust build_target_option_node caller. (rs6000_valid_attribute_p): Adjust build_optimization_node, cl_optimization_restore, cl_target_option_save, cl_target_option_restore and build_target_option_node callers. (rs6000_pragma_target_parse): Adjust cl_target_option_restore and build_target_option_node callers. (rs6000_activate_target_options): Adjust cl_target_option_restore callers. (rs6000_function_specific_save, rs6000_function_specific_restore): Add opts_set argument. * config/s390/s390.c (s390_function_specific_restore): Likewise. (s390_option_override_internal): Adjust s390_function_specific_restore caller. (s390_option_override, s390_valid_target_attribute_tree): Adjust build_target_option_node caller. (s390_valid_target_attribute_p): Adjust build_optimization_node, cl_optimization_restore and cl_target_option_restore callers. (s390_activate_target_options): Adjust cl_target_option_restore caller. * config/s390/s390-c.c (s390_cpu_cpp_builtins): Adjust cl_target_option_save caller. (s390_pragma_target_parse): Adjust build_target_option_node and cl_target_option_restore callers. gcc/c-family/ * c-attribs.c (handle_optimize_attribute): Adjust cl_optimization_save, cl_optimization_restore and build_optimization_node callers. * c-pragma.c (handle_pragma_optimize): Adjust build_optimization_node caller. (handle_pragma_push_options): Adjust build_optimization_node and build_target_option_node callers. (handle_pragma_pop_options, handle_pragma_reset_options): Adjust cl_optimization_restore callers. gcc/go/ * go-gcc.cc (Gcc_backend::function): Adjust cl_optimization_save, cl_optimization_restore and build_optimization_node callers. gcc/ada/ * gcc-interface/trans.c (gigi): Adjust build_optimization_node caller.
125 lines
3.4 KiB
Awk
125 lines
3.4 KiB
Awk
# Copyright (C) 2003-2020 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/>.
|
|
|
|
# Read in the option records generated from opt-gather.awk.
|
|
|
|
BEGIN {
|
|
n_opts = 0
|
|
n_langs = 0
|
|
n_target_save = 0
|
|
n_extra_vars = 0
|
|
n_extra_target_vars = 0
|
|
n_extra_masks = 0
|
|
n_extra_c_includes = 0
|
|
n_extra_h_includes = 0
|
|
n_enums = 0
|
|
have_save = 0;
|
|
quote = "\042"
|
|
comma = ","
|
|
FS=SUBSEP
|
|
# Default the name of header created from opth-gen.awk to options.h
|
|
if (header_name == "") header_name="options.h"
|
|
}
|
|
|
|
# Collect the text and flags of each option into an array
|
|
{
|
|
if ($1 == "Language") {
|
|
langs[n_langs] = $2
|
|
lang_numbers[$2] = n_langs
|
|
n_langs++;
|
|
}
|
|
else if ($1 == "TargetSave") {
|
|
# Make sure the declarations are put in source order
|
|
target_save_decl[n_target_save] = $2
|
|
n_target_save++
|
|
}
|
|
else if ($1 == "Variable") {
|
|
extra_vars[n_extra_vars] = $2
|
|
n_extra_vars++
|
|
name = host_wide_int_var_name($2)
|
|
if (name != "")
|
|
host_wide_int[name] = "yes"
|
|
}
|
|
else if ($1 == "TargetVariable") {
|
|
# Combination of TargetSave and Variable
|
|
extra_vars[n_extra_vars] = $2
|
|
n_extra_vars++
|
|
|
|
var = $2
|
|
sub(" *=.*", "", var)
|
|
orig_var = var
|
|
name = var
|
|
type = var
|
|
sub("^.*[ *]", "", name)
|
|
sub(" *" name "$", "", type)
|
|
target_save_decl[n_target_save] = type " x_" name
|
|
n_target_save++
|
|
|
|
extra_target_vars[n_extra_target_vars] = name
|
|
extra_target_var_types[n_extra_target_vars] = type
|
|
n_extra_target_vars++
|
|
}
|
|
else if ($1 == "HeaderInclude") {
|
|
extra_h_includes[n_extra_h_includes++] = $2;
|
|
}
|
|
else if ($1 == "SourceInclude") {
|
|
extra_c_includes[n_extra_c_includes++] = $2;
|
|
}
|
|
else if ($1 == "Enum") {
|
|
props = $2
|
|
name = opt_args_non_empty("Name", props)
|
|
type = opt_args_non_empty("Type", props)
|
|
unknown_error = opt_args("UnknownError", props)
|
|
enum_names[n_enums] = name
|
|
enum_type[name] = type
|
|
enum_index[name] = n_enums
|
|
enum_unknown_error[name] = unknown_error
|
|
enum_help[name] = $3
|
|
n_enums++
|
|
}
|
|
else if ($1 == "EnumValue") {
|
|
props = $2
|
|
enum_name = opt_args_non_empty("Enum", props)
|
|
string = opt_args_non_empty("String", props)
|
|
value = opt_args_non_empty("Value", props)
|
|
val_flags = "0"
|
|
val_flags = val_flags \
|
|
test_flag("Canonical", props, "| CL_ENUM_CANONICAL") \
|
|
test_flag("DriverOnly", props, "| CL_ENUM_DRIVER_ONLY")
|
|
enum_data[enum_name] = enum_data[enum_name] \
|
|
" { " quote string quote ", " value ", " val_flags \
|
|
" },\n"
|
|
}
|
|
else {
|
|
name = opt_args("Mask", $1)
|
|
if (name == "") {
|
|
opts[n_opts] = $1
|
|
opt_numbers[$1] = n_opts
|
|
flags[n_opts] = $2
|
|
help[n_opts] = $3
|
|
for (i = 4; i <= NF; i++)
|
|
help[n_opts] = help[n_opts] " " $i
|
|
n_opts++;
|
|
}
|
|
else {
|
|
extra_masks[n_extra_masks++] = name
|
|
}
|
|
}
|
|
}
|
|
|