public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: sami wagiaalla <swagiaal@redhat.com>
To: gdb-patches@sourceware.org
Subject: Re: [patch] Defer symbol addition until construction is complete
Date: Mon, 09 Aug 2010 18:38:00 -0000	[thread overview]
Message-ID: <4C604B22.4060904@redhat.com> (raw)
In-Reply-To: <m37hkej984.fsf@fleche.redhat.com>

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


> Ok with those changes.
>

I am reposting since the rebase want trivial; I change the template 
symbol code to take advantage of this clean up.

Is this cool ?

Sami

[-- Attachment #2: defer_symbol_addtion.patch --]
[-- Type: text/plain, Size: 6842 bytes --]

Complete symbol construction before adding to pending list.

2010-08-09  Sami Wagiaalla  <swagiaal@redhat.com>

	* dwarf2read.c (new_symbol): Add symbol to variable list at end of
	function after symbol construction is complete.
	Do the same for template symbol addition to template_symbols list.

diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 5275c58..e7f7d19 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -9996,6 +9996,8 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
   struct attribute *attr = NULL;
   struct attribute *attr2 = NULL;
   CORE_ADDR baseaddr;
+  struct pending **list_to_add = NULL;
+
   int inlined_func = (die->tag == DW_TAG_inlined_subroutine);
 
   baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
@@ -10088,11 +10090,11 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
                  access them globally.  For instance, we want to be able
                  to break on a nested subprogram without having to
                  specify the context.  */
-	      add_symbol_to_list (sym, &global_symbols);
+	      list_to_add = &global_symbols;
 	    }
 	  else
 	    {
-	      add_symbol_to_list (sym, cu->list_in_scope);
+	      list_to_add = cu->list_in_scope;
 	    }
 	  break;
 	case DW_TAG_inlined_subroutine:
@@ -10129,17 +10131,12 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 	    {
 	      dwarf2_const_value (attr, sym, cu);
 	      attr2 = dwarf2_attr (die, DW_AT_external, cu);
-	      if (suppress_add)
-		{
-		  sym->hash_next = objfile->template_symbols;
-		  objfile->template_symbols = sym;
-		}
-	      else
+	      if (!suppress_add)
 		{
 		  if (attr2 && (DW_UNSND (attr2) != 0))
-		    add_symbol_to_list (sym, &global_symbols);
+		    list_to_add = &global_symbols;
 		  else
-		    add_symbol_to_list (sym, cu->list_in_scope);
+		    list_to_add = cu->list_in_scope;
 		}
 	      break;
 	    }
@@ -10159,8 +10156,6 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 		}
 	      else if (attr2 && (DW_UNSND (attr2) != 0))
 		{
-		  struct pending **list_to_add;
-
 		  /* Workaround gfortran PR debug/40040 - it uses
 		     DW_AT_location for variables in -fPIC libraries which may
 		     get overriden by other libraries/executable and get
@@ -10179,10 +10174,9 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 		     but it may be block-scoped.  */
 		  list_to_add = (cu->list_in_scope == &file_symbols
 				 ? &global_symbols : cu->list_in_scope);
-		  add_symbol_to_list (sym, list_to_add);
 		}
 	      else
-		add_symbol_to_list (sym, cu->list_in_scope);
+		list_to_add = cu->list_in_scope;
 	    }
 	  else
 	    {
@@ -10196,33 +10190,19 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 	      if (attr2 && (DW_UNSND (attr2) != 0)
 		  && dwarf2_attr (die, DW_AT_type, cu) != NULL)
 		{
-		  struct pending **list_to_add;
-
 		  /* A variable with DW_AT_external is never static, but it
 		     may be block-scoped.  */
 		  list_to_add = (cu->list_in_scope == &file_symbols
 				 ? &global_symbols : cu->list_in_scope);
 
 		  SYMBOL_CLASS (sym) = LOC_UNRESOLVED;
-		  if (suppress_add)
-		    {
-		      sym->hash_next = objfile->template_symbols;
-		      objfile->template_symbols = sym;
-		    }
-		  else
-		    add_symbol_to_list (sym, list_to_add);
 		}
 	      else if (!die_is_declaration (die, cu))
 		{
 		  /* Use the default LOC_OPTIMIZED_OUT class.  */
 		  gdb_assert (SYMBOL_CLASS (sym) == LOC_OPTIMIZED_OUT);
-		  if (suppress_add)
-		    {
-		      sym->hash_next = objfile->template_symbols;
-		      objfile->template_symbols = sym;
-		    }
-		  else
-		    add_symbol_to_list (sym, cu->list_in_scope);
+		  if (!suppress_add)
+		    list_to_add = cu->list_in_scope;
 		}
 	    }
 	  break;
@@ -10254,7 +10234,7 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 	      SYMBOL_TYPE (sym) = ref_type;
 	    }
 
-	  add_symbol_to_list (sym, cu->list_in_scope);
+	  list_to_add = cu->list_in_scope;
 	  break;
 	case DW_TAG_unspecified_parameters:
 	  /* From varargs functions; gdb doesn't seem to have any
@@ -10282,21 +10262,12 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 	       saves you.  See the OtherFileClass tests in
 	       gdb.c++/namespace.exp.  */
 
-	    if (suppress_add)
+	    if (!suppress_add)
 	      {
-		sym->hash_next = objfile->template_symbols;
-		objfile->template_symbols = sym;
-	      }
-	    else
-	      {
-		struct pending **list_to_add;
-
 		list_to_add = (cu->list_in_scope == &file_symbols
 			       && (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
@@ -10317,13 +10288,13 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 	case DW_TAG_typedef:
 	  SYMBOL_CLASS (sym) = LOC_TYPEDEF;
 	  SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-	  add_symbol_to_list (sym, cu->list_in_scope);
+	  list_to_add = cu->list_in_scope;
 	  break;
 	case DW_TAG_base_type:
         case DW_TAG_subrange_type:
 	  SYMBOL_CLASS (sym) = LOC_TYPEDEF;
 	  SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-	  add_symbol_to_list (sym, cu->list_in_scope);
+	  list_to_add = cu->list_in_scope;
 	  break;
 	case DW_TAG_enumerator:
 	  attr = dwarf2_attr (die, DW_AT_const_value, cu);
@@ -10335,19 +10306,15 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 	    /* NOTE: carlton/2003-11-10: See comment above in the
 	       DW_TAG_class_type, etc. block.  */
 
-	    struct pending **list_to_add;
-
 	    list_to_add = (cu->list_in_scope == &file_symbols
 			   && (cu->language == language_cplus
 			       || cu->language == language_java)
 			   ? &global_symbols : cu->list_in_scope);
-
-	    add_symbol_to_list (sym, list_to_add);
 	  }
 	  break;
 	case DW_TAG_namespace:
 	  SYMBOL_CLASS (sym) = LOC_TYPEDEF;
-	  add_symbol_to_list (sym, &global_symbols);
+	  list_to_add = &global_symbols;
 	  break;
 	default:
 	  /* Not a tag we recognize.  Hopefully we aren't processing
@@ -10359,6 +10326,16 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 	  break;
 	}
 
+      if (suppress_add)
+	{
+	  sym->hash_next = objfile->template_symbols;
+	  objfile->template_symbols = sym;
+	  list_to_add = NULL;
+	}
+
+      if (list_to_add != NULL)
+	add_symbol_to_list (sym, list_to_add);
+
       /* For the benefit of old versions of GCC, check for anonymous
 	 namespaces based on the demangled name.  */
       if (!processing_has_namespace_info

  reply	other threads:[~2010-08-09 18:38 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-19 15:28 sami wagiaalla
2010-07-29 20:58 ` Tom Tromey
2010-08-09 18:38   ` sami wagiaalla [this message]
2010-08-09 19:55     ` Tom Tromey
2010-08-10  7:44     ` Regression gdb.cp/temargs.exp: test value of P in inner_m [Re: [patch] Defer symbol addition until construction is complete] Jan Kratochvil
2010-08-10 14:34       ` sami wagiaalla
2010-08-20 20:21         ` sami wagiaalla
2010-08-20 21:54           ` Tom Tromey
2010-08-31 15:18             ` sami wagiaalla
2010-08-31 18:37       ` Tom Tromey

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=4C604B22.4060904@redhat.com \
    --to=swagiaal@redhat.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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).