This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] [3/5] Use DWARF-2 DW_AT_artificial information
- From: Daniel Jacobowitz <drow at mvista dot com>
- To: gdb-patches at sources dot redhat dot com
- Date: Tue, 15 Jan 2002 15:30:05 -0500
- Subject: [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)