Patchwork Add DW_AT_accessibility for DW_TAG_{typedef,structure_type,class_type,enumeration_type} (PR debug/44668)

login
register
mail settings
Submitter Jakub Jelinek
Date June 25, 2010, 8:16 p.m.
Message ID <20100625201625.GC25077@tyan-ft48-01.lab.bos.redhat.com>
Download mbox | patch
Permalink /patch/56984/
State New
Headers show

Comments

Jakub Jelinek - June 25, 2010, 8:16 p.m.
Hi!

We weren't emitting DW_AT_accessibility for private or protected
typedefs etc. inside of classes/structures.

The following patch fixes that, bootstrapped/regtested on x86_64-linux and
i686-linux.  Ok for trunk?

2010-06-25  Jakub Jelinek  <jakub@redhat.com>

	PR debug/44668
	* dwarf2out.c (add_accessibility_attribute): New function.
	(gen_subprogram_die, gen_variable_die, gen_field_die): Use it
	instead of adding DW_AT_accessibility manually.
	(gen_enumeration_type_die, gen_struct_or_union_type_die,
	gen_typedef_die): Use it.

	* g++.dg/debug/dwarf2/accessibility1.C: New test.


	Jakub
Jason Merrill - June 29, 2010, 6:59 p.m.
OK.

Jason

Patch

--- gcc/dwarf2out.c.jj	2010-06-21 19:26:39.000000000 +0200
+++ gcc/dwarf2out.c	2010-06-25 20:02:01.000000000 +0200
@@ -15746,6 +15746,17 @@  add_AT_location_description (dw_die_ref 
     add_AT_loc_list (die, attr_kind, descr);
 }
 
+/* Add DW_AT_accessibility attribute to DIE if needed.  */
+
+static void
+add_accessibility_attribute (dw_die_ref die, tree decl)
+{
+  if (TREE_PROTECTED (decl))
+    add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_protected);
+  else if (TREE_PRIVATE (decl))
+    add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_private);
+}
+
 /* Attach the specialized form of location attribute used for data members of
    struct and union types.  In the special case of a FIELD_DECL node which
    represents a bit-field, the "offset" part of this special location
@@ -18017,7 +18028,10 @@  gen_enumeration_type_die (tree type, dw_
       TREE_ASM_WRITTEN (type) = 1;
       add_byte_size_attribute (type_die, type);
       if (TYPE_STUB_DECL (type) != NULL_TREE)
-	add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
+	{
+	  add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
+	  add_accessibility_attribute (type_die, TYPE_STUB_DECL (type));
+	}
 
       /* If the first reference to this type was as the return type of an
 	 inline function, then it may not have a parent.  Fix this now.  */
@@ -18524,10 +18538,7 @@  gen_subprogram_die (tree decl, dw_die_re
       if (DECL_ARTIFICIAL (decl))
 	add_AT_flag (subr_die, DW_AT_artificial, 1);
 
-      if (TREE_PROTECTED (decl))
-	add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_protected);
-      else if (TREE_PRIVATE (decl))
-	add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_private);
+      add_accessibility_attribute (subr_die, decl);
     }
 
   if (declaration)
@@ -19025,10 +19036,7 @@  gen_variable_die (tree decl, tree origin
       if (DECL_ARTIFICIAL (decl))
 	add_AT_flag (var_die, DW_AT_artificial, 1);
 
-      if (TREE_PROTECTED (decl))
-	add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_protected);
-      else if (TREE_PRIVATE (decl))
-	add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_private);
+      add_accessibility_attribute (var_die, decl);
     }
 
   if (declaration)
@@ -19257,10 +19265,7 @@  gen_field_die (tree decl, dw_die_ref con
   if (DECL_ARTIFICIAL (decl))
     add_AT_flag (decl_die, DW_AT_artificial, 1);
 
-  if (TREE_PROTECTED (decl))
-    add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_protected);
-  else if (TREE_PRIVATE (decl))
-    add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_private);
+  add_accessibility_attribute (decl_die, decl);
 
   /* Equate decl number to die, so that we can look up this decl later on.  */
   equate_decl_number_to_die (decl, decl_die);
@@ -19534,13 +19539,16 @@  gen_struct_or_union_type_die (tree type,
       TREE_ASM_WRITTEN (type) = 1;
       add_byte_size_attribute (type_die, type);
       if (TYPE_STUB_DECL (type) != NULL_TREE)
-	add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
+	{
+	  add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
+	  add_accessibility_attribute (type_die, TYPE_STUB_DECL (type));
+	}
 
       /* If the first reference to this type was as the return type of an
 	 inline function, then it may not have a parent.  Fix this now.  */
       if (type_die->die_parent == NULL)
 	add_child_die (scope_die, type_die);
 
       push_decl_scope (type);
       gen_member_die (type, type_die);
       pop_decl_scope ();
@@ -19647,6 +19656,8 @@  gen_typedef_die (tree decl, dw_die_ref c
 	   TYPE in argument yield the DW_TAG_typedef we have just
 	   created.  */
 	equate_type_number_to_die (type, type_die);
+
+      add_accessibility_attribute (type_die, decl);
     }
 
   if (DECL_ABSTRACT (decl))
--- gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C.jj	2010-06-25 20:17:09.000000000 +0200
+++ gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C	2010-06-25 20:18:26.000000000 +0200
@@ -0,0 +1,24 @@ 
+// PR debug/44668
+// { dg-do compile }
+// { dg-options "-g -dA" }
+
+struct C
+{
+private:
+  typedef int a;
+  a b;
+  enum g { g1, g2 } h;
+  struct D { int i; } i;
+protected:
+  typedef int c;
+  c d;
+public:
+  typedef int e;
+  e f;
+} c;
+
+// 3 private DW_TAG_member dies, 1 private DW_TAG_typedef,
+// 1 private DW_TAG_enumeration_type and 1 private DW_TAG_structure_type
+// { dg-final { scan-assembler-times "3\[^\\r\\n\]* DW_AT_accessibility" 6 } }
+// 1 private DW_TAG_member die, 1 private DW_TAG_typedef
+// { dg-final { scan-assembler-times "2\[^\\r\\n\]* DW_AT_accessibility" 2 } }