Commit 6bc322a1 by Jakub Jelinek Committed by Jakub Jelinek

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
parent e7c77c4f
2017-11-09 Jakub Jelinek <jakub@redhat.com>
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.
2017-11-08 Andi Kleen <ak@linux.intel.com> 2017-11-08 Andi Kleen <ak@linux.intel.com>
* config/i386/i386.opt: Add -mforce-indirect-call. * config/i386/i386.opt: Add -mforce-indirect-call.
...@@ -13783,10 +13783,14 @@ const_ok_for_output_1 (rtx rtl) ...@@ -13783,10 +13783,14 @@ const_ok_for_output_1 (rtx rtl)
We should really identify / validate expressions We should really identify / validate expressions
enclosed in CONST that can be handled by assemblers on various enclosed in CONST that can be handled by assemblers on various
targets and only handle legitimate cases here. */ targets and only handle legitimate cases here. */
if (GET_CODE (rtl) != SYMBOL_REF) switch (GET_CODE (rtl))
{ {
if (GET_CODE (rtl) == NOT) case SYMBOL_REF:
break;
case NOT:
case NEG:
return false; return false;
default:
return true; return true;
} }
...@@ -14959,10 +14963,34 @@ mem_loc_descriptor (rtx rtl, machine_mode mode, ...@@ -14959,10 +14963,34 @@ mem_loc_descriptor (rtx rtl, machine_mode mode,
if (!const_ok_for_output (rtl)) if (!const_ok_for_output (rtl))
{ {
if (GET_CODE (rtl) == CONST) if (GET_CODE (rtl) == CONST)
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_loc_result = mem_loc_descriptor (XEXP (rtl, 0), int_mode,
mem_mode, initialized); mem_mode, initialized);
break; break;
} }
break;
}
symref: symref:
mem_loc_result = new_addr_loc_descr (rtl, dtprel_false); mem_loc_result = new_addr_loc_descr (rtl, dtprel_false);
......
2017-11-09 Jakub Jelinek <jakub@redhat.com>
PR debug/82837
* gcc.dg/debug/dwarf2/pr82837.c: New test.
2017-11-08 Andi Kleen <ak@linux.intel.com> 2017-11-08 Andi Kleen <ak@linux.intel.com>
* gcc.target/i386/force-indirect-call-1.c: New test. * gcc.target/i386/force-indirect-call-1.c: New test.
......
/* PR debug/82837 */
/* { dg-do compile } */
/* { dg-options "-O2 -g" } */
/* { dg-additional-options "-march=athlon" { target ia32 } } */
/* { dg-additional-options "-fPIE" { target pie } } */
static char b[100];
static int *c;
char *e;
void a(char *f, char *i) {
int d = __builtin_object_size(f, 1);
__builtin___strcpy_chk(f, i, d);
}
void g(void) {
int h;
switch (*c) {
case 8:
e = "swapgs";
break;
case 9:
e = "rdtscp";
break;
default:
return;
}
h = __builtin_strlen(b);
a(b + h - 6, e);
c++;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment