diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-11-09 09:54:19 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-11-09 09:54:19 +0100 |
commit | 6bc322a11bec51aceb463fb2336198645dca993f (patch) | |
tree | 8ca86eec5904dd459014b877b1bc6b7d7aa43bd9 /gcc/dwarf2out.c | |
parent | e7c77c4f12100602e078cee454b8d0e7433c2660 (diff) | |
download | gcc-6bc322a11bec51aceb463fb2336198645dca993f.zip gcc-6bc322a11bec51aceb463fb2336198645dca993f.tar.gz gcc-6bc322a11bec51aceb463fb2336198645dca993f.tar.bz2 |
re PR debug/82837 (ICE in output_operand: invalid expression as operand)
PR debug/82837
* dwarf2out.c (const_ok_for_output_1): Reject NEG in addition to NOT.
(mem_loc_descriptor): Handle (const (neg (...))) as (neg (const (...)))
and similarly for not instead of neg.
* gcc.dg/debug/dwarf2/pr82837.c: New test.
From-SVN: r254561
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index f396997..b8f4e48 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -13783,10 +13783,14 @@ const_ok_for_output_1 (rtx rtl) We should really identify / validate expressions enclosed in CONST that can be handled by assemblers on various targets and only handle legitimate cases here. */ - if (GET_CODE (rtl) != SYMBOL_REF) + switch (GET_CODE (rtl)) { - if (GET_CODE (rtl) == NOT) - return false; + case SYMBOL_REF: + break; + case NOT: + case NEG: + return false; + default: return true; } @@ -14959,8 +14963,32 @@ mem_loc_descriptor (rtx rtl, machine_mode mode, if (!const_ok_for_output (rtl)) { if (GET_CODE (rtl) == CONST) - mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), int_mode, - mem_mode, initialized); + switch (GET_CODE (XEXP (rtl, 0))) + { + case NOT: + op = DW_OP_not; + goto try_const_unop; + case NEG: + op = DW_OP_neg; + goto try_const_unop; + try_const_unop: + rtx arg; + arg = XEXP (XEXP (rtl, 0), 0); + if (!CONSTANT_P (arg)) + arg = gen_rtx_CONST (int_mode, arg); + op0 = mem_loc_descriptor (arg, int_mode, mem_mode, + initialized); + if (op0) + { + mem_loc_result = op0; + add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0)); + } + break; + default: + mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), int_mode, + mem_mode, initialized); + break; + } break; } |