public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-503] Do not use DW_OP_not for TRUTH_NOT_EXPR in conditional expressions
@ 2022-05-16 9:05 Eric Botcazou
0 siblings, 0 replies; only message in thread
From: Eric Botcazou @ 2022-05-16 9:05 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:cc7cd8d57cabf2598a1c5f64dd77487c31b4d149
commit r13-503-gcc7cd8d57cabf2598a1c5f64dd77487c31b4d149
Author: Eric Botcazou <ebotcazou@adacore.com>
Date: Mon May 16 10:44:09 2022 +0200
Do not use DW_OP_not for TRUTH_NOT_EXPR in conditional expressions
DW_OP_not is a bitwise, not a logical NOT, so it computes the wrong result
in a DWARF conditional expression.
gcc/
* dwarf2out.cc (loc_list_from_tree_1) <TRUTH_NOT_EXPR>: Do a logical
instead of a bitwise negation.
<COND_EXPR>: Swap the operands if the condition is TRUTH_NOT_EXPR.
Diff:
---
gcc/dwarf2out.cc | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
index 4ef644c5fae..fccf59e8ec3 100644
--- a/gcc/dwarf2out.cc
+++ b/gcc/dwarf2out.cc
@@ -19448,6 +19448,14 @@ loc_list_from_tree_1 (tree loc, int want_address,
break;
case TRUTH_NOT_EXPR:
+ list_ret = loc_list_from_tree_1 (TREE_OPERAND (loc, 0), 0, context);
+ if (list_ret == 0)
+ return 0;
+
+ add_loc_descr_to_each (list_ret, new_loc_descr (DW_OP_lit0, 0, 0));
+ add_loc_descr_to_each (list_ret, new_loc_descr (DW_OP_eq, 0, 0));
+ break;
+
case BIT_NOT_EXPR:
op = DW_OP_not;
goto do_unop;
@@ -19496,6 +19504,15 @@ loc_list_from_tree_1 (tree loc, int want_address,
list_ret
= loc_list_from_tree_1 (TREE_OPERAND (TREE_OPERAND (loc, 0), 0),
0, context);
+ /* Likewise, swap the operands for a logically negated condition. */
+ else if (TREE_CODE (TREE_OPERAND (loc, 0)) == TRUTH_NOT_EXPR)
+ {
+ lhs = loc_descriptor_from_tree (TREE_OPERAND (loc, 2), 0, context);
+ rhs = loc_list_from_tree_1 (TREE_OPERAND (loc, 1), 0, context);
+ list_ret
+ = loc_list_from_tree_1 (TREE_OPERAND (TREE_OPERAND (loc, 0), 0),
+ 0, context);
+ }
else
list_ret = loc_list_from_tree_1 (TREE_OPERAND (loc, 0), 0, context);
if (list_ret == 0 || lhs == 0 || rhs == 0)
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-05-16 9:05 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-16 9:05 [gcc r13-503] Do not use DW_OP_not for TRUTH_NOT_EXPR in conditional expressions Eric Botcazou
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).