public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/aoliva/heads/hard12)] avoid early reference to debug-only symbol
@ 2022-05-06 8:38 Alexandre Oliva
0 siblings, 0 replies; only message in thread
From: Alexandre Oliva @ 2022-05-06 8:38 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:310e96d43803ec7e3a1224dff70d5d7169cb85da
commit 310e96d43803ec7e3a1224dff70d5d7169cb85da
Author: Alexandre Oliva <oliva@adacore.com>
Date: Fri May 6 05:34:59 2022 -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.
for gcc/ChangeLog
* dwarf2out.c (add_const_value_attribute): Return false if
resolve_one_addr fails.
(reference_to_unused): Don't assume local symbol presence
while it can still be optimized out.
(rtl_for_decl_init): Fallback to expand_debug_expr.
* cfgexpand.c (expand_debug_expr): Export.
* expr.h (expand_debug_expr): Declare.
Diff:
---
gcc/cfgexpand.cc | 12 +++++++++---
gcc/dwarf2out.cc | 15 +++++++++++++--
gcc/expr.h | 2 ++
3 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc
index d3cc77d2ca9..b4c5aa7eba5 100644
--- a/gcc/cfgexpand.cc
+++ b/gcc/cfgexpand.cc
@@ -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);
@@ -4402,7 +4400,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;
@@ -5274,6 +5272,14 @@ expand_debug_expr (tree exp)
else
goto flag_unsupported;
+ case COMPOUND_LITERAL_EXPR:
+ exp = COMPOUND_LITERAL_EXPR_DECL_EXPR (exp);
+ /* DECL_EXPR is a tcc_statement, which expand_debug_expr does
+ not expect, so instead of recursing we take care of it right
+ away. */
+ exp = DECL_EXPR_DECL (exp);
+ return expand_debug_expr (exp);
+
case CALL_EXPR:
/* ??? Maybe handle some builtins? */
return NULL;
diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
index 5681b01749a..59d5508fafd 100644
--- a/gcc/dwarf2out.cc
+++ b/gcc/dwarf2out.cc
@@ -20294,7 +20294,8 @@ add_const_value_attribute (dw_die_ref die, machine_mode mode, rtx rtl)
if (dwarf_version >= 4 || !dwarf_strict)
{
dw_loc_descr_ref loc_result;
- resolve_one_addr (&rtl);
+ if (!resolve_one_addr (&rtl))
+ return false;
rtl_addr:
loc_result = new_addr_loc_descr (rtl, dtprel_false);
add_loc_descr (&loc_result, new_loc_descr (DW_OP_stack_value, 0, 0));
@@ -20378,6 +20379,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)))
@@ -20402,6 +20409,7 @@ static rtx
rtl_for_decl_init (tree init, tree type)
{
rtx rtl = NULL_RTX;
+ bool valid_p = false;
STRIP_NOPS (init);
@@ -20448,7 +20456,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
@@ -20493,6 +20501,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 7e5cf495a2b..e8246d87457 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. */
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-05-06 8:38 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-06 8:38 [gcc(refs/users/aoliva/heads/hard12)] avoid early reference to debug-only symbol Alexandre Oliva
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).