Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* Re: [rfc] get rid of redundant data in c++ and java
@ 2008-04-22 16:46 Aleksandar Ristovski
  0 siblings, 0 replies; 11+ messages in thread
From: Aleksandar Ristovski @ 2008-04-22 16:46 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb-patches

Daniel Jacobowitz wrote:
> On Wed, Feb 13, 2008 at 07:15:48PM -0500, Aleksandar Ristovski wrote:
>> Anyone has any comments on this?
> 
> Sorry, I'm very busy during the week and there does not seem to be
> another maintainer comfortable (or available) to review symbol table
> patches right now.  I'll get back to you as soon as I have the time;
> both for this and your other patch.
> 

Just curious if you had a chance to review? (this thread and this one:
http://sourceware.org/ml/gdb-patches/2008-02/msg00208.html)

Thanks,

Aleksandar Ristovski
QNX Software Systems


^ permalink raw reply	[flat|nested] 11+ messages in thread
* [rfc] get rid of redundant data in c++ and java
@ 2008-02-09  5:21 Aleksandar Ristovski
  2008-02-14  0:16 ` Aleksandar Ristovski
  2008-05-01 19:25 ` Daniel Jacobowitz
  0 siblings, 2 replies; 11+ messages in thread
From: Aleksandar Ristovski @ 2008-02-09  5:21 UTC (permalink / raw)
  To: gdb-patches

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

Hello,

Currently we synthesize typedef info for java and c++ (and ada, but I am not 
familiar with that language) for any symbol with STRUCT_DOMAIN domain. This can 
add up to a lot of redundant data. For partial symbols, we generate two 
identical names for the same symbol, once as struct second as typedef. The same 
happens with symbols, except we do not duplicate symbol name, but we do allocate 
another symbol struture.

Instead of generating redundant data for symbols with STRUCT_DOMAIN domain in 
java and c++ languages, treat STRUCT_DOMAIN as equal to VAR_DOMAIN for these two 
languages when looking up symbols.

See the patch for details.

Running tests on linux x86, no regressions.


---
Aleksandar Ristovski
QNX Software Systems



2008-02-08  Aleksandar Ristovski  <aristovski@qnx.com>

	* dwarf2read.c (add_partial_symbol): Do not add new psym for
	STRUCT_DOMAIN. Make sure you recognize c++ struct and java 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++ and java.
	(lookup_partial_symbol): Use symbol_matches_domain to see if the
	found psym domain matches the given domain.
	(lookup_block_symbol): Likewise.


[-- Attachment #2: duplicatesymbolfix.diff --]
[-- Type: text/plain, Size: 5925 bytes --]

Index: gdb/dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.251
diff -u -5 -p -p -r1.251 dwarf2read.c
--- gdb/dwarf2read.c	1 Feb 2008 22:45:13 -0000	1.251
+++ gdb/dwarf2read.c	9 Feb 2008 04:51:19 -0000
@@ -2006,15 +2006,14 @@ add_partial_symbol (struct partial_die_i
 			    || cu->language == language_java)
 			   ? &objfile->global_psymbols
 			   : &objfile->static_psymbols,
 			   0, (CORE_ADDR) 0, cu->language, objfile);
 
-      if (cu->language == language_cplus
-          || cu->language == language_java
-          || cu->language == language_ada)
+      if (cu->language == language_ada)
 	{
-	  /* For C++ and Java, these implicitly act as typedefs as well. */
+	  /* FIXME: Check if Ada really
+	     needs to implicitly set typedef.  */
 	  add_psymbol_to_list (actual_name, strlen (actual_name),
 			       VAR_DOMAIN, LOC_TYPEDEF,
 			       &objfile->global_psymbols,
 			       0, (CORE_ADDR) 0, cu->language, objfile);
 	}
@@ -7429,29 +7428,32 @@ new_symbol (struct die_info *die, struct
 			   && (cu->language == language_cplus
 			       || cu->language == language_java)
 			   ? &global_symbols : cu->list_in_scope);
 	  
 	    add_symbol_to_list (sym, list_to_add);
-
-	    /* 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.  */
+	    
 	    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);
+	      }
+ 
+	    /* FIXME: Check if ada really needs to synthesize the typedef
+	       or it can, as cplus and java, reuse STRUCT_DOMAIN in
+	       lookup_ functions.  */
+	    if (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;
 		add_symbol_to_list (typedef_sym, list_to_add);
 	      }
 	  }
 	  break;
 	case DW_TAG_typedef:
Index: gdb/symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.173
diff -u -5 -p -p -r1.173 symtab.c
--- gdb/symtab.c	5 Feb 2008 22:17:40 -0000	1.173
+++ gdb/symtab.c	9 Feb 2008 04:51:20 -0000
@@ -1577,10 +1577,28 @@ lookup_symbol_global (const char *name,
 
   return lookup_symbol_aux_psymtabs (GLOBAL_BLOCK, name, linkage_name,
 				     domain, symtab);
 }
 
+static 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.  */
+  if (symbol_language == language_cplus
+      || symbol_language  == language_java)
+    {
+      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
    static symbols if not */
 
@@ -1641,14 +1659,13 @@ lookup_partial_symbol (struct partial_sy
       while (top <= real_top
 	     && (linkage_name != NULL
 		 ? 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++;
 	}
     }
 
   /* Can't use a binary search or else we found during the binary search that
@@ -1656,11 +1673,12 @@ lookup_partial_symbol (struct partial_sy
 
   if (do_linear_search)
     {			
       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
 		  : SYMBOL_MATCHES_SEARCH_NAME (*psym, name))
 		{
@@ -1841,11 +1859,12 @@ lookup_block_symbol (const struct block 
     {
       for (sym = dict_iter_name_first (BLOCK_DICT (block), name, &iter);
 	   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;
 	}
       return NULL;
@@ -1862,11 +1881,12 @@ lookup_block_symbol (const struct block 
 
       for (sym = dict_iter_name_first (BLOCK_DICT (block), name, &iter);
 	   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))
 	    {
 	      sym_found = sym;
 	      if (SYMBOL_CLASS (sym) != LOC_ARG &&

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2008-05-05 14:39 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-04-22 16:46 [rfc] get rid of redundant data in c++ and java Aleksandar Ristovski
  -- strict thread matches above, loose matches on Subject: below --
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
2008-05-05 16:15         ` Aleksandar Ristovski
2008-05-05 15:16           ` Aleksandar Ristovski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox