public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Alexandre Oliva <aoliva@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testme)] avoid early reference to debug-only symbol Date: Mon, 28 Jun 2021 15:42:43 +0000 (GMT) [thread overview] Message-ID: <20210628154243.616883987974@sourceware.org> (raw) https://gcc.gnu.org/g:15a15d0d27afe203b98dbb9f3bd1633221c0bc73 commit 15a15d0d27afe203b98dbb9f3bd1633221c0bc73 Author: Alexandre Oliva <oliva@adacore.com> Date: Mon Jun 28 12:40:33 2021 -0300 avoid early reference to debug-only symbol If some IPA pass replaces the only reference to a constant non-public non-automatic variable with its initializer, namely the address of another such variable, the former becomes unreferenced and it's discarded by symbol_table::remove_unreachable_nodes. It calls debug_hooks->late_global_decl while at that, and this expands the initializer, which assigs RTL to the latter variable and forces it to be retained by remove_unreferenced_decls, and eventually be output despite not being referenced. Without debug information, it's not output. This has caused a bootstrap-debug compare failure in libdecnumber/decContext.o, while developing a transformation that ends up enabling the above substitution in constprop. This patch makes reference_to_unused slightly more conservative about such variables at the end of IPA passes, falling back onto expand_debug_expr for expressions referencing symbols that might or might not be output, avoiding the loss of debug information when the symbol is output, while avoiding a symbol output only because of debug info. Diff: --- gcc/cfgexpand.c | 4 +--- gcc/dwarf2out.c | 12 +++++++++++- gcc/expr.h | 2 ++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 3edd53c37dc..6e629669148 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -91,8 +91,6 @@ struct ssaexpand SA; of comminucating the profile info to the builtin expanders. */ gimple *currently_expanding_gimple_stmt; -static rtx expand_debug_expr (tree); - static bool defer_stack_allocation (tree, bool); static void record_alignment_for_reg_var (unsigned int); @@ -4413,7 +4411,7 @@ expand_debug_parm_decl (tree decl) /* Return an RTX equivalent to the value of the tree expression EXP. */ -static rtx +rtx expand_debug_expr (tree exp) { rtx op0 = NULL_RTX, op1 = NULL_RTX, op2 = NULL_RTX; diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 9a91981acb0..65b0bd6fe24 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -20255,6 +20255,12 @@ reference_to_unused (tree * tp, int * walk_subtrees, varpool_node *node = varpool_node::get (*tp); if (!node || !node->definition) return *tp; + /* If it's local, it might still be optimized out, unless we've + already committed to outputting it by assigning RTL to it. */ + if (! TREE_PUBLIC (*tp) && ! TREE_ASM_WRITTEN (*tp) + && symtab->state <= IPA_SSA_AFTER_INLINING + && ! DECL_RTL_SET_P (*tp)) + return *tp; } else if (TREE_CODE (*tp) == FUNCTION_DECL && (!DECL_EXTERNAL (*tp) || DECL_DECLARED_INLINE_P (*tp))) @@ -20279,6 +20285,7 @@ static rtx rtl_for_decl_init (tree init, tree type) { rtx rtl = NULL_RTX; + bool valid_p = false; STRIP_NOPS (init); @@ -20322,7 +20329,7 @@ rtl_for_decl_init (tree init, tree type) /* If the initializer is something that we know will expand into an immediate RTL constant, expand it now. We must be careful not to reference variables which won't be output. */ - else if (initializer_constant_valid_p (init, type) + else if ((valid_p = initializer_constant_valid_p (init, type)) && ! walk_tree (&init, reference_to_unused, NULL, NULL)) { /* Convert vector CONSTRUCTOR initializers to VECTOR_CST if @@ -20367,6 +20374,9 @@ rtl_for_decl_init (tree init, tree type) /* If expand_expr returns a MEM, it wasn't immediate. */ gcc_assert (!rtl || !MEM_P (rtl)); } + else if (valid_p) + /* Perhaps we could just use this and skip all of the above? */ + rtl = expand_debug_expr (init); return rtl; } diff --git a/gcc/expr.h b/gcc/expr.h index a4f44265759..7b060462020 100644 --- a/gcc/expr.h +++ b/gcc/expr.h @@ -307,6 +307,8 @@ expand_normal (tree exp) return expand_expr_real (exp, NULL_RTX, VOIDmode, EXPAND_NORMAL, NULL, false); } +/* This one is defined in cfgexpand.c. */ +extern rtx expand_debug_expr (tree); /* Return STRING_CST and set offset, size and decl, if the first argument corresponds to a string constant. */
next reply other threads:[~2021-06-28 15:42 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-06-28 15:42 Alexandre Oliva [this message] 2021-06-30 4:16 Alexandre Oliva 2021-07-10 0:08 Alexandre Oliva 2021-07-10 9:43 Alexandre Oliva
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210628154243.616883987974@sourceware.org \ --to=aoliva@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).