re PR debug/54970 (Missing DW_OP_GNU_implicit_pointer in debuginfo)
authorJakub Jelinek <jakub@redhat.com>
Fri, 26 Oct 2012 19:19:25 +0000 (21:19 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 26 Oct 2012 19:19:25 +0000 (21:19 +0200)
PR debug/54970
* cfgexpand.c (expand_debug_expr): Expand &MEM_REF[&var, n]
as DEBUG_IMPLICIT_PTR + n if &var expands to DEBUG_IMPLICIT_PTR.
* tree-sra.c (create_access_replacement): Allow also MEM_REFs
with ADDR_EXPR first operand in DECL_DEBUG_EXPR expressions.
* var-tracking.c (track_expr_p): Handle MEM_REFs in DECL_DEBUG_EXPR
expressions.
* dwarf2out.c (add_var_loc_to_decl): Likewise.

PR debug/54971
* gcc.dg/guality/pr54970.c: New test.

From-SVN: r192860

gcc/ChangeLog
gcc/cfgexpand.c
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/guality/pr54970.c [new file with mode: 0644]
gcc/tree-sra.c
gcc/var-tracking.c

index 1f63b2e6dcdb8d5f70a7a3f3e0eaed1e137d44ca..7a048726de395980620491177e1e880d26360534 100644 (file)
@@ -1,3 +1,14 @@
+2012-10-26  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/54970
+       * cfgexpand.c (expand_debug_expr): Expand &MEM_REF[&var, n]
+       as DEBUG_IMPLICIT_PTR + n if &var expands to DEBUG_IMPLICIT_PTR.
+       * tree-sra.c (create_access_replacement): Allow also MEM_REFs
+       with ADDR_EXPR first operand in DECL_DEBUG_EXPR expressions.
+       * var-tracking.c (track_expr_p): Handle MEM_REFs in DECL_DEBUG_EXPR
+       expressions.
+       * dwarf2out.c (add_var_loc_to_decl): Likewise.
+
 2012-10-26  Jeff Law  <law@redhat.com>
 
        * tree-ssa-threadedge.c (cond_arg_set_in_bb): Use last stmt.
index 4ae1600d71cc18fd381123a43edd1d1be908ca09..ba86eb571eaf887b72f4b185ca21e1421e6b8b39 100644 (file)
@@ -3284,6 +3284,27 @@ expand_debug_expr (tree exp)
                }
            }
 
+         if (TREE_CODE (TREE_OPERAND (exp, 0)) == MEM_REF
+             && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
+                == ADDR_EXPR)
+           {
+             op0 = expand_debug_expr (TREE_OPERAND (TREE_OPERAND (exp, 0),
+                                                    0));
+             if (op0 != NULL
+                 && (GET_CODE (op0) == DEBUG_IMPLICIT_PTR
+                     || (GET_CODE (op0) == PLUS
+                         && GET_CODE (XEXP (op0, 0)) == DEBUG_IMPLICIT_PTR
+                         && CONST_INT_P (XEXP (op0, 1)))))
+               {
+                 op1 = expand_debug_expr (TREE_OPERAND (TREE_OPERAND (exp, 0),
+                                                        1));
+                 if (!op1 || !CONST_INT_P (op1))
+                   return NULL;
+
+                 return plus_constant (mode, op0, INTVAL (op1));
+               }
+           }
+
          return NULL;
        }
 
index 6442edd85f98b6a6a16ad6bbf9f3dc9e59e0b1e2..24c750656560945bacea66267fc95357c83a8452 100644 (file)
@@ -4622,7 +4622,10 @@ add_var_loc_to_decl (tree decl, rtx loc_note, const char *label)
   if (DECL_DEBUG_EXPR_IS_FROM (decl))
     {
       tree realdecl = DECL_DEBUG_EXPR (decl);
-      if (realdecl && handled_component_p (realdecl))
+      if (realdecl
+         && (handled_component_p (realdecl)
+             || (TREE_CODE (realdecl) == MEM_REF
+                 && TREE_CODE (TREE_OPERAND (realdecl, 0)) == ADDR_EXPR)))
        {
          HOST_WIDE_INT maxsize;
          tree innerdecl;
index 46750117ef36d5b33777b6b002ec5b573dde5433..b3b6facf1c658997f7f6f718c563aba247777d4c 100644 (file)
@@ -1,3 +1,9 @@
+2012-10-26  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/54970
+       PR debug/54971
+       * gcc.dg/guality/pr54970.c: New test.
+
 2012-10-26  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/54984
diff --git a/gcc/testsuite/gcc.dg/guality/pr54970.c b/gcc/testsuite/gcc.dg/guality/pr54970.c
new file mode 100644 (file)
index 0000000..bd940e3
--- /dev/null
@@ -0,0 +1,47 @@
+/* PR debug/54970 */
+/* PR debug/54971 */
+/* { dg-do run } */
+/* { dg-options "-g" } */
+
+#include "../nop.h"
+
+int
+main ()
+{
+  int a[] = { 1, 2, 3 };       /* { dg-final { gdb-test 15 "a\[0\]" "1" } } */
+  int *p = a + 2;              /* { dg-final { gdb-test 15 "a\[1\]" "2" } } */
+  int *q = a + 1;              /* { dg-final { gdb-test 15 "a\[2\]" "3" } } */
+                               /* { dg-final { gdb-test 15 "*p" "3" } } */
+  asm volatile ("NOP");                /* { dg-final { gdb-test 15 "*q" "2" } } */
+  *p += 10;                    /* { dg-final { gdb-test 20 "a\[0\]" "1" } } */
+                               /* { dg-final { gdb-test 20 "a\[1\]" "2" } } */
+                               /* { dg-final { gdb-test 20 "a\[2\]" "13" } } */
+                               /* { dg-final { gdb-test 20 "*p" "13" } } */
+  asm volatile ("NOP");                /* { dg-final { gdb-test 20 "*q" "2" } } */
+  *q += 10;                    /* { dg-final { gdb-test 25 "a\[0\]" "1" } } */
+                               /* { dg-final { gdb-test 25 "a\[1\]" "12" } } */
+                               /* { dg-final { gdb-test 25 "a\[2\]" "13" } } */
+                               /* { dg-final { gdb-test 25 "*p" "13" } } */
+  asm volatile ("NOP");                /* { dg-final { gdb-test 25 "*q" "12" } } */
+  __builtin_memcpy (&a, (int [3]) { 4, 5, 6 }, sizeof (a));
+                               /* { dg-final { gdb-test 31 "a\[0\]" "4" } } */
+                               /* { dg-final { gdb-test 31 "a\[1\]" "5" } } */
+                               /* { dg-final { gdb-test 31 "a\[2\]" "6" } } */
+                               /* { dg-final { gdb-test 31 "*p" "6" } } */
+  asm volatile ("NOP");                /* { dg-final { gdb-test 31 "*q" "5" } } */
+  *p += 20;                    /* { dg-final { gdb-test 36 "a\[0\]" "4" } } */
+                               /* { dg-final { gdb-test 36 "a\[1\]" "5" } } */
+                               /* { dg-final { gdb-test 36 "a\[2\]" "26" } } */
+                               /* { dg-final { gdb-test 36 "*p" "26" } } */
+  asm volatile ("NOP");                /* { dg-final { gdb-test 36 "*q" "5" } } */
+  *q += 20;                    /* { dg-final { gdb-test 45 "a\[0\]" "4" } } */
+                               /* { dg-final { gdb-test 45 "a\[1\]" "25" } } */
+                               /* { dg-final { gdb-test 45 "a\[2\]" "26" } } */
+                               /* { dg-final { gdb-test 45 "*p" "26" } } */
+                               /* { dg-final { gdb-test 45 "p\[-1\]" "25" } } */
+                               /* { dg-final { gdb-test 45 "p\[-2\]" "4" } } */
+                               /* { dg-final { gdb-test 45 "q\[-1\]" "4" } } */
+                               /* { dg-final { gdb-test 45 "q\[1\]" "26" } } */
+  asm volatile ("NOP");                /* { dg-final { gdb-test 45 "*q" "25" } } */
+  return 0;
+}
index 65b5ef59e151c9344c249f64baa292c762eb7a3b..bf1a0f209f6b568a916cc2f1fbee4f78e3663357 100644 (file)
@@ -1,7 +1,7 @@
 /* Scalar Replacement of Aggregates (SRA) converts some structure
    references into scalar references, exposing them to the scalar
    optimizers.
-   Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
    Contributed by Martin Jambor <mjambor@suse.cz>
 
 This file is part of GCC.
@@ -1941,7 +1941,8 @@ create_access_replacement (struct access *access)
         and that get_ref_base_and_extent works properly on the
         expression.  It cannot handle accesses at a non-constant offset
         though, so just give up in those cases.  */
-      for (d = debug_expr; !fail && handled_component_p (d);
+      for (d = debug_expr;
+          !fail && (handled_component_p (d) || TREE_CODE (d) == MEM_REF);
           d = TREE_OPERAND (d, 0))
        switch (TREE_CODE (d))
          {
@@ -1959,6 +1960,12 @@ create_access_replacement (struct access *access)
                && TREE_CODE (TREE_OPERAND (d, 2)) != INTEGER_CST)
              fail = true;
            break;
+         case MEM_REF:
+           if (TREE_CODE (TREE_OPERAND (d, 0)) != ADDR_EXPR)
+             fail = true;
+           else
+             d = TREE_OPERAND (d, 0);
+           break;
          default:
            break;
          }
index 25973a9776e9cce6644fddae8fb00b2bb5945e94..9b28c7d273cb318c4e58694cd274dad275927f82 100644 (file)
@@ -4921,7 +4921,9 @@ track_expr_p (tree expr, bool need_rtl)
        realdecl = expr;
       else if (!DECL_P (realdecl))
        {
-         if (handled_component_p (realdecl))
+         if (handled_component_p (realdecl)
+             || (TREE_CODE (realdecl) == MEM_REF
+                 && TREE_CODE (TREE_OPERAND (realdecl, 0)) == ADDR_EXPR))
            {
              HOST_WIDE_INT bitsize, bitpos, maxsize;
              tree innerdecl