aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-07-21 10:50:57 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2010-07-21 10:50:57 +0200
commit370ae5992fa38d0161157ce8b237174d220054bf (patch)
treeb6a2b0a3ebd043807579644d37d17ec082758093 /gcc
parenta431e913309586a8b284a30bcee0d5c3ece1f991 (diff)
downloadgcc-370ae5992fa38d0161157ce8b237174d220054bf.zip
gcc-370ae5992fa38d0161157ce8b237174d220054bf.tar.gz
gcc-370ae5992fa38d0161157ce8b237174d220054bf.tar.bz2
re PR debug/45003 (VTA issues with sign/zero extension and debug temporaries)
PR debug/45003 * var-tracking.c (reverse_op): Also handle {SIGN,ZERO}_EXTEND of a MEM. * dwarf2out.c (loc_descriptor): Don't handle SIGN_EXTEND nor ZERO_EXTEND here. * gcc.dg/guality/pr45003-2.c: New test. * gcc.dg/guality/pr45003-3.c: New test. From-SVN: r162364
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/dwarf2out.c5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr45003-2.c31
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr45003-3.c31
-rw-r--r--gcc/var-tracking.c9
6 files changed, 80 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 59ca430..2d70233 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2010-07-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/45003
+ * var-tracking.c (reverse_op): Also handle {SIGN,ZERO}_EXTEND of
+ a MEM.
+ * dwarf2out.c (loc_descriptor): Don't handle SIGN_EXTEND nor
+ ZERO_EXTEND here.
+
2010-07-20 Richard Henderson <rth@redhat.com>
* vxworks.c (vxworks_emutls_var_fields): Pass locus to build_decls.
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 385d5da..ce35c91 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -14254,11 +14254,6 @@ loc_descriptor (rtx rtl, enum machine_mode mode,
loc_result = reg_loc_descriptor (rtl, initialized);
break;
- case SIGN_EXTEND:
- case ZERO_EXTEND:
- loc_result = loc_descriptor (XEXP (rtl, 0), mode, initialized);
- break;
-
case MEM:
loc_result = mem_loc_descriptor (XEXP (rtl, 0), GET_MODE (rtl),
initialized);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e0e4936..3cac7383 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -2,6 +2,10 @@
* gcc.dg/guality/asm-1.c: New test.
+ PR debug/45003
+ * gcc.dg/guality/pr45003-2.c: New test.
+ * gcc.dg/guality/pr45003-3.c: New test.
+
2010-07-20 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/44697
diff --git a/gcc/testsuite/gcc.dg/guality/pr45003-2.c b/gcc/testsuite/gcc.dg/guality/pr45003-2.c
new file mode 100644
index 0000000..dcdba23
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/guality/pr45003-2.c
@@ -0,0 +1,31 @@
+/* PR debug/45003 */
+/* { dg-do run { target { x86_64-*-* && lp64 } } } */
+/* { dg-options "-g" } */
+
+int __attribute__((noinline))
+foo (unsigned short *p)
+{
+ int a = *p;
+ asm volatile ("nop" : : "D" ((int) *p));
+ asm volatile ("nop" : : "D" ((int) *p)); /* { dg-final { gdb-test 10 "a" "0x8078" } } */
+ return 0;
+}
+
+int __attribute__((noinline))
+bar (short *p)
+{
+ unsigned int a = *p;
+ asm volatile ("nop" : : "D" ((unsigned int) *p));
+ asm volatile ("nop" : : "D" ((unsigned int) *p)); /* { dg-final { gdb-test 19 "a" "0xffff8078" } } */
+ return 0;
+}
+
+int
+main ()
+{
+ unsigned short us = 0x8078;
+ foo (&us);
+ short s = -32648;
+ bar (&s);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/guality/pr45003-3.c b/gcc/testsuite/gcc.dg/guality/pr45003-3.c
new file mode 100644
index 0000000..3adc4f2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/guality/pr45003-3.c
@@ -0,0 +1,31 @@
+/* PR debug/45003 */
+/* { dg-do run { target { x86_64-*-* && lp64 } } } */
+/* { dg-options "-g" } */
+
+int __attribute__((noinline))
+foo (unsigned short *p)
+{
+ int a = (short) *p;
+ asm volatile ("nop" : : "D" ((int) *p));
+ asm volatile ("nop" : : "D" ((int) *p)); /* { dg-final { gdb-test 10 "a" "-32648" } } */
+ return 0;
+}
+
+int __attribute__((noinline))
+bar (short *p)
+{
+ unsigned int a = (unsigned short) *p;
+ asm volatile ("nop" : : "D" ((unsigned int) *p));
+ asm volatile ("nop" : : "D" ((unsigned int) *p)); /* { dg-final { gdb-test 19 "a" "0x8078" } } */
+ return 0;
+}
+
+int
+main ()
+{
+ unsigned short us = 0x8078;
+ foo (&us);
+ short s = -32648;
+ bar (&s);
+ return 0;
+}
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index e13f340..d1c584a 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -5187,16 +5187,19 @@ reverse_op (rtx val, const_rtx expr)
case XOR:
case NOT:
case NEG:
+ if (!REG_P (XEXP (src, 0)))
+ return NULL_RTX;
+ break;
case SIGN_EXTEND:
case ZERO_EXTEND:
+ if (!REG_P (XEXP (src, 0)) && !MEM_P (XEXP (src, 0)))
+ return NULL_RTX;
break;
default:
return NULL_RTX;
}
- if (!REG_P (XEXP (src, 0))
- || !SCALAR_INT_MODE_P (GET_MODE (src))
- || XEXP (src, 0) == cfa_base_rtx)
+ if (!SCALAR_INT_MODE_P (GET_MODE (src)) || XEXP (src, 0) == cfa_base_rtx)
return NULL_RTX;
v = cselib_lookup (XEXP (src, 0), GET_MODE (XEXP (src, 0)), 0);