Commit f5d30aa6 by Jakub Jelinek Committed by Jakub Jelinek

re PR debug/36728 ([stack]: gdb doesn't work with stack alignment)

	PR debug/36728
	PR debug/55467
	PR middle-end/55507
	PR bootstrap/55511
	* cselib.c (cselib_process_insn): If cselib_preserve_constants,
	don't reset table and exit early on volatile insns and setjmp.
	Reset table afterwards on setjmp.

	* gcc.dg/guality/pr36728-1.c: Include "../nop.h", make sure the asm
	are non-empty and add dependency between the first and second asm.
	* gcc.dg/guality/pr36728-2.c: Likewise.
	* gcc.dg/guality/pr36728-3.c: New test.
	* gcc.dg/guality/pr36728-4.c: New test.

From-SVN: r193911
parent 5d99894e
2012-11-28 Jakub Jelinek <jakub@redhat.com>
PR debug/36728
PR debug/55467
PR middle-end/55507
PR bootstrap/55511
* cselib.c (cselib_process_insn): If cselib_preserve_constants,
don't reset table and exit early on volatile insns and setjmp.
Reset table afterwards on setjmp.
2012-11-28 Andrew Pinski <apinski@cavium.com> 2012-11-28 Andrew Pinski <apinski@cavium.com>
PR bootstrap/54279 PR bootstrap/54279
...@@ -2626,11 +2626,12 @@ cselib_process_insn (rtx insn) ...@@ -2626,11 +2626,12 @@ cselib_process_insn (rtx insn)
cselib_current_insn = insn; cselib_current_insn = insn;
/* Forget everything at a CODE_LABEL, a volatile insn, or a setjmp. */ /* Forget everything at a CODE_LABEL, a volatile insn, or a setjmp. */
if (LABEL_P (insn) if ((LABEL_P (insn)
|| (CALL_P (insn) || (CALL_P (insn)
&& find_reg_note (insn, REG_SETJMP, NULL)) && find_reg_note (insn, REG_SETJMP, NULL))
|| (NONJUMP_INSN_P (insn) || (NONJUMP_INSN_P (insn)
&& volatile_insn_p (PATTERN (insn)))) && volatile_insn_p (PATTERN (insn))))
&& !cselib_preserve_constants)
{ {
cselib_reset_table (next_uid); cselib_reset_table (next_uid);
cselib_current_insn = NULL_RTX; cselib_current_insn = NULL_RTX;
...@@ -2668,9 +2669,18 @@ cselib_process_insn (rtx insn) ...@@ -2668,9 +2669,18 @@ cselib_process_insn (rtx insn)
/* Look for any CLOBBERs in CALL_INSN_FUNCTION_USAGE, but only /* Look for any CLOBBERs in CALL_INSN_FUNCTION_USAGE, but only
after we have processed the insn. */ after we have processed the insn. */
if (CALL_P (insn)) if (CALL_P (insn))
for (x = CALL_INSN_FUNCTION_USAGE (insn); x; x = XEXP (x, 1)) {
if (GET_CODE (XEXP (x, 0)) == CLOBBER) for (x = CALL_INSN_FUNCTION_USAGE (insn); x; x = XEXP (x, 1))
cselib_invalidate_rtx (XEXP (XEXP (x, 0), 0)); if (GET_CODE (XEXP (x, 0)) == CLOBBER)
cselib_invalidate_rtx (XEXP (XEXP (x, 0), 0));
/* Flush evertything on setjmp. */
if (cselib_preserve_constants
&& find_reg_note (insn, REG_SETJMP, NULL))
{
cselib_preserve_only_values ();
cselib_reset_table (next_uid);
}
}
/* On setter of the hard frame pointer if frame_pointer_needed, /* On setter of the hard frame pointer if frame_pointer_needed,
invalidate stack_pointer_rtx, so that sp and {,h}fp based invalidate stack_pointer_rtx, so that sp and {,h}fp based
......
2012-11-28 Jakub Jelinek <jakub@redhat.com>
PR debug/36728
PR debug/55467
PR middle-end/55507
PR bootstrap/55511
* gcc.dg/guality/pr36728-1.c: Include "../nop.h", make sure the asm
are non-empty and add dependency between the first and second asm.
* gcc.dg/guality/pr36728-2.c: Likewise.
* gcc.dg/guality/pr36728-3.c: New test.
* gcc.dg/guality/pr36728-4.c: New test.
2012-11-28 Andrew Pinski <apinski@cavium.com> 2012-11-28 Andrew Pinski <apinski@cavium.com>
PR bootstrap/54279 PR bootstrap/54279
......
/* PR debug/36728 */ /* PR debug/36728 */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-options "-g" } */ /* { dg-options "-g" } */
int a;
#include "../nop.h"
int a, b;
int __attribute__((noinline)) int __attribute__((noinline))
foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7)
{ {
...@@ -9,9 +13,9 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) ...@@ -9,9 +13,9 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7)
int __attribute__ ((aligned(32))) y; int __attribute__ ((aligned(32))) y;
y = 2; y = 2;
asm ("" : "=m" (y) : "m" (y)); asm (NOP : "=m" (y), "=m" (b) : "m" (y));
x[0] = 25; x[0] = 25;
asm ("" : "=m" (x[0]), "=m" (a) : "m" (x[0])); asm (NOP : "=m" (x[0]), "=m" (a) : "m" (x[0]), "m" (b));
return y; return y;
} }
...@@ -21,23 +25,23 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) ...@@ -21,23 +25,23 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7)
and arg2. So it is expected that these values are unavailable in and arg2. So it is expected that these values are unavailable in
some of these tests. */ some of these tests. */
/* { dg-final { gdb-test 12 "arg1" "1" { target { ! "s390*-*-*" } } } }*/ /* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 12 "arg2" "2" { target { ! "s390*-*-*" } } } }*/ /* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 12 "arg3" "3" } } */ /* { dg-final { gdb-test 16 "arg3" "3" } } */
/* { dg-final { gdb-test 12 "arg4" "4" } } */ /* { dg-final { gdb-test 16 "arg4" "4" } } */
/* { dg-final { gdb-test 12 "arg5" "5" } } */ /* { dg-final { gdb-test 16 "arg5" "5" } } */
/* { dg-final { gdb-test 12 "arg6" "6" } } */ /* { dg-final { gdb-test 16 "arg6" "6" } } */
/* { dg-final { gdb-test 12 "arg7" "30" } } */ /* { dg-final { gdb-test 16 "arg7" "30" } } */
/* { dg-final { gdb-test 12 "y" "2" } } */ /* { dg-final { gdb-test 16 "y" "2" } } */
/* { dg-final { gdb-test 14 "arg1" "1" { target { ! "s390*-*-*" } } } }*/ /* { dg-final { gdb-test 18 "arg1" "1" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 14 "arg2" "2" { target { ! "s390*-*-*" } } } }*/ /* { dg-final { gdb-test 18 "arg2" "2" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 14 "arg3" "3" } } */ /* { dg-final { gdb-test 18 "arg3" "3" } } */
/* { dg-final { gdb-test 14 "arg4" "4" } } */ /* { dg-final { gdb-test 18 "arg4" "4" } } */
/* { dg-final { gdb-test 14 "arg5" "5" } } */ /* { dg-final { gdb-test 18 "arg5" "5" } } */
/* { dg-final { gdb-test 14 "arg6" "6" } } */ /* { dg-final { gdb-test 18 "arg6" "6" } } */
/* { dg-final { gdb-test 14 "arg7" "30" } } */ /* { dg-final { gdb-test 18 "arg7" "30" } } */
/* { dg-final { gdb-test 14 "*x" "(char) 25" } } */ /* { dg-final { gdb-test 18 "*x" "(char) 25" } } */
/* { dg-final { gdb-test 14 "y" "2" } } */ /* { dg-final { gdb-test 18 "y" "2" } } */
int int
main () main ()
......
/* PR debug/36728 */ /* PR debug/36728 */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-options "-g" } */ /* { dg-options "-g" } */
int a;
#include "../nop.h"
int a, b;
int __attribute__((noinline)) int __attribute__((noinline))
foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7)
{ {
...@@ -9,9 +13,9 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) ...@@ -9,9 +13,9 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7)
int __attribute__ ((aligned(32))) y; int __attribute__ ((aligned(32))) y;
y = 2; y = 2;
asm ("" : "=m" (y) : "m" (y)); asm (NOP : "=m" (y), "=m" (b) : "m" (y));
x[0] = 25; x[0] = 25;
asm ("" : "=m" (x[0]), "=m" (a) : "m" (x[0])); asm (NOP : "=m" (x[0]), "=m" (a) : "m" (x[0]), "m" (b));
return y; return y;
} }
...@@ -21,23 +25,23 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) ...@@ -21,23 +25,23 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7)
and arg2. So it is expected that these values are unavailable in and arg2. So it is expected that these values are unavailable in
some of these tests. */ some of these tests. */
/* { dg-final { gdb-test 12 "arg1" "1" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 12 "arg2" "2" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 12 "arg3" "3" } } */ /* { dg-final { gdb-test 16 "arg3" "3" } } */
/* { dg-final { gdb-test 12 "arg4" "4" } } */ /* { dg-final { gdb-test 16 "arg4" "4" } } */
/* { dg-final { gdb-test 12 "arg5" "5" } } */ /* { dg-final { gdb-test 16 "arg5" "5" } } */
/* { dg-final { gdb-test 12 "arg6" "6" } } */ /* { dg-final { gdb-test 16 "arg6" "6" } } */
/* { dg-final { gdb-test 12 "arg7" "30" } } */ /* { dg-final { gdb-test 16 "arg7" "30" } } */
/* { dg-final { gdb-test 12 "y" "2" } } */ /* { dg-final { gdb-test 16 "y" "2" } } */
/* { dg-final { gdb-test 14 "arg1" "1" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 18 "arg1" "1" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 14 "arg2" "2" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 18 "arg2" "2" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 14 "arg3" "3" } } */ /* { dg-final { gdb-test 18 "arg3" "3" } } */
/* { dg-final { gdb-test 14 "arg4" "4" } } */ /* { dg-final { gdb-test 18 "arg4" "4" } } */
/* { dg-final { gdb-test 14 "arg5" "5" } } */ /* { dg-final { gdb-test 18 "arg5" "5" } } */
/* { dg-final { gdb-test 14 "arg6" "6" } } */ /* { dg-final { gdb-test 18 "arg6" "6" } } */
/* { dg-final { gdb-test 14 "arg7" "30" } } */ /* { dg-final { gdb-test 18 "arg7" "30" } } */
/* { dg-final { gdb-test 14 "*x" "(char) 25" } } */ /* { dg-final { gdb-test 18 "*x" "(char) 25" } } */
/* { dg-final { gdb-test 14 "y" "2" } } */ /* { dg-final { gdb-test 18 "y" "2" } } */
int int
main () main ()
......
/* PR debug/36728 */
/* { dg-do run } */
/* { dg-options "-g" } */
#include "../nop.h"
int __attribute__((noinline))
foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7)
{
char *x = __builtin_alloca (arg7);
int __attribute__ ((aligned(32))) y;
y = 2;
asm (NOP : "=m" (y) : "m" (y));
x[0] = 25;
asm volatile (NOP : "=m" (x[0]) : "m" (x[0]));
return y;
}
/* On s390(x) r2 and r3 are (depending on the optimization level) used
when adjusting the addresses in order to meet the alignment
requirements above. They usually hold the function arguments arg1
and arg2. So it is expected that these values are unavailable in
some of these tests. */
/* { dg-final { gdb-test 14 "arg1" "1" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 14 "arg2" "2" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 14 "arg3" "3" } } */
/* { dg-final { gdb-test 14 "arg4" "4" } } */
/* { dg-final { gdb-test 14 "arg5" "5" } } */
/* { dg-final { gdb-test 14 "arg6" "6" } } */
/* { dg-final { gdb-test 14 "arg7" "30" } } */
/* { dg-final { gdb-test 14 "y" "2" } } */
/* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 16 "arg3" "3" } } */
/* { dg-final { gdb-test 16 "arg4" "4" } } */
/* { dg-final { gdb-test 16 "arg5" "5" } } */
/* { dg-final { gdb-test 16 "arg6" "6" } } */
/* { dg-final { gdb-test 16 "arg7" "30" } } */
/* { dg-final { gdb-test 16 "*x" "(char) 25" } } */
/* { dg-final { gdb-test 16 "y" "2" } } */
int
main ()
{
int l = 0;
asm volatile ("" : "=r" (l) : "0" (l));
foo (l + 1, l + 2, l + 3, l + 4, l + 5, l + 6, l + 30);
return 0;
}
/* PR debug/36728 */
/* { dg-do run } */
/* { dg-options "-g" } */
#include "../nop.h"
int __attribute__((noinline))
foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7)
{
char x[30];
int __attribute__ ((aligned(32))) y;
y = 2;
asm (NOP : "=m" (y) : "m" (y));
x[0] = 25;
asm volatile (NOP : "=m" (x[0]) : "m" (x[0]));
return y;
}
/* On s390(x) r2 and r3 are (depending on the optimization level) used
when adjusting the addresses in order to meet the alignment
requirements above. They usually hold the function arguments arg1
and arg2. So it is expected that these values are unavailable in
some of these tests. */
/* { dg-final { gdb-test 14 "arg1" "1" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 14 "arg2" "2" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 14 "arg3" "3" } } */
/* { dg-final { gdb-test 14 "arg4" "4" } } */
/* { dg-final { gdb-test 14 "arg5" "5" } } */
/* { dg-final { gdb-test 14 "arg6" "6" } } */
/* { dg-final { gdb-test 14 "arg7" "30" } } */
/* { dg-final { gdb-test 14 "y" "2" } } */
/* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 16 "arg3" "3" } } */
/* { dg-final { gdb-test 16 "arg4" "4" } } */
/* { dg-final { gdb-test 16 "arg5" "5" } } */
/* { dg-final { gdb-test 16 "arg6" "6" } } */
/* { dg-final { gdb-test 16 "arg7" "30" } } */
/* { dg-final { gdb-test 16 "*x" "(char) 25" } } */
/* { dg-final { gdb-test 16 "y" "2" } } */
int
main ()
{
int l = 0;
asm volatile ("" : "=r" (l) : "0" (l));
foo (l + 1, l + 2, l + 3, l + 4, l + 5, l + 6, l + 30);
return 0;
}
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