From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1851) id 04DE83858001; Thu, 7 Oct 2021 15:55:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 04DE83858001 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Martin Liska To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/marxin/heads/PR102585-var-tracking-options-fix)] options: Fix variable tracking option processing. X-Act-Checkin: gcc X-Git-Author: Martin Liska X-Git-Refname: refs/users/marxin/heads/PR102585-var-tracking-options-fix X-Git-Oldrev: 2e6e0d86a06389056d0e7fecc99c547420ad787a X-Git-Newrev: 878bf365f9f85cdca6a0455e8485be82295b0539 Message-Id: <20211007155523.04DE83858001@sourceware.org> Date: Thu, 7 Oct 2021 15:55:23 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 Oct 2021 15:55:23 -0000 https://gcc.gnu.org/g:878bf365f9f85cdca6a0455e8485be82295b0539 commit 878bf365f9f85cdca6a0455e8485be82295b0539 Author: Martin Liska Date: Thu Oct 7 17:01:23 2021 +0200 options: Fix variable tracking option processing. PR debug/102585 gcc/ChangeLog: * common.opt: Do not init flag_var_tracking* options. * opts.c (finish_options): Handle flag_var_tracking* options. * opts.h (OPTION_SET_P): New macro. * toplev.c (process_options): Move to opts.c. * tree.c (cl_option_hasher::hash): Use a proper hash function for cl_optimization nodes. gcc/testsuite/ChangeLog: * gcc.dg/pr102585.c: New test. Diff: --- gcc/common.opt | 14 +++++--------- gcc/opts.c | 29 +++++++++++++++++++++++++++++ gcc/opts.h | 2 ++ gcc/testsuite/gcc.dg/pr102585.c | 6 ++++++ gcc/toplev.c | 33 +++------------------------------ gcc/tree.c | 19 +------------------ 6 files changed, 46 insertions(+), 57 deletions(-) diff --git a/gcc/common.opt b/gcc/common.opt index a9644cae4f0..4f0b6c84162 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -3003,19 +3003,16 @@ Common Undocumented Var(flag_use_linker_plugin) ; Positive if we should track variables, negative if we should run ; the var-tracking pass only to discard debug annotations, zero if -; we're not to run it. When flag_var_tracking == 2 (AUTODETECT_VALUE) it -; will be set according to optimize, debug_info_level and debug_hooks -; in process_options (). +; we're not to run it. fvar-tracking -Common Var(flag_var_tracking) Init(2) PerFunction +Common Var(flag_var_tracking) PerFunction Perform variable tracking. ; Positive if we should track variables at assignments, negative if ; we should run the var-tracking pass only to discard debug -; annotations. When flag_var_tracking_assignments == -; AUTODETECT_VALUE it will be set according to flag_var_tracking. +; annotations. fvar-tracking-assignments -Common Var(flag_var_tracking_assignments) Init(2) PerFunction +Common Var(flag_var_tracking_assignments) PerFunction Perform variable tracking by annotating assignments. ; Nonzero if we should toggle flag_var_tracking_assignments after @@ -3026,8 +3023,7 @@ Toggle -fvar-tracking-assignments. ; Positive if we should track uninitialized variables, negative if ; we should run the var-tracking pass only to discard debug -; annotations. When flag_var_tracking_uninit == AUTODETECT_VALUE it -; will be set according to flag_var_tracking. +; annotations. fvar-tracking-uninit Common Var(flag_var_tracking_uninit) PerFunction Perform variable tracking and also tag variables that are uninitialized. diff --git a/gcc/opts.c b/gcc/opts.c index 6503980cd33..78c594ff320 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1343,6 +1343,35 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set, opts->x_flag_complex_method = 1; else if (opts_set->x_flag_cx_fortran_rules) opts->x_flag_complex_method = opts->x_flag_default_complex_method; + + /* If the user specifically requested variable tracking with tagging + uninitialized variables, we need to turn on variable tracking. + (We already determined above that variable tracking is feasible.) */ + if (opts->x_flag_var_tracking_uninit == 1) + opts->x_flag_var_tracking = 1; + + if (!opts_set->x_flag_var_tracking) + opts->x_flag_var_tracking = optimize >= 1; + + if (!opts_set->x_flag_var_tracking_uninit) + opts->x_flag_var_tracking_uninit = opts->x_flag_var_tracking; + + if (!opts_set->x_flag_var_tracking_assignments) + opts->x_flag_var_tracking_assignments + = (opts->x_flag_var_tracking + && !(opts->x_flag_selective_scheduling + || opts->x_flag_selective_scheduling2)); + + if (opts->x_flag_var_tracking_assignments_toggle) + opts->x_flag_var_tracking_assignments = !opts->x_flag_var_tracking_assignments; + + if (opts->x_flag_var_tracking_assignments && !opts->x_flag_var_tracking) + opts->x_flag_var_tracking = opts->x_flag_var_tracking_assignments = -1; + + if (opts->x_flag_var_tracking_assignments + && (opts->x_flag_selective_scheduling || opts->x_flag_selective_scheduling2)) + warning_at (loc, 0, + "var-tracking-assignments changes selective scheduling"); } #define LEFT_COLUMN 27 diff --git a/gcc/opts.h b/gcc/opts.h index bafc790112b..e00f0054419 100644 --- a/gcc/opts.h +++ b/gcc/opts.h @@ -500,4 +500,6 @@ extern char *gen_producer_string (const char *language_string, } \ while (false) +#define OPTION_SET_P(OPTION) global_options_set.x_ ## OPTION + #endif diff --git a/gcc/testsuite/gcc.dg/pr102585.c b/gcc/testsuite/gcc.dg/pr102585.c new file mode 100644 index 00000000000..efd066b4a4e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr102585.c @@ -0,0 +1,6 @@ +/* PR debug/102585 */ +/* { dg-do compile } */ +/* { dg-options "-fvar-tracking-assignments -fno-var-tracking" } */ + +#pragma GCC optimize 0 +void d_demangle_callback_Og() { int c = 0; } diff --git a/gcc/toplev.c b/gcc/toplev.c index ecb2b694970..a4ed940e010 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1488,8 +1488,8 @@ process_options (bool no_backend) || !dwarf_debuginfo_p () || debug_hooks->var_location == do_nothing_debug_hooks.var_location) { - if (flag_var_tracking == 1 - || flag_var_tracking_uninit == 1) + if ((OPTION_SET_P (flag_var_tracking) && flag_var_tracking == 1) + || (OPTION_SET_P (flag_var_tracking_uninit) && flag_var_tracking_uninit == 1)) { if (debug_info_level < DINFO_LEVEL_NORMAL) warning_at (UNKNOWN_LOCATION, 0, @@ -1502,6 +1502,7 @@ process_options (bool no_backend) } flag_var_tracking = 0; flag_var_tracking_uninit = 0; + flag_var_tracking_assignments = 0; } /* The debug hooks are used to implement -fdump-go-spec because it @@ -1510,34 +1511,6 @@ process_options (bool no_backend) if (flag_dump_go_spec != NULL) debug_hooks = dump_go_spec_init (flag_dump_go_spec, debug_hooks); - /* If the user specifically requested variable tracking with tagging - uninitialized variables, we need to turn on variable tracking. - (We already determined above that variable tracking is feasible.) */ - if (flag_var_tracking_uninit == 1) - flag_var_tracking = 1; - - if (flag_var_tracking == AUTODETECT_VALUE) - flag_var_tracking = optimize >= 1; - - if (flag_var_tracking_uninit == AUTODETECT_VALUE) - flag_var_tracking_uninit = flag_var_tracking; - - if (flag_var_tracking_assignments == AUTODETECT_VALUE) - flag_var_tracking_assignments - = (flag_var_tracking - && !(flag_selective_scheduling || flag_selective_scheduling2)); - - if (flag_var_tracking_assignments_toggle) - flag_var_tracking_assignments = !flag_var_tracking_assignments; - - if (flag_var_tracking_assignments && !flag_var_tracking) - flag_var_tracking = flag_var_tracking_assignments = -1; - - if (flag_var_tracking_assignments - && (flag_selective_scheduling || flag_selective_scheduling2)) - warning_at (UNKNOWN_LOCATION, 0, - "var-tracking-assignments changes selective scheduling"); - if (debug_nonbind_markers_p == AUTODETECT_VALUE) debug_nonbind_markers_p = (optimize diff --git a/gcc/tree.c b/gcc/tree.c index 561b9cd56bd..7bfd64160f4 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -11473,30 +11473,13 @@ hashval_t cl_option_hasher::hash (tree x) { const_tree const t = x; - const char *p; - size_t i; - size_t len = 0; - hashval_t hash = 0; if (TREE_CODE (t) == OPTIMIZATION_NODE) - { - p = (const char *)TREE_OPTIMIZATION (t); - len = sizeof (struct cl_optimization); - } - + return cl_optimization_hash (TREE_OPTIMIZATION (t)); else if (TREE_CODE (t) == TARGET_OPTION_NODE) return cl_target_option_hash (TREE_TARGET_OPTION (t)); - else gcc_unreachable (); - - /* assume most opt flags are just 0/1, some are 2-3, and a few might be - something else. */ - for (i = 0; i < len; i++) - if (p[i]) - hash = (hash << 4) ^ ((i << 2) | p[i]); - - return hash; } /* Return nonzero if the value represented by *X (an OPTIMIZATION or