Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Elena Zannoni <ezannoni@redhat.com>
To: David Carlton <carlton@bactrian.org>
Cc: gdb-patches@sources.redhat.com, Elena Zannoni <ezannoni@redhat.com>
Subject: Re: [rfa] linespec.c: add_{matching_methods,constructors}
Date: Tue, 03 Jun 2003 01:39:00 -0000	[thread overview]
Message-ID: <16091.64924.18200.426877@localhost.redhat.com> (raw)
In-Reply-To: <m3fzn52o0i.fsf@papaya.bactrian.org>

David Carlton writes:
 > After a long hiatus, here's the latest in my exciting series of
 > linespec.c patches.  This one extracts code from find_methods into
 > add_matching_methods and add_constructors.
 > 
 > The only subtlety is that the new functions translate sym_arr over by
 > i1, so the meaning of sym_arr and i1 between the two functions is
 > different.  (But the meaning of sym_arr[i1] is the same: they're both
 > translated in a consistent way to preserve that invariant.)
 > Everything else about the change is mindless.
 > 
 > Tested on GCC 3.1, DWARF 2, i686-pc-linux-gnu; no new regressions.  OK
 > to commit?

yes, thanks

elena


 > 
 > David Carlton
 > carlton@bactrian.org
 > 
 > 2003-05-23  David Carlton  <carlton@bactrian.org>
 > 
 > 	* linespec.c (find_methods): Break out code into
 > 	add_matching_methods and add_constructors.
 > 	(add_matching_methods): New.
 > 	(add_constructors): Ditto.
 > 
 > Index: linespec.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/linespec.c,v
 > retrieving revision 1.47
 > diff -u -p -r1.47 linespec.c
 > --- linespec.c	14 May 2003 17:43:18 -0000	1.47
 > +++ linespec.c	24 May 2003 00:16:06 -0000
 > @@ -82,6 +82,12 @@ static int total_number_of_methods (stru
 >  
 >  static int find_methods (struct type *, char *, struct symbol **);
 >  
 > +static int add_matching_methods (int method_counter, struct type *t,
 > +				 struct symbol **sym_arr);
 > +
 > +static int add_constructors (int method_counter, struct type *t,
 > +			     struct symbol **sym_arr);
 > +
 >  static void build_canonical_line_spec (struct symtab_and_line *,
 >  				       char *, char ***);
 >  
 > @@ -210,7 +216,6 @@ find_methods (struct type *t, char *name
 >  	   method_counter >= 0;
 >  	   --method_counter)
 >  	{
 > -	  int field_counter;
 >  	  char *method_name = TYPE_FN_FIELDLIST_NAME (t, method_counter);
 >  	  char dem_opname[64];
 >  
 > @@ -226,88 +231,13 @@ find_methods (struct type *t, char *name
 >  
 >  	  if (strcmp_iw (name, method_name) == 0)
 >  	    /* Find all the overloaded methods with that name.  */
 > -	    for (field_counter = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1;
 > -		 field_counter >= 0;
 > -		 --field_counter)
 > -	      {
 > -		struct fn_field *f;
 > -		char *phys_name;
 > -
 > -		f = TYPE_FN_FIELDLIST1 (t, method_counter);
 > -
 > -		if (TYPE_FN_FIELD_STUB (f, field_counter))
 > -		  {
 > -		    char *tmp_name;
 > -
 > -		    tmp_name = gdb_mangle_name (t,
 > -						method_counter,
 > -						field_counter);
 > -		    phys_name = alloca (strlen (tmp_name) + 1);
 > -		    strcpy (phys_name, tmp_name);
 > -		    xfree (tmp_name);
 > -		  }
 > -		else
 > -		  phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
 > -		
 > -		/* Destructor is handled by caller, don't add it to
 > -		   the list.  */
 > -		if (is_destructor_name (phys_name) != 0)
 > -		  continue;
 > -
 > -		sym_arr[i1] = lookup_symbol (phys_name,
 > -					     NULL, VAR_DOMAIN,
 > -					     (int *) NULL,
 > -					     (struct symtab **) NULL);
 > -		if (sym_arr[i1])
 > -		  i1++;
 > -		else
 > -		  {
 > -		    /* This error message gets printed, but the method
 > -		       still seems to be found
 > -		       fputs_filtered("(Cannot find method ", gdb_stdout);
 > -		       fprintf_symbol_filtered (gdb_stdout, phys_name,
 > -		       language_cplus,
 > -		       DMGL_PARAMS | DMGL_ANSI);
 > -		       fputs_filtered(" - possibly inlined.)\n", gdb_stdout);
 > -		     */
 > -		  }
 > -	      }
 > +	    i1 += add_matching_methods (method_counter, t,
 > +					sym_arr + i1);
 >  	  else if (strncmp (class_name, name, name_len) == 0
 >  		   && (class_name[name_len] == '\0'
 >  		       || class_name[name_len] == '<'))
 > -	    {
 > -	      /* For GCC 3.x and stabs, constructors and destructors
 > -		 have names like __base_ctor and __complete_dtor.
 > -		 Check the physname for now if we're looking for a
 > -		 constructor.  */
 > -	      for (field_counter
 > -		     = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1;
 > -		   field_counter >= 0;
 > -		   --field_counter)
 > -		{
 > -		  struct fn_field *f;
 > -		  char *phys_name;
 > -		  
 > -		  f = TYPE_FN_FIELDLIST1 (t, method_counter);
 > -
 > -		  /* GCC 3.x will never produce stabs stub methods, so
 > -		     we don't need to handle this case.  */
 > -		  if (TYPE_FN_FIELD_STUB (f, field_counter))
 > -		    continue;
 > -		  phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
 > -		  if (! is_constructor_name (phys_name))
 > -		    continue;
 > -
 > -		  /* If this method is actually defined, include it in the
 > -		     list.  */
 > -		  sym_arr[i1] = lookup_symbol (phys_name,
 > -					       NULL, VAR_DOMAIN,
 > -					       (int *) NULL,
 > -					       (struct symtab **) NULL);
 > -		  if (sym_arr[i1])
 > -		    i1++;
 > -		}
 > -	    }
 > +	    i1 += add_constructors (method_counter, t,
 > +				    sym_arr + i1);
 >  	}
 >      }
 >  
 > @@ -325,6 +255,113 @@ find_methods (struct type *t, char *name
 >    if (i1 == 0)
 >      for (ibase = 0; ibase < TYPE_N_BASECLASSES (t); ibase++)
 >        i1 += find_methods (TYPE_BASECLASS (t, ibase), name, sym_arr + i1);
 > +
 > +  return i1;
 > +}
 > +
 > +/* Add the symbols associated to methods of the class whose type is T
 > +   and whose name matches the method indexed by METHOD_COUNTER in the
 > +   array SYM_ARR.  Return the number of methods added.  */
 > +
 > +static int
 > +add_matching_methods (int method_counter, struct type *t,
 > +		      struct symbol **sym_arr)
 > +{
 > +  int field_counter;
 > +  int i1 = 0;
 > +
 > +  for (field_counter = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1;
 > +       field_counter >= 0;
 > +       --field_counter)
 > +    {
 > +      struct fn_field *f;
 > +      char *phys_name;
 > +
 > +      f = TYPE_FN_FIELDLIST1 (t, method_counter);
 > +
 > +      if (TYPE_FN_FIELD_STUB (f, field_counter))
 > +	{
 > +	  char *tmp_name;
 > +
 > +	  tmp_name = gdb_mangle_name (t,
 > +				      method_counter,
 > +				      field_counter);
 > +	  phys_name = alloca (strlen (tmp_name) + 1);
 > +	  strcpy (phys_name, tmp_name);
 > +	  xfree (tmp_name);
 > +	}
 > +      else
 > +	phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
 > +		
 > +      /* Destructor is handled by caller, don't add it to
 > +	 the list.  */
 > +      if (is_destructor_name (phys_name) != 0)
 > +	continue;
 > +
 > +      sym_arr[i1] = lookup_symbol (phys_name,
 > +				   NULL, VAR_DOMAIN,
 > +				   (int *) NULL,
 > +				   (struct symtab **) NULL);
 > +      if (sym_arr[i1])
 > +	i1++;
 > +      else
 > +	{
 > +	  /* This error message gets printed, but the method
 > +	     still seems to be found
 > +	     fputs_filtered("(Cannot find method ", gdb_stdout);
 > +	     fprintf_symbol_filtered (gdb_stdout, phys_name,
 > +	     language_cplus,
 > +	     DMGL_PARAMS | DMGL_ANSI);
 > +	     fputs_filtered(" - possibly inlined.)\n", gdb_stdout);
 > +	  */
 > +	}
 > +    }
 > +
 > +  return i1;
 > +}
 > +
 > +/* Add the symbols associated to constructors of the class whose type
 > +   is CLASS_TYPE and which are indexed by by METHOD_COUNTER to the
 > +   array SYM_ARR.  Return the number of methods added.  */
 > +
 > +static int
 > +add_constructors (int method_counter, struct type *t,
 > +		  struct symbol **sym_arr)
 > +{
 > +  int field_counter;
 > +  int i1 = 0;
 > +
 > +  /* For GCC 3.x and stabs, constructors and destructors
 > +     have names like __base_ctor and __complete_dtor.
 > +     Check the physname for now if we're looking for a
 > +     constructor.  */
 > +  for (field_counter
 > +	 = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1;
 > +       field_counter >= 0;
 > +       --field_counter)
 > +    {
 > +      struct fn_field *f;
 > +      char *phys_name;
 > +		  
 > +      f = TYPE_FN_FIELDLIST1 (t, method_counter);
 > +
 > +      /* GCC 3.x will never produce stabs stub methods, so
 > +	 we don't need to handle this case.  */
 > +      if (TYPE_FN_FIELD_STUB (f, field_counter))
 > +	continue;
 > +      phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
 > +      if (! is_constructor_name (phys_name))
 > +	continue;
 > +
 > +      /* If this method is actually defined, include it in the
 > +	 list.  */
 > +      sym_arr[i1] = lookup_symbol (phys_name,
 > +				   NULL, VAR_DOMAIN,
 > +				   (int *) NULL,
 > +				   (struct symtab **) NULL);
 > +      if (sym_arr[i1])
 > +	i1++;
 > +    }
 >  
 >    return i1;
 >  }


  reply	other threads:[~2003-06-03  1:39 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-05-24  0:21 David Carlton
2003-06-03  1:39 ` Elena Zannoni [this message]
2003-06-03  3:07   ` David Carlton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=16091.64924.18200.426877@localhost.redhat.com \
    --to=ezannoni@redhat.com \
    --cc=carlton@bactrian.org \
    --cc=gdb-patches@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox