Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Fernando Nasser <fnasser@redhat.com>
To: David Carlton <carlton@math.stanford.edu>
Cc: gdb <gdb@sources.redhat.com>, Jim Blandy <jimb@redhat.com>,
	Elena Zannoni <ezannoni@redhat.com>
Subject: Re: How I learned to stop worrying and love decode_line_1
Date: Mon, 04 Nov 2002 17:28:00 -0000	[thread overview]
Message-ID: <3DC71F7B.7020003@redhat.com> (raw)
In-Reply-To: <ro1bs58hpgm.fsf@jackfruit.Stanford.EDU>

David,

Jim Blandy brought your message to my attention.

Would you be willing to submit a patch with your clean-up?

Regards,
Fernando

David Carlton wrote:
> I've been spending the week getting to know decode_line_1.  One of the
> things that I learned was that decode_line_1 thinks that it's its job
> to take apart C++ expressions like A::B::C::x, where A and B are
> namespaces, C is a class or a namespace, and x is a variable or a
> member or something.
> 
> This cleared up some issues for me: e.g. why you don't have to put
> single quotes around expressions involving static class members but do
> have to put single quotes around expressions involving namespaces.
> But, frankly, I was surprised that the function claimed to handle
> namespaces at all (since, basically, it doesn't currently); moreover,
> there's this lovely comment:
> 
>   Some versions of the HP ANSI C++ compiler (as also possibly
>   other compilers) generate class/function/member names with
>   embedded double-colons if they are inside namespaces. To
>   handle this, we loop a few times, considering larger and
>   larger prefixes of the string as though they were single
>   symbols.  So, if the initially supplied string is
>   A::B::C::D::foo, we have to look up "A", then "A::B",
>   then "A::B::C", then "A::B::C::D", and finally
>   "A::B::C::D::foo" as single, monolithic symbols, because
>   A, B, C or D may be namespaces.
> 
> I'm not sure I understand the context here: did/does HP's compiler
> generate names for symbols in namespace that, after demangling, looked
> fundamentally different from, say, the way GCC's do?  The above sounds
> the same as the way GCC's demangled symbol names work; but it hints at
> possible compilers which might somehow generate a symbol 'A' if there
> is a namespace 'A'.  Are there any such compilers?  I sure can't
> imagine where GDB would currently do anything useful with that
> information.
> 
> So any insight about the context of that comment would be greatly
> appreciated.
> 
> I'm certainly glad I discovered this bit of decode_line_1, at any
> rate: it suggests that some code that I was planning to add to
> lookup_symbol should really go in decode_line_1.  (The only thing
> worse than having one gross hack of a parser is having two gross hacks
> of a parser that are both trying to do the same thing.)
> 
> For what it's worth, I've got decode_line_1 tamed a bit.  The version
> of it that I'll check into my branch later today is only 82 lines
> long.  (I'll include it after my signature; of course, it calls lots
> of other functions that contain various bits of the current version of
> the function.) It turns out that, underlying all that mess, there's
> actually a function with perfectly reasonable control flow.  In
> particular, whoever put in those goto's originally should be given a
> bit of a talking-to: there's absolutely no reason whatsoever for the
> function to do any jumps like that.  Mind you, my version of the code
> still contains all of the myriad special cases in the current version,
> but at least it's now pretty obvious when the function might return,
> whether all the different uses of the variables 'p' and 'copy' are
> really pointing to the same thing or are only there because somebody
> decided to reuse variable names, and so forth.
> 
> David Carlton
> carlton@math.stanford.edu
> 
> struct symtabs_and_lines
> decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
> 	       int default_line, char ***canonical)
> {
>   /* This is NULL if there are no parens in argptr, or a pointer to
>      the closing parenthesis if there are parens.  */
>   char *paren_pointer;
>   /* If a file name is specified, this is its symtab.  */
>   struct symtab *file_symtab = NULL;
>   int is_quoted;
>   char *saved_arg = *argptr;
> 
>   /* Defaults have defaults.  */
> 
>   dl1_initialize_defaults (&default_symtab, &default_line);
>   
>   /* See if arg is *PC */
> 
>   if (**argptr == '*')
>     return dl1_indirect (argptr);
> 
>   /* Set various flags.
>    * 'paren_pointer' is important for overload checking, where
>    * we allow things like: 
>    *     (gdb) break c::f(int)
>    */
> 
>   dl1_set_flags (*argptr, &is_quoted, &paren_pointer);
> 
>   /* Check to see if it's a multipart linespec (with colons or periods).  */
>   {
>     char *p;
>     int is_quote_enclosed;
>     
>     /* Locate the first half of the linespec, ending in a colon, period,
>        or whitespace.  (More or less.)  */
> 
>     p = dl1_locate_first_half (argptr, &is_quote_enclosed);
> 
>     /* Does it look like there actually were two parts?  */
> 
>     if ((p[0] == ':' || p[0] == '.') && paren_pointer == NULL)
>       {
> 	if (is_quoted)
> 	  *argptr = *argptr + 1;
>       
> 	/* Is it a C++ or Java compound data structure?  */
>       
> 	if (p[0] == '.' || p[1] == ':')
> 	  return dl1_compound (argptr, funfirstline, canonical,
> 			       saved_arg, p);
> 
> 	/* No, the first part is a filename; set file_symtab
> 	   accordingly.  Also, move argptr past the filename.  */
>       
> 	file_symtab = dl1_handle_filename (argptr, p, is_quote_enclosed);
>       }
>   }
> 
>   /* Check whether arg is all digits (and sign) */
> 
>   if (dl1_is_all_digits (*argptr))
>     return dl1_all_digits (argptr, default_symtab, default_line,
> 			   canonical, file_symtab);
> 
>   /* Arg token is not digits => try it as a variable name
>      Find the next token (everything up to end or next whitespace).  */
> 
>   /* If it starts with $: may be a legitimate variable or routine name
>      (e.g. HP-UX millicode routines such as $$dyncall), or it may
>      be history value, or it may be a convenience variable */
>   
>   if (**argptr == '$')
>     return dl1_dollar (argptr, funfirstline, default_symtab, canonical,
> 		       file_symtab);
>   
>   /* Look up that token as a variable.
>      If file specified, use that file's per-file block to start with.  */
> 
>   return dl1_variable (argptr, funfirstline, canonical, is_quoted,
> 		       paren_pointer, file_symtab);
> }
> 


-- 
Fernando Nasser
Red Hat Canada Ltd.                     E-Mail:  fnasser@redhat.com
2323 Yonge Street, Suite #300
Toronto, Ontario   M4P 2C9


  reply	other threads:[~2002-11-05  1:28 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-11-01 14:53 David Carlton
2002-11-04 17:28 ` Fernando Nasser [this message]
2002-11-04 20:41   ` 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=3DC71F7B.7020003@redhat.com \
    --to=fnasser@redhat.com \
    --cc=carlton@math.stanford.edu \
    --cc=ezannoni@redhat.com \
    --cc=gdb@sources.redhat.com \
    --cc=jimb@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