Complete symbol construction before adding to pending list.
authorSami Wagiaalla <swagiaal@redhat.com>
Mon, 9 Aug 2010 20:34:06 +0000 (20:34 +0000)
committerSami Wagiaalla <swagiaal@redhat.com>
Mon, 9 Aug 2010 20:34:06 +0000 (20:34 +0000)
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.

gdb/ChangeLog
gdb/dwarf2read.c

index d0522f83b6b3b9cecb23e8d9c607c02060248c6f..d85f913008a02befaf2e75d0b205ddfda085d357 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2010-08-09  Sami Wagiaalla  <swagiaal@redhat.com>
 
        * symtab.c (symbol_get_demangled_name): Remove assertion and
index aecd042b6e27413ed9764446c45a2d108df6cc47..78491c8a781454725f316998e2704bce1e7e4688 100644 (file)
@@ -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