Skip to content

Commit

Permalink
PR debug/82837
Browse files Browse the repository at this point in the history
	* 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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@254561 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
jakub committed Nov 9, 2017
1 parent 37db795 commit f5f219f
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 5 deletions.
7 changes: 7 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
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>

* config/i386/i386.opt: Add -mforce-indirect-call.
Expand Down
38 changes: 33 additions & 5 deletions gcc/dwarf2out.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}

Expand Down
5 changes: 5 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
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>

* gcc.target/i386/force-indirect-call-1.c: New test.
Expand Down
29 changes: 29 additions & 0 deletions gcc/testsuite/gcc.dg/debug/dwarf2/pr82837.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/* 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++;
}

0 comments on commit f5f219f

Please sign in to comment.