OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / var-tracking.c
index 6e95e50..a6a9c15 100644 (file)
@@ -1,5 +1,5 @@
 /* Variable tracking routines for the GNU compiler.
-   Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
    This file is part of GCC.
 
@@ -244,7 +244,7 @@ typedef struct variable_def
 } *variable;
 
 /* Hash function for DECL for VARIABLE_HTAB.  */
-#define VARIABLE_HASH_VAL(decl) ((size_t) (decl))
+#define VARIABLE_HASH_VAL(decl) (DECL_UID (decl))
 
 /* Pointer to the BB's information specific to variable tracking pass.  */
 #define VTI(BB) ((variable_tracking_info) (BB)->aux)
@@ -387,9 +387,9 @@ stack_adjust_offset_pre_post (rtx pattern, HOST_WIDE_INT *pre,
            {
              rtx val = XEXP (XEXP (src, 1), 1);
              /* We handle only adjustments by constant amount.  */
-             if (GET_CODE (XEXP (src, 1)) != PLUS ||
-                 GET_CODE (val) != CONST_INT)
-               abort ();
+             gcc_assert (GET_CODE (XEXP (src, 1)) == PLUS &&
+                         GET_CODE (val) == CONST_INT);
+             
              if (code == PRE_MODIFY)
                *pre -= INTVAL (val);
              else
@@ -526,7 +526,7 @@ prologue_stack_adjust (void)
 static bool
 vt_stack_adjustments (void)
 {
-  edge *stack;
+  edge_iterator *stack;
   int sp;
 
   /* Initialize entry block.  */
@@ -534,22 +534,22 @@ vt_stack_adjustments (void)
   VTI (ENTRY_BLOCK_PTR)->out.stack_adjust = frame_stack_adjust;
 
   /* Allocate stack for back-tracking up CFG.  */
-  stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge));
+  stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge_iterator));
   sp = 0;
 
   /* Push the first edge on to the stack.  */
-  stack[sp++] = ENTRY_BLOCK_PTR->succ;
+  stack[sp++] = ei_start (ENTRY_BLOCK_PTR->succs);
 
   while (sp)
     {
-      edge e;
+      edge_iterator ei;
       basic_block src;
       basic_block dest;
 
       /* Look at the edge on the top of the stack.  */
-      e = stack[sp - 1];
-      src = e->src;
-      dest = e->dest;
+      ei = stack[sp - 1];
+      src = ei_edge (ei)->src;
+      dest = ei_edge (ei)->dest;
 
       /* Check if the edge destination has been visited yet.  */
       if (!VTI (dest)->visited)
@@ -558,10 +558,10 @@ vt_stack_adjustments (void)
          VTI (dest)->in.stack_adjust = VTI (src)->out.stack_adjust;
          bb_stack_adjust_offset (dest);
 
-         if (dest->succ)
+         if (EDGE_COUNT (dest->succs) > 0)
            /* Since the DEST node has been visited for the first
               time, check its successors.  */
-           stack[sp++] = dest->succ;
+           stack[sp++] = ei_start (dest->succs);
        }
       else
        {
@@ -572,9 +572,9 @@ vt_stack_adjustments (void)
              return false;
            }
 
-         if (e->succ_next)
+         if (! ei_one_before_end_p (ei))
            /* Go to the next edge.  */
-           stack[sp - 1] = e->succ_next;
+           ei_next (&stack[sp - 1]);
          else
            /* Return to previous level if there are no more edges.  */
            sp--;
@@ -639,10 +639,7 @@ variable_htab_free (void *elem)
   variable var = (variable) elem;
   location_chain node, next;
 
-#ifdef ENABLE_CHECKING
-  if (var->refcount <= 0)
-    abort ();
-#endif
+  gcc_assert (var->refcount > 0);
 
   var->refcount--;
   if (var->refcount > 0)
@@ -1019,22 +1016,14 @@ variable_union (void **slot, void *data)
         a copy of the variable.  */
       for (k = 0; k < src->n_var_parts; k++)
        {
+         gcc_assert (!src->var_part[k].loc_chain
+                     == !src->var_part[k].cur_loc);
          if (src->var_part[k].loc_chain)
            {
-#ifdef ENABLE_CHECKING
-             if (src->var_part[k].cur_loc == NULL)
-               abort ();
-#endif
+             gcc_assert (src->var_part[k].cur_loc);
              if (src->var_part[k].cur_loc != src->var_part[k].loc_chain->loc)
                break;
            }
-#ifdef ENABLE_CHECKING
-         else
-           {
-             if (src->var_part[k].cur_loc != NULL)
-               abort ();
-           }
-#endif
        }
       if (k < src->n_var_parts)
        unshare_variable (set, src);
@@ -1047,10 +1036,7 @@ variable_union (void **slot, void *data)
   else
     dst = *dstp;
 
-#ifdef ENABLE_CHECKING
-  if (src->n_var_parts == 0)
-    abort ();
-#endif
+  gcc_assert (src->n_var_parts);
 
   /* Count the number of location parts, result is K.  */
   for (i = 0, j = 0, k = 0;
@@ -1068,12 +1054,10 @@ variable_union (void **slot, void *data)
     }
   k += src->n_var_parts - i;
   k += dst->n_var_parts - j;
-#ifdef ENABLE_CHECKING
+
   /* We track only variables whose size is <= MAX_VAR_PARTS bytes
      thus there are at most MAX_VAR_PARTS different offsets.  */
-  if (k > MAX_VAR_PARTS)
-    abort ();
-#endif
+  gcc_assert (k <= MAX_VAR_PARTS);
 
   if (dst->refcount > 1 && dst->n_var_parts != k)
     dst = unshare_variable (set, dst);
@@ -1356,12 +1340,9 @@ dataflow_set_different_2 (void **slot, void *data)
       return 0;
     }
 
-#ifdef ENABLE_CHECKING
   /* If both variables are defined they have been already checked for
      equivalence.  */
-  if (variable_different_p (var1, var2, false))
-    abort ();
-#endif
+  gcc_assert (!variable_different_p (var1, var2, false));
 
   /* Continue traversing the hash table.  */
   return 1;
@@ -1441,6 +1422,7 @@ static bool
 track_expr_p (tree expr)
 {
   rtx decl_rtl;
+  tree realdecl;
 
   /* If EXPR is not a parameter or a variable do not track it.  */
   if (TREE_CODE (expr) != VAR_DECL && TREE_CODE (expr) != PARM_DECL)
@@ -1454,14 +1436,29 @@ track_expr_p (tree expr)
   decl_rtl = DECL_RTL_IF_SET (expr);
   if (!decl_rtl)
     return 0;
+  
+  /* If this expression is really a debug alias of some other declaration, we 
+     don't need to track this expression if the ultimate declaration is
+     ignored.  */
+  realdecl = expr;
+  if (DECL_DEBUG_EXPR (realdecl)
+      && DECL_DEBUG_EXPR_IS_FROM (realdecl))
+    {
+      realdecl = DECL_DEBUG_EXPR (realdecl);
+      /* ??? We don't yet know how to emit DW_OP_piece for variable
+        that has been SRA'ed.  */
+      if (!DECL_P (realdecl))
+       return 0;
+    }
 
-  /* Do not track EXPR if it should be ignored for debugging purposes.  */
-  if (DECL_IGNORED_P (expr))
+  /* Do not track EXPR if REALDECL it should be ignored for debugging
+     purposes.  */ 
+  if (DECL_IGNORED_P (realdecl))
     return 0;
 
   /* Do not track global variables until we are able to emit correct location
      list for them.  */
-  if (TREE_STATIC (expr))
+  if (TREE_STATIC (realdecl))
     return 0;
 
   /* When the EXPR is a DECL for alias of some variable (see example)
@@ -1501,17 +1498,14 @@ count_uses (rtx *loc, void *insn)
 
   if (REG_P (*loc))
     {
-#ifdef ENABLE_CHECKING
-       if (REGNO (*loc) >= FIRST_PSEUDO_REGISTER)
-         abort ();
-#endif
-       VTI (bb)->n_mos++;
+      gcc_assert (REGNO (*loc) < FIRST_PSEUDO_REGISTER);
+      VTI (bb)->n_mos++;
     }
   else if (MEM_P (*loc)
           && MEM_EXPR (*loc)
           && track_expr_p (MEM_EXPR (*loc)))
     {
-         VTI (bb)->n_mos++;
+      VTI (bb)->n_mos++;
     }
 
   return 0;
@@ -1723,12 +1717,13 @@ vt_find_locations (void)
          if (!TEST_BIT (visited, bb->index))
            {
              bool changed;
+             edge_iterator ei;
 
              SET_BIT (visited, bb->index);
 
              /* Calculate the IN set as union of predecessor OUT sets.  */
              dataflow_set_clear (&VTI (bb)->in);
-             for (e = bb->pred; e; e = e->pred_next)
+             FOR_EACH_EDGE (e, ei, bb->preds)
                {
                  dataflow_set_union (&VTI (bb)->in, &VTI (e->src)->out);
                }
@@ -1736,7 +1731,7 @@ vt_find_locations (void)
              changed = compute_bb_dataflow (bb);
              if (changed)
                {
-                 for (e = bb->succ; e; e = e->succ_next)
+                 FOR_EACH_EDGE (e, ei, bb->succs)
                    {
                      if (e->dest == EXIT_BLOCK_PTR)
                        continue;
@@ -1905,10 +1900,7 @@ variable_was_changed (variable var, htab_t htab)
     }
   else
     {
-#ifdef ENABLE_CHECKING
-      if (!htab)
-       abort ();
-#endif
+      gcc_assert (htab);
       if (var->n_var_parts == 0)
        {
          void **slot = htab_find_slot_with_hash (htab, var->decl, hash,
@@ -1930,16 +1922,10 @@ set_frame_base_location (dataflow_set *set, rtx loc)
   
   var = htab_find_with_hash (set->vars, frame_base_decl,
                             VARIABLE_HASH_VAL (frame_base_decl));
-#ifdef ENABLE_CHECKING
-  if (!var)
-    abort ();
-  if (var->n_var_parts != 1)
-    abort ();
-  if (var->var_part[0].offset != 0)
-    abort ();
-  if (!var->var_part[0].loc_chain)
-    abort ();
-#endif
+  gcc_assert (var);
+  gcc_assert (var->n_var_parts == 1);
+  gcc_assert (!var->var_part[0].offset);
+  gcc_assert (var->var_part[0].loc_chain);
 
   /* If frame_base_decl is shared unshare it first.  */
   if (var->refcount > 1)
@@ -2023,12 +2009,9 @@ set_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset)
          if (var->refcount > 1)
            var = unshare_variable (set, var);
 
-#ifdef ENABLE_CHECKING
          /* We track only variables whose size is <= MAX_VAR_PARTS bytes
             thus there are at most MAX_VAR_PARTS different offsets.  */
-         if (var->n_var_parts >= MAX_VAR_PARTS)
-           abort ();
-#endif
+         gcc_assert (var->n_var_parts < MAX_VAR_PARTS);
 
          /* We have to move the elements of array starting at index low to the
             next position.  */
@@ -2190,10 +2173,7 @@ emit_note_insn_var_location (void **varp, void *data)
   HOST_WIDE_INT last_limit;
   tree type_size_unit;
 
-#ifdef ENABLE_CHECKING
-  if (!var->decl)
-    abort ();
-#endif
+  gcc_assert (var->decl);
 
   complete = true;
   last_limit = 0;
@@ -2430,10 +2410,7 @@ vt_emit_notes (void)
   dataflow_set *last_out;
   dataflow_set empty;
 
-#ifdef ENABLE_CHECKING
-  if (htab_elements (changed_variables))
-    abort ();
-#endif
+  gcc_assert (!htab_elements (changed_variables));
 
   /* Enable emitting notes by functions (mainly by set_variable_part and
      delete_variable_part).  */
@@ -2519,20 +2496,14 @@ vt_add_function_parameters (void)
       if (!decl)
        continue;
 
-#ifdef ENABLE_CHECKING
-      if (parm != decl)
-       abort ();
-#endif
+      gcc_assert (parm == decl);
 
       incoming = eliminate_regs (incoming, 0, NULL_RTX);
       out = &VTI (ENTRY_BLOCK_PTR)->out;
 
       if (REG_P (incoming))
        {
-#ifdef ENABLE_CHECKING
-         if (REGNO (incoming) >= FIRST_PSEUDO_REGISTER)
-           abort ();
-#endif
+         gcc_assert (REGNO (incoming) < FIRST_PSEUDO_REGISTER);
          attrs_list_insert (&out->regs[REGNO (incoming)],
                             parm, offset, incoming);
          set_variable_part (out, incoming, parm, offset);
@@ -2695,6 +2666,7 @@ vt_initialize (void)
       DECL_NAME (frame_base_decl) = get_identifier ("___frame_base_decl");
       TREE_TYPE (frame_base_decl) = char_type_node;
       DECL_ARTIFICIAL (frame_base_decl) = 1;
+      DECL_IGNORED_P (frame_base_decl) = 1;
 
       /* Set its initial "location".  */
       frame_stack_adjust = -prologue_stack_adjust ();