gdb/
authorJerome Guitton <guitton@adacore.com>
Mon, 26 Jul 2010 09:30:00 +0000 (09:30 +0000)
committerJerome Guitton <guitton@adacore.com>
Mon, 26 Jul 2010 09:30:00 +0000 (09:30 +0000)
* dwarf2read.c (add_partial_symbol): Do not add a global variable if
its adress is null. Add comment to explain why.
(new_symbol): Ditto.

gdb/ChangeLog
gdb/dwarf2read.c

index 9908178063a6615af5cfe79ee619ac4c119bde44..a80f1cce831c67c2b3a563d8e4a2b4b926becc3c 100644 (file)
@@ -1,3 +1,9 @@
+2010-07-26  Jerome Guitton  <guitton@adacore.com>
+
+       * dwarf2read.c (add_partial_symbol): Do not add a global variable if
+       its adress is null. Add comment to explain why.
+       (new_symbol): Ditto.
+
 2010-07-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * linux-nat.c (linux_nat_do_thread_registers): Convert STOP_SIGNAL to
index f4eb1f7370285f2bd74ea63bfb9e3861015efb74..fb62b77265978ca35a84a450771af8f0e93520e8 100644 (file)
@@ -3569,7 +3569,19 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
        }
       break;
     case DW_TAG_variable:
-      if (pdi->is_external)
+      if (pdi->locdesc)
+       addr = decode_locdesc (pdi->locdesc, cu);
+
+      if (pdi->locdesc
+         && addr == 0
+         && !dwarf2_per_objfile->has_section_at_zero)
+       {
+         /* A global or static variable may also have been stripped
+            out by the linker if unused, in which case its address
+            will be nullified; do not add such variables into partial
+            symbol table then.  */
+       }
+      else if (pdi->is_external)
        {
          /* Global Variable.
             Don't enter into the minimal symbol tables as there is
@@ -3584,8 +3596,6 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
             used by GDB, but it comes in handy for debugging partial symbol
             table building.  */
 
-         if (pdi->locdesc)
-           addr = decode_locdesc (pdi->locdesc, cu);
          if (pdi->locdesc || pdi->has_type)
            psym = add_psymbol_to_list (actual_name, strlen (actual_name),
                                        built_actual_name,
@@ -3603,7 +3613,6 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
                xfree (actual_name);
              return;
            }
-         addr = decode_locdesc (pdi->locdesc, cu);
          /*prim_record_minimal_symbol (actual_name, addr + baseaddr,
             mst_file_data, objfile); */
          psym = add_psymbol_to_list (actual_name, strlen (actual_name),
@@ -10006,7 +10015,16 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
            {
              var_decode_location (attr, sym, cu);
              attr2 = dwarf2_attr (die, DW_AT_external, cu);
-             if (attr2 && (DW_UNSND (attr2) != 0))
+             if (SYMBOL_CLASS (sym) == LOC_STATIC
+                 && SYMBOL_VALUE_ADDRESS (sym) == 0
+                 && !dwarf2_per_objfile->has_section_at_zero)
+               {
+                 /* When a static variable is eliminated by the linker,
+                    the corresponding debug information is not stripped
+                    out, but the variable address is set to null;
+                    do not add such variables into symbol table.  */
+               }
+             else if (attr2 && (DW_UNSND (attr2) != 0))
                {
                  struct pending **list_to_add;