Use unrelocated_addr in partial symbol tables
authorTom Tromey <tom@tromey.com>
Fri, 17 Mar 2023 22:37:15 +0000 (16:37 -0600)
committerTom Tromey <tom@tromey.com>
Tue, 28 Mar 2023 21:12:43 +0000 (15:12 -0600)
This changes partial symbol tables to use unrelocated_addr for the
text_high and text_low members.  This revealed some latent bugs in
ctfread.c, which are fixed here.

gdb/ctfread.c
gdb/dbxread.c
gdb/mdebugread.c
gdb/psympriv.h
gdb/psymtab.c
gdb/stabsread.h
gdb/xcoffread.c

index 42f2da7a88f64a1c3e2f22f5379fd5b5d92f470e..41411abef2b85acc579d3ea7126cc6c616ee6044 100644 (file)
@@ -127,7 +127,7 @@ struct ctf_psymtab : public standard_psymtab
   ctf_psymtab (const char *filename,
               psymtab_storage *partial_symtabs,
               objfile_per_bfd_storage *objfile_per_bfd,
-              CORE_ADDR addr)
+              unrelocated_addr addr)
     : standard_psymtab (filename, partial_symtabs, objfile_per_bfd, addr)
   {
   }
@@ -1232,10 +1232,10 @@ add_stt_func (struct ctf_context *ccp)
   add_stt_entries (ccp, 1);
 }
 
-/* Get text segment base for OBJFILE, TSIZE contains the segment size.  */
+/* Get text section base for OBJFILE, TSIZE contains the size.  */
 
 static CORE_ADDR
-get_objfile_text_range (struct objfile *of, int *tsize)
+get_objfile_text_range (struct objfile *of, size_t *tsize)
 {
   bfd *abfd = of->obfd.get ();
   const asection *codes;
@@ -1405,14 +1405,14 @@ ctf_psymtab::read_symtab (struct objfile *objfile)
 
       /* Start a symtab.  */
       CORE_ADDR offset;        /* Start of text segment.  */
-      int tsize;
+      size_t tsize;
 
       offset = get_objfile_text_range (objfile, &tsize);
       ctf_start_compunit_symtab (this, objfile, offset);
       expand_psymtab (objfile);
 
-      set_text_low (offset);
-      set_text_high (offset + tsize);
+      set_text_low (unrelocated_addr (0));
+      set_text_high (unrelocated_addr (tsize));
       compunit_symtab = ctf_end_compunit_symtab (this, offset + tsize);
 
       /* Finish up the debug error message.  */
@@ -1442,7 +1442,8 @@ create_partial_symtab (const char *name,
 {
   ctf_psymtab *pst;
 
-  pst = new ctf_psymtab (name, partial_symtabs, objfile->per_bfd, 0);
+  pst = new ctf_psymtab (name, partial_symtabs, objfile->per_bfd,
+                        unrelocated_addr (0));
 
   pst->context.arc = arc;
   pst->context.fp = cfp;
index e5366ccd0d09be103f983c04e066e621128b9c79..1ae527e9bf3fe6a5ce5879e746b0825332af4e1f 100644 (file)
@@ -296,7 +296,7 @@ static void add_old_header_file (const char *, int);
 static void add_this_object_header_file (int);
 
 static legacy_psymtab *start_psymtab (psymtab_storage *, struct objfile *,
-                                     const char *, CORE_ADDR, int);
+                                     const char *, unrelocated_addr, int);
 
 /* Free up old header file tables.  */
 
@@ -1125,16 +1125,18 @@ read_dbx_symtab (minimal_symbol_reader &reader,
              || (namestring[(nsl = strlen (namestring)) - 1] == 'o'
                  && namestring[nsl - 2] == '.'))
            {
+             unrelocated_addr unrel_val = unrelocated_addr (nlist.n_value);
+
              if (past_first_source_file && pst
                  /* The gould NP1 uses low values for .o and -l symbols
                     which are not the address.  */
-                 && nlist.n_value >= pst->raw_text_low ())
+                 && unrel_val >= pst->raw_text_low ())
                {
                  dbx_end_psymtab (objfile, partial_symtabs,
                                   pst, psymtab_include_list,
                                   includes_used, symnum * symbol_size,
-                                  nlist.n_value > pst->raw_text_high ()
-                                  ? nlist.n_value : pst->raw_text_high (),
+                                  unrel_val > pst->raw_text_high ()
+                                  ? unrel_val : pst->raw_text_high (),
                                   dependency_list, dependencies_used,
                                   textlow_not_set);
                  pst = (legacy_psymtab *) 0;
@@ -1246,11 +1248,12 @@ read_dbx_symtab (minimal_symbol_reader &reader,
 
                if (pst)
                  {
+                   unrelocated_addr unrel_value = unrelocated_addr (valu);
                    dbx_end_psymtab (objfile, partial_symtabs,
                                     pst, psymtab_include_list,
                                     includes_used, symnum * symbol_size,
-                                    (valu > pst->raw_text_high ()
-                                     ? valu : pst->raw_text_high ()),
+                                    (unrel_value > pst->raw_text_high ()
+                                     ? unrel_value : pst->raw_text_high ()),
                                     dependency_list, dependencies_used,
                                     prev_textlow_not_set);
                    pst = (legacy_psymtab *) 0;
@@ -1291,7 +1294,8 @@ read_dbx_symtab (minimal_symbol_reader &reader,
            if (!pst)
              {
                pst = start_psymtab (partial_symtabs, objfile,
-                                    namestring, valu,
+                                    namestring,
+                                    unrelocated_addr (valu),
                                     first_so_symnum * symbol_size);
                pst->dirname = dirname_nso;
                dirname_nso = NULL;
@@ -1416,13 +1420,14 @@ read_dbx_symtab (minimal_symbol_reader &reader,
          /* See if this is an end of function stab.  */
          if (pst && nlist.n_type == N_FUN && *namestring == '\000')
            {
-             CORE_ADDR valu;
+             unrelocated_addr valu;
 
              /* It's value is the size (in bytes) of the function for
                 function relative stabs, or the address of the function's
                 end for old style stabs.  */
-             valu = nlist.n_value + last_function_start;
-             if (pst->raw_text_high () == 0 || valu > pst->raw_text_high ())
+             valu = unrelocated_addr (nlist.n_value + last_function_start);
+             if (pst->raw_text_high () == unrelocated_addr (0)
+                 || valu > pst->raw_text_high ())
                pst->set_text_high (valu);
              break;
            }
@@ -1673,7 +1678,7 @@ read_dbx_symtab (minimal_symbol_reader &reader,
              if (pst && textlow_not_set
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
-                 pst->set_text_low (nlist.n_value);
+                 pst->set_text_low (unrelocated_addr (nlist.n_value));
                  textlow_not_set = 0;
                }
              /* End kludge.  */
@@ -1688,10 +1693,11 @@ read_dbx_symtab (minimal_symbol_reader &reader,
                 the partial symbol table.  */
              if (pst
                  && (textlow_not_set
-                     || (nlist.n_value < pst->raw_text_low ()
+                     || (unrelocated_addr (nlist.n_value)
+                         < pst->raw_text_low ()
                          && (nlist.n_value != 0))))
                {
-                 pst->set_text_low (nlist.n_value);
+                 pst->set_text_low (unrelocated_addr (nlist.n_value));
                  textlow_not_set = 0;
                }
              if (pst != nullptr)
@@ -1729,7 +1735,7 @@ read_dbx_symtab (minimal_symbol_reader &reader,
              if (pst && textlow_not_set
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
-                 pst->set_text_low (nlist.n_value);
+                 pst->set_text_low (unrelocated_addr (nlist.n_value));
                  textlow_not_set = 0;
                }
              /* End kludge.  */
@@ -1744,10 +1750,11 @@ read_dbx_symtab (minimal_symbol_reader &reader,
                 the partial symbol table.  */
              if (pst
                  && (textlow_not_set
-                     || (nlist.n_value < pst->raw_text_low ()
+                     || (unrelocated_addr (nlist.n_value)
+                         < pst->raw_text_low ()
                          && (nlist.n_value != 0))))
                {
-                 pst->set_text_low (nlist.n_value);
+                 pst->set_text_low (unrelocated_addr (nlist.n_value));
                  textlow_not_set = 0;
                }
              if (pst != nullptr)
@@ -1871,7 +1878,7 @@ read_dbx_symtab (minimal_symbol_reader &reader,
              dbx_end_psymtab (objfile, partial_symtabs, pst,
                               psymtab_include_list, includes_used,
                               symnum * symbol_size,
-                              (CORE_ADDR) 0, dependency_list,
+                              (unrelocated_addr) 0, dependency_list,
                               dependencies_used, textlow_not_set);
              pst = (legacy_psymtab *) 0;
              includes_used = 0;
@@ -1928,11 +1935,11 @@ read_dbx_symtab (minimal_symbol_reader &reader,
     {
       /* Don't set high text address of PST lower than it already
         is.  */
-      CORE_ADDR text_end =
-       (lowest_text_address == (CORE_ADDR) -1
-        ? text_addr
-        : lowest_text_address)
-       + text_size;
+      unrelocated_addr text_end
+       = unrelocated_addr ((lowest_text_address == (CORE_ADDR) -1
+                            ? text_addr
+                            : lowest_text_address)
+                           + text_size);
 
       dbx_end_psymtab (objfile, partial_symtabs,
                       pst, psymtab_include_list, includes_used,
@@ -1952,7 +1959,7 @@ read_dbx_symtab (minimal_symbol_reader &reader,
 
 static legacy_psymtab *
 start_psymtab (psymtab_storage *partial_symtabs, struct objfile *objfile,
-              const char *filename, CORE_ADDR textlow, int ldsymoff)
+              const char *filename, unrelocated_addr textlow, int ldsymoff)
 {
   legacy_psymtab *result = new legacy_psymtab (filename, partial_symtabs,
                                               objfile->per_bfd, textlow);
@@ -1983,7 +1990,7 @@ legacy_psymtab *
 dbx_end_psymtab (struct objfile *objfile, psymtab_storage *partial_symtabs,
                 legacy_psymtab *pst,
                 const char **include_list, int num_includes,
-                int capping_symbol_offset, CORE_ADDR capping_text,
+                int capping_symbol_offset, unrelocated_addr capping_text,
                 legacy_psymtab **dependency_list,
                 int number_dependencies,
                 int textlow_not_set)
@@ -2037,8 +2044,9 @@ dbx_end_psymtab (struct objfile *objfile, psymtab_storage *partial_symtabs,
        }
 
       if (minsym.minsym)
-       pst->set_text_high (minsym.minsym->value_raw_address ()
-                           + minsym.minsym->size ());
+       pst->set_text_high
+         (unrelocated_addr (minsym.minsym->value_raw_address ()
+                            + minsym.minsym->size ()));
 
       last_function_name = NULL;
     }
index 43542eae673bd65e12f89e64073def18c46c83ad..4bcda4b9d742ceaedda81022d9f04ce062a0be52 100644 (file)
@@ -2601,7 +2601,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
     {
       legacy_psymtab *save_pst;
       EXTR *ext_ptr;
-      CORE_ADDR textlow;
+      unrelocated_addr textlow;
 
       cur_fdr = fh = debug_info->fdr + f_idx;
 
@@ -2614,9 +2614,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
       /* Determine the start address for this object file from the
         file header and relocate it, except for Irix 5.2 zero fh->adr.  */
       if (fh->cpd)
-       textlow = fh->adr;
+       textlow = unrelocated_addr (fh->adr);
       else
-       textlow = 0;
+       textlow = unrelocated_addr (0);
       pst = new legacy_psymtab (fdr_name (fh), partial_symtabs,
                                objfile->per_bfd, textlow);
       pst->read_symtab_private = XOBNEW (&objfile->objfile_obstack, md_symloc);
@@ -2695,7 +2695,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                {
                  if (sh.st == stProc || sh.st == stStaticProc)
                    {
-                     CORE_ADDR procaddr;
+                     unrelocated_addr procaddr;
                      long isym;
 
                      if (sh.st == stStaticProc)
@@ -2705,7 +2705,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                                                 mst_file_text, sh.sc,
                                                 objfile);
                        }
-                     procaddr = sh.value;
+                     procaddr = unrelocated_addr (sh.value);
 
                      isym = AUX_GET_ISYM (fh->fBigendian,
                                           (debug_info->external_aux
@@ -2718,7 +2718,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                                      &sh);
                      if (sh.st == stEnd)
                        {
-                         CORE_ADDR high = procaddr + sh.value;
+                         unrelocated_addr high
+                           = unrelocated_addr (CORE_ADDR (procaddr)
+                                               + sh.value);
 
                          /* Kludge for Irix 5.2 zero fh->adr.  */
                          if (!relocatable
@@ -3304,8 +3306,12 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                    continue;
 
                  case N_RBRAC:
-                   if (sh.value > save_pst->raw_text_high ())
-                     save_pst->set_text_high (sh.value);
+                   {
+                     unrelocated_addr unrel_value
+                       = unrelocated_addr (sh.value);
+                     if (unrel_value > save_pst->raw_text_high ())
+                       save_pst->set_text_high (unrel_value);
+                   }
                    continue;
                  case N_EINCL:
                  case N_DSLINE:
@@ -3409,8 +3415,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
              switch (sh.st)
                {
-                 CORE_ADDR high;
-                 CORE_ADDR procaddr;
+                 unrelocated_addr high;
+                 unrelocated_addr procaddr;
                  int new_sdx;
 
                case stStaticProc:
@@ -3479,7 +3485,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                                      sh.value, psymtab_language,
                                      partial_symtabs, objfile);
 
-                 procaddr = sh.value;
+                 procaddr = unrelocated_addr (sh.value);
 
                  cur_sdx = new_sdx;
                  (*swap_sym_in) (cur_bfd,
@@ -3496,7 +3502,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                          || procaddr < pst->raw_text_low ()))
                    pst->set_text_low (procaddr);
 
-                 high = procaddr + sh.value;
+                 high = unrelocated_addr (CORE_ADDR (procaddr) + sh.value);
                  if (high > pst->raw_text_high ())
                    pst->set_text_high (high);
                  continue;
@@ -4005,7 +4011,7 @@ mdebug_expand_psymtab (legacy_psymtab *pst, struct objfile *objfile)
 
       if (! last_symtab_ended)
        {
-         cust = end_compunit_symtab (pst->raw_text_high ());
+         cust = end_compunit_symtab (pst->text_high (objfile));
          end_stabs ();
        }
 
index 332d6a62686308bf6543320976f2c31d4bebe4f2..8fb595e2e0b182cc1944046e1e8ffc7ca49d9446 100644 (file)
@@ -130,7 +130,7 @@ struct partial_symtab
   partial_symtab (const char *filename,
                  psymtab_storage *partial_symtabs,
                  objfile_per_bfd_storage *objfile_per_bfd,
-                 CORE_ADDR addr)
+                 unrelocated_addr addr)
     ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3);
 
   virtual ~partial_symtab ()
@@ -171,14 +171,16 @@ struct partial_symtab
   virtual struct compunit_symtab *get_compunit_symtab
     (struct objfile *) const = 0;
 
-  /* Return the raw low text address of this partial_symtab.  */
-  CORE_ADDR raw_text_low () const
+  /* Return the unrelocated low text address of this
+     partial_symtab.  */
+  unrelocated_addr raw_text_low () const
   {
     return m_text_low;
   }
 
-  /* Return the raw high text address of this partial_symtab.  */
-  CORE_ADDR raw_text_high () const
+  /* Return the unrelocated_addr high text address of this
+     partial_symtab.  */
+  unrelocated_addr raw_text_high () const
   {
     return m_text_high;
   }
@@ -186,24 +188,24 @@ struct partial_symtab
   /* Return the relocated low text address of this partial_symtab.  */
   CORE_ADDR text_low (struct objfile *objfile) const
   {
-    return m_text_low + objfile->text_section_offset ();
+    return CORE_ADDR (m_text_low) + objfile->text_section_offset ();
   }
 
   /* Return the relocated high text address of this partial_symtab.  */
   CORE_ADDR text_high (struct objfile *objfile) const
   {
-    return m_text_high + objfile->text_section_offset ();
+    return CORE_ADDR (m_text_high) + objfile->text_section_offset ();
   }
 
   /* Set the low text address of this partial_symtab.  */
-  void set_text_low (CORE_ADDR addr)
+  void set_text_low (unrelocated_addr addr)
   {
     m_text_low = addr;
     text_low_valid = 1;
   }
 
-  /* Set the hight text address of this partial_symtab.  */
-  void set_text_high (CORE_ADDR addr)
+  /* Set the high text address of this partial_symtab.  */
+  void set_text_high (unrelocated_addr addr)
   {
     m_text_high = addr;
     text_high_valid = 1;
@@ -283,8 +285,8 @@ struct partial_symtab
      fields; these are located later in this structure for better
      packing.  */
 
-  CORE_ADDR m_text_low = 0;
-  CORE_ADDR m_text_high = 0;
+  unrelocated_addr m_text_low {};
+  unrelocated_addr m_text_high {};
 
   /* If NULL, this is an ordinary partial symbol table.
 
@@ -372,7 +374,7 @@ struct standard_psymtab : public partial_symtab
   standard_psymtab (const char *filename,
                    psymtab_storage *partial_symtabs,
                    objfile_per_bfd_storage *objfile_per_bfd,
-                   CORE_ADDR addr)
+                   unrelocated_addr addr)
     : partial_symtab (filename, partial_symtabs, objfile_per_bfd, addr)
   {
   }
@@ -414,7 +416,7 @@ struct legacy_psymtab : public standard_psymtab
   legacy_psymtab (const char *filename,
                  psymtab_storage *partial_symtabs,
                  objfile_per_bfd_storage *objfile_per_bfd,
-                 CORE_ADDR addr)
+                 unrelocated_addr addr)
     : standard_psymtab (filename, partial_symtabs, objfile_per_bfd, addr)
   {
   }
index 95a53b90edda87052eb3aebcb83219690675497b..484199b4be2636d0e34cf28775c76f99ff260de8 100644 (file)
@@ -1110,7 +1110,7 @@ psymbol_functions::has_unexpanded_symtabs (struct objfile *objfile)
 partial_symtab::partial_symtab (const char *filename,
                                psymtab_storage *partial_symtabs,
                                objfile_per_bfd_storage *objfile_per_bfd,
-                               CORE_ADDR textlow)
+                               unrelocated_addr textlow)
   : partial_symtab (filename, partial_symtabs, objfile_per_bfd)
 {
   set_text_low (textlow);
@@ -1653,7 +1653,7 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
                      gdb_printf (" psymtab\n");
                    }
                }
-             if (ps->raw_text_high () != 0
+             if (ps->raw_text_high () != unrelocated_addr (0)
                  && (ps->text_low (objfile) < b->start ()
                      || ps->text_high (objfile) > b->end ()))
                {
index 9df79bc7dfaee324076068504e22b45472642426..27ba176f63f10cc7cf3f3b1f86f56b36318e590b 100644 (file)
@@ -175,7 +175,7 @@ extern legacy_psymtab *dbx_end_psymtab
   (struct objfile *objfile, psymtab_storage *partial_symtabs,
    legacy_psymtab *pst,
    const char **include_list, int num_includes,
-   int capping_symbol_offset, CORE_ADDR capping_text,
+   int capping_symbol_offset, unrelocated_addr capping_text,
    legacy_psymtab **dependency_list, int number_dependencies,
    int textlow_not_set);
 
index f1fb1953c62a27f09fc9fc7bbfee7f887253c2cc..ff46cd507761848dbe008badd23579c6a9225ba2 100644 (file)
@@ -1875,7 +1875,8 @@ xcoff_start_psymtab (psymtab_storage *partial_symtabs,
 {
   /* We fill in textlow later.  */
   legacy_psymtab *result = new legacy_psymtab (filename, partial_symtabs,
-                                              objfile->per_bfd, 0);
+                                              objfile->per_bfd,
+                                              unrelocated_addr (0));
 
   result->read_symtab_private =
     XOBNEW (&objfile->objfile_obstack, struct xcoff_symloc);
@@ -2172,14 +2173,16 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
                      }
                    if (pst != NULL)
                      {
-                       CORE_ADDR highval =
-                         symbol.n_value + CSECT_LEN (&csect_aux);
+                       unrelocated_addr highval
+                         = unrelocated_addr (symbol.n_value
+                                             + CSECT_LEN (&csect_aux));
 
                        if (highval > pst->raw_text_high ())
                          pst->set_text_high (highval);
-                       if (!pst->text_low_valid
-                           || symbol.n_value < pst->raw_text_low ())
-                         pst->set_text_low (symbol.n_value);
+                       unrelocated_addr loval
+                         = unrelocated_addr (symbol.n_value);
+                       if (!pst->text_low_valid || loval < pst->raw_text_low ())
+                         pst->set_text_low (loval);
                      }
                    misc_func_recorded = 0;
                    break;