This patch is for the google/gcc-4_6 branch.

It fixes a problem where we were still trying to output entries
in the .debug_addr table for location lists that were removed,
and fixes a problem where we were getting an ICE while trying
to output a pubname for a member function of a struct.

Tested with the GCC testsuite and validate-failures.py, and
also with an internal Google build with -gfission enabled.


2012-05-25   Sterling Augustine  <saugust...@google.com>
             Cary Coutant  <ccout...@google.com>

        * gcc/dwarf2out.c (remove_loc_list_addr_table_entries): New function.
        (is_class_die): Return TRUE for DW_TAG_structure_type.
        (resolve_addr): Remove address table entries when replacing a
        location list.


Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c     (revision 187887)
+++ gcc/dwarf2out.c     (working copy)
@@ -7864,6 +7864,19 @@ remove_addr_table_entry (unsigned int i)
   attr->dw_attr = (enum dwarf_attribute) 0;
 }
 
+/* Given a location list, remove all addresses it refers to from the
+   address_table.  */
+
+static void
+remove_loc_list_addr_table_entries (dw_loc_list_ref loc)
+{
+  dw_loc_descr_ref descr;
+
+  for (descr = loc->expr; descr; descr = descr->dw_loc_next)
+    if (descr->dw_loc_oprnd1.val_index != -1U)
+      remove_addr_table_entry (descr->dw_loc_oprnd1.val_index);
+}
+
 /* Add an address constant attribute value to a DIE.  */
 
 static inline void
@@ -10033,7 +10046,8 @@ is_namespace_die (dw_die_ref c)
 static inline bool
 is_class_die (dw_die_ref c)
 {
-  return c && c->die_tag == DW_TAG_class_type;
+  return c && (c->die_tag == DW_TAG_class_type
+              || c->die_tag == DW_TAG_structure_type);
 }
 
 static char *
@@ -23788,15 +23802,13 @@ resolve_addr (dw_die_ref die)
                if (!resolve_addr_in_expr ((*curr)->expr))
                  {
                    dw_loc_list_ref next = (*curr)->dw_loc_next;
-                   dw_loc_descr_ref l = (*curr)->expr;
 
                    if (next && (*curr)->ll_symbol)
                      {
                        gcc_assert (!next->ll_symbol);
                        next->ll_symbol = (*curr)->ll_symbol;
                      }
-                   if (l->dw_loc_oprnd1.val_index != -1U)
-                     remove_addr_table_entry (l->dw_loc_oprnd1.val_index);
+                   remove_loc_list_addr_table_entries (*curr);
                    *curr = next;
                  }
                else

--
This patch is available for review at http://codereview.appspot.com/6254054

Reply via email to