This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA] [3/5] Use DWARF-2 DW_AT_artificial information


This one's pretty simple.  This handles artificial methods (which turned out
to be much easier than artificial arguments).  It's independent of the
others.

OK to commit?

-- 
Daniel Jacobowitz                           Carnegie Mellon University
MontaVista Software                         Debian GNU/Linux Developer

2002-01-15  Daniel Jacobowitz  <drow@mvista.com>

	* gdbtypes.h (struct cplus_struct_type): Add is_artificial to
	member function fields.  Add accessor macro
	TYPE_FN_FIELD_ARTIFICIAL.
	* dwarf2read.c (dwarf2_add_member_fn): Check for artificial methods.
	* c-typeprint.c (c_type_print_base): Skip artificial member
	functions.

diff -urp src-p2/gdb/c-typeprint.c src-p3/gdb/c-typeprint.c
--- src-p2/gdb/c-typeprint.c	Tue Jan 15 14:25:54 2002
+++ src-p3/gdb/c-typeprint.c	Tue Jan 15 14:38:27 2002
@@ -636,9 +636,9 @@ void
 c_type_print_base (struct type *type, struct ui_file *stream, int show,
 		   int level)
 {
-  register int i;
-  register int len;
-  register int lastval;
+  int i;
+  int len, reallen;
+  int lastval;
   char *mangled_name;
   char *demangled_name;
   char *demangled_no_static;
@@ -903,7 +903,17 @@ c_type_print_base (struct type *type, st
 
 	  /* If there are both fields and methods, put a space between. */
 	  len = TYPE_NFN_FIELDS (type);
-	  if (len && section_type != s_none)
+	  reallen = 0;
+	  for (i = 0; i < len; i++)
+	    {
+	      struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
+	      int len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
+	      int j;
+	      for (j = 0; j < len2; j++)
+		if (!TYPE_FN_FIELD_ARTIFICIAL (f, j))
+		  reallen++;
+	    }
+	  if (reallen && section_type != s_none)
 	    fprintf_filtered (stream, "\n");
 
 	  /* C++: print out the methods */
@@ -922,6 +932,9 @@ c_type_print_base (struct type *type, st
 		   || is_destructor_name (physname)
 		   || method_name[0] == '~';
 
+		  /* Do not print out artificial methods.  */
+		  if (TYPE_FN_FIELD_ARTIFICIAL (f, j))
+		    continue;
 
 		  QUIT;
 		  if (TYPE_FN_FIELD_PROTECTED (f, j))
diff -urp src-p2/gdb/dwarf2read.c src-p3/gdb/dwarf2read.c
--- src-p2/gdb/dwarf2read.c	Tue Jan 15 14:29:15 2002
+++ src-p3/gdb/dwarf2read.c	Tue Jan 15 14:38:27 2002
@@ -2168,6 +2168,11 @@ dwarf2_add_member_fn (struct field_info 
 	}
     }
 
+  /* Check for artificial methods.  */
+  attr = dwarf_attr (die, DW_AT_artificial);
+  if (attr && DW_UNSND (attr) != 0)
+    fnp->is_artificial = 1;
+
   /* Get index in virtual function table if it is a virtual member function.  */
   attr = dwarf_attr (die, DW_AT_vtable_elem_location);
   if (attr)
diff -urp src-p2/gdb/gdbtypes.h src-p3/gdb/gdbtypes.h
--- src-p2/gdb/gdbtypes.h	Tue Jan 15 14:29:15 2002
+++ src-p3/gdb/gdbtypes.h	Tue Jan 15 14:38:27 2002
@@ -619,6 +619,7 @@ struct cplus_struct_type
 	    unsigned int is_final:1;
 	    unsigned int is_synchronized:1;
 	    unsigned int is_native:1;
+	    unsigned int is_artificial:1;
 
 	    /* A stub method only has some fields valid (but they are enough
 	       to reconstruct the rest of the fields).  */
@@ -628,7 +629,7 @@ struct cplus_struct_type
 	    unsigned int is_inlined:1;
 
 	    /* Unused.  */
-	    unsigned int dummy:4;
+	    unsigned int dummy:3;
 
 	    /* Index into that baseclass's virtual function table,
 	       minus 2; else if static: VOFFSET_STATIC; else: 0.  */
@@ -867,6 +868,7 @@ extern void allocate_cplus_struct_type (
 #define TYPE_FN_FIELD_FINAL(thisfn, n) ((thisfn)[n].is_final)
 #define TYPE_FN_FIELD_SYNCHRONIZED(thisfn, n) ((thisfn)[n].is_synchronized)
 #define TYPE_FN_FIELD_NATIVE(thisfn, n) ((thisfn)[n].is_native)
+#define TYPE_FN_FIELD_ARTIFICIAL(thisfn, n) ((thisfn)[n].is_artificial)
 #define TYPE_FN_FIELD_ABSTRACT(thisfn, n) ((thisfn)[n].is_abstract)
 #define TYPE_FN_FIELD_STUB(thisfn, n) ((thisfn)[n].is_stub)
 #define TYPE_FN_FIELD_INLINED(thisfn, n) ((thisfn)[n].is_inlined)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]