Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Joel Brobecker <brobecker@adacore.com>
To: Aleksandar Ristovski <aristovski@qnx.com>,
		GDB Patches <gdb-patches@sourceware.org>
Subject: Re: [rfc] get rid of redundant data in c++ and java
Date: Sat, 03 May 2008 00:01:00 -0000	[thread overview]
Message-ID: <20080502230127.GJ3801@adacore.com> (raw)
In-Reply-To: <20080502135132.GD29202@caradoc.them.org>

[-- Attachment #1: Type: text/plain, Size: 1418 bytes --]

> > 	* dwarf2read.c (add_partial_symbol): Do not add new psym for
> > 	STRUCT_DOMAIN. Make sure you recognize c++ struct and java and ada  
> > 	class as typedefs. See lookup_partial_symbol function.
> > 	(new_symbol): Similar to add_partial_symbol, do not create 	symbol for 
> > the typedef. See lookup_block_symbol.
> > 	* symtab.c (symbol_matches_domain): New function, takes care
> > 	of dual meaning of STRUCT_DOMAIN symbol for c++, ada and java.
> > 	(lookup_partial_symbol): Use symbol_matches_domain to see if the
> > 	found psym domain matches the given domain.
> > 	(lookup_block_symbol): Likewise.
> 
> Thanks.  Joel, could you give this a try with GNAT?  If it works for
> Joel, it's OK to commit.

This is a nice welcome space saver! I missed the patch when it was sent.

There was a piece missing, however. The Ada module has its own bunch
of symbol lookup routines, and some of them were checking the symbol
domain.  So I had to make the symbol_matches_domain routine non-static,
and add a declaration in symtab.h.  I also took the opportunity to fix
an indentation issue, spell "C++" instead of "c++" as well as extend
a comment to explain the Ada situation.

        * ada-lang.c: Update throughout to use symbol_matches_domain
        instead of matching the symbol domain explictly.

I tested the above on x86-linux against the AdaCore testsuite and
the gdb.ada section of our testsuite.

-- 
Joel

[-- Attachment #2: sym-dups.diff --]
[-- Type: text/plain, Size: 7471 bytes --]

Index: ada-lang.c
===================================================================
--- ada-lang.c	(revision 130550)
+++ ada-lang.c	(working copy)
@@ -4398,7 +4398,8 @@ ada_lookup_partial_symbol (struct partia
         {
           struct partial_symbol *psym = start[i];
 
-          if (SYMBOL_DOMAIN (psym) == namespace
+          if (symbol_matches_domain (SYMBOL_LANGUAGE (psym),
+                                     SYMBOL_DOMAIN (psym), namespace)
               && wild_match (name, name_len, SYMBOL_LINKAGE_NAME (psym)))
             return psym;
         }
@@ -4432,7 +4433,8 @@ ada_lookup_partial_symbol (struct partia
         {
           struct partial_symbol *psym = start[i];
 
-          if (SYMBOL_DOMAIN (psym) == namespace)
+          if (symbol_matches_domain (SYMBOL_LANGUAGE (psym),
+                                     SYMBOL_DOMAIN (psym), namespace))
             {
               int cmp = strncmp (name, SYMBOL_LINKAGE_NAME (psym), name_len);
 
@@ -4475,7 +4477,8 @@ ada_lookup_partial_symbol (struct partia
         {
           struct partial_symbol *psym = start[i];
 
-          if (SYMBOL_DOMAIN (psym) == namespace)
+          if (symbol_matches_domain (SYMBOL_LANGUAGE (psym),
+                                     SYMBOL_DOMAIN (psym), namespace))
             {
               int cmp;
 
@@ -5593,7 +5596,8 @@ ada_add_block_symbols (struct obstack *o
       struct symbol *sym;
       ALL_BLOCK_SYMBOLS (block, iter, sym)
       {
-        if (SYMBOL_DOMAIN (sym) == domain
+        if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+                                   SYMBOL_DOMAIN (sym), domain)
             && wild_match (name, name_len, SYMBOL_LINKAGE_NAME (sym)))
           {
             switch (SYMBOL_CLASS (sym))
@@ -5623,7 +5627,8 @@ ada_add_block_symbols (struct obstack *o
     {
       ALL_BLOCK_SYMBOLS (block, iter, sym)
       {
-        if (SYMBOL_DOMAIN (sym) == domain)
+        if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+                                   SYMBOL_DOMAIN (sym), domain))
           {
             int cmp = strncmp (name, SYMBOL_LINKAGE_NAME (sym), name_len);
             if (cmp == 0
@@ -5668,7 +5673,8 @@ ada_add_block_symbols (struct obstack *o
 
       ALL_BLOCK_SYMBOLS (block, iter, sym)
       {
-        if (SYMBOL_DOMAIN (sym) == domain)
+        if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+                                   SYMBOL_DOMAIN (sym), domain))
           {
             int cmp;
 
Index: dwarf2read.c
===================================================================
--- dwarf2read.c	(revision 130550)
+++ dwarf2read.c	(working copy)
@@ -2114,16 +2114,6 @@ add_partial_symbol (struct partial_die_i
 			   : &objfile->static_psymbols,
 			   0, (CORE_ADDR) 0, cu->language, objfile);
 
-      if (cu->language == language_cplus
-          || cu->language == language_java
-          || cu->language == language_ada)
-	{
-	  /* For C++ and Java, these implicitly act as typedefs as well. */
-	  add_psymbol_to_list (actual_name, strlen (actual_name),
-			       VAR_DOMAIN, LOC_TYPEDEF,
-			       &objfile->global_psymbols,
-			       0, (CORE_ADDR) 0, cu->language, objfile);
-	}
       break;
     case DW_TAG_enumerator:
       add_psymbol_to_list (actual_name, strlen (actual_name),
@@ -7863,23 +7853,16 @@ new_symbol (struct die_info *die, struct
 
 	    /* The semantics of C++ state that "struct foo { ... }" also
 	       defines a typedef for "foo".  A Java class declaration also
-	       defines a typedef for the class.  Synthesize a typedef symbol
-	       so that "ptype foo" works as expected.  */
+	       defines a typedef for the class.  */
 	    if (cu->language == language_cplus
 		|| cu->language == language_java
 		|| cu->language == language_ada)
 	      {
-		struct symbol *typedef_sym = (struct symbol *)
-		  obstack_alloc (&objfile->objfile_obstack,
-				 sizeof (struct symbol));
-		*typedef_sym = *sym;
-		SYMBOL_DOMAIN (typedef_sym) = VAR_DOMAIN;
 		/* The symbol's name is already allocated along with
 		   this objfile, so we don't need to duplicate it for
 		   the type.  */
 		if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
 		  TYPE_NAME (SYMBOL_TYPE (sym)) = SYMBOL_SEARCH_NAME (sym);
-		add_symbol_to_list (typedef_sym, list_to_add);
 	      }
 	  }
 	  break;
Index: symtab.c
===================================================================
--- symtab.c	(revision 130550)
+++ symtab.c	(working copy)
@@ -1675,6 +1675,26 @@ lookup_symbol_global (const char *name,
 				     domain, symtab);
 }
 
+int
+symbol_matches_domain (enum language symbol_language, 
+		       domain_enum symbol_domain,
+		       domain_enum domain)
+{
+  /* For C++ "struct foo { ... }" also defines a typedef for "foo".  
+     A Java class declaration also defines a typedef for the class.
+     Similarly, any Ada type declaration implicitly defines a typedef.  */
+  if (symbol_language == language_cplus
+      || symbol_language == language_java
+      || symbol_language == language_ada)
+    {
+      if ((domain == VAR_DOMAIN || domain == STRUCT_DOMAIN)
+	  && symbol_domain == STRUCT_DOMAIN)
+	return 1;
+    }
+  /* For all other languages, strict match is required.  */
+  return (symbol_domain == domain);
+}
+
 /* Look, in partial_symtab PST, for symbol whose natural name is NAME.
    If LINKAGE_NAME is non-NULL, check in addition that the symbol's
    linkage name matches it.  Check the global symbols if GLOBAL, the
@@ -1739,10 +1759,9 @@ lookup_partial_symbol (struct partial_sy
 		 ? strcmp (SYMBOL_LINKAGE_NAME (*top), linkage_name) == 0
 		 : SYMBOL_MATCHES_SEARCH_NAME (*top,name)))
 	{
-	  if (SYMBOL_DOMAIN (*top) == domain)
-	    {
-		  return (*top);
-	    }
+	  if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
+				     SYMBOL_DOMAIN (*top), domain))
+	    return (*top);
 	  top++;
 	}
     }
@@ -1754,7 +1773,8 @@ lookup_partial_symbol (struct partial_sy
     {			
       for (psym = start; psym < start + length; psym++)
 	{
-	  if (domain == SYMBOL_DOMAIN (*psym))
+	  if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym), 
+				     SYMBOL_DOMAIN (*psym), domain))
 	    {
 	      if (linkage_name != NULL
 		  ? strcmp (SYMBOL_LINKAGE_NAME (*psym), linkage_name) == 0
@@ -1939,7 +1959,8 @@ lookup_block_symbol (const struct block 
 	   sym != NULL;
 	   sym = dict_iter_name_next (name, &iter))
 	{
-	  if (SYMBOL_DOMAIN (sym) == domain
+	  if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+				     SYMBOL_DOMAIN (sym), domain)
 	      && (linkage_name != NULL
 		  ? strcmp (SYMBOL_LINKAGE_NAME (sym), linkage_name) == 0 : 1))
 	    return sym;
@@ -1960,7 +1981,8 @@ lookup_block_symbol (const struct block 
 	   sym != NULL;
 	   sym = dict_iter_name_next (name, &iter))
 	{
-	  if (SYMBOL_DOMAIN (sym) == domain
+	  if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+				     SYMBOL_DOMAIN (sym), domain)
 	      && (linkage_name != NULL
 		  ? strcmp (SYMBOL_LINKAGE_NAME (sym), linkage_name) == 0 : 1))
 	    {
Index: symtab.h
===================================================================
--- symtab.h	(revision 130550)
+++ symtab.h	(working copy)
@@ -1019,6 +1019,10 @@ extern const char multiple_symbols_cance
 
 const char *multiple_symbols_select_mode (void);
 
+int symbol_matches_domain (enum language symbol_language, 
+			   domain_enum symbol_domain,
+			   domain_enum domain);
+
 /* lookup a symbol table by source file name */
 
 extern struct symtab *lookup_symtab (const char *);

  reply	other threads:[~2008-05-02 23:01 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-09  5:21 Aleksandar Ristovski
2008-02-14  0:16 ` Aleksandar Ristovski
2008-02-14  1:35   ` Daniel Jacobowitz
2008-05-01 19:25 ` Daniel Jacobowitz
2008-05-02 13:43   ` Aleksandar Ristovski
2008-05-02 13:39     ` Aleksandar Ristovski
2008-05-02 14:01     ` Daniel Jacobowitz
2008-05-03  0:01       ` Joel Brobecker [this message]
2008-05-05 16:15         ` Aleksandar Ristovski
2008-05-05 15:16           ` Aleksandar Ristovski
2008-04-22 16:46 Aleksandar Ristovski

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=20080502230127.GJ3801@adacore.com \
    --to=brobecker@adacore.com \
    --cc=aristovski@qnx.com \
    --cc=gdb-patches@sourceware.org \
    /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