diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2022-05-16 10:44:09 +0200 |
---|---|---|
committer | Eric Botcazou <ebotcazou@adacore.com> | 2022-05-16 11:04:51 +0200 |
commit | cc7cd8d57cabf2598a1c5f64dd77487c31b4d149 (patch) | |
tree | 5cf40ef94c4346506f69af239f9eb5e6272a430c /gcc | |
parent | b90e43dbbb2ba00ef2f8b2468fb09b43a12ae13d (diff) | |
download | gcc-cc7cd8d57cabf2598a1c5f64dd77487c31b4d149.zip gcc-cc7cd8d57cabf2598a1c5f64dd77487c31b4d149.tar.gz gcc-cc7cd8d57cabf2598a1c5f64dd77487c31b4d149.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/dwarf2out.cc | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc index 4ef644c..fccf59e 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) |