if ((strncmp (fieldname, vptr_name, strlen (vptr_name) - 1) == 0) && is_cplus_marker (fieldname[strlen (vptr_name)]))
if (is_vtable_name (fieldname, cu))
read_structure_type (struct die_info *die, struct dwarf2_cu *cu){  struct objfile *objfile = cu->objfile;  struct type *type;  struct attribute *attr;  const char *previous_prefix = processing_current_prefix;  struct cleanup *back_to = NULL;  if (die->type)    return;  type = alloc_type (objfile);  INIT_CPLUS_SPECIFIC (type);  attr = dwarf2_attr (die, DW_AT_name, cu);  if (attr && DW_STRING (attr))    {      if (cu->language == language_cplus)	{ 	  char *new_prefix = determine_class_name (die, cu); 	  TYPE_TAG_NAME (type) = obsavestring (new_prefix, 					       strlen (new_prefix), 					       &objfile->objfile_obstack); 	  back_to = make_cleanup (xfree, new_prefix);	  processing_current_prefix = new_prefix;	}      else	{	  TYPE_TAG_NAME (type) = DW_STRING (attr);	}    }  if (die->tag == DW_TAG_structure_type)    {      TYPE_CODE (type) = TYPE_CODE_STRUCT;    }  else if (die->tag == DW_TAG_union_type)    {      TYPE_CODE (type) = TYPE_CODE_UNION;    }  else    {      /* FIXME: TYPE_CODE_CLASS is currently defined to TYPE_CODE_STRUCT         in gdbtypes.h.  */      TYPE_CODE (type) = TYPE_CODE_CLASS;    }  attr = dwarf2_attr (die, DW_AT_byte_size, cu);  if (attr)    {      TYPE_LENGTH (type) = DW_UNSND (attr);    }  else    {      TYPE_LENGTH (type) = 0;    }  /* We need to add the type field to the die immediately so we don't     infinitely recurse when dealing with pointers to the structure     type within the structure itself. */  die->type = type;  if (die->child != NULL && ! die_is_declaration (die, cu))    {      struct field_info fi;      struct die_info *child_die;      struct cleanup *back_to = make_cleanup (null_cleanup, NULL);      memset (&fi, 0, sizeof (struct field_info));      child_die = die->child;      while (child_die && child_die->tag)	{	  if (child_die->tag == DW_TAG_member	      || child_die->tag == DW_TAG_variable)	    {	      /* NOTE: carlton/2002-11-05: A C++ static data member		 should be a DW_TAG_member that is a declaration, but		 all versions of G++ as of this writing (so through at		 least 3.2.1) incorrectly generate DW_TAG_variable		 tags for them instead.  */	      dwarf2_add_field (&fi, child_die, cu);	    }	  else if (child_die->tag == DW_TAG_subprogram)	    {	      /* C++ member function. */	      read_type_die (child_die, cu);	      dwarf2_add_member_fn (&fi, child_die, type, cu);	    }	  else if (child_die->tag == DW_TAG_inheritance)	    {	      /* C++ base class field.  */	      dwarf2_add_field (&fi, child_die, cu);	    }	  child_die = sibling_die (child_die);	}      /* Attach fields and member functions to the type.  */      if (fi.nfields)	dwarf2_attach_fields_to_type (&fi, type, cu);      if (fi.nfnfields)	{	  dwarf2_attach_fn_fields_to_type (&fi, type, cu);	  /* Get the type which refers to the base class (possibly this	     class itself) which contains the vtable pointer for the current	     class from the DW_AT_containing_type attribute.  */	  if (dwarf2_attr (die, DW_AT_containing_type, cu) != NULL)	    {	      struct type *t = die_containing_type (die, cu);	      TYPE_VPTR_BASETYPE (type) = t;	      if (type == t)		{		  static const char vptr_name[] =		  {'_', 'v', 'p', 't', 'r', '\0'};		  int i;		  /* Our own class provides vtbl ptr.  */		  for (i = TYPE_NFIELDS (t) - 1;		       i >= TYPE_N_BASECLASSES (t);		       --i)		    {		      char *fieldname = TYPE_FIELD_NAME (t, i);		      if ((strncmp (fieldname, vptr_name,                                    strlen (vptr_name) - 1)                           == 0)			  && is_cplus_marker (fieldname[strlen (vptr_name)]))			{			  TYPE_VPTR_FIELDNO (type) = i;			  break;			}		    }		  /* Complain if virtual function table field not found.  */		  if (i < TYPE_N_BASECLASSES (t))		    complaint (&symfile_complaints,			       "virtual function table pointer not found when defining class '%s'",			       TYPE_TAG_NAME (type) ? TYPE_TAG_NAME (type) :			       "");		}	      else		{		  TYPE_VPTR_FIELDNO (type) = TYPE_VPTR_FIELDNO (t);		}	    }	}      do_cleanups (back_to);    }  else    {      /* No children, must be stub. */      TYPE_FLAGS (type) |= TYPE_FLAG_STUB;    }  processing_current_prefix = previous_prefix;  if (back_to != NULL)    do_cleanups (back_to);}