Set section indices when symbols are made
authorTom Tromey <tromey@adacore.com>
Fri, 13 Jan 2023 15:57:08 +0000 (08:57 -0700)
committerTom Tromey <tromey@adacore.com>
Wed, 8 Feb 2023 15:20:12 +0000 (08:20 -0700)
Most places in gdb that create a new symbol will apply a section
offset to the address.  It seems to me that the choice of offset here
is also an implicit choice of the section.  This is particularly true
if you examine fixup_section, which notes that it must be called
before such offsets are applied -- meaning that if any such call has
an effect, it's purely by accident.

This patch cleans up this area by tracking the section index and
applying it to a symbol when the address is set.  This is done for
nearly every case -- the remaining cases will be handled in later
patches.

gdb/dbxread.c
gdb/dwarf2/read.c
gdb/mdebugread.c
gdb/stabsread.c

index ab0734f0218c9533bc53ce8345c771572c5e429a..dc11f0bb6a9bb2c2ded3c4cdc3de8c7ef2d0dd36 100644 (file)
@@ -2414,6 +2414,9 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
      source file.  Used to detect the SunPRO solaris compiler.  */
   static int n_opt_found;
 
+  /* The section index for this symbol.  */
+  int section_index = -1;
+
   /* Something is wrong if we see real data before seeing a source
      file name.  */
 
@@ -2477,6 +2480,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
       sline_found_in_function = 0;
 
       /* Relocate for dynamic loading.  */
+      section_index = SECT_OFF_TEXT (objfile);
       valu += section_offsets[SECT_OFF_TEXT (objfile)];
       valu = gdbarch_addr_bits_remove (gdbarch, valu);
       last_function_start = valu;
@@ -2565,6 +2569,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
     case N_FN_SEQ:
       /* This kind of symbol indicates the start of an object file.
         Relocate for dynamic loading.  */
+      section_index = SECT_OFF_TEXT (objfile);
       valu += section_offsets[SECT_OFF_TEXT (objfile)];
       break;
 
@@ -2573,6 +2578,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
         source file.  Finish the symbol table of the previous source
         file (if any) and start accumulating a new symbol table.
         Relocate for dynamic loading.  */
+      section_index = SECT_OFF_TEXT (objfile);
       valu += section_offsets[SECT_OFF_TEXT (objfile)];
 
       n_opt_found = 0;
@@ -2609,6 +2615,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
         sub-source-file, one whose contents were copied or included
         in the compilation of the main source file (whose name was
         given in the N_SO symbol).  Relocate for dynamic loading.  */
+      section_index = SECT_OFF_TEXT (objfile);
       valu += section_offsets[SECT_OFF_TEXT (objfile)];
       start_subfile (name);
       break;
@@ -2709,6 +2716,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
                   symbol_file_add as addr (this is known to affect
                   SunOS 4, and I suspect ELF too).  Since there is no
                   Ttext.text symbol, we can get addr from the text offset.  */
+               section_index = SECT_OFF_TEXT (objfile);
                valu += section_offsets[SECT_OFF_TEXT (objfile)];
                goto define_a_symbol;
              }
@@ -2730,21 +2738,25 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
 
     case_N_STSYM:              /* Static symbol in data segment.  */
     case N_DSLINE:             /* Source line number, data segment.  */
+      section_index = SECT_OFF_DATA (objfile);
       valu += section_offsets[SECT_OFF_DATA (objfile)];
       goto define_a_symbol;
 
     case_N_LCSYM:              /* Static symbol in BSS segment.  */
     case N_BSLINE:             /* Source line number, BSS segment.  */
       /* N_BROWS: overlaps with N_BSLINE.  */
+      section_index = SECT_OFF_BSS (objfile);
       valu += section_offsets[SECT_OFF_BSS (objfile)];
       goto define_a_symbol;
 
     case_N_ROSYM:              /* Static symbol in read-only data segment.  */
+      section_index = SECT_OFF_RODATA (objfile);
       valu += section_offsets[SECT_OFF_RODATA (objfile)];
       goto define_a_symbol;
 
     case N_ENTRY:              /* Alternate entry point.  */
       /* Relocate for dynamic loading.  */
+      section_index = SECT_OFF_TEXT (objfile);
       valu += section_offsets[SECT_OFF_TEXT (objfile)];
       goto define_a_symbol;
 
@@ -2836,10 +2848,17 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
 
              newobj = push_context (0, valu);
              newobj->name = define_symbol (valu, name, desc, type, objfile);
+             if (newobj->name != nullptr)
+               newobj->name->set_section_index (section_index);
              break;
 
            default:
-             define_symbol (valu, name, desc, type, objfile);
+             {
+               struct symbol *sym = define_symbol (valu, name, desc, type,
+                                                   objfile);
+               if (sym != nullptr)
+                 sym->set_section_index (section_index);
+             }
              break;
            }
        }
index bbbf8ad18162026354fd0875f9eb788ef730f1d8..8708f7a40748e6497098ce699da70fd9eb1e9393 100644 (file)
@@ -20885,6 +20885,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 
              addr = attr->as_address ();
              addr = gdbarch_adjust_dwarf2_addr (gdbarch, addr + baseaddr);
+             sym->set_section_index (SECT_OFF_TEXT (objfile));
              sym->set_value_address (addr);
              sym->set_aclass_index (LOC_LABEL);
            }
index 8dc836a0f6e8aeb4315ecb64e4c05f9cb949c7d0..4feee39035e0daaab77235c35a866694bbaf8a2e 100644 (file)
@@ -597,6 +597,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
   else
     name = debug_info->ss + cur_fdr->issBase + sh->iss;
 
+  int section_index = -1;
   switch (sh->sc)
     {
     case scText:
@@ -607,21 +608,24 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
         The value of a stBlock symbol is the displacement from the
         procedure address.  */
       if (sh->st != stEnd && sh->st != stBlock)
-       sh->value += section_offsets[SECT_OFF_TEXT (objfile)];
+       section_index = SECT_OFF_TEXT (objfile);
       break;
     case scData:
     case scSData:
     case scRData:
     case scPData:
     case scXData:
-      sh->value += section_offsets[SECT_OFF_DATA (objfile)];
+      section_index = SECT_OFF_DATA (objfile);
       break;
     case scBss:
     case scSBss:
-      sh->value += section_offsets[SECT_OFF_BSS (objfile)];
+      section_index = SECT_OFF_BSS (objfile);
       break;
     }
 
+  if (section_index != -1)
+    sh->value += section_offsets[section_index];
+
   switch (sh->st)
     {
     case stNil:
@@ -630,6 +634,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
     case stGlobal:             /* External symbol, goes into global block.  */
       b = top_stack->cur_st->compunit ()->blockvector ()->global_block ();
       s = new_symbol (name);
+      s->set_section_index (section_index);
       s->set_value_address (sh->value);
       add_data_symbol (sh, ax, bigend, s, LOC_STATIC, b, objfile, name);
       break;
@@ -647,7 +652,10 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          global_sym_chain[bucket] = s;
        }
       else
-       s->set_value_address (sh->value);
+       {
+         s->set_section_index (section_index);
+         s->set_value_address (sh->value);
+       }
       add_data_symbol (sh, ax, bigend, s, LOC_STATIC, b, objfile, name);
       break;
 
@@ -704,6 +712,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       s = new_symbol (name);
       s->set_domain (VAR_DOMAIN);      /* So that it can be used */
       s->set_aclass_index (LOC_LABEL); /* but not misused.  */
+      s->set_section_index (section_index);
       s->set_value_address (sh->value);
       s->set_type (objfile_type (objfile)->builtin_int);
       add_symbol (s, top_stack->cur_st, top_stack->cur_block);
@@ -745,6 +754,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       s = new_symbol (name);
       s->set_domain (VAR_DOMAIN);
       s->set_aclass_index (LOC_BLOCK);
+      s->set_section_index (section_index);
       /* Type of the return value.  */
       if (SC_IS_UNDEF (sh->sc) || sh->sc == scNil)
        t = objfile_type (objfile)->builtin_int;
index 8d1b998354f4d4648f147719f68ca0ddafcab6d2..ca9132b37d08b5fcd5cdf264e12ced2c4b6a905c 100644 (file)
@@ -107,8 +107,6 @@ static void
 patch_block_stabs (struct pending *, struct pending_stabs *,
                   struct objfile *);
 
-static void fix_common_block (struct symbol *, CORE_ADDR);
-
 static int read_type_number (const char **, int *);
 
 static struct type *read_type (const char **, struct objfile *);
@@ -4305,7 +4303,7 @@ common_block_end (struct objfile *objfile)
    the common block name).  */
 
 static void
-fix_common_block (struct symbol *sym, CORE_ADDR valu)
+fix_common_block (struct symbol *sym, CORE_ADDR valu, int section_index)
 {
   struct pending *next = (struct pending *) sym->type ();
 
@@ -4314,8 +4312,11 @@ fix_common_block (struct symbol *sym, CORE_ADDR valu)
       int j;
 
       for (j = next->nsyms - 1; j >= 0; j--)
-       next->symbol[j]->set_value_address
-         (next->symbol[j]->value_address () + valu);
+       {
+         next->symbol[j]->set_value_address
+           (next->symbol[j]->value_address () + valu);
+         next->symbol[j]->set_section_index (section_index);
+       }
     }
 }
 \f
@@ -4585,7 +4586,8 @@ scan_file_globals (struct objfile *objfile)
                    {
                      if (sym->aclass () == LOC_BLOCK)
                        fix_common_block
-                         (sym, msymbol->value_address (resolve_objfile));
+                         (sym, msymbol->value_address (resolve_objfile),
+                          msymbol->section_index ());
                      else
                        sym->set_value_address
                          (msymbol->value_address (resolve_objfile));