2002-01-20 Daniel Jacobowitz <drow@mvista.com>
authorDaniel Jacobowitz <drow@false.org>
Sun, 20 Jan 2002 19:20:16 +0000 (19:20 +0000)
committerDaniel Jacobowitz <drow@false.org>
Sun, 20 Jan 2002 19:20:16 +0000 (19:20 +0000)
* 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.

gdb/ChangeLog
gdb/c-typeprint.c
gdb/dwarf2read.c
gdb/gdbtypes.h

index 73ddf08dca4ab53f67debddca8597fd9bab98c4b..1b4ef88494076f84f6267177d99bb86733419f59 100644 (file)
@@ -1,3 +1,12 @@
+2002-01-20  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.
+
 2002-01-20  Daniel Jacobowitz  <drow@mvista.com>
 
        * f-typeprint.c: Delete unused function f_type_print_args.
index a202db437b24fe3bc329e4903d5f59a29cab8ba4..667ead01ea5c5813e255181cf6f848743bfdb6b6 100644 (file)
@@ -642,9 +642,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, real_len;
+  int lastval;
   char *mangled_name;
   char *demangled_name;
   char *demangled_no_static;
@@ -907,9 +907,21 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
              fprintf_filtered (stream, ";\n");
            }
 
-         /* If there are both fields and methods, put a space between. */
+         /* If there are both fields and methods, put a blank line
+             between them.  Make sure to count only method that we will
+             display; artificial methods will be hidden.  */
          len = TYPE_NFN_FIELDS (type);
-         if (len && section_type != s_none)
+         real_len = 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))
+                 real_len++;
+           }
+         if (real_len > 0 && section_type != s_none)
            fprintf_filtered (stream, "\n");
 
          /* C++: print out the methods */
@@ -928,6 +940,9 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
                   || 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))
index b0b401ee373d36e3b5060456f04249c882462e93..5c4567831bf9e65ad5da2219973bd75a440d4d95 100644 (file)
@@ -2168,6 +2168,11 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
        }
     }
 
+  /* 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)
index 3cb561348d319936dc3d4c56250e5e844f9599d7..31ab1da9f34fb703de477a628e1befdfab4418bb 100644 (file)
@@ -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 (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)