OSDN Git Service

PR debug/43478
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 5 May 2010 10:43:36 +0000 (10:43 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 04:59:37 +0000 (13:59 +0900)
* df-problems.c (struct dead_debug_use, struct dead_debug): New.
(dead_debug_init, dead_debug_finish): New functions.
(dead_debug_add, dead_debug_insert_before): Likewise.
(df_note_bb_compute): Initialize a dead_debug object, add dead
debug uses to it, insert debug bind insns before death insns,
reset debug insns that refer to pending uses at the end.
* rtl.h (make_debug_expr_from_rtl): New prototype.
* varasm.c (make_debug_expr_from_rtl): New function.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159063 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/df-problems.c
gcc/rtl.h
gcc/varasm.c

index 3d751d2..89487f7 100644 (file)
@@ -1,3 +1,16 @@
+2010-05-05  Alexandre Oliva  <aoliva@redhat.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/43478
+       * df-problems.c (struct dead_debug_use, struct dead_debug): New.
+       (dead_debug_init, dead_debug_finish): New functions.
+       (dead_debug_add, dead_debug_insert_before): Likewise.
+       (df_note_bb_compute): Initialize a dead_debug object, add dead
+       debug uses to it, insert debug bind insns before death insns,
+       reset debug insns that refer to pending uses at the end.
+       * rtl.h (make_debug_expr_from_rtl): New prototype.
+       * varasm.c (make_debug_expr_from_rtl): New function.
+
 2010-05-05  Jan Hubicka  <jh@suse.cz>
 
        * lto-cgraph.c (output_varpool): Forward declare; work on encoder.
index 25bbba6..5f908da 100644 (file)
@@ -1,6 +1,6 @@
 /* Standard problems for dataflow support routines.
    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-   2008, 2009, 2010 Free Software Foundation, Inc.
+   2008, 2009 Free Software Foundation, Inc.
    Originally contributed by Michael P. Hayes
              (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
    Major rewrite contributed by Danny Berlin (dberlin@dberlin.org)
@@ -3416,7 +3416,6 @@ struct dead_debug
 {
   struct dead_debug_use *head;
   bitmap used;
-  bitmap to_rescan;
 };
 
 /* Initialize DEBUG to an empty list, and clear USED, if given.  */
@@ -3425,7 +3424,6 @@ dead_debug_init (struct dead_debug *debug, bitmap used)
 {
   debug->head = NULL;
   debug->used = used;
-  debug->to_rescan = NULL;
   if (used)
     bitmap_clear (used);
 }
@@ -3449,26 +3447,10 @@ dead_debug_finish (struct dead_debug *debug, bitmap used)
        {
          INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
          df_insn_rescan_debug_internal (insn);
-         if (debug->to_rescan)
-           bitmap_clear_bit (debug->to_rescan, INSN_UID (insn));
        }
       debug->head = head->next;
       XDELETE (head);
     }
-
-  if (debug->to_rescan)
-    {
-      bitmap_iterator bi;
-      unsigned int uid;
-
-      EXECUTE_IF_SET_IN_BITMAP (debug->to_rescan, 0, uid, bi)
-       {
-         struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid);
-         if (insn_info)
-           df_insn_rescan (insn_info->insn);
-       }
-      BITMAP_FREE (debug->to_rescan);
-    }
 }
 
 /* Add USE to DEBUG.  It must be a dead reference to UREGNO in a debug
@@ -3519,8 +3501,8 @@ dead_debug_insert_before (struct dead_debug *debug, unsigned int uregno,
          cur->next = NULL;
          if (!reg
              || (GET_MODE_BITSIZE (GET_MODE (reg))
-                 < GET_MODE_BITSIZE (GET_MODE (*DF_REF_REAL_LOC (cur->use)))))
-           reg = *DF_REF_REAL_LOC (cur->use);
+                 < GET_MODE_BITSIZE (GET_MODE (DF_REF_REAL_REG (cur->use)))))
+           reg = DF_REF_REAL_REG (cur->use);
        }
       else
        tailp = &(*tailp)->next;
@@ -3542,15 +3524,13 @@ dead_debug_insert_before (struct dead_debug *debug, unsigned int uregno,
   /* Adjust all uses.  */
   while ((cur = uses))
     {
-      if (GET_MODE (*DF_REF_REAL_LOC (cur->use)) == GET_MODE (reg))
+      if (GET_MODE (DF_REF_REAL_REG (cur->use)) == GET_MODE (reg))
        *DF_REF_REAL_LOC (cur->use) = dval;
       else
        *DF_REF_REAL_LOC (cur->use)
-         = gen_lowpart_SUBREG (GET_MODE (*DF_REF_REAL_LOC (cur->use)), dval);
+         = gen_lowpart_SUBREG (GET_MODE (DF_REF_REAL_REG (cur->use)), dval);
       /* ??? Should we simplify subreg of subreg?  */
-      if (debug->to_rescan == NULL)
-       debug->to_rescan = BITMAP_ALLOC (NULL);
-      bitmap_set_bit (debug->to_rescan, INSN_UID (DF_REF_INSN (cur->use)));
+      df_insn_rescan (DF_REF_INSN (cur->use));
       uses = cur->next;
       XDELETE (cur);
     }
@@ -3748,10 +3728,7 @@ df_note_bb_compute (unsigned int bb_index,
              if (debug_insn)
                {
                  if (debug_insn > 0)
-                   {
-                     dead_debug_add (&debug, use, uregno);
-                     continue;
-                   }
+                   dead_debug_add (&debug, use, uregno);
                  break;
                }
              else
index fe17ae7..88c0abf 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2382,6 +2382,8 @@ extern rtx emit_library_call_value (rtx, rtx, enum libcall_type,
 extern void init_varasm_once (void);
 extern enum tls_model decl_default_tls_model (const_tree);
 
+extern rtx make_debug_expr_from_rtl (const_rtx);
+
 /* In rtl.c */
 extern void traverse_md_constants (int (*) (void **, void *), void *);
 struct md_constant { char *name, *value; };
index bcb5b11..9f2f0a6 100644 (file)
@@ -7261,4 +7261,31 @@ default_elf_asm_output_external (FILE *file ATTRIBUTE_UNUSED,
     maybe_assemble_visibility (decl);
 }
 
+/* Create a DEBUG_EXPR_DECL / DEBUG_EXPR pair from RTL expression
+   EXP.  */
+rtx
+make_debug_expr_from_rtl (const_rtx exp)
+{
+  tree ddecl = make_node (DEBUG_EXPR_DECL), type;
+  enum machine_mode mode = GET_MODE (exp);
+  rtx dval;
+
+  DECL_ARTIFICIAL (ddecl) = 1;
+  if (REG_P (exp) && REG_EXPR (exp))
+    type = TREE_TYPE (REG_EXPR (exp));
+  else if (MEM_P (exp) && MEM_EXPR (exp))
+    type = TREE_TYPE (MEM_EXPR (exp));
+  else
+    type = NULL_TREE;
+  if (type && TYPE_MODE (type) == mode)
+    TREE_TYPE (ddecl) = type;
+  else
+    TREE_TYPE (ddecl) = lang_hooks.types.type_for_mode (mode, 1);
+  DECL_MODE (ddecl) = mode;
+  dval = gen_rtx_DEBUG_EXPR (mode);
+  DEBUG_EXPR_TREE_DECL (dval) = ddecl;
+  SET_DECL_RTL (ddecl, dval);
+  return dval;
+}
+
 #include "gt-varasm.h"