public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [RFA 6/6] Make psymbols and psymtabs independent of the program space
  2018-05-03 22:36 [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
                   ` (2 preceding siblings ...)
  2018-05-03 22:36 ` [RFA 1/6] Remove dead code in end_psymtab Tom Tromey
@ 2018-05-03 22:36 ` Tom Tromey
  2018-06-05 20:34   ` Keith Seitz
  2018-05-03 22:36 ` [RFA 2/6] Change representation of psymbol to flush out accessors Tom Tromey
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 25+ messages in thread
From: Tom Tromey @ 2018-05-03 22:36 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This patch finally makes partial symbols and partial symtabs
independent of the program space.

Specifically:

It changes add_psymbol_to_list to accept a section index, and changes
the psymbol readers to pass this.  At the same time it removes the
code to add the objfile's section offset to the psymbol.

It adds an objfile argument to the psymtab textlow and texthigh
accessors and changes some code to use the raw variants instead.

It removes the "relocate" method from struct quick_symbol_functions,
as it is no longer needed any more.

It removes the "0 *" from PSYMBOL_VALUE_ADDRESS (introduced earlier in
this series), so that the relevant offset is now applied at the point
of use.

ChangeLog
2018-05-03  Tom Tromey  <tom@tromey.com>

	* dwarf-index-write.c (add_address_entry): Don't add objfile
	offsets.
	* dbxread.c (find_stab_function_addr): Use
	MSYMBOL_VALUE_RAW_ADDRESS.
	(read_dbx_symtab): Use PSYMTAB_RAW_TEXTLOW, PSYMTAB_RAW_TEXTHIGH.
	Don't add objfile offsets.
	(end_psymtab): Use PSYMTAB_RAW_TEXTLOW, PSYMTAB_RAW_TEXTHIGH,
	MSYMBOL_VALUE_RAW_ADDRESS.
	(read_ofile_symtab): Update.
	* dwarf2read.c (create_addrmap_from_index): Don't add objfile
	offsets.
	(dw2_relocate): Remove.
	(dw2_find_pc_sect_symtab): Bias PC by the text offset before
	searching addrmap.
	(dwarf2_gdb_index_functions, dwarf2_debug_names_functions):
	Update.
	(process_psymtab_comp_unit_reader, add_partial_symbol)
	(add_partial_subprogram, dwarf2_ranges_read): Don't add objfile
	offsets.  Update.
	(load_partial_dies): Update.
	(add_address_entry): Don't add objfile offsets.
	(dwarf2_build_include_psymtabs): Update.
	(create_addrmap_from_aranges): Don't add objfile offsets.
	(dw2_find_pc_sect_compunit_symtab): Update.
	* mdebugread.c (parse_symbol): Don't add objfile offsets.
	(parse_lines): Remove 'pst' parameter, replace with 'textlow'.
	Update.
	(parse_partial_symbols): Don't add objfile offsets.  Use
	PSYMTAB_RAW_TEXTLOW, PSYMTAB_RAW_TEXTHIGH.  Update.
	(handle_psymbol_enumerators, psymtab_to_symtab_1): Update.
	* objfiles.c (objfile_relocate1): Don't relocate psymtabs_addrmap
	or call 'relocate' quick function.  Clear psymbol_map.
	* psympriv.h (PSYMBOL_VALUE_ADDRESS): Remove "0 *".
	(PSYMTAB_RAW_TEXTLOW, PSYMTAB_RAW_TEXTHIGH): New macros.
	(PSYMTAB_TEXTLOW, PSYMTAB_TEXTHIGH): Add 'objfile' parameter.
	(add_psymbol_to_bcache): Add 'section' parameter.
	* psymtab.c (find_pc_sect_psymtab_closer, find_pc_sect_psymtab)
	(find_pc_psymbol): Update.
	(fixup_psymbol_section, relocate_psymtabs): Remove.
	(dump_psymtab, psym_functions): Update.
	(add_psymbol_to_bcache, add_psymbol_to_list): Add 'section'
	parameter.
	(maintenance_info_psymtabs, maintenance_check_psymtabs): Update.
	(start_psymtab_common): Update.
	* symfile-debug.c (debug_qf_relocate): Remove.
	(debug_sym_quick_functions): Update.
	* symfile.h (struct quick_symbol_functions) <relocate>: Remove.
	* xcoffread.c (scan_xcoff_symtab): Don't add objfile offsets.
	Update.
---
 gdb/ChangeLog           |  52 +++++++++++++++++++
 gdb/dbxread.c           |  81 ++++++++++++-----------------
 gdb/dwarf-index-write.c |   8 +--
 gdb/dwarf2read.c        |  98 +++++++++++++++++++----------------
 gdb/mdebugread.c        | 108 +++++++++++++++-----------------------
 gdb/objfiles.c          |  11 ++--
 gdb/psympriv.h          |  14 +++--
 gdb/psymtab.c           | 135 ++++++++++++++----------------------------------
 gdb/symfile-debug.c     |  18 -------
 gdb/symfile.h           |   6 ---
 gdb/xcoffread.c         |  27 ++++------
 11 files changed, 247 insertions(+), 311 deletions(-)

diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index da675abb68..91bc25a87d 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -993,7 +993,7 @@ find_stab_function_addr (const char *namestring, const char *filename,
       msym = lookup_minimal_symbol (p, NULL, objfile);
     }
 
-  return msym.minsym == NULL ? 0 : BMSYMBOL_VALUE_ADDRESS (msym);
+  return msym.minsym == NULL ? 0 : MSYMBOL_VALUE_RAW_ADDRESS (msym.minsym);
 }
 
 static void
@@ -1187,18 +1187,15 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	      || (namestring[(nsl = strlen (namestring)) - 1] == 'o'
 		  && namestring[nsl - 2] == '.'))
 	    {
-	      nlist.n_value += ANOFFSET (objfile->section_offsets,
-					 SECT_OFF_TEXT (objfile));
-
 	      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 >= PSYMTAB_TEXTLOW (pst))
+		  && nlist.n_value >= PSYMTAB_RAW_TEXTLOW (pst))
 		{
 		  dbx_end_psymtab (objfile, pst, psymtab_include_list,
 				   includes_used, symnum * symbol_size,
-				   nlist.n_value > PSYMTAB_TEXTHIGH (pst)
-				   ? nlist.n_value : PSYMTAB_TEXTHIGH (pst),
+				   nlist.n_value > PSYMTAB_RAW_TEXTHIGH (pst)
+				   ? nlist.n_value : PSYMTAB_RAW_TEXTHIGH (pst),
 				   dependency_list, dependencies_used,
 				   textlow_not_set);
 		  pst = (struct partial_symtab *) 0;
@@ -1285,8 +1282,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	    static const char *dirname_nso;
 	    int prev_textlow_not_set;
 
-	    valu = nlist.n_value + ANOFFSET (objfile->section_offsets,
-					     SECT_OFF_TEXT (objfile));
+	    valu = nlist.n_value;
 
 	    prev_textlow_not_set = textlow_not_set;
 
@@ -1313,8 +1309,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		  {
 		    dbx_end_psymtab (objfile, pst, psymtab_include_list,
 				     includes_used, symnum * symbol_size,
-				     (valu > PSYMTAB_TEXTHIGH (pst)
-				      ? valu : PSYMTAB_TEXTHIGH (pst)),
+				     (valu > PSYMTAB_RAW_TEXTHIGH (pst)
+				      ? valu : PSYMTAB_RAW_TEXTHIGH (pst)),
 				     dependency_list, dependencies_used,
 				     prev_textlow_not_set);
 		    pst = (struct partial_symtab *) 0;
@@ -1489,7 +1485,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		 function relative stabs, or the address of the function's
 		 end for old style stabs.  */
 	      valu = nlist.n_value + last_function_start;
-	      if (PSYMTAB_TEXTHIGH (pst) == 0 || valu > PSYMTAB_TEXTHIGH (pst))
+	      if (PSYMTAB_RAW_TEXTHIGH (pst) == 0
+		  || valu > PSYMTAB_RAW_TEXTHIGH (pst))
 		SET_PSYMTAB_TEXTHIGH (pst, valu);
 	      break;
 	    }
@@ -1529,25 +1526,22 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	  switch (p[1])
 	    {
 	    case 'S':
-	      nlist.n_value += ANOFFSET (objfile->section_offsets,
-					 data_sect_index);
-
 	      if (gdbarch_static_transform_name_p (gdbarch))
 		gdbarch_static_transform_name (gdbarch, namestring);
 
 	      add_psymbol_to_list (sym_name, sym_len, 1,
 				   VAR_DOMAIN, LOC_STATIC,
+				   data_sect_index,
 				   &objfile->static_psymbols,
 				   nlist.n_value, psymtab_language, objfile);
 	      continue;
 
 	    case 'G':
-	      nlist.n_value += ANOFFSET (objfile->section_offsets,
-					 data_sect_index);
 	      /* The addresses in these entries are reported to be
 		 wrong.  See the code that reads 'G's for symtabs.  */
 	      add_psymbol_to_list (sym_name, sym_len, 1,
 				   VAR_DOMAIN, LOC_STATIC,
+				   data_sect_index,
 				   &objfile->global_psymbols,
 				   nlist.n_value, psymtab_language, objfile);
 	      continue;
@@ -1564,14 +1558,14 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		      && namestring[0] != ' '))
 		{
 		  add_psymbol_to_list (sym_name, sym_len, 1,
-				       STRUCT_DOMAIN, LOC_TYPEDEF,
+				       STRUCT_DOMAIN, LOC_TYPEDEF, -1,
 				       &objfile->static_psymbols,
 				       0, psymtab_language, objfile);
 		  if (p[2] == 't')
 		    {
 		      /* Also a typedef with the same name.  */
 		      add_psymbol_to_list (sym_name, sym_len, 1,
-					   VAR_DOMAIN, LOC_TYPEDEF,
+					   VAR_DOMAIN, LOC_TYPEDEF, -1,
 					   &objfile->static_psymbols,
 					   0, psymtab_language, objfile);
 		      p += 1;
@@ -1583,7 +1577,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	      if (p != namestring)	/* a name is there, not just :T...  */
 		{
 		  add_psymbol_to_list (sym_name, sym_len, 1,
-				       VAR_DOMAIN, LOC_TYPEDEF,
+				       VAR_DOMAIN, LOC_TYPEDEF, -1,
 				       &objfile->static_psymbols,
 				       0, psymtab_language, objfile);
 		}
@@ -1644,7 +1638,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		      /* Note that the value doesn't matter for
 			 enum constants in psymtabs, just in symtabs.  */
 		      add_psymbol_to_list (p, q - p, 1,
-					   VAR_DOMAIN, LOC_CONST,
+					   VAR_DOMAIN, LOC_CONST, -1,
 					   &objfile->static_psymbols, 0,
 					   psymtab_language, objfile);
 		      /* Point past the name.  */
@@ -1662,7 +1656,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	    case 'c':
 	      /* Constant, e.g. from "const" in Pascal.  */
 	      add_psymbol_to_list (sym_name, sym_len, 1,
-				   VAR_DOMAIN, LOC_CONST,
+				   VAR_DOMAIN, LOC_CONST, -1,
 				   &objfile->static_psymbols, 0,
 				   psymtab_language, objfile);
 	      continue;
@@ -1678,14 +1672,11 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		  function_outside_compilation_unit_complaint (name);
 		  xfree (name);
 		}
-	      nlist.n_value += ANOFFSET (objfile->section_offsets, 
-					 SECT_OFF_TEXT (objfile));
 	      /* Kludges for ELF/STABS with Sun ACC.  */
 	      last_function_name = namestring;
 	      /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
 		 value for the bottom of the text seg in those cases.  */
-	      if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
-					     SECT_OFF_TEXT (objfile))
+	      if (nlist.n_value == 0
 		  && gdbarch_sofun_address_maybe_missing (gdbarch))
 		{
 		  CORE_ADDR minsym_valu = 
@@ -1719,16 +1710,15 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		 the partial symbol table.  */
 	      if (pst
 		  && (textlow_not_set
-		      || (nlist.n_value < PSYMTAB_TEXTLOW (pst)
-			  && (nlist.n_value
-			      != ANOFFSET (objfile->section_offsets,
-					   SECT_OFF_TEXT (objfile))))))
+		      || (nlist.n_value < PSYMTAB_RAW_TEXTLOW (pst)
+			  && (nlist.n_value != 0))))
 		{
 		  SET_PSYMTAB_TEXTLOW (pst, nlist.n_value);
 		  textlow_not_set = 0;
 		}
 	      add_psymbol_to_list (sym_name, sym_len, 1,
 				   VAR_DOMAIN, LOC_BLOCK,
+				   SECT_OFF_TEXT (objfile),
 				   &objfile->static_psymbols,
 				   nlist.n_value, psymtab_language, objfile);
 	      continue;
@@ -1747,14 +1737,11 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		  function_outside_compilation_unit_complaint (name);
 		  xfree (name);
 		}
-	      nlist.n_value += ANOFFSET (objfile->section_offsets, 
-					 SECT_OFF_TEXT (objfile));
 	      /* Kludges for ELF/STABS with Sun ACC.  */
 	      last_function_name = namestring;
 	      /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
 		 value for the bottom of the text seg in those cases.  */
-	      if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
-					     SECT_OFF_TEXT (objfile))
+	      if (nlist.n_value == 0
 		  && gdbarch_sofun_address_maybe_missing (gdbarch))
 		{
 		  CORE_ADDR minsym_valu = 
@@ -1788,16 +1775,15 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		 the partial symbol table.  */
 	      if (pst
 		  && (textlow_not_set
-		      || (nlist.n_value < PSYMTAB_TEXTLOW (pst)
-			  && (nlist.n_value
-			      != ANOFFSET (objfile->section_offsets,
-					   SECT_OFF_TEXT (objfile))))))
+		      || (nlist.n_value < PSYMTAB_RAW_TEXTLOW (pst)
+			  && (nlist.n_value != 0))))
 		{
 		  SET_PSYMTAB_TEXTLOW (pst, nlist.n_value);
 		  textlow_not_set = 0;
 		}
 	      add_psymbol_to_list (sym_name, sym_len, 1,
 				   VAR_DOMAIN, LOC_BLOCK,
+				   SECT_OFF_TEXT (objfile),
 				   &objfile->global_psymbols,
 				   nlist.n_value, psymtab_language, objfile);
 	      continue;
@@ -1973,15 +1959,14 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
       /* Don't set pst->texthigh lower than it already is.  */
       CORE_ADDR text_end =
 	(lowest_text_address == (CORE_ADDR) -1
-	 ? (text_addr + ANOFFSET (objfile->section_offsets,
-				  SECT_OFF_TEXT (objfile)))
+	 ? text_addr
 	 : lowest_text_address)
 	+ text_size;
 
       dbx_end_psymtab (objfile, pst, psymtab_include_list, includes_used,
 		       symnum * symbol_size,
-		       (text_end > PSYMTAB_TEXTHIGH (pst)
-			? text_end : PSYMTAB_TEXTHIGH (pst)),
+		       (text_end > PSYMTAB_RAW_TEXTHIGH (pst)
+			? text_end : PSYMTAB_RAW_TEXTHIGH (pst)),
 		       dependency_list, dependencies_used, textlow_not_set);
     }
 
@@ -2055,7 +2040,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
      a reliable texthigh by taking the address plus size of the
      last function in the file.  */
 
-  if (PSYMTAB_TEXTHIGH (pst) == 0 && last_function_name
+  if (PSYMTAB_RAW_TEXTHIGH (pst) == 0 && last_function_name
       && gdbarch_sofun_address_maybe_missing (gdbarch))
     {
       int n;
@@ -2082,7 +2067,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
 	}
 
       if (minsym.minsym)
-	SET_PSYMTAB_TEXTHIGH (pst, (BMSYMBOL_VALUE_ADDRESS (minsym)
+	SET_PSYMTAB_TEXTHIGH (pst, (MSYMBOL_VALUE_RAW_ADDRESS (minsym.minsym)
 				    + MSYMBOL_SIZE (minsym.minsym)));
 
       last_function_name = NULL;
@@ -2092,7 +2077,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
     ;
   /* This test will be true if the last .o file is only data.  */
   else if (textlow_not_set)
-    SET_PSYMTAB_TEXTLOW (pst, PSYMTAB_TEXTHIGH (pst));
+    SET_PSYMTAB_TEXTLOW (pst, PSYMTAB_RAW_TEXTHIGH (pst));
   else
     {
       struct partial_symtab *p1;
@@ -2105,7 +2090,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
       ALL_OBJFILE_PSYMTABS (objfile, p1)
       {
 	if (!p1->texthigh_valid && p1->textlow_valid && p1 != pst)
-	  SET_PSYMTAB_TEXTHIGH (p1, PSYMTAB_TEXTLOW (pst));
+	  SET_PSYMTAB_TEXTHIGH (p1, PSYMTAB_RAW_TEXTLOW (pst));
       }
     }
 
@@ -2296,8 +2281,8 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst)
 
   sym_offset = LDSYMOFF (pst);
   sym_size = LDSYMLEN (pst);
-  text_offset = PSYMTAB_TEXTLOW (pst);
-  text_size = PSYMTAB_TEXTHIGH (pst) - PSYMTAB_TEXTLOW (pst);
+  text_offset = PSYMTAB_TEXTLOW (objfile, pst);
+  text_size = PSYMTAB_TEXTHIGH (objfile, pst) - PSYMTAB_TEXTLOW (objfile, pst);
   section_offsets = objfile->section_offsets;
 
   dbxread_objfile = objfile;
diff --git a/gdb/dwarf-index-write.c b/gdb/dwarf-index-write.c
index 74080c48b8..03e8542015 100644
--- a/gdb/dwarf-index-write.c
+++ b/gdb/dwarf-index-write.c
@@ -427,12 +427,8 @@ static void
 add_address_entry (struct objfile *objfile, data_buf &addr_vec,
 		   CORE_ADDR start, CORE_ADDR end, unsigned int cu_index)
 {
-  CORE_ADDR baseaddr;
-
-  baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-
-  addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, start - baseaddr);
-  addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, end - baseaddr);
+  addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, start);
+  addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, end);
   addr_vec.append_data (MAYBE_SWAP (cu_index));
 }
 
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 3cb0475b3b..f8630de47a 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -3178,8 +3178,8 @@ create_addrmap_from_index (struct dwarf2_per_objfile *dwarf2_per_objfile,
 	  continue;
 	}
 
-      lo = gdbarch_adjust_dwarf2_addr (gdbarch, lo + baseaddr);
-      hi = gdbarch_adjust_dwarf2_addr (gdbarch, hi + baseaddr);
+      lo = gdbarch_adjust_dwarf2_addr (gdbarch, lo + baseaddr) - baseaddr;
+      hi = gdbarch_adjust_dwarf2_addr (gdbarch, hi + baseaddr) - baseaddr;
       addrmap_set_empty (mutable_map, lo, hi - 1,
 			 dwarf2_per_objfile->get_cu (cu_index));
     }
@@ -3337,8 +3337,10 @@ create_addrmap_from_aranges (struct dwarf2_per_objfile *dwarf2_per_objfile,
 	      continue;
 	    }
 	  ULONGEST end = start + length;
-	  start = gdbarch_adjust_dwarf2_addr (gdbarch, start + baseaddr);
-	  end = gdbarch_adjust_dwarf2_addr (gdbarch, end + baseaddr);
+	  start = (gdbarch_adjust_dwarf2_addr (gdbarch, start + baseaddr)
+		   - baseaddr);
+	  end = (gdbarch_adjust_dwarf2_addr (gdbarch, end + baseaddr)
+		 - baseaddr);
 	  addrmap_set_empty (mutable_map, start, end - 1, per_cu);
 	}
     }
@@ -4106,14 +4108,6 @@ dw2_dump (struct objfile *objfile)
 }
 
 static void
-dw2_relocate (struct objfile *objfile,
-	      const struct section_offsets *new_offsets,
-	      const struct section_offsets *delta)
-{
-  /* There's nothing to relocate here.  */
-}
-
-static void
 dw2_expand_symtabs_for_function (struct objfile *objfile,
 				 const char *func_name)
 {
@@ -5240,8 +5234,10 @@ dw2_find_pc_sect_compunit_symtab (struct objfile *objfile,
   if (!objfile->psymtabs_addrmap)
     return NULL;
 
+  CORE_ADDR baseaddr;
+  baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
   data = (struct dwarf2_per_cu_data *) addrmap_find (objfile->psymtabs_addrmap,
-						     pc);
+						     pc - baseaddr);
   if (!data)
     return NULL;
 
@@ -5338,7 +5334,6 @@ const struct quick_symbol_functions dwarf2_gdb_index_functions =
   dw2_lookup_symbol,
   dw2_print_stats,
   dw2_dump,
-  dw2_relocate,
   dw2_expand_symtabs_for_function,
   dw2_expand_all_symtabs,
   dw2_expand_symtabs_with_fullname,
@@ -6159,7 +6154,6 @@ const struct quick_symbol_functions dwarf2_debug_names_functions =
   dw2_debug_names_lookup_symbol,
   dw2_print_stats,
   dw2_debug_names_dump,
-  dw2_relocate,
   dw2_debug_names_expand_symtabs_for_function,
   dw2_expand_all_symtabs,
   dw2_expand_symtabs_with_fullname,
@@ -6557,7 +6551,7 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu,
 
   /* NOTE: pst->dirname is DW_AT_comp_dir (if present).  */
   dwarf_decode_lines (lh.get (), pst->dirname, cu, pst,
-		      PSYMTAB_TEXTLOW (pst), 1);
+		      PSYMTAB_RAW_TEXTLOW (pst), 1);
 }
 
 static hashval_t
@@ -7941,14 +7935,17 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
   cu_bounds_kind = dwarf2_get_pc_bounds (comp_unit_die, &best_lowpc,
 					 &best_highpc, cu, pst);
   if (cu_bounds_kind == PC_BOUNDS_HIGH_LOW && best_lowpc < best_highpc)
-    /* Store the contiguous range if it is not empty; it can be empty for
-       CUs with no code.  */
-    addrmap_set_empty (objfile->psymtabs_addrmap,
-		       gdbarch_adjust_dwarf2_addr (gdbarch,
-						   best_lowpc + baseaddr),
-		       gdbarch_adjust_dwarf2_addr (gdbarch,
-						   best_highpc + baseaddr) - 1,
-		       pst);
+    {
+      CORE_ADDR low
+	= (gdbarch_adjust_dwarf2_addr (gdbarch, best_lowpc + baseaddr)
+	   - baseaddr);
+      CORE_ADDR high
+	= (gdbarch_adjust_dwarf2_addr (gdbarch, best_highpc + baseaddr)
+	   - baseaddr - 1);
+      /* Store the contiguous range if it is not empty; it can be
+	 empty for CUs with no code.  */
+      addrmap_set_empty (objfile->psymtabs_addrmap, low, high, pst);
+    }
 
   /* Check if comp unit has_children.
      If so, read the rest of the partial symbols from this comp unit.
@@ -7981,10 +7978,12 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
     }
   SET_PSYMTAB_TEXTLOW (pst,
 		       gdbarch_adjust_dwarf2_addr (gdbarch,
-						   best_lowpc + baseaddr));
+						   best_lowpc + baseaddr)
+		       - baseaddr);
   SET_PSYMTAB_TEXTHIGH (pst,
 			gdbarch_adjust_dwarf2_addr (gdbarch,
-						    best_highpc + baseaddr));
+						    best_highpc + baseaddr)
+			- baseaddr);
 
   end_psymtab_common (objfile, pst);
 
@@ -8021,8 +8020,8 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
 			  ", %d global, %d static syms\n",
 			  per_cu->is_debug_types ? "type" : "comp",
 			  sect_offset_str (per_cu->sect_off),
-			  paddress (gdbarch, PSYMTAB_TEXTLOW (pst)),
-			  paddress (gdbarch, PSYMTAB_TEXTHIGH (pst)),
+			  paddress (gdbarch, PSYMTAB_TEXTLOW (objfile, pst)),
+			  paddress (gdbarch, PSYMTAB_TEXTHIGH (objfile, pst)),
 			  pst->n_global_syms, pst->n_static_syms);
     }
 }
@@ -8817,7 +8816,8 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
     {
     case DW_TAG_inlined_subroutine:
     case DW_TAG_subprogram:
-      addr = gdbarch_adjust_dwarf2_addr (gdbarch, pdi->lowpc + baseaddr);
+      addr = (gdbarch_adjust_dwarf2_addr (gdbarch, pdi->lowpc + baseaddr)
+	      - baseaddr);
       if (pdi->is_external || cu->language == language_ada)
 	{
           /* brobecker/2007-12-26: Normally, only "external" DIEs are part
@@ -8827,16 +8827,20 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	  add_psymbol_to_list (actual_name, strlen (actual_name),
 			       built_actual_name != NULL,
 			       VAR_DOMAIN, LOC_BLOCK,
+			       SECT_OFF_TEXT (objfile),
 			       &objfile->global_psymbols,
-			       addr, cu->language, objfile);
+			       addr,
+			       cu->language, objfile);
 	}
       else
 	{
 	  add_psymbol_to_list (actual_name, strlen (actual_name),
 			       built_actual_name != NULL,
 			       VAR_DOMAIN, LOC_BLOCK,
+			       SECT_OFF_TEXT (objfile),
 			       &objfile->static_psymbols,
-			       addr, cu->language, objfile);
+			       addr,
+			       cu->language, objfile);
 	}
 
       if (pdi->main_subprogram && actual_name != NULL)
@@ -8852,7 +8856,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	  list = &objfile->static_psymbols;
 	add_psymbol_to_list (actual_name, strlen (actual_name),
 			     built_actual_name != NULL, VAR_DOMAIN, LOC_STATIC,
-			     list, 0, cu->language, objfile);
+			     -1, list, 0, cu->language, objfile);
       }
       break;
     case DW_TAG_variable:
@@ -8887,8 +8891,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	    add_psymbol_to_list (actual_name, strlen (actual_name),
 				 built_actual_name != NULL,
 				 VAR_DOMAIN, LOC_STATIC,
+				 SECT_OFF_TEXT (objfile),
 				 &objfile->global_psymbols,
-				 addr + baseaddr,
+				 addr,
 				 cu->language, objfile);
 	}
       else
@@ -8906,8 +8911,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	  add_psymbol_to_list (actual_name, strlen (actual_name),
 			       built_actual_name != NULL,
 			       VAR_DOMAIN, LOC_STATIC,
+			       SECT_OFF_TEXT (objfile),
 			       &objfile->static_psymbols,
-			       has_loc ? addr + baseaddr : (CORE_ADDR) 0,
+			       has_loc ? addr : 0,
 			       cu->language, objfile);
 	}
       break;
@@ -8916,7 +8922,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
     case DW_TAG_subrange_type:
       add_psymbol_to_list (actual_name, strlen (actual_name),
 			   built_actual_name != NULL,
-			   VAR_DOMAIN, LOC_TYPEDEF,
+			   VAR_DOMAIN, LOC_TYPEDEF, -1,
 			   &objfile->static_psymbols,
 			   0, cu->language, objfile);
       break;
@@ -8924,14 +8930,14 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
     case DW_TAG_namespace:
       add_psymbol_to_list (actual_name, strlen (actual_name),
 			   built_actual_name != NULL,
-			   VAR_DOMAIN, LOC_TYPEDEF,
+			   VAR_DOMAIN, LOC_TYPEDEF, -1,
 			   &objfile->global_psymbols,
 			   0, cu->language, objfile);
       break;
     case DW_TAG_module:
       add_psymbol_to_list (actual_name, strlen (actual_name),
 			   built_actual_name != NULL,
-			   MODULE_DOMAIN, LOC_TYPEDEF,
+			   MODULE_DOMAIN, LOC_TYPEDEF, -1,
 			   &objfile->global_psymbols,
 			   0, cu->language, objfile);
       break;
@@ -8955,7 +8961,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	 static vs. global.  */
       add_psymbol_to_list (actual_name, strlen (actual_name),
 			   built_actual_name != NULL,
-			   STRUCT_DOMAIN, LOC_TYPEDEF,
+			   STRUCT_DOMAIN, LOC_TYPEDEF, -1,
 			   cu->language == language_cplus
 			   ? &objfile->global_psymbols
 			   : &objfile->static_psymbols,
@@ -8965,7 +8971,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
     case DW_TAG_enumerator:
       add_psymbol_to_list (actual_name, strlen (actual_name),
 			   built_actual_name != NULL,
-			   VAR_DOMAIN, LOC_CONST,
+			   VAR_DOMAIN, LOC_CONST, -1,
 			   cu->language == language_cplus
 			   ? &objfile->global_psymbols
 			   : &objfile->static_psymbols,
@@ -9048,10 +9054,12 @@ add_partial_subprogram (struct partial_die_info *pdi,
 
 	      baseaddr = ANOFFSET (objfile->section_offsets,
 				   SECT_OFF_TEXT (objfile));
-	      lowpc = gdbarch_adjust_dwarf2_addr (gdbarch,
-						  pdi->lowpc + baseaddr);
-	      highpc = gdbarch_adjust_dwarf2_addr (gdbarch,
-						   pdi->highpc + baseaddr);
+	      lowpc = (gdbarch_adjust_dwarf2_addr (gdbarch,
+						   pdi->lowpc + baseaddr)
+		       - baseaddr);
+	      highpc = (gdbarch_adjust_dwarf2_addr (gdbarch,
+						    pdi->highpc + baseaddr)
+			- baseaddr);
 	      addrmap_set_empty (objfile->psymtabs_addrmap, lowpc, highpc - 1,
 				 cu->per_cu->v.psymtab);
 	    }
@@ -18296,7 +18304,7 @@ load_partial_dies (const struct die_reader_specs *reader,
 	{
 	  if (building_psymtab && pdi.name != NULL)
 	    add_psymbol_to_list (pdi.name, strlen (pdi.name), 0,
-				 VAR_DOMAIN, LOC_TYPEDEF,
+				 VAR_DOMAIN, LOC_TYPEDEF, -1,
 				 &objfile->static_psymbols,
 				 0, cu->language, objfile);
 	  info_ptr = locate_pdi_sibling (reader, &pdi, info_ptr);
@@ -18332,7 +18340,7 @@ load_partial_dies (const struct die_reader_specs *reader,
 		       _("malformed enumerator DIE ignored"));
 	  else if (building_psymtab)
 	    add_psymbol_to_list (pdi.name, strlen (pdi.name), 0,
-				 VAR_DOMAIN, LOC_CONST,
+				 VAR_DOMAIN, LOC_CONST, -1,
 				 cu->language == language_cplus
 				 ? &objfile->global_psymbols
 				 : &objfile->static_psymbols,
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index fb8318a831..6101691567 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -2177,12 +2177,9 @@ parse_external (EXTR *es, int bigend, struct section_offsets *section_offsets,
    numbers can go back and forth, apparently we can live
    with that and do not need to reorder our linetables.  */
 
-static void parse_lines (FDR *, PDR *, struct linetable *, int,
-			 struct partial_symtab *, CORE_ADDR);
-
 static void
 parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
-	     struct partial_symtab *pst, CORE_ADDR lowest_pdr_addr)
+	     CORE_ADDR textlow, CORE_ADDR lowest_pdr_addr)
 {
   unsigned char *base;
   int j, k;
@@ -2213,7 +2210,7 @@ parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
 	halt = base + fh->cbLine;
       base += pr->cbLineOffset;
 
-      adr = PSYMTAB_TEXTLOW (pst) + pr->adr - lowest_pdr_addr;
+      adr = textlow + pr->adr - lowest_pdr_addr;
 
       l = adr >> 2;		/* in words */
       for (lineno = pr->lnLow; base < halt;)
@@ -2646,12 +2643,7 @@ 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;
-	  if (relocatable || textlow != 0)
-	    textlow += ANOFFSET (objfile->section_offsets,
-				 SECT_OFF_TEXT (objfile));
-	}
+	textlow = fh->adr;
       else
 	textlow = 0;
       pst = start_psymtab_common (objfile,
@@ -2699,7 +2691,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 	psymtab_language = prev_language;
       PST_PRIVATE (pst)->pst_language = psymtab_language;
 
-      SET_PSYMTAB_TEXTHIGH (pst, PSYMTAB_TEXTLOW (pst));
+      SET_PSYMTAB_TEXTHIGH (pst, PSYMTAB_RAW_TEXTLOW (pst));
 
       /* For stabs-in-ecoff files, the second symbol must be @stab.
          This symbol is emitted by mips-tfile to signal that the
@@ -2745,8 +2737,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                                                  mst_file_text, sh.sc,
                                                  objfile);
 			}
-		      sh.value += ANOFFSET (objfile->section_offsets,
-					    SECT_OFF_TEXT (objfile));
 		      procaddr = sh.value;
 
 		      isym = AUX_GET_ISYM (fh->fBigendian,
@@ -2765,9 +2755,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			  /* Kludge for Irix 5.2 zero fh->adr.  */
 			  if (!relocatable
 			      && (!pst->textlow_valid
-				  || procaddr < PSYMTAB_TEXTLOW (pst)))
+				  || procaddr < PSYMTAB_RAW_TEXTLOW (pst)))
 			    SET_PSYMTAB_TEXTLOW (pst, procaddr);
-			  if (high > PSYMTAB_TEXTHIGH (pst))
+			  if (high > PSYMTAB_RAW_TEXTHIGH (pst))
 			    SET_PSYMTAB_TEXTHIGH (pst, high);
 			}
 		    }
@@ -2790,8 +2780,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                           record_minimal_symbol (reader, namestring, sh.value,
                                                  mst_file_data, sh.sc,
                                                  objfile);
-			  sh.value += ANOFFSET (objfile->section_offsets,
-						SECT_OFF_DATA (objfile));
 			  break;
 
 			default:
@@ -2801,8 +2789,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                           record_minimal_symbol (reader, namestring, sh.value,
                                                  mst_file_bss, sh.sc,
                                                  objfile);
-			  sh.value += ANOFFSET (objfile->section_offsets,
-						SECT_OFF_BSS (objfile));
 			  break;
 			}
 		    }
@@ -2855,22 +2841,16 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
 		  case N_TEXT | N_EXT:
 		  case N_NBTEXT | N_EXT:
-		    sh.value += ANOFFSET (objfile->section_offsets,
-					  SECT_OFF_TEXT (objfile));
 		    goto record_it;
 
 		  case N_DATA | N_EXT:
 		  case N_NBDATA | N_EXT:
-		    sh.value += ANOFFSET (objfile->section_offsets,
-					  SECT_OFF_DATA (objfile));
 		    goto record_it;
 
 		  case N_BSS:
 		  case N_BSS | N_EXT:
 		  case N_NBBSS | N_EXT:
 		  case N_SETV | N_EXT:		/* FIXME, is this in BSS?  */
-		    sh.value += ANOFFSET (objfile->section_offsets,
-					  SECT_OFF_BSS (objfile));
 		    goto record_it;
 
 		  case N_ABS | N_EXT:
@@ -2893,8 +2873,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		    continue;
 
 		  case N_DATA:
-		    sh.value += ANOFFSET (objfile->section_offsets,
-					  SECT_OFF_DATA (objfile));
 		    goto record_it;
 
 		  case N_UNDF | N_EXT:
@@ -3095,27 +3073,24 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		    switch (p[1])
 		      {
 		      case 'S':
-			sh.value += ANOFFSET (objfile->section_offsets,
-					      SECT_OFF_DATA (objfile));
-
 			if (gdbarch_static_transform_name_p (gdbarch))
 			  namestring = gdbarch_static_transform_name
 					 (gdbarch, namestring);
 
 			add_psymbol_to_list (namestring, p - namestring, 1,
 					     VAR_DOMAIN, LOC_STATIC,
+					     SECT_OFF_DATA (objfile),
 					     &objfile->static_psymbols,
 					     sh.value,
 					     psymtab_language, objfile);
 			continue;
 		      case 'G':
-			sh.value += ANOFFSET (objfile->section_offsets,
-					      SECT_OFF_DATA (objfile));
 			/* The addresses in these entries are reported
 			   to be wrong.  See the code that reads 'G's
 			   for symtabs.  */
 			add_psymbol_to_list (namestring, p - namestring, 1,
 					     VAR_DOMAIN, LOC_STATIC,
+					     SECT_OFF_DATA (objfile),
 					     &objfile->global_psymbols,
 					     sh.value,
 					     psymtab_language, objfile);
@@ -3134,6 +3109,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			  {
 			    add_psymbol_to_list (namestring, p - namestring, 1,
 						 STRUCT_DOMAIN, LOC_TYPEDEF,
+						 -1,
 						 &objfile->static_psymbols,
 						 0, psymtab_language, objfile);
 			    if (p[2] == 't')
@@ -3142,6 +3118,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 				add_psymbol_to_list (namestring,
 						     p - namestring, 1,
 						     VAR_DOMAIN, LOC_TYPEDEF,
+						     -1,
 						     &objfile->static_psymbols,
 						     0, psymtab_language,
 						     objfile);
@@ -3155,6 +3132,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			  {
 			    add_psymbol_to_list (namestring, p - namestring, 1,
 						 VAR_DOMAIN, LOC_TYPEDEF,
+						 -1,
 						 &objfile->static_psymbols,
 						 0, psymtab_language, objfile);
 			  }
@@ -3219,6 +3197,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 				   symtabs.  */
 				add_psymbol_to_list (p, q - p, 1,
 						     VAR_DOMAIN, LOC_CONST,
+						     -1,
 						     &objfile->static_psymbols,
 						     0, psymtab_language,
 						     objfile);
@@ -3236,7 +3215,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		      case 'c':
 			/* Constant, e.g. from "const" in Pascal.  */
 			add_psymbol_to_list (namestring, p - namestring, 1,
-					     VAR_DOMAIN, LOC_CONST,
+					     VAR_DOMAIN, LOC_CONST, -1,
 					     &objfile->static_psymbols,
 					     0, psymtab_language, objfile);
 			continue;
@@ -3252,10 +3231,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			    function_outside_compilation_unit_complaint (name);
 			    xfree (name);
 			  }
-			sh.value += ANOFFSET (objfile->section_offsets,
-					      SECT_OFF_TEXT (objfile));
 			add_psymbol_to_list (namestring, p - namestring, 1,
 					     VAR_DOMAIN, LOC_BLOCK,
+					     SECT_OFF_TEXT (objfile),
 					     &objfile->static_psymbols,
 					     sh.value,
 					     psymtab_language, objfile);
@@ -3276,10 +3254,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			    function_outside_compilation_unit_complaint (name);
 			    xfree (name);
 			  }
-			sh.value += ANOFFSET (objfile->section_offsets,
-					      SECT_OFF_TEXT (objfile));
 			add_psymbol_to_list (namestring, p - namestring, 1,
 					     VAR_DOMAIN, LOC_BLOCK,
+					     SECT_OFF_TEXT (objfile),
 					     &objfile->global_psymbols,
 					     sh.value,
 					     psymtab_language, objfile);
@@ -3352,7 +3329,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		    continue;
 
 		  case N_RBRAC:
-		    if (sh.value > PSYMTAB_TEXTHIGH (save_pst))
+		    if (sh.value > PSYMTAB_RAW_TEXTHIGH (save_pst))
 		      SET_PSYMTAB_TEXTHIGH (save_pst, sh.value);
 		    continue;
 		  case N_EINCL:
@@ -3409,6 +3386,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 	      char *name;
 	      enum address_class theclass;
 	      CORE_ADDR minsym_value;
+	      short section = -1;
 
 	      (*swap_sym_in) (cur_bfd,
 			      ((char *) debug_info->external_sym
@@ -3443,21 +3421,18 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		  /* The value of a stEnd symbol is the displacement from the
 		     corresponding start symbol value, do not relocate it.  */
 		  if (sh.st != stEnd)
-		    sh.value += ANOFFSET (objfile->section_offsets,
-					  SECT_OFF_TEXT (objfile));
+		    section = SECT_OFF_TEXT (objfile);
 		  break;
 		case scData:
 		case scSData:
 		case scRData:
 		case scPData:
 		case scXData:
-		  sh.value += ANOFFSET (objfile->section_offsets,
-					SECT_OFF_DATA (objfile));
+		  section = SECT_OFF_DATA (objfile);
 		  break;
 		case scBss:
 		case scSBss:
-		  sh.value += ANOFFSET (objfile->section_offsets,
-					SECT_OFF_BSS (objfile));
+		  section = SECT_OFF_BSS (objfile);
 		  break;
 		}
 
@@ -3522,11 +3497,13 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		  if (sh.st == stProc)
 		    add_psymbol_to_list (name, strlen (name), 1,
 					 VAR_DOMAIN, LOC_BLOCK,
+					 section,
 					 &objfile->global_psymbols,
 					 sh.value, psymtab_language, objfile);
 		  else
 		    add_psymbol_to_list (name, strlen (name), 1,
 					 VAR_DOMAIN, LOC_BLOCK,
+					 section,
 					 &objfile->static_psymbols,
 					 sh.value, psymtab_language, objfile);
 
@@ -3544,11 +3521,11 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		  /* Kludge for Irix 5.2 zero fh->adr.  */
 		  if (!relocatable
 		      && (!pst->textlow_valid
-			  || procaddr < PSYMTAB_TEXTLOW (pst)))
+			  || procaddr < PSYMTAB_RAW_TEXTLOW (pst)))
 		    SET_PSYMTAB_TEXTLOW (pst, procaddr);
 
 		  high = procaddr + sh.value;
-		  if (high > PSYMTAB_TEXTHIGH (pst))
+		  if (high > PSYMTAB_RAW_TEXTHIGH (pst))
 		    SET_PSYMTAB_TEXTHIGH (pst, high);
 		  continue;
 
@@ -3592,7 +3569,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		      && sh.index != cur_sdx + 2)
 		    {
 		      add_psymbol_to_list (name, strlen (name), 1,
-					   STRUCT_DOMAIN, LOC_TYPEDEF,
+					   STRUCT_DOMAIN, LOC_TYPEDEF, -1,
 					   &objfile->static_psymbols,
 					   0, psymtab_language, objfile);
 		    }
@@ -3632,7 +3609,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		}
 	      /* Use this gdb symbol.  */
 	      add_psymbol_to_list (name, strlen (name), 1,
-				   VAR_DOMAIN, theclass,
+				   VAR_DOMAIN, theclass, section,
 				   &objfile->static_psymbols,
 				   sh.value, psymtab_language, objfile);
 	    skip:
@@ -3650,6 +3627,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 	      SYMR *psh;
 	      char *name;
 	      CORE_ADDR svalue;
+	      short section;
 
 	      if (ext_ptr->ifd != f_idx)
 		internal_error (__FILE__, __LINE__,
@@ -3663,23 +3641,21 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 	      svalue = psh->value;
 	      switch (psh->sc)
 		{
+		default:
 		case scText:
 		case scRConst:
-		  svalue += ANOFFSET (objfile->section_offsets,
-				      SECT_OFF_TEXT (objfile));
+		  section = SECT_OFF_TEXT (objfile);
 		  break;
 		case scData:
 		case scSData:
 		case scRData:
 		case scPData:
 		case scXData:
-		  svalue += ANOFFSET (objfile->section_offsets,
-				      SECT_OFF_DATA (objfile));
+		  section = SECT_OFF_DATA (objfile);
 		  break;
 		case scBss:
 		case scSBss:
-		  svalue += ANOFFSET (objfile->section_offsets,
-				      SECT_OFF_BSS (objfile));
+		  section = SECT_OFF_BSS (objfile);
 		  break;
 		}
 
@@ -3713,6 +3689,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 	      name = debug_info->ssext + psh->iss;
 	      add_psymbol_to_list (name, strlen (name), 1,
 				   VAR_DOMAIN, theclass,
+				   section,
 				   &objfile->global_psymbols,
 				   svalue, psymtab_language, objfile);
 	    }
@@ -3723,7 +3700,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
       fdr_to_pst[f_idx].pst
 	= dbx_end_psymtab (objfile, save_pst,
 			   psymtab_include_list, includes_used,
-			   -1, PSYMTAB_TEXTHIGH (save_pst),
+			   -1, PSYMTAB_RAW_TEXTHIGH (save_pst),
 			   dependency_list, dependencies_used,
 			   textlow_not_set);
       includes_used = 0;
@@ -3748,9 +3725,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 	  ALL_OBJFILE_PSYMTABS (objfile, pst)
 	  {
 	    if (save_pst != pst
-		&& PSYMTAB_TEXTLOW (save_pst) >= PSYMTAB_TEXTLOW (pst)
-		&& PSYMTAB_TEXTLOW (save_pst) < PSYMTAB_TEXTHIGH (pst)
-		&& PSYMTAB_TEXTHIGH (save_pst) > PSYMTAB_TEXTHIGH (pst))
+		&& PSYMTAB_RAW_TEXTLOW (save_pst) >= PSYMTAB_RAW_TEXTLOW (pst)
+		&& PSYMTAB_RAW_TEXTLOW (save_pst) < PSYMTAB_RAW_TEXTHIGH (pst)
+		&& PSYMTAB_RAW_TEXTHIGH (save_pst) > PSYMTAB_RAW_TEXTHIGH (pst))
 	      {
 		objfile->flags |= OBJF_REORDERED;
 		break;
@@ -3877,9 +3854,9 @@ handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
       /* Note that the value doesn't matter for enum constants
          in psymtabs, just in symtabs.  */
       add_psymbol_to_list (name, strlen (name), 1,
-			   VAR_DOMAIN, LOC_CONST,
-			   &objfile->static_psymbols,
-			   0, psymtab_language, objfile);
+			   VAR_DOMAIN, LOC_CONST, -1,
+			   &objfile->static_psymbols, 0,
+			   psymtab_language, objfile);
       ext_sym += external_sym_size;
     }
 }
@@ -4109,7 +4086,8 @@ psymtab_to_symtab_1 (struct objfile *objfile,
 
       if (! last_symtab_ended)
 	{
-	  cust = end_symtab (PSYMTAB_TEXTHIGH (pst), SECT_OFF_TEXT (objfile));
+	  cust = end_symtab (PSYMTAB_TEXTHIGH (objfile, pst),
+			     SECT_OFF_TEXT (objfile));
 	  end_stabs ();
 	}
 
@@ -4190,7 +4168,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
       top_stack->cur_st = COMPUNIT_FILETABS (cust);
       top_stack->cur_block
 	= BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), STATIC_BLOCK);
-      BLOCK_START (top_stack->cur_block) = PSYMTAB_TEXTLOW (pst);
+      BLOCK_START (top_stack->cur_block) = PSYMTAB_TEXTLOW (objfile, pst);
       BLOCK_END (top_stack->cur_block) = 0;
       top_stack->blocktype = stFile;
       top_stack->cur_type = 0;
@@ -4255,7 +4233,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
 		}
 
 	      parse_lines (fh, pr_block, lines, maxlines,
-			   pst, lowest_pdr_addr);
+			   PSYMTAB_TEXTLOW (objfile, pst), lowest_pdr_addr);
 	      if (lines->nitems < fh->cline)
 		lines = shrink_linetable (lines);
 
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 98e81c48c4..e0b6ac30a9 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -846,6 +846,10 @@ objfile_relocate1 (struct objfile *objfile,
     }
   }
 
+  /* This stores relocated addresses and so must be cleared.  This
+     will cause it to be recreated on demand.  */
+  objfile->psymbol_map.clear ();
+
   /* Relocate isolated symbols.  */
   {
     struct symbol *iter;
@@ -854,13 +858,6 @@ objfile_relocate1 (struct objfile *objfile,
       relocate_one_symbol (iter, objfile, delta);
   }
 
-  if (objfile->psymtabs_addrmap)
-    addrmap_relocate (objfile->psymtabs_addrmap,
-		      ANOFFSET (delta, SECT_OFF_TEXT (objfile)));
-
-  if (objfile->sf)
-    objfile->sf->qf->relocate (objfile, new_offsets, delta);
-
   {
     int i;
 
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 8ce3c6b2a9..487a34f053 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -56,7 +56,7 @@ struct partial_symbol
 #define PSYMBOL_VALUE_RAW_ADDRESS(symbol) ((symbol)->pginfo.value.address + 0)
 #define PSYMBOL_VALUE_ADDRESS(objfile, symbol)	\
   ((symbol)->pginfo.value.address \
-   + (0 * (ANOFFSET ((objfile)->section_offsets, ((symbol)->pginfo.section)))))
+   + (ANOFFSET ((objfile)->section_offsets, ((symbol)->pginfo.section))))
 #define PSYMBOL_LANGUAGE(symbol)	(symbol)->pginfo.language
 #define PSYMBOL_SECTION(symbol)		(symbol)->pginfo.section
 #define PSYMBOL_OBJ_SECTION(objfile, symbol)			\
@@ -243,8 +243,15 @@ struct partial_symtab
   (ANOFFSET ((OBJF)->section_offsets, (INDEX))			\
    + ((((OFFS) == NULL)) ? 0 : ANOFFSET ((OFFS), (INDEX))))
 
-#define PSYMTAB_TEXTLOW(PST) ((PST)->textlow_ + 0)
-#define PSYMTAB_TEXTHIGH(PST) ((PST)->texthigh_ + 0)
+#define PSYMTAB_RAW_TEXTLOW(PST) ((PST)->textlow_ + 0)
+#define PSYMTAB_RAW_TEXTHIGH(PST) ((PST)->texthigh_ + 0)
+
+#define PSYMTAB_TEXTLOW(OBJFILE, PST)					\
+  ((PST)->textlow_							\
+   + ANOFFSET ((OBJFILE)->section_offsets, SECT_OFF_TEXT (OBJFILE)))
+#define PSYMTAB_TEXTHIGH(OBJFILE, PST)					\
+  ((PST)->texthigh_							\
+   + ANOFFSET ((OBJFILE)->section_offsets, SECT_OFF_TEXT (OBJFILE)))
 
 /* Set the "textlow" field on the partial symbol table, and mark the
    field as valid.  */
@@ -274,6 +281,7 @@ set_psymtab_texthigh (struct partial_symtab *pst, CORE_ADDR high)
 extern void add_psymbol_to_list (const char *, int,
 				 int, domain_enum,
 				 enum address_class,
+				 short /* section */,
 				 std::vector<partial_symbol *> *,
 				 CORE_ADDR,
 				 enum language, struct objfile *);
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 30c9a43e2c..28935291e4 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -62,9 +62,6 @@ static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
 						    CORE_ADDR,
 						    struct obj_section *);
 
-static void fixup_psymbol_section (struct partial_symbol *psym,
-				   struct objfile *objfile);
-
 static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile,
 						  struct partial_symtab *pst);
 
@@ -232,7 +229,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 {
   struct partial_symtab *tpst;
   struct partial_symtab *best_pst = pst;
-  CORE_ADDR best_addr = PSYMTAB_TEXTLOW (pst);
+  CORE_ADDR best_addr = PSYMTAB_TEXTLOW (objfile, pst);
 
   gdb_assert (!pst->psymtabs_addrmap_supported);
 
@@ -256,7 +253,8 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
      that is closest and still less than the given PC.  */
   for (tpst = pst; tpst != NULL; tpst = tpst->next)
     {
-      if (pc >= PSYMTAB_TEXTLOW (tpst) && pc < PSYMTAB_TEXTHIGH (tpst))
+      if (pc >= PSYMTAB_TEXTLOW (objfile, tpst)
+	  && pc < PSYMTAB_TEXTHIGH (objfile, tpst))
 	{
 	  struct partial_symbol *p;
 	  CORE_ADDR this_addr;
@@ -278,7 +276,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 	  if (p != NULL)
 	    this_addr = PSYMBOL_VALUE_ADDRESS (objfile, p);
 	  else
-	    this_addr = PSYMTAB_TEXTLOW (tpst);
+	    this_addr = PSYMTAB_TEXTLOW (objfile, tpst);
 
 	  /* Check whether it is closer than our current
 	     BEST_ADDR.  Since this symbol address is
@@ -311,6 +309,8 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 		      struct bound_minimal_symbol msymbol)
 {
   struct partial_symtab *pst;
+  CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets,
+				 SECT_OFF_TEXT (objfile));
 
   /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity
      than the later used TEXTLOW/TEXTHIGH one.  */
@@ -318,7 +318,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
   if (objfile->psymtabs_addrmap != NULL)
     {
       pst = ((struct partial_symtab *)
-	     addrmap_find (objfile->psymtabs_addrmap, pc));
+	     addrmap_find (objfile->psymtabs_addrmap, pc - baseaddr));
       if (pst != NULL)
 	{
 	  /* FIXME: addrmaps currently do not handle overlayed sections,
@@ -362,7 +362,8 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
     if (!pst->psymtabs_addrmap_supported
-	&& pc >= PSYMTAB_TEXTLOW (pst) && pc < PSYMTAB_TEXTHIGH (pst))
+	&& pc >= PSYMTAB_TEXTLOW (objfile, pst)
+	&& pc < PSYMTAB_TEXTHIGH (objfile, pst))
       {
 	struct partial_symtab *best_pst;
 
@@ -412,12 +413,12 @@ find_pc_sect_psymbol (struct objfile *objfile,
 {
   struct partial_symbol *best = NULL;
   CORE_ADDR best_pc;
+  const CORE_ADDR textlow = PSYMTAB_TEXTLOW (objfile, psymtab);
 
   gdb_assert (psymtab != NULL);
 
   /* Cope with programs that start at address 0.  */
-  best_pc = ((PSYMTAB_TEXTLOW (psymtab) != 0)
-	     ? PSYMTAB_TEXTLOW (psymtab) - 1 : 0);
+  best_pc = (textlow != 0) ? textlow - 1 : 0;
 
   /* Search the global symbols as well as the static symbols, so that
      find_pc_partial_function doesn't use a minimal symbol and thus
@@ -430,13 +431,12 @@ find_pc_sect_psymbol (struct objfile *objfile,
 	  && PSYMBOL_CLASS (p) == LOC_BLOCK
 	  && pc >= PSYMBOL_VALUE_ADDRESS (objfile, p)
 	  && (PSYMBOL_VALUE_ADDRESS (objfile, p) > best_pc
-	      || (PSYMTAB_TEXTLOW (psymtab) == 0
+	      || (textlow == 0
 		  && best_pc == 0
 		  && PSYMBOL_VALUE_ADDRESS (objfile, p) == 0)))
 	{
 	  if (section != NULL)  /* Match on a specific section.  */
 	    {
-	      fixup_psymbol_section (p, objfile);
 	      if (!matching_obj_sections (PSYMBOL_OBJ_SECTION (objfile, p),
 					  section))
 		continue;
@@ -454,13 +454,12 @@ find_pc_sect_psymbol (struct objfile *objfile,
 	  && PSYMBOL_CLASS (p) == LOC_BLOCK
 	  && pc >= PSYMBOL_VALUE_ADDRESS (objfile, p)
 	  && (PSYMBOL_VALUE_ADDRESS (objfile, p) > best_pc
-	      || (PSYMTAB_TEXTLOW (psymtab) == 0
+	      || (textlow == 0
 		  && best_pc == 0
 		  && PSYMBOL_VALUE_ADDRESS (objfile, p) == 0)))
 	{
 	  if (section != NULL)  /* Match on a specific section.  */
 	    {
-	      fixup_psymbol_section (p, objfile);
 	      if (!matching_obj_sections (PSYMBOL_OBJ_SECTION (objfile, p),
 					  section))
 		continue;
@@ -473,35 +472,6 @@ find_pc_sect_psymbol (struct objfile *objfile,
   return best;
 }
 
-static void
-fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
-{
-  CORE_ADDR addr;
-
-  if (psym == NULL)
-    return;
-
-  if (PSYMBOL_SECTION (psym) >= 0)
-    return;
-
-  gdb_assert (objfile);
-
-  switch (PSYMBOL_CLASS (psym))
-    {
-    case LOC_STATIC:
-    case LOC_LABEL:
-    case LOC_BLOCK:
-      addr = PSYMBOL_VALUE_ADDRESS (objfile, psym);
-      break;
-    default:
-      /* Nothing else will be listed in the minsyms -- no use looking
-	 it up.  */
-      return;
-    }
-
-  fixup_section (&psym->pginfo, addr, objfile);
-}
-
 /* Psymtab version of lookup_symbol.  See its definition in
    the definition of quick_symbol_functions in symfile.h.  */
 
@@ -798,44 +768,6 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
   return pst->compunit_symtab;
 }
 
-/* Psymtab version of relocate.  See its definition in
-   the definition of quick_symbol_functions in symfile.h.  */
-
-static void
-psym_relocate (struct objfile *objfile,
-	       const struct section_offsets *new_offsets,
-	       const struct section_offsets *delta)
-{
-  struct partial_symtab *p;
-
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
-    {
-      SET_PSYMTAB_TEXTLOW (p, (PSYMTAB_TEXTLOW (p)
-			       + ANOFFSET (delta, SECT_OFF_TEXT (objfile))));
-      SET_PSYMTAB_TEXTHIGH (p, (PSYMTAB_TEXTHIGH (p)
-				+ ANOFFSET (delta, SECT_OFF_TEXT (objfile))));
-    }
-
-  for (partial_symbol *psym : objfile->global_psymbols)
-    {
-      fixup_psymbol_section (psym, objfile);
-      if (PSYMBOL_SECTION (psym) >= 0)
-	SET_PSYMBOL_VALUE_ADDRESS (psym,
-				   PSYMBOL_VALUE_RAW_ADDRESS (psym)
-				   + ANOFFSET (delta, PSYMBOL_SECTION (psym)));
-    }
-  for (partial_symbol *psym : objfile->static_psymbols)
-    {
-      fixup_psymbol_section (psym, objfile);
-      if (PSYMBOL_SECTION (psym) >= 0)
-	SET_PSYMBOL_VALUE_ADDRESS (psym,
-				   PSYMBOL_VALUE_RAW_ADDRESS (psym)
-				   + ANOFFSET (delta, PSYMBOL_SECTION (psym)));
-    }
-
-  objfile->psymbol_map.clear ();
-}
-
 /* Psymtab version of find_last_source_symtab.  See its definition in
    the definition of quick_symbol_functions in symfile.h.  */
 
@@ -1022,9 +954,11 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
     }
 
   fprintf_filtered (outfile, "  Symbols cover text addresses ");
-  fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (psymtab)), outfile);
+  fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (objfile, psymtab)),
+		  outfile);
   fprintf_filtered (outfile, "-");
-  fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (psymtab)), outfile);
+  fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (objfile, psymtab)),
+		  outfile);
   fprintf_filtered (outfile, "\n");
   fprintf_filtered (outfile, "  Address map supported - %s.\n",
 		    psymtab->psymtabs_addrmap_supported ? "yes" : "no");
@@ -1558,7 +1492,6 @@ const struct quick_symbol_functions psym_functions =
   psym_lookup_symbol,
   psym_print_stats,
   psym_dump,
-  psym_relocate,
   psym_expand_symtabs_for_function,
   psym_expand_all_symtabs,
   psym_expand_symtabs_with_fullname,
@@ -1605,7 +1538,7 @@ start_psymtab_common (struct objfile *objfile,
 
   psymtab = allocate_psymtab (filename, objfile);
   SET_PSYMTAB_TEXTLOW (psymtab, textlow);
-  SET_PSYMTAB_TEXTHIGH (psymtab, PSYMTAB_TEXTLOW (psymtab)); /* default */
+  SET_PSYMTAB_TEXTHIGH (psymtab, PSYMTAB_RAW_TEXTLOW (psymtab)); /* default */
   psymtab->globals_offset = global_psymbols.size ();
   psymtab->statics_offset = static_psymbols.size ();
   return psymtab;
@@ -1724,6 +1657,7 @@ static struct partial_symbol *
 add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
 		       domain_enum domain,
 		       enum address_class theclass,
+		       short section,
 		       CORE_ADDR coreaddr,
 		       enum language language, struct objfile *objfile,
 		       int *added)
@@ -1736,7 +1670,7 @@ add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
   memset (&psymbol, 0, sizeof (psymbol));
 
   SET_PSYMBOL_VALUE_ADDRESS (&psymbol, coreaddr);
-  PSYMBOL_SECTION (&psymbol) = -1;
+  PSYMBOL_SECTION (&psymbol) = section;
   PSYMBOL_SET_LANGUAGE (&psymbol, language, &objfile->objfile_obstack);
   PSYMBOL_DOMAIN (&psymbol) = domain;
   PSYMBOL_CLASS (&psymbol) = theclass;
@@ -1768,6 +1702,7 @@ void
 add_psymbol_to_list (const char *name, int namelength, int copy_name,
 		     domain_enum domain,
 		     enum address_class theclass,
+		     short section,
 		     std::vector<partial_symbol *> *list,
 		     CORE_ADDR coreaddr,
 		     enum language language, struct objfile *objfile)
@@ -1778,7 +1713,7 @@ add_psymbol_to_list (const char *name, int namelength, int copy_name,
 
   /* Stash the partial symbol away in the cache.  */
   psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, theclass,
-				coreaddr, language, objfile, &added);
+				section, coreaddr, language, objfile, &added);
 
   /* Do not duplicate global partial symbols.  */
   if (list == &objfile->global_psymbols
@@ -2161,10 +2096,12 @@ maintenance_info_psymtabs (const char *regexp, int from_tty)
 			       psymtab->fullname
 			       ? psymtab->fullname : "(null)");
 	      printf_filtered ("    text addresses ");
-	      fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (psymtab)),
+	      fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (objfile,
+								  psymtab)),
 			      gdb_stdout);
 	      printf_filtered (" -- ");
-	      fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (psymtab)),
+	      fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (objfile,
+								   psymtab)),
 			      gdb_stdout);
 	      printf_filtered ("\n");
 	      printf_filtered ("    psymtabs_addrmap_supported %s\n",
@@ -2244,14 +2181,16 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
     cust = ps->compunit_symtab;
 
     /* First do some checks that don't require the associated symtab.  */
-    if (PSYMTAB_TEXTHIGH (ps) < PSYMTAB_TEXTLOW (ps))
+    if (PSYMTAB_TEXTHIGH (objfile, ps) < PSYMTAB_TEXTLOW (objfile, ps))
       {
 	printf_filtered ("Psymtab ");
 	puts_filtered (ps->filename);
 	printf_filtered (" covers bad range ");
-	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (ps)), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (objfile, ps)),
+			gdb_stdout);
 	printf_filtered (" - ");
-	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (ps)), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (objfile, ps)),
+			gdb_stdout);
 	printf_filtered ("\n");
 	continue;
       }
@@ -2296,16 +2235,18 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
 	  }
 	psym++;
       }
-    if (PSYMTAB_TEXTHIGH (ps) != 0
-	&& (PSYMTAB_TEXTLOW (ps) < BLOCK_START (b)
-	    || PSYMTAB_TEXTHIGH (ps) > BLOCK_END (b)))
+    if (PSYMTAB_RAW_TEXTHIGH (ps) != 0
+	&& (PSYMTAB_TEXTLOW (objfile, ps) < BLOCK_START (b)
+	    || PSYMTAB_TEXTHIGH (objfile, ps) > BLOCK_END (b)))
       {
 	printf_filtered ("Psymtab ");
 	puts_filtered (ps->filename);
 	printf_filtered (" covers ");
-	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (ps)), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (objfile, ps)),
+			gdb_stdout);
 	printf_filtered (" - ");
-	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (ps)), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (objfile, ps)),
+			gdb_stdout);
 	printf_filtered (" but symtab covers only ");
 	fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
 	printf_filtered (" - ");
diff --git a/gdb/symfile-debug.c b/gdb/symfile-debug.c
index 9d8007d92e..3aab1736b4 100644
--- a/gdb/symfile-debug.c
+++ b/gdb/symfile-debug.c
@@ -194,23 +194,6 @@ debug_qf_dump (struct objfile *objfile)
 }
 
 static void
-debug_qf_relocate (struct objfile *objfile,
-		   const struct section_offsets *new_offsets,
-		   const struct section_offsets *delta)
-{
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-
-  fprintf_filtered (gdb_stdlog, "qf->relocate (%s, %s, %s)\n",
-		    objfile_debug_name (objfile),
-		    host_address_to_string (new_offsets),
-		    host_address_to_string (delta));
-
-  debug_data->real_sf->qf->relocate (objfile, new_offsets, delta);
-}
-
-static void
 debug_qf_expand_symtabs_for_function (struct objfile *objfile,
 				      const char *func_name)
 {
@@ -401,7 +384,6 @@ static const struct quick_symbol_functions debug_sym_quick_functions =
   debug_qf_lookup_symbol,
   debug_qf_print_stats,
   debug_qf_dump,
-  debug_qf_relocate,
   debug_qf_expand_symtabs_for_function,
   debug_qf_expand_all_symtabs,
   debug_qf_expand_symtabs_with_fullname,
diff --git a/gdb/symfile.h b/gdb/symfile.h
index d9185092ee..358e42b3f2 100644
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -189,12 +189,6 @@ struct quick_symbol_functions
      gdb_stdout.  This is used for "maint print objfiles".  */
   void (*dump) (struct objfile *objfile);
 
-  /* This is called by objfile_relocate to relocate any indices loaded
-     for OBJFILE.  */
-  void (*relocate) (struct objfile *objfile,
-		    const struct section_offsets *new_offsets,
-		    const struct section_offsets *delta);
-
   /* Find all the symbols in OBJFILE named FUNC_NAME, and ensure that
      the corresponding symbol tables are loaded.  */
   void (*expand_symtabs_for_function) (struct objfile *objfile,
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 25df119d51..e1818c2545 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2351,10 +2351,10 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 			CORE_ADDR highval =
 			  symbol.n_value + csect_aux.x_csect.x_scnlen.l;
 
-			if (highval > PSYMTAB_TEXTHIGH (pst))
+			if (highval > PSYMTAB_RAW_TEXTHIGH (pst))
 			  SET_PSYMTAB_TEXTHIGH (pst, highval);
 			if (!pst->textlow_valid
-			    || symbol.n_value < PSYMTAB_TEXTLOW (pst))
+			    || symbol.n_value < PSYMTAB_RAW_TEXTLOW (pst))
 			  SET_PSYMTAB_TEXTLOW (pst, symbol.n_value);
 		      }
 		    misc_func_recorded = 0;
@@ -2669,27 +2669,24 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 	    switch (p[1])
 	      {
 	      case 'S':
-		symbol.n_value += ANOFFSET (objfile->section_offsets,
-					    SECT_OFF_DATA (objfile));
-
 		if (gdbarch_static_transform_name_p (gdbarch))
 		  namestring = gdbarch_static_transform_name
 				 (gdbarch, namestring);
 
 		add_psymbol_to_list (namestring, p - namestring, 1,
 				     VAR_DOMAIN, LOC_STATIC,
+				     SECT_OFF_DATA (objfile),
 				     &objfile->static_psymbols,
 				     symbol.n_value,
 				     psymtab_language, objfile);
 		continue;
 
 	      case 'G':
-		symbol.n_value += ANOFFSET (objfile->section_offsets,
-					    SECT_OFF_DATA (objfile));
 		/* The addresses in these entries are reported to be
 		   wrong.  See the code that reads 'G's for symtabs.  */
 		add_psymbol_to_list (namestring, p - namestring, 1,
 				     VAR_DOMAIN, LOC_STATIC,
+				     SECT_OFF_DATA (objfile),
 				     &objfile->global_psymbols,
 				     symbol.n_value,
 				     psymtab_language, objfile);
@@ -2707,14 +2704,14 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 			&& namestring[0] != ' '))
 		  {
 		    add_psymbol_to_list (namestring, p - namestring, 1,
-					 STRUCT_DOMAIN, LOC_TYPEDEF,
+					 STRUCT_DOMAIN, LOC_TYPEDEF, -1,
 					 &objfile->static_psymbols,
 					 0, psymtab_language, objfile);
 		    if (p[2] == 't')
 		      {
 			/* Also a typedef with the same name.  */
 			add_psymbol_to_list (namestring, p - namestring, 1,
-					     VAR_DOMAIN, LOC_TYPEDEF,
+					     VAR_DOMAIN, LOC_TYPEDEF, -1,
 					     &objfile->static_psymbols,
 					     0, psymtab_language, objfile);
 			p += 1;
@@ -2726,7 +2723,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 		if (p != namestring)	/* a name is there, not just :T...  */
 		  {
 		    add_psymbol_to_list (namestring, p - namestring, 1,
-					 VAR_DOMAIN, LOC_TYPEDEF,
+					 VAR_DOMAIN, LOC_TYPEDEF, -1,
 					 &objfile->static_psymbols,
 					 0, psymtab_language, objfile);
 		  }
@@ -2788,7 +2785,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 			/* Note that the value doesn't matter for
 			   enum constants in psymtabs, just in symtabs.  */
 			add_psymbol_to_list (p, q - p, 1,
-					     VAR_DOMAIN, LOC_CONST,
+					     VAR_DOMAIN, LOC_CONST, -1,
 					     &objfile->static_psymbols,
 					     0, psymtab_language, objfile);
 			/* Point past the name.  */
@@ -2806,7 +2803,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 	      case 'c':
 		/* Constant, e.g. from "const" in Pascal.  */
 		add_psymbol_to_list (namestring, p - namestring, 1,
-				     VAR_DOMAIN, LOC_CONST,
+				     VAR_DOMAIN, LOC_CONST, -1,
 				     &objfile->static_psymbols,
 				     0, psymtab_language, objfile);
 		continue;
@@ -2822,10 +2819,9 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 		    function_outside_compilation_unit_complaint (name);
 		    xfree (name);
 		  }
-		symbol.n_value += ANOFFSET (objfile->section_offsets,
-					    SECT_OFF_TEXT (objfile));
 		add_psymbol_to_list (namestring, p - namestring, 1,
 				     VAR_DOMAIN, LOC_BLOCK,
+				     SECT_OFF_TEXT (objfile),
 				     &objfile->static_psymbols,
 				     symbol.n_value,
 				     psymtab_language, objfile);
@@ -2853,10 +2849,9 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 		if (startswith (namestring, "@FIX"))
 		  continue;
 
-		symbol.n_value += ANOFFSET (objfile->section_offsets,
-					    SECT_OFF_TEXT (objfile));
 		add_psymbol_to_list (namestring, p - namestring, 1,
 				     VAR_DOMAIN, LOC_BLOCK,
+				     SECT_OFF_TEXT (objfile),
 				     &objfile->global_psymbols,
 				     symbol.n_value,
 				     psymtab_language, objfile);
-- 
2.13.6

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument
  2018-05-03 22:36 [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
@ 2018-05-03 22:36 ` Tom Tromey
  2018-06-01 20:06   ` Keith Seitz
  2018-05-03 22:36 ` [RFA 4/6] Introduce accessors for psymtab high and low fields Tom Tromey
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 25+ messages in thread
From: Tom Tromey @ 2018-05-03 22:36 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This changes PSYMBOL_VALUE_ADDRESS to take an objfile argument.  This
is necessary so that we can later relocate a partial symbol at its
point of use.  It also adds a "raw" form of the accessor, to compute
the unrelocated value; and a special macro to be used for setting the
field.

Note that the macro doesn't actually perform any relocation -- it uses
the argument, to ensure that any possible syntax errors are caught,
but it multiplies it by 0 so that it has no effect.

ChangeLog
2018-05-03  Tom Tromey  <tromey@redhat.com>

	* psympriv.h (SET_PSYMBOL_VALUE_ADDRESS)
	(PSYMBOL_VALUE_RAW_ADDRESS): New macros.
	(PSYMBOL_VALUE_ADDRESS): Add 'objfile' parameter.
	* psymtab.c (find_pc_sect_psymtab_closer, find_pc_sect_psymbol)
	(fixup_psymbol_section, relocate_psymtabs): Update.
	(print_partial_symbols): Add 'objfile' parameter.  Update.
	(dump_psymtab, add_psymbol_to_bcache, psym_fill_psymbol_map):
	Update.
---
 gdb/ChangeLog  | 11 +++++++++++
 gdb/psympriv.h |  7 ++++++-
 gdb/psymtab.c  | 50 ++++++++++++++++++++++++++++----------------------
 3 files changed, 45 insertions(+), 23 deletions(-)

diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 31f2a2b3e9..8daaa377b7 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -51,7 +51,12 @@ struct partial_symbol
 };
 
 #define PSYMBOL_VALUE(symbol)		(symbol)->pginfo.value.ivalue
-#define PSYMBOL_VALUE_ADDRESS(symbol)	(symbol)->pginfo.value.address
+#define SET_PSYMBOL_VALUE_ADDRESS(symbol, addr) \
+  (((symbol)->pginfo.value.address) = (addr))
+#define PSYMBOL_VALUE_RAW_ADDRESS(symbol) ((symbol)->pginfo.value.address + 0)
+#define PSYMBOL_VALUE_ADDRESS(objfile, symbol)	\
+  ((symbol)->pginfo.value.address \
+   + (0 * (ANOFFSET ((objfile)->section_offsets, ((symbol)->pginfo.section)))))
 #define PSYMBOL_LANGUAGE(symbol)	(symbol)->pginfo.language
 #define PSYMBOL_SECTION(symbol)		(symbol)->pginfo.section
 #define PSYMBOL_OBJ_SECTION(objfile, symbol)			\
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index e9a6a23b9d..3b6f0d53b5 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -267,7 +267,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 	     object's symbol table.  */
 	  p = find_pc_sect_psymbol (objfile, tpst, pc, section);
 	  if (p != NULL
-	      && (PSYMBOL_VALUE_ADDRESS (p)
+	      && (PSYMBOL_VALUE_ADDRESS (objfile, p)
 		  == BMSYMBOL_VALUE_ADDRESS (msymbol)))
 	    return tpst;
 
@@ -276,7 +276,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 	     symbol tables with line information but no debug
 	     symbols (e.g. those produced by an assembler).  */
 	  if (p != NULL)
-	    this_addr = PSYMBOL_VALUE_ADDRESS (p);
+	    this_addr = PSYMBOL_VALUE_ADDRESS (objfile, p);
 	  else
 	    this_addr = tpst->textlow;
 
@@ -334,7 +334,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 		 object's symbol table.  */
 	      p = find_pc_sect_psymbol (objfile, pst, pc, section);
 	      if (p == NULL
-		  || (PSYMBOL_VALUE_ADDRESS (p)
+		  || (PSYMBOL_VALUE_ADDRESS (objfile, p)
 		      != BMSYMBOL_VALUE_ADDRESS (msymbol)))
 		goto next;
 	    }
@@ -427,10 +427,11 @@ find_pc_sect_psymbol (struct objfile *objfile,
 
       if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
 	  && PSYMBOL_CLASS (p) == LOC_BLOCK
-	  && pc >= PSYMBOL_VALUE_ADDRESS (p)
-	  && (PSYMBOL_VALUE_ADDRESS (p) > best_pc
+	  && pc >= PSYMBOL_VALUE_ADDRESS (objfile, p)
+	  && (PSYMBOL_VALUE_ADDRESS (objfile, p) > best_pc
 	      || (psymtab->textlow == 0
-		  && best_pc == 0 && PSYMBOL_VALUE_ADDRESS (p) == 0)))
+		  && best_pc == 0
+		  && PSYMBOL_VALUE_ADDRESS (objfile, p) == 0)))
 	{
 	  if (section != NULL)  /* Match on a specific section.  */
 	    {
@@ -439,7 +440,7 @@ find_pc_sect_psymbol (struct objfile *objfile,
 					  section))
 		continue;
 	    }
-	  best_pc = PSYMBOL_VALUE_ADDRESS (p);
+	  best_pc = PSYMBOL_VALUE_ADDRESS (objfile, p);
 	  best = p;
 	}
     }
@@ -450,10 +451,11 @@ find_pc_sect_psymbol (struct objfile *objfile,
 
       if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
 	  && PSYMBOL_CLASS (p) == LOC_BLOCK
-	  && pc >= PSYMBOL_VALUE_ADDRESS (p)
-	  && (PSYMBOL_VALUE_ADDRESS (p) > best_pc
+	  && pc >= PSYMBOL_VALUE_ADDRESS (objfile, p)
+	  && (PSYMBOL_VALUE_ADDRESS (objfile, p) > best_pc
 	      || (psymtab->textlow == 0
-		  && best_pc == 0 && PSYMBOL_VALUE_ADDRESS (p) == 0)))
+		  && best_pc == 0
+		  && PSYMBOL_VALUE_ADDRESS (objfile, p) == 0)))
 	{
 	  if (section != NULL)  /* Match on a specific section.  */
 	    {
@@ -462,7 +464,7 @@ find_pc_sect_psymbol (struct objfile *objfile,
 					  section))
 		continue;
 	    }
-	  best_pc = PSYMBOL_VALUE_ADDRESS (p);
+	  best_pc = PSYMBOL_VALUE_ADDRESS (objfile, p);
 	  best = p;
 	}
     }
@@ -488,7 +490,7 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
     case LOC_STATIC:
     case LOC_LABEL:
     case LOC_BLOCK:
-      addr = PSYMBOL_VALUE_ADDRESS (psym);
+      addr = PSYMBOL_VALUE_ADDRESS (objfile, psym);
       break;
     default:
       /* Nothing else will be listed in the minsyms -- no use looking
@@ -815,15 +817,17 @@ psym_relocate (struct objfile *objfile,
     {
       fixup_psymbol_section (psym, objfile);
       if (PSYMBOL_SECTION (psym) >= 0)
-	PSYMBOL_VALUE_ADDRESS (psym) += ANOFFSET (delta,
-						  PSYMBOL_SECTION (psym));
+	SET_PSYMBOL_VALUE_ADDRESS (psym,
+				   PSYMBOL_VALUE_RAW_ADDRESS (psym)
+				   + ANOFFSET (delta, PSYMBOL_SECTION (psym)));
     }
   for (partial_symbol *psym : objfile->static_psymbols)
     {
       fixup_psymbol_section (psym, objfile);
       if (PSYMBOL_SECTION (psym) >= 0)
-	PSYMBOL_VALUE_ADDRESS (psym) += ANOFFSET (delta,
-						  PSYMBOL_SECTION (psym));
+	SET_PSYMBOL_VALUE_ADDRESS (psym,
+				   PSYMBOL_VALUE_RAW_ADDRESS (psym)
+				   + ANOFFSET (delta, PSYMBOL_SECTION (psym)));
     }
 
   objfile->psymbol_map.clear ();
@@ -887,7 +891,7 @@ psym_forget_cached_source_info (struct objfile *objfile)
 }
 
 static void
-print_partial_symbols (struct gdbarch *gdbarch,
+print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
 		       struct partial_symbol **p, int count, const char *what,
 		       struct ui_file *outfile)
 {
@@ -971,7 +975,9 @@ print_partial_symbols (struct gdbarch *gdbarch,
 	  break;
 	}
       fputs_filtered (", ", outfile);
-      fputs_filtered (paddress (gdbarch, PSYMBOL_VALUE_ADDRESS (*p)), outfile);
+      fputs_filtered (paddress (gdbarch,
+				PSYMBOL_VALUE_RAW_ADDRESS (*p)),
+		      outfile);
       fprintf_filtered (outfile, "\n");
       p++;
     }
@@ -1036,13 +1042,13 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
     }
   if (psymtab->n_global_syms > 0)
     {
-      print_partial_symbols (gdbarch,
+      print_partial_symbols (gdbarch, objfile,
 			     &objfile->global_psymbols[psymtab->globals_offset],
 			     psymtab->n_global_syms, "Global", outfile);
     }
   if (psymtab->n_static_syms > 0)
     {
-      print_partial_symbols (gdbarch,
+      print_partial_symbols (gdbarch, objfile,
 			     &objfile->static_psymbols[psymtab->statics_offset],
 			     psymtab->n_static_syms, "Static", outfile);
     }
@@ -1479,7 +1485,7 @@ psym_fill_psymbol_map (struct objfile *objfile,
 
       if (PSYMBOL_CLASS (psym) == LOC_STATIC)
 	{
-	  CORE_ADDR addr = PSYMBOL_VALUE_ADDRESS (psym);
+	  CORE_ADDR addr = PSYMBOL_VALUE_RAW_ADDRESS (psym);
 	  if (seen_addrs->find (addr) == seen_addrs->end ())
 	    {
 	      seen_addrs->insert (addr);
@@ -1726,7 +1732,7 @@ add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
      holes.  */
   memset (&psymbol, 0, sizeof (psymbol));
 
-  PSYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
+  SET_PSYMBOL_VALUE_ADDRESS (&psymbol, coreaddr);
   PSYMBOL_SECTION (&psymbol) = -1;
   PSYMBOL_SET_LANGUAGE (&psymbol, language, &objfile->objfile_obstack);
   PSYMBOL_DOMAIN (&psymbol) = domain;
-- 
2.13.6

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [RFA 1/6] Remove dead code in end_psymtab
  2018-05-03 22:36 [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
  2018-05-03 22:36 ` [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument Tom Tromey
  2018-05-03 22:36 ` [RFA 4/6] Introduce accessors for psymtab high and low fields Tom Tromey
@ 2018-05-03 22:36 ` Tom Tromey
  2018-06-01 18:55   ` Keith Seitz
  2018-05-03 22:36 ` [RFA 6/6] Make psymbols and psymtabs independent of the program space Tom Tromey
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 25+ messages in thread
From: Tom Tromey @ 2018-05-03 22:36 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

I noticed that there is a bit of dead code in end_psymtab.
This deletes it.

Normally I would investigate a fix for the code.  However, considering
that the code has been this way a long time (since the first import to
sourceware) and considering that dbxread.c is not as important any
more, I think it's safe to just consider that there's no bug.

ChangeLog
2018-05-03  Tom Tromey  <tromey@redhat.com>

	* dbxread.c (end_psymtab): Remove dead code.
---
 gdb/ChangeLog | 4 ++++
 gdb/dbxread.c | 8 +-------
 2 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index bdf4fb9c79..7acbb0ec8b 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -2105,13 +2105,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
       ALL_OBJFILE_PSYMTABS (objfile, p1)
       {
 	if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst)
-	  {
-	    p1->texthigh = pst->textlow;
-	    /* If this file has only data, then make textlow match
-	       texthigh.  */
-	    if (p1->textlow == 0)
-	      p1->textlow = p1->texthigh;
-	  }
+	  p1->texthigh = pst->textlow;
       }
     }
 
-- 
2.13.6

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [RFA 2/6] Change representation of psymbol to flush out accessors
  2018-05-03 22:36 [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
                   ` (3 preceding siblings ...)
  2018-05-03 22:36 ` [RFA 6/6] Make psymbols and psymtabs independent of the program space Tom Tromey
@ 2018-05-03 22:36 ` Tom Tromey
  2018-06-01 19:19   ` Keith Seitz
  2018-05-03 22:36 ` [RFA 5/6] Add validity bits for psymtab high and low fields Tom Tromey
  2018-05-25 17:58 ` [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
  6 siblings, 1 reply; 25+ messages in thread
From: Tom Tromey @ 2018-05-03 22:36 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This is the psymbol analog to the patch to change the representation
of minimal symbols:

    https://sourceware.org/ml/gdb-patches/2013-10/msg00524.html

It has the same rationale: namely, that we're going to change the code
to apply psymbol offsets at runtime.  This will be done by adding an
argument to the SYMBOL_VALUE_ADDRESS macro -- but since we can't
convert all the symbol types at once, we need a new macro.

Also, as noted before, these macros implement a kind of "phony
polymorphism" that is not actually useful in practice; so introducing
a new macro that is specific to psymbols is probably a slight
improvement anyhow.

ChangeLog
2018-05-03  Tom Tromey  <tom@tromey.com>

	* dwarf-index-write.c (write_psymbols, debug_names::insert)
	(debug_names::write_psymbols): Update.
	* psympriv.h (struct partial_symbol) <pginfo>: Rename from
	'ginfo'.
	(PSYMBOL_VALUE, PSYMBOL_VALUE_ADDRESS, PSYMBOL_LANGUAGE)
	(PSYMBOL_SECTION, PSYMBOL_OBJ_SECTION, PSYMBOL_SET_LANGUAGE)
	(PSYMBOL_SET_NAMES, PSYMBOL_LINKAGE_NAME, PSYMBOL_DEMANGLED_NAME)
	(PSYMBOL_SEARCH_NAME, PSYMBOL_MATCHES_SEARCH_NAME): New macros.
	* psymtab.c (find_pc_sect_psymtab_closer, find_pc_sect_psymtab)
	(find_pc_sect_psymbol, fixup_psymbol_section)
	(match_partial_symbol, lookup_partial_symbol, relocate_psymtabs)
	(print_partial_symbols, recursively_search_psymtabs)
	(compare_psymbols, psymbol_hash, psymbol_compare)
	(add_psymbol_to_bcache, maintenance_check_psymtabs)
	(psymbol_name_matches, psym_fill_psymbol_map): Update.
---
 gdb/ChangeLog           |  18 ++++++++
 gdb/dwarf-index-write.c |   8 ++--
 gdb/psympriv.h          |  25 +++++++++-
 gdb/psymtab.c           | 118 ++++++++++++++++++++++++------------------------
 4 files changed, 106 insertions(+), 63 deletions(-)

diff --git a/gdb/dwarf-index-write.c b/gdb/dwarf-index-write.c
index a5e196db32..74080c48b8 100644
--- a/gdb/dwarf-index-write.c
+++ b/gdb/dwarf-index-write.c
@@ -546,7 +546,7 @@ write_psymbols (struct mapped_symtab *symtab,
     {
       struct partial_symbol *psym = *psymp;
 
-      if (SYMBOL_LANGUAGE (psym) == language_ada)
+      if (PSYMBOL_LANGUAGE (psym) == language_ada)
 	error (_("Ada is not currently supported by the index"));
 
       /* Only add a given psymbol once.  */
@@ -554,7 +554,7 @@ write_psymbols (struct mapped_symtab *symtab,
 	{
 	  gdb_index_symbol_kind kind = symbol_kind (psym);
 
-	  add_index_entry (symtab, SYMBOL_SEARCH_NAME (psym),
+	  add_index_entry (symtab, PSYMBOL_SEARCH_NAME (psym),
 			   is_static, kind, cu_index);
 	}
     }
@@ -688,7 +688,7 @@ public:
     const int dwarf_tag = psymbol_tag (psym);
     if (dwarf_tag == 0)
       return;
-    const char *const name = SYMBOL_SEARCH_NAME (psym);
+    const char *const name = PSYMBOL_SEARCH_NAME (psym);
     const auto insertpair
       = m_name_to_value_set.emplace (c_str_view (name),
 				     std::set<symbol_value> ());
@@ -1184,7 +1184,7 @@ private:
       {
 	struct partial_symbol *psym = *psymp;
 
-	if (SYMBOL_LANGUAGE (psym) == language_ada)
+	if (PSYMBOL_LANGUAGE (psym) == language_ada)
 	  error (_("Ada is not currently supported by the index"));
 
 	/* Only add a given psymbol once.  */
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 45746a26a7..31f2a2b3e9 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -37,7 +37,7 @@ struct partial_symbol
 {
   /* The general symbol info required for all types of symbols.  */
 
-  struct general_symbol_info ginfo;
+  struct general_symbol_info pginfo;
 
   /* Name space code.  */
 
@@ -50,9 +50,32 @@ struct partial_symbol
   ENUM_BITFIELD(address_class) aclass : SYMBOL_ACLASS_BITS;
 };
 
+#define PSYMBOL_VALUE(symbol)		(symbol)->pginfo.value.ivalue
+#define PSYMBOL_VALUE_ADDRESS(symbol)	(symbol)->pginfo.value.address
+#define PSYMBOL_LANGUAGE(symbol)	(symbol)->pginfo.language
+#define PSYMBOL_SECTION(symbol)		(symbol)->pginfo.section
+#define PSYMBOL_OBJ_SECTION(objfile, symbol)			\
+  (((symbol)->pginfo.section >= 0)				\
+   ? (&(((objfile)->sections)[(symbol)->pginfo.section]))	\
+   : NULL)
+
+#define PSYMBOL_SET_LANGUAGE(symbol,language,obstack)	\
+  (symbol_set_language (&(symbol)->pginfo, (language), (obstack)))
+#define PSYMBOL_SET_NAMES(symbol,linkage_name,len,copy_name,objfile)	\
+  symbol_set_names (&(symbol)->pginfo, linkage_name, len, copy_name, objfile)
+
+#define PSYMBOL_LINKAGE_NAME(symbol)	(symbol)->pginfo.name
+#define PSYMBOL_DEMANGLED_NAME(symbol) \
+  (symbol_demangled_name (&(symbol)->pginfo))
+#define PSYMBOL_SEARCH_NAME(symbol)					 \
+   (symbol_search_name (&(symbol)->pginfo))
+
 #define PSYMBOL_DOMAIN(psymbol)	(psymbol)->domain
 #define PSYMBOL_CLASS(psymbol)		(psymbol)->aclass
 
+#define PSYMBOL_MATCHES_SEARCH_NAME(symbol, name)			\
+  symbol_matches_search_name (&(symbol)->pginfo, (name))
+
 /* A convenience enum to give names to some constants used when
    searching psymtabs.  This is internal to psymtab and should not be
    used elsewhere.  */
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index ac0ee0a5a6..e9a6a23b9d 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -267,7 +267,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 	     object's symbol table.  */
 	  p = find_pc_sect_psymbol (objfile, tpst, pc, section);
 	  if (p != NULL
-	      && (SYMBOL_VALUE_ADDRESS (p)
+	      && (PSYMBOL_VALUE_ADDRESS (p)
 		  == BMSYMBOL_VALUE_ADDRESS (msymbol)))
 	    return tpst;
 
@@ -276,7 +276,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 	     symbol tables with line information but no debug
 	     symbols (e.g. those produced by an assembler).  */
 	  if (p != NULL)
-	    this_addr = SYMBOL_VALUE_ADDRESS (p);
+	    this_addr = PSYMBOL_VALUE_ADDRESS (p);
 	  else
 	    this_addr = tpst->textlow;
 
@@ -334,7 +334,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 		 object's symbol table.  */
 	      p = find_pc_sect_psymbol (objfile, pst, pc, section);
 	      if (p == NULL
-		  || (SYMBOL_VALUE_ADDRESS (p)
+		  || (PSYMBOL_VALUE_ADDRESS (p)
 		      != BMSYMBOL_VALUE_ADDRESS (msymbol)))
 		goto next;
 	    }
@@ -427,19 +427,19 @@ find_pc_sect_psymbol (struct objfile *objfile,
 
       if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
 	  && PSYMBOL_CLASS (p) == LOC_BLOCK
-	  && pc >= SYMBOL_VALUE_ADDRESS (p)
-	  && (SYMBOL_VALUE_ADDRESS (p) > best_pc
+	  && pc >= PSYMBOL_VALUE_ADDRESS (p)
+	  && (PSYMBOL_VALUE_ADDRESS (p) > best_pc
 	      || (psymtab->textlow == 0
-		  && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
+		  && best_pc == 0 && PSYMBOL_VALUE_ADDRESS (p) == 0)))
 	{
 	  if (section != NULL)  /* Match on a specific section.  */
 	    {
 	      fixup_psymbol_section (p, objfile);
-	      if (!matching_obj_sections (SYMBOL_OBJ_SECTION (objfile, p),
+	      if (!matching_obj_sections (PSYMBOL_OBJ_SECTION (objfile, p),
 					  section))
 		continue;
 	    }
-	  best_pc = SYMBOL_VALUE_ADDRESS (p);
+	  best_pc = PSYMBOL_VALUE_ADDRESS (p);
 	  best = p;
 	}
     }
@@ -450,19 +450,19 @@ find_pc_sect_psymbol (struct objfile *objfile,
 
       if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
 	  && PSYMBOL_CLASS (p) == LOC_BLOCK
-	  && pc >= SYMBOL_VALUE_ADDRESS (p)
-	  && (SYMBOL_VALUE_ADDRESS (p) > best_pc
+	  && pc >= PSYMBOL_VALUE_ADDRESS (p)
+	  && (PSYMBOL_VALUE_ADDRESS (p) > best_pc
 	      || (psymtab->textlow == 0
-		  && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
+		  && best_pc == 0 && PSYMBOL_VALUE_ADDRESS (p) == 0)))
 	{
 	  if (section != NULL)  /* Match on a specific section.  */
 	    {
 	      fixup_psymbol_section (p, objfile);
-	      if (!matching_obj_sections (SYMBOL_OBJ_SECTION (objfile, p),
+	      if (!matching_obj_sections (PSYMBOL_OBJ_SECTION (objfile, p),
 					  section))
 		continue;
 	    }
-	  best_pc = SYMBOL_VALUE_ADDRESS (p);
+	  best_pc = PSYMBOL_VALUE_ADDRESS (p);
 	  best = p;
 	}
     }
@@ -478,7 +478,7 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
   if (psym == NULL)
     return;
 
-  if (SYMBOL_SECTION (psym) >= 0)
+  if (PSYMBOL_SECTION (psym) >= 0)
     return;
 
   gdb_assert (objfile);
@@ -488,7 +488,7 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
     case LOC_STATIC:
     case LOC_LABEL:
     case LOC_BLOCK:
-      addr = SYMBOL_VALUE_ADDRESS (psym);
+      addr = PSYMBOL_VALUE_ADDRESS (psym);
       break;
     default:
       /* Nothing else will be listed in the minsyms -- no use looking
@@ -496,7 +496,7 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
       return;
     }
 
-  fixup_section (&psym->ginfo, addr, objfile);
+  fixup_section (&psym->pginfo, addr, objfile);
 }
 
 /* Psymtab version of lookup_symbol.  See its definition in
@@ -554,10 +554,10 @@ static bool
 psymbol_name_matches (partial_symbol *psym,
 		      const lookup_name_info &lookup_name)
 {
-  const language_defn *lang = language_def (SYMBOL_LANGUAGE (psym));
+  const language_defn *lang = language_def (PSYMBOL_LANGUAGE (psym));
   symbol_name_matcher_ftype *name_match
     = get_symbol_name_matcher (lang, lookup_name);
-  return name_match (SYMBOL_SEARCH_NAME (psym), lookup_name, NULL);
+  return name_match (PSYMBOL_SEARCH_NAME (psym), lookup_name, NULL);
 }
 
 /* Look in PST for a symbol in DOMAIN whose name matches NAME.  Search
@@ -607,11 +607,11 @@ match_partial_symbol (struct objfile *objfile,
 	  center = bottom + (top - bottom) / 2;
 	  gdb_assert (center < top);
 
-	  enum language lang = SYMBOL_LANGUAGE (*center);
+	  enum language lang = PSYMBOL_LANGUAGE (*center);
 	  const char *lang_ln
 	    = lookup_name.language_lookup_name (lang).c_str ();
 
-	  if (ordered_compare (SYMBOL_SEARCH_NAME (*center), lang_ln) >= 0)
+	  if (ordered_compare (PSYMBOL_SEARCH_NAME (*center), lang_ln) >= 0)
 	    top = center;
 	  else
 	    bottom = center + 1;
@@ -621,8 +621,8 @@ match_partial_symbol (struct objfile *objfile,
       while (top <= real_top
 	     && psymbol_name_matches (*top, lookup_name))
 	{
-	  if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
-				     SYMBOL_DOMAIN (*top), domain))
+	  if (symbol_matches_domain (PSYMBOL_LANGUAGE (*top),
+				     PSYMBOL_DOMAIN (*top), domain))
 	    return *top;
 	  top++;
 	}
@@ -635,7 +635,7 @@ match_partial_symbol (struct objfile *objfile,
     {
       for (psym = start; psym < start + length; psym++)
 	{
-	  if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
+	  if (symbol_matches_domain (PSYMBOL_LANGUAGE (*psym),
 				     SYMBOL_DOMAIN (*psym), domain)
 	      && psymbol_name_matches (*psym, lookup_name))
 	    return *psym;
@@ -718,7 +718,7 @@ lookup_partial_symbol (struct objfile *objfile,
 	  if (!(center < top))
 	    internal_error (__FILE__, __LINE__,
 			    _("failed internal consistency check"));
-	  if (strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*center),
+	  if (strcmp_iw_ordered (PSYMBOL_SEARCH_NAME (*center),
 				 search_name.get ()) >= 0)
 	    {
 	      top = center;
@@ -734,15 +734,15 @@ lookup_partial_symbol (struct objfile *objfile,
 
       /* For `case_sensitivity == case_sensitive_off' strcmp_iw_ordered will
 	 search more exactly than what matches SYMBOL_MATCHES_SEARCH_NAME.  */
-      while (top >= start && SYMBOL_MATCHES_SEARCH_NAME (*top, lookup_name))
+      while (top >= start && PSYMBOL_MATCHES_SEARCH_NAME (*top, lookup_name))
 	top--;
 
       /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME.  */
       top++;
 
-      while (top <= real_top && SYMBOL_MATCHES_SEARCH_NAME (*top, lookup_name))
+      while (top <= real_top && PSYMBOL_MATCHES_SEARCH_NAME (*top, lookup_name))
 	{
-	  if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
+	  if (symbol_matches_domain (PSYMBOL_LANGUAGE (*top),
 				     SYMBOL_DOMAIN (*top), domain))
 	    return *top;
 	  top++;
@@ -756,9 +756,9 @@ lookup_partial_symbol (struct objfile *objfile,
     {
       for (psym = start; psym < start + length; psym++)
 	{
-	  if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
+	  if (symbol_matches_domain (PSYMBOL_LANGUAGE (*psym),
 				     SYMBOL_DOMAIN (*psym), domain)
-	      && SYMBOL_MATCHES_SEARCH_NAME (*psym, lookup_name))
+	      && PSYMBOL_MATCHES_SEARCH_NAME (*psym, lookup_name))
 	    return *psym;
 	}
     }
@@ -814,14 +814,16 @@ psym_relocate (struct objfile *objfile,
   for (partial_symbol *psym : objfile->global_psymbols)
     {
       fixup_psymbol_section (psym, objfile);
-      if (SYMBOL_SECTION (psym) >= 0)
-	SYMBOL_VALUE_ADDRESS (psym) += ANOFFSET (delta, SYMBOL_SECTION (psym));
+      if (PSYMBOL_SECTION (psym) >= 0)
+	PSYMBOL_VALUE_ADDRESS (psym) += ANOFFSET (delta,
+						  PSYMBOL_SECTION (psym));
     }
   for (partial_symbol *psym : objfile->static_psymbols)
     {
       fixup_psymbol_section (psym, objfile);
-      if (SYMBOL_SECTION (psym) >= 0)
-	SYMBOL_VALUE_ADDRESS (psym) += ANOFFSET (delta, SYMBOL_SECTION (psym));
+      if (PSYMBOL_SECTION (psym) >= 0)
+	PSYMBOL_VALUE_ADDRESS (psym) += ANOFFSET (delta,
+						  PSYMBOL_SECTION (psym));
     }
 
   objfile->psymbol_map.clear ();
@@ -893,10 +895,10 @@ print_partial_symbols (struct gdbarch *gdbarch,
   while (count-- > 0)
     {
       QUIT;
-      fprintf_filtered (outfile, "    `%s'", SYMBOL_LINKAGE_NAME (*p));
-      if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
+      fprintf_filtered (outfile, "    `%s'", PSYMBOL_LINKAGE_NAME (*p));
+      if (PSYMBOL_DEMANGLED_NAME (*p) != NULL)
 	{
-	  fprintf_filtered (outfile, "  `%s'", SYMBOL_DEMANGLED_NAME (*p));
+	  fprintf_filtered (outfile, "  `%s'", PSYMBOL_DEMANGLED_NAME (*p));
 	}
       fputs_filtered (", ", outfile);
       switch (SYMBOL_DOMAIN (*p))
@@ -969,7 +971,7 @@ print_partial_symbols (struct gdbarch *gdbarch,
 	  break;
 	}
       fputs_filtered (", ", outfile);
-      fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (*p)), outfile);
+      fputs_filtered (paddress (gdbarch, PSYMBOL_VALUE_ADDRESS (*p)), outfile);
       fprintf_filtered (outfile, "\n");
       p++;
     }
@@ -1371,7 +1373,7 @@ recursively_search_psymtabs
 	       || (domain == TYPES_DOMAIN
 		   && PSYMBOL_CLASS (*psym) == LOC_TYPEDEF))
 	      && psymbol_name_matches (*psym, lookup_name)
-	      && (sym_matcher == NULL || sym_matcher (SYMBOL_SEARCH_NAME (*psym))))
+	      && (sym_matcher == NULL || sym_matcher (PSYMBOL_SEARCH_NAME (*psym))))
 	    {
 	      /* Found a match, so notify our caller.  */
 	      result = PST_SEARCHED_AND_FOUND;
@@ -1477,7 +1479,7 @@ psym_fill_psymbol_map (struct objfile *objfile,
 
       if (PSYMBOL_CLASS (psym) == LOC_STATIC)
 	{
-	  CORE_ADDR addr = SYMBOL_VALUE_ADDRESS (psym);
+	  CORE_ADDR addr = PSYMBOL_VALUE_ADDRESS (psym);
 	  if (seen_addrs->find (addr) == seen_addrs->end ())
 	    {
 	      seen_addrs->insert (addr);
@@ -1573,8 +1575,8 @@ sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
 
   std::sort (begin, end, [] (partial_symbol *s1, partial_symbol *s2)
     {
-      return strcmp_iw_ordered (SYMBOL_SEARCH_NAME (s1),
-				SYMBOL_SEARCH_NAME (s2)) < 0;
+      return strcmp_iw_ordered (PSYMBOL_SEARCH_NAME (s1),
+				PSYMBOL_SEARCH_NAME (s2)) < 0;
     });
 }
 
@@ -1621,17 +1623,17 @@ psymbol_hash (const void *addr, int length)
 {
   unsigned long h = 0;
   struct partial_symbol *psymbol = (struct partial_symbol *) addr;
-  unsigned int lang = psymbol->ginfo.language;
+  unsigned int lang = PSYMBOL_LANGUAGE (psymbol);
   unsigned int domain = PSYMBOL_DOMAIN (psymbol);
   unsigned int theclass = PSYMBOL_CLASS (psymbol);
 
-  h = hash_continue (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
+  h = hash_continue (&psymbol->pginfo.value, sizeof (psymbol->pginfo.value), h);
   h = hash_continue (&lang, sizeof (unsigned int), h);
   h = hash_continue (&domain, sizeof (unsigned int), h);
   h = hash_continue (&theclass, sizeof (unsigned int), h);
   /* Note that psymbol names are interned via symbol_set_names, so
      there's no need to hash the contents of the name here.  */
-  h = hash_continue (&psymbol->ginfo.name, sizeof (psymbol->ginfo.name), h);
+  h = hash_continue (&psymbol->pginfo.name, sizeof (psymbol->pginfo.name), h);
 
   return h;
 }
@@ -1646,15 +1648,15 @@ psymbol_compare (const void *addr1, const void *addr2, int length)
   struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
   struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
 
-  return (memcmp (&sym1->ginfo.value, &sym2->ginfo.value,
-                  sizeof (sym1->ginfo.value)) == 0
-	  && sym1->ginfo.language == sym2->ginfo.language
+  return (memcmp (&sym1->pginfo.value, &sym2->pginfo.value,
+                  sizeof (sym1->pginfo.value)) == 0
+	  && sym1->pginfo.language == sym2->pginfo.language
           && PSYMBOL_DOMAIN (sym1) == PSYMBOL_DOMAIN (sym2)
           && PSYMBOL_CLASS (sym1) == PSYMBOL_CLASS (sym2)
 	  /* Note that psymbol names are interned via
 	     symbol_set_names, so there's no need to compare the
 	     contents of the name here.  */
-          && sym1->ginfo.name == sym2->ginfo.name);
+          && sym1->pginfo.name == sym2->pginfo.name);
 }
 
 /* Initialize a partial symbol bcache.  */
@@ -1724,13 +1726,13 @@ add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
      holes.  */
   memset (&psymbol, 0, sizeof (psymbol));
 
-  SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
-  SYMBOL_SECTION (&psymbol) = -1;
-  SYMBOL_SET_LANGUAGE (&psymbol, language, &objfile->objfile_obstack);
+  PSYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
+  PSYMBOL_SECTION (&psymbol) = -1;
+  PSYMBOL_SET_LANGUAGE (&psymbol, language, &objfile->objfile_obstack);
   PSYMBOL_DOMAIN (&psymbol) = domain;
   PSYMBOL_CLASS (&psymbol) = theclass;
 
-  SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
+  PSYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
 
   /* Stash the partial symbol away in the cache.  */
   return psymbol_bcache_full (&psymbol, objfile->psymbol_cache, added);
@@ -2254,13 +2256,13 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
     length = ps->n_static_syms;
     while (length--)
       {
-	sym = block_lookup_symbol (b, SYMBOL_SEARCH_NAME (*psym),
+	sym = block_lookup_symbol (b, PSYMBOL_SEARCH_NAME (*psym),
 				   symbol_name_match_type::SEARCH_NAME,
-				   SYMBOL_DOMAIN (*psym));
+				   PSYMBOL_DOMAIN (*psym));
 	if (!sym)
 	  {
 	    printf_filtered ("Static symbol `");
-	    puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
+	    puts_filtered (PSYMBOL_LINKAGE_NAME (*psym));
 	    printf_filtered ("' only found in ");
 	    puts_filtered (ps->filename);
 	    printf_filtered (" psymtab\n");
@@ -2272,13 +2274,13 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
     length = ps->n_global_syms;
     while (length--)
       {
-	sym = block_lookup_symbol (b, SYMBOL_SEARCH_NAME (*psym),
+	sym = block_lookup_symbol (b, PSYMBOL_SEARCH_NAME (*psym),
 				   symbol_name_match_type::SEARCH_NAME,
-				   SYMBOL_DOMAIN (*psym));
+				   PSYMBOL_DOMAIN (*psym));
 	if (!sym)
 	  {
 	    printf_filtered ("Global symbol `");
-	    puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
+	    puts_filtered (PSYMBOL_LINKAGE_NAME (*psym));
 	    printf_filtered ("' only found in ");
 	    puts_filtered (ps->filename);
 	    printf_filtered (" psymtab\n");
-- 
2.13.6

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [RFA 5/6] Add validity bits for psymtab high and low fields
  2018-05-03 22:36 [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
                   ` (4 preceding siblings ...)
  2018-05-03 22:36 ` [RFA 2/6] Change representation of psymbol to flush out accessors Tom Tromey
@ 2018-05-03 22:36 ` Tom Tromey
  2018-06-01 21:23   ` Keith Seitz
  2018-05-25 17:58 ` [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
  6 siblings, 1 reply; 25+ messages in thread
From: Tom Tromey @ 2018-05-03 22:36 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

Right now some psymtab code checks whether a psymtab's textlow or
texthigh fields are valid by comparing against 0.

I imagine this is mildly wrong in the current environment, but once
psymtabs are relocated dynamically, it will no longer be correct,
because it will be much more normal to see a psymtab with a textlow of
zero -- this will just mean it appears at the start of the text
section.

This patch introduces validity bits to handle this situation more
nicely, and changes users of the code to follow.

ChangeLog
2018-05-03  Tom Tromey  <tromey@redhat.com>

	* dbxread.c (end_psymtab): Use texthigh_valid and textlow_valid.
	* mdebugread.c (parse_partial_symbols): Use textlow_valid.
	(psymtab_to_symtab_1): Use texthigh_valid and textlow_valid.
	* psympriv.h (struct partial_symtab) <textlow_, texthigh_>: Update
	comment.
	<textlow_valid, texthigh_valid>: New fields.
	(set_psymtab_textlow, set_psymtab_texthigh): New inline functions.
	(SET_PSYMTAB_TEXTLOW, SET_PSYMTAB_TEXTHIGH): Redefine.
	* xcoffread.c (scan_xcoff_symtab): Use textlow_valid.
---
 gdb/ChangeLog    | 12 ++++++++++++
 gdb/dbxread.c    |  6 ++----
 gdb/mdebugread.c |  8 ++++----
 gdb/psympriv.h   | 33 ++++++++++++++++++++++++++++++---
 gdb/xcoffread.c  |  2 +-
 5 files changed, 49 insertions(+), 12 deletions(-)

diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 810bdcf57b..da675abb68 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -2100,13 +2100,11 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
       /* If we know our own starting text address, then walk through all other
          psymtabs for this objfile, and if any didn't know their ending text
          address, set it to our starting address.  Take care to not set our
-         own ending address to our starting address, nor to set addresses on
-         `dependency' files that have both textlow and texthigh zero.  */
+         own ending address to our starting address.  */
 
       ALL_OBJFILE_PSYMTABS (objfile, p1)
       {
-	if (PSYMTAB_TEXTHIGH (p1) == 0 && PSYMTAB_TEXTLOW (p1) != 0
-	    && p1 != pst)
+	if (!p1->texthigh_valid && p1->textlow_valid && p1 != pst)
 	  SET_PSYMTAB_TEXTHIGH (p1, PSYMTAB_TEXTLOW (pst));
       }
     }
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index 09bdb28088..fb8318a831 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -2764,7 +2764,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
 			  /* Kludge for Irix 5.2 zero fh->adr.  */
 			  if (!relocatable
-			      && (PSYMTAB_TEXTLOW (pst) == 0
+			      && (!pst->textlow_valid
 				  || procaddr < PSYMTAB_TEXTLOW (pst)))
 			    SET_PSYMTAB_TEXTLOW (pst, procaddr);
 			  if (high > PSYMTAB_TEXTHIGH (pst))
@@ -3543,7 +3543,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
 		  /* Kludge for Irix 5.2 zero fh->adr.  */
 		  if (!relocatable
-		      && (PSYMTAB_TEXTLOW (pst) == 0
+		      && (!pst->textlow_valid
 			  || procaddr < PSYMTAB_TEXTLOW (pst)))
 		    SET_PSYMTAB_TEXTLOW (pst, procaddr);
 
@@ -3742,7 +3742,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
          other cases.  */
       save_pst = fdr_to_pst[f_idx].pst;
       if (save_pst != NULL
-	  && PSYMTAB_TEXTLOW (save_pst) != 0
+	  && save_pst->textlow_valid
 	  && !(objfile->flags & OBJF_REORDERED))
 	{
 	  ALL_OBJFILE_PSYMTABS (objfile, pst)
@@ -3957,7 +3957,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
   /* Do nothing if this is a dummy psymtab.  */
 
   if (pst->n_global_syms == 0 && pst->n_static_syms == 0
-      && PSYMTAB_TEXTLOW (pst) == 0 && PSYMTAB_TEXTHIGH (pst) == 0)
+      && !pst->textlow_valid && !pst->texthigh_valid)
     return;
 
   /* Now read the symbols for this symtab.  */
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index fa175736ce..8ce3c6b2a9 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -125,7 +125,9 @@ struct partial_symtab
   /* Range of text addresses covered by this file; texthigh is the
      beginning of the next section.  Do not use if PSYMTABS_ADDRMAP_SUPPORTED
      is set.  Do not refer directly to these fields.  Instead, use the
-     accessor macros.  */
+     accessor macros.  The validity of these fields is determined by the
+     textlow_valid and texthigh_valid fields; these are located later
+     in this structure for better packing.  */
 
   CORE_ADDR textlow_;
   CORE_ADDR texthigh_;
@@ -211,6 +213,11 @@ struct partial_symtab
 
   ENUM_BITFIELD (psymtab_search_status) searched_flag : 2;
 
+  /* Validity of the textlow_ and texthigh_ fields.  */
+
+  unsigned int textlow_valid : 1;
+  unsigned int texthigh_valid : 1;
+
   /* Pointer to compunit eventually allocated for this source file, 0 if
      !readin or if we haven't looked for the symtab after it was readin.  */
 
@@ -239,8 +246,28 @@ struct partial_symtab
 #define PSYMTAB_TEXTLOW(PST) ((PST)->textlow_ + 0)
 #define PSYMTAB_TEXTHIGH(PST) ((PST)->texthigh_ + 0)
 
-#define SET_PSYMTAB_TEXTLOW(PST, V) (((PST)->textlow_) = (V))
-#define SET_PSYMTAB_TEXTHIGH(PST, V) (((PST)->texthigh_) = (V))
+/* Set the "textlow" field on the partial symbol table, and mark the
+   field as valid.  */
+
+static inline void
+set_psymtab_textlow (struct partial_symtab *pst, CORE_ADDR low)
+{
+  pst->textlow_ = low;
+  pst->textlow_valid = 1;
+}
+
+/* Set the "texthigh" field on the partial symbol table, and mark the
+   field as valid.  */
+
+static inline void
+set_psymtab_texthigh (struct partial_symtab *pst, CORE_ADDR high)
+{
+  pst->texthigh_ = high;
+  pst->texthigh_valid = 1;
+}
+
+#define SET_PSYMTAB_TEXTLOW(PST, V) set_psymtab_textlow ((PST), (V))
+#define SET_PSYMTAB_TEXTHIGH(PST, V) set_psymtab_texthigh ((PST), (V))
 
 /* Add any kind of symbol to a partial_symbol vector.  */
 
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 49716a56e5..25df119d51 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2353,7 +2353,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 
 			if (highval > PSYMTAB_TEXTHIGH (pst))
 			  SET_PSYMTAB_TEXTHIGH (pst, highval);
-			if (PSYMTAB_TEXTLOW (pst) == 0
+			if (!pst->textlow_valid
 			    || symbol.n_value < PSYMTAB_TEXTLOW (pst))
 			  SET_PSYMTAB_TEXTLOW (pst, symbol.n_value);
 		      }
-- 
2.13.6

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [RFA 0/6] Make psymbols independent of the progspace
@ 2018-05-03 22:36 Tom Tromey
  2018-05-03 22:36 ` [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument Tom Tromey
                   ` (6 more replies)
  0 siblings, 7 replies; 25+ messages in thread
From: Tom Tromey @ 2018-05-03 22:36 UTC (permalink / raw)
  To: gdb-patches

This is another old patch series that I never checked in, which I've
now rebased.

Like some earlier series -- most recently for line tables -- This
series changes partial symbols to be independent of the progspace.
This means that the data is now stored unrelocated, and could in
theory be shared across multiple objfiles.

In practice psymtabs cannot be shared yet, because they have a
backlink to the full symtab.

Patches #1-#3 are just infrastructure changes in preparation for the
main patch; and most of the real work is in patch #6.

In patch #6 I chose to adjust addresses like this:

      lo = gdbarch_adjust_dwarf2_addr (gdbarch, lo + baseaddr) - baseaddr;

I'm not sure if this is the best way.  Maybe in the line table (I
can't look at this moment and I don't recall offhand) patch I chose to
pass unrelocated addresses to gdbarch_adjust_dwarf2_addr.  It would be
good to nail down the intended meaning of this hook and adjust
accordingly.

Tested by the buildbot -- but careful review is still required,
because some of the changes are not tested there.

Tom

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [RFA 4/6] Introduce accessors for psymtab high and low fields
  2018-05-03 22:36 [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
  2018-05-03 22:36 ` [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument Tom Tromey
@ 2018-05-03 22:36 ` Tom Tromey
  2018-06-01 20:48   ` Keith Seitz
  2018-06-05 21:03   ` Simon Marchi
  2018-05-03 22:36 ` [RFA 1/6] Remove dead code in end_psymtab Tom Tromey
                   ` (4 subsequent siblings)
  6 siblings, 2 replies; 25+ messages in thread
From: Tom Tromey @ 2018-05-03 22:36 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This introduces accessors for the partial symbol table textlow and
texthigh fields.  This lets us later arrange to relocate these values
at their point of use.

I did this conversion by renaming the fields.  I didn't rename the
fields back afterward, thinking that on the off chance that someone
has a patch touching this area, then a merge would helpfully break
their compile.

ChangeLog
2018-05-03  Tom Tromey  <tom@tromey.com>

	* dbxread.c (read_dbx_symtab, end_psymtab, read_ofile_symtab):
	Update.
	* dwarf2read.c (dwarf2_create_include_psymtab): Don't initialize
	textlow and texthigh fields.
	(process_psymtab_comp_unit_reader, dwarf2_build_include_psymtabs):
	Update.
	* mdebugread.c (parse_lines, parse_partial_symbols)
	(psymtab_to_symtab_1): Update.
	* psympriv.h (struct partial_symtab) <textlow_, texthigh_>: Rename
	fields.  Update comment.
	(PSYMTAB_TEXTLOW, PSYMTAB_TEXTHIGH, SET_PSYMTAB_TEXTLOW)
	(SET_PSYMTAB_TEXTHIGH): New macros.
	* psymtab.c (find_pc_sect_psymtab_closer, find_pc_sect_psymtab)
	(find_pc_sect_psymbol, relocate_psymtabs, dump_psymtab)
	(start_psymtab_common, maintenance_info_psymtabs)
	(maintenance_check_psymtabs): Update.
	* xcoffread.c (xcoff_end_psymtab): Don't initialize textlow and
	texthigh fields.
	(scan_xcoff_symtab): Update.
---
 gdb/ChangeLog    | 22 ++++++++++++++++++++++
 gdb/dbxread.c    | 52 ++++++++++++++++++++++++++--------------------------
 gdb/dwarf2read.c | 18 ++++++++++--------
 gdb/mdebugread.c | 42 ++++++++++++++++++++++--------------------
 gdb/psympriv.h   | 20 +++++++++++++++++---
 gdb/psymtab.c    | 48 ++++++++++++++++++++++++++----------------------
 gdb/xcoffread.c  | 11 +++++------
 7 files changed, 128 insertions(+), 85 deletions(-)

diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 7acbb0ec8b..810bdcf57b 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -1193,12 +1193,12 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	      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->textlow)
+		  && nlist.n_value >= PSYMTAB_TEXTLOW (pst))
 		{
 		  dbx_end_psymtab (objfile, pst, psymtab_include_list,
 				   includes_used, symnum * symbol_size,
-				   nlist.n_value > pst->texthigh
-				   ? nlist.n_value : pst->texthigh,
+				   nlist.n_value > PSYMTAB_TEXTHIGH (pst)
+				   ? nlist.n_value : PSYMTAB_TEXTHIGH (pst),
 				   dependency_list, dependencies_used,
 				   textlow_not_set);
 		  pst = (struct partial_symtab *) 0;
@@ -1313,8 +1313,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		  {
 		    dbx_end_psymtab (objfile, pst, psymtab_include_list,
 				     includes_used, symnum * symbol_size,
-				     valu > pst->texthigh
-				     ? valu : pst->texthigh,
+				     (valu > PSYMTAB_TEXTHIGH (pst)
+				      ? valu : PSYMTAB_TEXTHIGH (pst)),
 				     dependency_list, dependencies_used,
 				     prev_textlow_not_set);
 		    pst = (struct partial_symtab *) 0;
@@ -1489,8 +1489,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		 function relative stabs, or the address of the function's
 		 end for old style stabs.  */
 	      valu = nlist.n_value + last_function_start;
-	      if (pst->texthigh == 0 || valu > pst->texthigh)
-		pst->texthigh = valu;
+	      if (PSYMTAB_TEXTHIGH (pst) == 0 || valu > PSYMTAB_TEXTHIGH (pst))
+		SET_PSYMTAB_TEXTHIGH (pst, valu);
 	      break;
 	    }
 
@@ -1704,7 +1704,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	      if (pst && textlow_not_set
 		  && gdbarch_sofun_address_maybe_missing (gdbarch))
 		{
-		  pst->textlow = nlist.n_value;
+		  SET_PSYMTAB_TEXTLOW (pst, nlist.n_value);
 		  textlow_not_set = 0;
 		}
 	      /* End kludge.  */
@@ -1719,12 +1719,12 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		 the partial symbol table.  */
 	      if (pst
 		  && (textlow_not_set
-		      || (nlist.n_value < pst->textlow
+		      || (nlist.n_value < PSYMTAB_TEXTLOW (pst)
 			  && (nlist.n_value
 			      != ANOFFSET (objfile->section_offsets,
 					   SECT_OFF_TEXT (objfile))))))
 		{
-		  pst->textlow = nlist.n_value;
+		  SET_PSYMTAB_TEXTLOW (pst, nlist.n_value);
 		  textlow_not_set = 0;
 		}
 	      add_psymbol_to_list (sym_name, sym_len, 1,
@@ -1773,7 +1773,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	      if (pst && textlow_not_set
 		  && gdbarch_sofun_address_maybe_missing (gdbarch))
 		{
-		  pst->textlow = nlist.n_value;
+		  SET_PSYMTAB_TEXTLOW (pst, nlist.n_value);
 		  textlow_not_set = 0;
 		}
 	      /* End kludge.  */
@@ -1788,12 +1788,12 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		 the partial symbol table.  */
 	      if (pst
 		  && (textlow_not_set
-		      || (nlist.n_value < pst->textlow
+		      || (nlist.n_value < PSYMTAB_TEXTLOW (pst)
 			  && (nlist.n_value
 			      != ANOFFSET (objfile->section_offsets,
 					   SECT_OFF_TEXT (objfile))))))
 		{
-		  pst->textlow = nlist.n_value;
+		  SET_PSYMTAB_TEXTLOW (pst, nlist.n_value);
 		  textlow_not_set = 0;
 		}
 	      add_psymbol_to_list (sym_name, sym_len, 1,
@@ -1980,7 +1980,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 
       dbx_end_psymtab (objfile, pst, psymtab_include_list, includes_used,
 		       symnum * symbol_size,
-		       text_end > pst->texthigh ? text_end : pst->texthigh,
+		       (text_end > PSYMTAB_TEXTHIGH (pst)
+			? text_end : PSYMTAB_TEXTHIGH (pst)),
 		       dependency_list, dependencies_used, textlow_not_set);
     }
 
@@ -2037,7 +2038,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
 
   if (capping_symbol_offset != -1)
     LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
-  pst->texthigh = capping_text;
+  SET_PSYMTAB_TEXTHIGH (pst, capping_text);
 
   /* Under Solaris, the N_SO symbols always have a value of 0,
      instead of the usual address of the .o file.  Therefore,
@@ -2054,7 +2055,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
      a reliable texthigh by taking the address plus size of the
      last function in the file.  */
 
-  if (pst->texthigh == 0 && last_function_name
+  if (PSYMTAB_TEXTHIGH (pst) == 0 && last_function_name
       && gdbarch_sofun_address_maybe_missing (gdbarch))
     {
       int n;
@@ -2081,8 +2082,8 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
 	}
 
       if (minsym.minsym)
-	pst->texthigh = (BMSYMBOL_VALUE_ADDRESS (minsym)
-			 + MSYMBOL_SIZE (minsym.minsym));
+	SET_PSYMTAB_TEXTHIGH (pst, (BMSYMBOL_VALUE_ADDRESS (minsym)
+				    + MSYMBOL_SIZE (minsym.minsym)));
 
       last_function_name = NULL;
     }
@@ -2091,7 +2092,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
     ;
   /* This test will be true if the last .o file is only data.  */
   else if (textlow_not_set)
-    pst->textlow = pst->texthigh;
+    SET_PSYMTAB_TEXTLOW (pst, PSYMTAB_TEXTHIGH (pst));
   else
     {
       struct partial_symtab *p1;
@@ -2104,8 +2105,9 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
 
       ALL_OBJFILE_PSYMTABS (objfile, p1)
       {
-	if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst)
-	  p1->texthigh = pst->textlow;
+	if (PSYMTAB_TEXTHIGH (p1) == 0 && PSYMTAB_TEXTLOW (p1) != 0
+	    && p1 != pst)
+	  SET_PSYMTAB_TEXTHIGH (p1, PSYMTAB_TEXTLOW (pst));
       }
     }
 
@@ -2133,9 +2135,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
       subpst->read_symtab_private =
 	XOBNEW (&objfile->objfile_obstack, struct symloc);
       LDSYMOFF (subpst) =
-	LDSYMLEN (subpst) =
-	subpst->textlow =
-	subpst->texthigh = 0;
+	LDSYMLEN (subpst) = 0;
 
       /* We could save slight bits of space by only making one of these,
          shared by the entire set of include files.  FIXME-someday.  */
@@ -2298,8 +2298,8 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst)
 
   sym_offset = LDSYMOFF (pst);
   sym_size = LDSYMLEN (pst);
-  text_offset = pst->textlow;
-  text_size = pst->texthigh - pst->textlow;
+  text_offset = PSYMTAB_TEXTLOW (pst);
+  text_size = PSYMTAB_TEXTHIGH (pst) - PSYMTAB_TEXTLOW (pst);
   section_offsets = objfile->section_offsets;
 
   dbxread_objfile = objfile;
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 380ff365bb..3cb0475b3b 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -6518,9 +6518,6 @@ dwarf2_create_include_psymtab (const char *name, struct partial_symtab *pst,
       subpst->dirname = pst->dirname;
     }
 
-  subpst->textlow = 0;
-  subpst->texthigh = 0;
-
   subpst->dependencies
     = XOBNEW (&objfile->objfile_obstack, struct partial_symtab *);
   subpst->dependencies[0] = pst;
@@ -6559,7 +6556,8 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu,
     return;  /* No linetable, so no includes.  */
 
   /* NOTE: pst->dirname is DW_AT_comp_dir (if present).  */
-  dwarf_decode_lines (lh.get (), pst->dirname, cu, pst, pst->textlow, 1);
+  dwarf_decode_lines (lh.get (), pst->dirname, cu, pst,
+		      PSYMTAB_TEXTLOW (pst), 1);
 }
 
 static hashval_t
@@ -7981,8 +7979,12 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
 	  best_highpc = highpc;
 	}
     }
-  pst->textlow = gdbarch_adjust_dwarf2_addr (gdbarch, best_lowpc + baseaddr);
-  pst->texthigh = gdbarch_adjust_dwarf2_addr (gdbarch, best_highpc + baseaddr);
+  SET_PSYMTAB_TEXTLOW (pst,
+		       gdbarch_adjust_dwarf2_addr (gdbarch,
+						   best_lowpc + baseaddr));
+  SET_PSYMTAB_TEXTHIGH (pst,
+			gdbarch_adjust_dwarf2_addr (gdbarch,
+						    best_highpc + baseaddr));
 
   end_psymtab_common (objfile, pst);
 
@@ -8019,8 +8021,8 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
 			  ", %d global, %d static syms\n",
 			  per_cu->is_debug_types ? "type" : "comp",
 			  sect_offset_str (per_cu->sect_off),
-			  paddress (gdbarch, pst->textlow),
-			  paddress (gdbarch, pst->texthigh),
+			  paddress (gdbarch, PSYMTAB_TEXTLOW (pst)),
+			  paddress (gdbarch, PSYMTAB_TEXTHIGH (pst)),
 			  pst->n_global_syms, pst->n_static_syms);
     }
 }
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index c0bce55148..09bdb28088 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -2213,7 +2213,7 @@ parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
 	halt = base + fh->cbLine;
       base += pr->cbLineOffset;
 
-      adr = pst->textlow + pr->adr - lowest_pdr_addr;
+      adr = PSYMTAB_TEXTLOW (pst) + pr->adr - lowest_pdr_addr;
 
       l = adr >> 2;		/* in words */
       for (lineno = pr->lnLow; base < halt;)
@@ -2699,7 +2699,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 	psymtab_language = prev_language;
       PST_PRIVATE (pst)->pst_language = psymtab_language;
 
-      pst->texthigh = pst->textlow;
+      SET_PSYMTAB_TEXTHIGH (pst, PSYMTAB_TEXTLOW (pst));
 
       /* For stabs-in-ecoff files, the second symbol must be @stab.
          This symbol is emitted by mips-tfile to signal that the
@@ -2764,10 +2764,11 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
 			  /* Kludge for Irix 5.2 zero fh->adr.  */
 			  if (!relocatable
-			  && (pst->textlow == 0 || procaddr < pst->textlow))
-			    pst->textlow = procaddr;
-			  if (high > pst->texthigh)
-			    pst->texthigh = high;
+			      && (PSYMTAB_TEXTLOW (pst) == 0
+				  || procaddr < PSYMTAB_TEXTLOW (pst)))
+			    SET_PSYMTAB_TEXTLOW (pst, procaddr);
+			  if (high > PSYMTAB_TEXTHIGH (pst))
+			    SET_PSYMTAB_TEXTHIGH (pst, high);
 			}
 		    }
 		  else if (sh.st == stStatic)
@@ -3351,8 +3352,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		    continue;
 
 		  case N_RBRAC:
-		    if (sh.value > save_pst->texthigh)
-		      save_pst->texthigh = sh.value;
+		    if (sh.value > PSYMTAB_TEXTHIGH (save_pst))
+		      SET_PSYMTAB_TEXTHIGH (save_pst, sh.value);
 		    continue;
 		  case N_EINCL:
 		  case N_DSLINE:
@@ -3542,12 +3543,13 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
 		  /* Kludge for Irix 5.2 zero fh->adr.  */
 		  if (!relocatable
-		      && (pst->textlow == 0 || procaddr < pst->textlow))
-		    pst->textlow = procaddr;
+		      && (PSYMTAB_TEXTLOW (pst) == 0
+			  || procaddr < PSYMTAB_TEXTLOW (pst)))
+		    SET_PSYMTAB_TEXTLOW (pst, procaddr);
 
 		  high = procaddr + sh.value;
-		  if (high > pst->texthigh)
-		    pst->texthigh = high;
+		  if (high > PSYMTAB_TEXTHIGH (pst))
+		    SET_PSYMTAB_TEXTHIGH (pst, high);
 		  continue;
 
 		case stStatic:	/* Variable */
@@ -3721,7 +3723,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
       fdr_to_pst[f_idx].pst
 	= dbx_end_psymtab (objfile, save_pst,
 			   psymtab_include_list, includes_used,
-			   -1, save_pst->texthigh,
+			   -1, PSYMTAB_TEXTHIGH (save_pst),
 			   dependency_list, dependencies_used,
 			   textlow_not_set);
       includes_used = 0;
@@ -3740,15 +3742,15 @@ parse_partial_symbols (minimal_symbol_reader &reader,
          other cases.  */
       save_pst = fdr_to_pst[f_idx].pst;
       if (save_pst != NULL
-	  && save_pst->textlow != 0
+	  && PSYMTAB_TEXTLOW (save_pst) != 0
 	  && !(objfile->flags & OBJF_REORDERED))
 	{
 	  ALL_OBJFILE_PSYMTABS (objfile, pst)
 	  {
 	    if (save_pst != pst
-		&& save_pst->textlow >= pst->textlow
-		&& save_pst->textlow < pst->texthigh
-		&& save_pst->texthigh > pst->texthigh)
+		&& PSYMTAB_TEXTLOW (save_pst) >= PSYMTAB_TEXTLOW (pst)
+		&& PSYMTAB_TEXTLOW (save_pst) < PSYMTAB_TEXTHIGH (pst)
+		&& PSYMTAB_TEXTHIGH (save_pst) > PSYMTAB_TEXTHIGH (pst))
 	      {
 		objfile->flags |= OBJF_REORDERED;
 		break;
@@ -3955,7 +3957,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
   /* Do nothing if this is a dummy psymtab.  */
 
   if (pst->n_global_syms == 0 && pst->n_static_syms == 0
-      && pst->textlow == 0 && pst->texthigh == 0)
+      && PSYMTAB_TEXTLOW (pst) == 0 && PSYMTAB_TEXTHIGH (pst) == 0)
     return;
 
   /* Now read the symbols for this symtab.  */
@@ -4107,7 +4109,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
 
       if (! last_symtab_ended)
 	{
-	  cust = end_symtab (pst->texthigh, SECT_OFF_TEXT (objfile));
+	  cust = end_symtab (PSYMTAB_TEXTHIGH (pst), SECT_OFF_TEXT (objfile));
 	  end_stabs ();
 	}
 
@@ -4188,7 +4190,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
       top_stack->cur_st = COMPUNIT_FILETABS (cust);
       top_stack->cur_block
 	= BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), STATIC_BLOCK);
-      BLOCK_START (top_stack->cur_block) = pst->textlow;
+      BLOCK_START (top_stack->cur_block) = PSYMTAB_TEXTLOW (pst);
       BLOCK_END (top_stack->cur_block) = 0;
       top_stack->blocktype = stFile;
       top_stack->cur_type = 0;
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 8daaa377b7..fa175736ce 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -124,10 +124,11 @@ struct partial_symtab
 
   /* Range of text addresses covered by this file; texthigh is the
      beginning of the next section.  Do not use if PSYMTABS_ADDRMAP_SUPPORTED
-     is set.  */
+     is set.  Do not refer directly to these fields.  Instead, use the
+     accessor macros.  */
 
-  CORE_ADDR textlow;
-  CORE_ADDR texthigh;
+  CORE_ADDR textlow_;
+  CORE_ADDR texthigh_;
 
   /* If NULL, this is an ordinary partial symbol table.
 
@@ -228,6 +229,19 @@ struct partial_symtab
   void *read_symtab_private;
 };
 
+/* Compute a section offset given an objfile, a section_offsets field
+   from a partial symtab, and an index.  */
+
+#define PST_OFFSET(OBJF, OFFS, INDEX)				\
+  (ANOFFSET ((OBJF)->section_offsets, (INDEX))			\
+   + ((((OFFS) == NULL)) ? 0 : ANOFFSET ((OFFS), (INDEX))))
+
+#define PSYMTAB_TEXTLOW(PST) ((PST)->textlow_ + 0)
+#define PSYMTAB_TEXTHIGH(PST) ((PST)->texthigh_ + 0)
+
+#define SET_PSYMTAB_TEXTLOW(PST, V) (((PST)->textlow_) = (V))
+#define SET_PSYMTAB_TEXTHIGH(PST, V) (((PST)->texthigh_) = (V))
+
 /* Add any kind of symbol to a partial_symbol vector.  */
 
 extern void add_psymbol_to_list (const char *, int,
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 3b6f0d53b5..30c9a43e2c 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -232,7 +232,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 {
   struct partial_symtab *tpst;
   struct partial_symtab *best_pst = pst;
-  CORE_ADDR best_addr = pst->textlow;
+  CORE_ADDR best_addr = PSYMTAB_TEXTLOW (pst);
 
   gdb_assert (!pst->psymtabs_addrmap_supported);
 
@@ -256,7 +256,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
      that is closest and still less than the given PC.  */
   for (tpst = pst; tpst != NULL; tpst = tpst->next)
     {
-      if (pc >= tpst->textlow && pc < tpst->texthigh)
+      if (pc >= PSYMTAB_TEXTLOW (tpst) && pc < PSYMTAB_TEXTHIGH (tpst))
 	{
 	  struct partial_symbol *p;
 	  CORE_ADDR this_addr;
@@ -278,7 +278,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 	  if (p != NULL)
 	    this_addr = PSYMBOL_VALUE_ADDRESS (objfile, p);
 	  else
-	    this_addr = tpst->textlow;
+	    this_addr = PSYMTAB_TEXTLOW (tpst);
 
 	  /* Check whether it is closer than our current
 	     BEST_ADDR.  Since this symbol address is
@@ -362,7 +362,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
     if (!pst->psymtabs_addrmap_supported
-	&& pc >= pst->textlow && pc < pst->texthigh)
+	&& pc >= PSYMTAB_TEXTLOW (pst) && pc < PSYMTAB_TEXTHIGH (pst))
       {
 	struct partial_symtab *best_pst;
 
@@ -416,7 +416,8 @@ find_pc_sect_psymbol (struct objfile *objfile,
   gdb_assert (psymtab != NULL);
 
   /* Cope with programs that start at address 0.  */
-  best_pc = (psymtab->textlow != 0) ? psymtab->textlow - 1 : 0;
+  best_pc = ((PSYMTAB_TEXTLOW (psymtab) != 0)
+	     ? PSYMTAB_TEXTLOW (psymtab) - 1 : 0);
 
   /* Search the global symbols as well as the static symbols, so that
      find_pc_partial_function doesn't use a minimal symbol and thus
@@ -429,7 +430,7 @@ find_pc_sect_psymbol (struct objfile *objfile,
 	  && PSYMBOL_CLASS (p) == LOC_BLOCK
 	  && pc >= PSYMBOL_VALUE_ADDRESS (objfile, p)
 	  && (PSYMBOL_VALUE_ADDRESS (objfile, p) > best_pc
-	      || (psymtab->textlow == 0
+	      || (PSYMTAB_TEXTLOW (psymtab) == 0
 		  && best_pc == 0
 		  && PSYMBOL_VALUE_ADDRESS (objfile, p) == 0)))
 	{
@@ -453,7 +454,7 @@ find_pc_sect_psymbol (struct objfile *objfile,
 	  && PSYMBOL_CLASS (p) == LOC_BLOCK
 	  && pc >= PSYMBOL_VALUE_ADDRESS (objfile, p)
 	  && (PSYMBOL_VALUE_ADDRESS (objfile, p) > best_pc
-	      || (psymtab->textlow == 0
+	      || (PSYMTAB_TEXTLOW (psymtab) == 0
 		  && best_pc == 0
 		  && PSYMBOL_VALUE_ADDRESS (objfile, p) == 0)))
 	{
@@ -809,8 +810,10 @@ psym_relocate (struct objfile *objfile,
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
     {
-      p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
-      p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
+      SET_PSYMTAB_TEXTLOW (p, (PSYMTAB_TEXTLOW (p)
+			       + ANOFFSET (delta, SECT_OFF_TEXT (objfile))));
+      SET_PSYMTAB_TEXTHIGH (p, (PSYMTAB_TEXTHIGH (p)
+				+ ANOFFSET (delta, SECT_OFF_TEXT (objfile))));
     }
 
   for (partial_symbol *psym : objfile->global_psymbols)
@@ -1019,9 +1022,9 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
     }
 
   fprintf_filtered (outfile, "  Symbols cover text addresses ");
-  fputs_filtered (paddress (gdbarch, psymtab->textlow), outfile);
+  fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (psymtab)), outfile);
   fprintf_filtered (outfile, "-");
-  fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
+  fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (psymtab)), outfile);
   fprintf_filtered (outfile, "\n");
   fprintf_filtered (outfile, "  Address map supported - %s.\n",
 		    psymtab->psymtabs_addrmap_supported ? "yes" : "no");
@@ -1601,8 +1604,8 @@ start_psymtab_common (struct objfile *objfile,
   struct partial_symtab *psymtab;
 
   psymtab = allocate_psymtab (filename, objfile);
-  psymtab->textlow = textlow;
-  psymtab->texthigh = psymtab->textlow;		/* default */
+  SET_PSYMTAB_TEXTLOW (psymtab, textlow);
+  SET_PSYMTAB_TEXTHIGH (psymtab, PSYMTAB_TEXTLOW (psymtab)); /* default */
   psymtab->globals_offset = global_psymbols.size ();
   psymtab->statics_offset = static_psymbols.size ();
   return psymtab;
@@ -2158,10 +2161,10 @@ maintenance_info_psymtabs (const char *regexp, int from_tty)
 			       psymtab->fullname
 			       ? psymtab->fullname : "(null)");
 	      printf_filtered ("    text addresses ");
-	      fputs_filtered (paddress (gdbarch, psymtab->textlow),
+	      fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (psymtab)),
 			      gdb_stdout);
 	      printf_filtered (" -- ");
-	      fputs_filtered (paddress (gdbarch, psymtab->texthigh),
+	      fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (psymtab)),
 			      gdb_stdout);
 	      printf_filtered ("\n");
 	      printf_filtered ("    psymtabs_addrmap_supported %s\n",
@@ -2241,14 +2244,14 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
     cust = ps->compunit_symtab;
 
     /* First do some checks that don't require the associated symtab.  */
-    if (ps->texthigh < ps->textlow)
+    if (PSYMTAB_TEXTHIGH (ps) < PSYMTAB_TEXTLOW (ps))
       {
 	printf_filtered ("Psymtab ");
 	puts_filtered (ps->filename);
 	printf_filtered (" covers bad range ");
-	fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (ps)), gdb_stdout);
 	printf_filtered (" - ");
-	fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (ps)), gdb_stdout);
 	printf_filtered ("\n");
 	continue;
       }
@@ -2293,15 +2296,16 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
 	  }
 	psym++;
       }
-    if (ps->texthigh != 0
-	&& (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b)))
+    if (PSYMTAB_TEXTHIGH (ps) != 0
+	&& (PSYMTAB_TEXTLOW (ps) < BLOCK_START (b)
+	    || PSYMTAB_TEXTHIGH (ps) > BLOCK_END (b)))
       {
 	printf_filtered ("Psymtab ");
 	puts_filtered (ps->filename);
 	printf_filtered (" covers ");
-	fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (ps)), gdb_stdout);
 	printf_filtered (" - ");
-	fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (ps)), gdb_stdout);
 	printf_filtered (" but symtab covers only ");
 	fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
 	printf_filtered (" - ");
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 8c707aa8fe..49716a56e5 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2101,8 +2101,6 @@ xcoff_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
 						   sizeof (struct symloc));
       ((struct symloc *) subpst->read_symtab_private)->first_symnum = 0;
       ((struct symloc *) subpst->read_symtab_private)->numsyms = 0;
-      subpst->textlow = 0;
-      subpst->texthigh = 0;
 
       /* We could save slight bits of space by only making one of these,
          shared by the entire set of include files.  FIXME-someday.  */
@@ -2353,10 +2351,11 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 			CORE_ADDR highval =
 			  symbol.n_value + csect_aux.x_csect.x_scnlen.l;
 
-			if (highval > pst->texthigh)
-			  pst->texthigh = highval;
-			if (pst->textlow == 0 || symbol.n_value < pst->textlow)
-			  pst->textlow = symbol.n_value;
+			if (highval > PSYMTAB_TEXTHIGH (pst))
+			  SET_PSYMTAB_TEXTHIGH (pst, highval);
+			if (PSYMTAB_TEXTLOW (pst) == 0
+			    || symbol.n_value < PSYMTAB_TEXTLOW (pst))
+			  SET_PSYMTAB_TEXTLOW (pst, symbol.n_value);
 		      }
 		    misc_func_recorded = 0;
 		    break;
-- 
2.13.6

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 0/6] Make psymbols independent of the progspace
  2018-05-03 22:36 [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
                   ` (5 preceding siblings ...)
  2018-05-03 22:36 ` [RFA 5/6] Add validity bits for psymtab high and low fields Tom Tromey
@ 2018-05-25 17:58 ` Tom Tromey
  6 siblings, 0 replies; 25+ messages in thread
From: Tom Tromey @ 2018-05-25 17:58 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

>>>>> "Tom" == Tom Tromey <tom@tromey.com> writes:

Tom> This is another old patch series that I never checked in, which I've
Tom> now rebased.

Tom> Like some earlier series -- most recently for line tables -- This
Tom> series changes partial symbols to be independent of the progspace.
Tom> This means that the data is now stored unrelocated, and could in
Tom> theory be shared across multiple objfiles.

Tom> In practice psymtabs cannot be shared yet, because they have a
Tom> backlink to the full symtab.

Tom> Patches #1-#3 are just infrastructure changes in preparation for the
Tom> main patch; and most of the real work is in patch #6.

Tom> In patch #6 I chose to adjust addresses like this:

Tom>       lo = gdbarch_adjust_dwarf2_addr (gdbarch, lo + baseaddr) - baseaddr;

Tom> I'm not sure if this is the best way.  Maybe in the line table (I
Tom> can't look at this moment and I don't recall offhand) patch I chose to
Tom> pass unrelocated addresses to gdbarch_adjust_dwarf2_addr.  It would be
Tom> good to nail down the intended meaning of this hook and adjust
Tom> accordingly.

Tom> Tested by the buildbot -- but careful review is still required,
Tom> because some of the changes are not tested there.

Ping.

Tom

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 1/6] Remove dead code in end_psymtab
  2018-05-03 22:36 ` [RFA 1/6] Remove dead code in end_psymtab Tom Tromey
@ 2018-06-01 18:55   ` Keith Seitz
  2018-06-05 19:41     ` Simon Marchi
  0 siblings, 1 reply; 25+ messages in thread
From: Keith Seitz @ 2018-06-01 18:55 UTC (permalink / raw)
  To: Tom Tromey, gdb-patches

On 05/03/2018 03:36 PM, Tom Tromey wrote:
> Normally I would investigate a fix for the code.  However, considering
> that the code has been this way a long time (since the first import to
> sourceware) and considering that dbxread.c is not as important any
> more, I think it's safe to just consider that there's no bug.

I agree. If it's not tested and the comments aren't clear about what problem it is trying to solve, wait for a new bug report. :-)

IANAMBLGTM*

Keith

* "I am not a maintainer, but looks good to me."

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 2/6] Change representation of psymbol to flush out accessors
  2018-05-03 22:36 ` [RFA 2/6] Change representation of psymbol to flush out accessors Tom Tromey
@ 2018-06-01 19:19   ` Keith Seitz
  2018-06-04 18:11     ` Tom Tromey
  0 siblings, 1 reply; 25+ messages in thread
From: Keith Seitz @ 2018-06-01 19:19 UTC (permalink / raw)
  To: Tom Tromey, gdb-patches

On 05/03/2018 03:36 PM, Tom Tromey wrote:
> ChangeLog
> 2018-05-03  Tom Tromey  <tom@tromey.com>
> 
> 	* dwarf-index-write.c (write_psymbols, debug_names::insert)
> 	(debug_names::write_psymbols): Update.
> 	* psympriv.h (struct partial_symbol) <pginfo>: Rename from
> 	'ginfo'.
> 	(PSYMBOL_VALUE, PSYMBOL_VALUE_ADDRESS, PSYMBOL_LANGUAGE)
> 	(PSYMBOL_SECTION, PSYMBOL_OBJ_SECTION, PSYMBOL_SET_LANGUAGE)
> 	(PSYMBOL_SET_NAMES, PSYMBOL_LINKAGE_NAME, PSYMBOL_DEMANGLED_NAME)
> 	(PSYMBOL_SEARCH_NAME, PSYMBOL_MATCHES_SEARCH_NAME): New macros.
> 	* psymtab.c (find_pc_sect_psymtab_closer, find_pc_sect_psymtab)
> 	(find_pc_sect_psymbol, fixup_psymbol_section)
> 	(match_partial_symbol, lookup_partial_symbol, relocate_psymtabs)
> 	(print_partial_symbols, recursively_search_psymtabs)
> 	(compare_psymbols, psymbol_hash, psymbol_compare)
> 	(add_psymbol_to_bcache, maintenance_check_psymtabs)
> 	(psymbol_name_matches, psym_fill_psymbol_map): Update.

One trivial comment, otherwise IANAM, but LGTM.

Keith

> diff --git a/gdb/psymtab.c b/gdb/psymtab.c
> index ac0ee0a5a6..e9a6a23b9d 100644
> --- a/gdb/psymtab.c
> +++ b/gdb/psymtab.c
> @@ -1621,17 +1623,17 @@ psymbol_hash (const void *addr, int length)
>  {
>    unsigned long h = 0;
>    struct partial_symbol *psymbol = (struct partial_symbol *) addr;
> -  unsigned int lang = psymbol->ginfo.language;
> +  unsigned int lang = PSYMBOL_LANGUAGE (psymbol);
>    unsigned int domain = PSYMBOL_DOMAIN (psymbol);
>    unsigned int theclass = PSYMBOL_CLASS (psymbol);
>  
> -  h = hash_continue (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
> +  h = hash_continue (&psymbol->pginfo.value, sizeof (psymbol->pginfo.value), h);
>    h = hash_continue (&lang, sizeof (unsigned int), h);
>    h = hash_continue (&domain, sizeof (unsigned int), h);
>    h = hash_continue (&theclass, sizeof (unsigned int), h);
>    /* Note that psymbol names are interned via symbol_set_names, so
>       there's no need to hash the contents of the name here.  */
> -  h = hash_continue (&psymbol->ginfo.name, sizeof (psymbol->ginfo.name), h);
> +  h = hash_continue (&psymbol->pginfo.name, sizeof (psymbol->pginfo.name), h);

I realize this is just a renaming of the existing code, but since there is an accessor for `name', I think it better to use it (in case someone ends up grepping for this).

>  
>    return h;
>  }
> @@ -1646,15 +1648,15 @@ psymbol_compare (const void *addr1, const void *addr2, int length)
>    struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
>    struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
>  
> -  return (memcmp (&sym1->ginfo.value, &sym2->ginfo.value,
> -                  sizeof (sym1->ginfo.value)) == 0
> -	  && sym1->ginfo.language == sym2->ginfo.language
> +  return (memcmp (&sym1->pginfo.value, &sym2->pginfo.value,
> +                  sizeof (sym1->pginfo.value)) == 0
> +	  && sym1->pginfo.language == sym2->pginfo.language
>            && PSYMBOL_DOMAIN (sym1) == PSYMBOL_DOMAIN (sym2)
>            && PSYMBOL_CLASS (sym1) == PSYMBOL_CLASS (sym2)
>  	  /* Note that psymbol names are interned via
>  	     symbol_set_names, so there's no need to compare the
>  	     contents of the name here.  */
> -          && sym1->ginfo.name == sym2->ginfo.name);
> +          && sym1->pginfo.name == sym2->pginfo.name);
>  }

Same here for PSYMBOL_LANGUAGE and PSYMBOL_LINKAGE_NAME?

>  /* Initialize a partial symbol bcache.  */
Keith

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument
  2018-05-03 22:36 ` [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument Tom Tromey
@ 2018-06-01 20:06   ` Keith Seitz
  2018-06-01 21:03     ` Tom Tromey
  0 siblings, 1 reply; 25+ messages in thread
From: Keith Seitz @ 2018-06-01 20:06 UTC (permalink / raw)
  To: Tom Tromey, gdb-patches

On 05/03/2018 03:36 PM, Tom Tromey wrote:
>
> Note that the macro doesn't actually perform any relocation -- it uses
> the argument, to ensure that any possible syntax errors are caught,
> but it multiplies it by 0 so that it has no effect.

Just a word of warning: ANOFFSET will assert if PSYMBOL_SECTION is -1. [Setting that field isn't added until the last patch.] As a result, I am seeing a lot of temporary regressions. I build with -O0, so maybe these won't show up during a buildbot test run?

Example from gdb.base/reread.exp:

run
Starting program: /home/keiths/work/gdb/branches/tromey-psymbols-progspace.patch
/linux/gdb/testsuite/outputs/gdb.base/reread/reread
../../src/gdb/psymtab.c:493: internal-error: Section index is uninitialized
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) FAIL: gdb.base/reread.exp: opts= "-fPIE" "ldflags=-pie" : run to foo() (GDB internal error)
Resyncing due to internal error.

> ChangeLog
> 2018-05-03  Tom Tromey  <tromey@redhat.com>
> 
> 	* psympriv.h (SET_PSYMBOL_VALUE_ADDRESS)
> 	(PSYMBOL_VALUE_RAW_ADDRESS): New macros.
> 	(PSYMBOL_VALUE_ADDRESS): Add 'objfile' parameter.
> 	* psymtab.c (find_pc_sect_psymtab_closer, find_pc_sect_psymbol)
> 	(fixup_psymbol_section, relocate_psymtabs): Update.
> 	(print_partial_symbols): Add 'objfile' parameter.  Update.
> 	(dump_psymtab, add_psymbol_to_bcache, psym_fill_psymbol_map):
> 	Update.

With that caveat, (and IANAM), this LGTM.

Keith

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 4/6] Introduce accessors for psymtab high and low fields
  2018-05-03 22:36 ` [RFA 4/6] Introduce accessors for psymtab high and low fields Tom Tromey
@ 2018-06-01 20:48   ` Keith Seitz
  2018-06-04 18:14     ` Tom Tromey
  2018-06-05 21:03   ` Simon Marchi
  1 sibling, 1 reply; 25+ messages in thread
From: Keith Seitz @ 2018-06-01 20:48 UTC (permalink / raw)
  To: Tom Tromey, gdb-patches

On 05/03/2018 03:36 PM, Tom Tromey wrote:
> I did this conversion by renaming the fields.  I didn't rename the
> fields back afterward, thinking that on the off chance that someone
> has a patch touching this area, then a merge would helpfully break
> their compile.

/me likey
;-)

Just a little request:

> 	* dbxread.c (read_dbx_symtab, end_psymtab, read_ofile_symtab):
> 	Update.
> 	* mdebugread.c (parse_lines, parse_partial_symbols)
> 	(psymtab_to_symtab_1): Update.

These files still mention ->textlow and/or ->texthigh. Could you please adjust the comments accordingly?

Otherwise, LGTM (but IANAM).

[And for the record, this patch (and the next) will also show "regressions" because of patch #3.]

Keith

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument
  2018-06-01 20:06   ` Keith Seitz
@ 2018-06-01 21:03     ` Tom Tromey
  2018-06-05 20:50       ` Simon Marchi
  0 siblings, 1 reply; 25+ messages in thread
From: Tom Tromey @ 2018-06-01 21:03 UTC (permalink / raw)
  To: Keith Seitz; +Cc: Tom Tromey, gdb-patches

>>>>> "Keith" == Keith Seitz <keiths@redhat.com> writes:

Keith> Just a word of warning: ANOFFSET will assert if PSYMBOL_SECTION is
Keith> -1. [Setting that field isn't added until the last patch.] As a
Keith> result, I am seeing a lot of temporary regressions. I build with -O0,
Keith> so maybe these won't show up during a buildbot test run?

Maybe they would, and anyway it seems like bad form to rely on this
being optimized out.

Since the goal here is just to do some syntax checking maybe there is
another form that could be used, like

(0 ? 0 : (ANOFFSET ((objfile)->section_offsets, ((symbol)->pginfo.section))))

Not sure if that will trigger warnings, but I can find out.

If that doesn't work one idea would be to just drop it from the patch,
since it has done its job already.

Tom

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 5/6] Add validity bits for psymtab high and low fields
  2018-05-03 22:36 ` [RFA 5/6] Add validity bits for psymtab high and low fields Tom Tromey
@ 2018-06-01 21:23   ` Keith Seitz
  2018-06-05 17:25     ` Tom Tromey
  0 siblings, 1 reply; 25+ messages in thread
From: Keith Seitz @ 2018-06-01 21:23 UTC (permalink / raw)
  To: Tom Tromey, gdb-patches

On 05/03/2018 03:36 PM, Tom Tromey wrote:
> Right now some psymtab code checks whether a psymtab's textlow or
> texthigh fields are valid by comparing against 0.
> 
> I imagine this is mildly wrong in the current environment, but once
> psymtabs are relocated dynamically, it will no longer be correct,
> because it will be much more normal to see a psymtab with a textlow of
> zero -- this will just mean it appears at the start of the text
> section.
> 

Also wrong if 0 is a valid address! [as a recent patch* serves to remind]

> This patch introduces validity bits to handle this situation more
> nicely, and changes users of the code to follow.
> 
> ChangeLog
> 2018-05-03  Tom Tromey  <tromey@redhat.com>
> 
> 	* dbxread.c (end_psymtab): Use texthigh_valid and textlow_valid.

Does this line not also qualify for texthigh_valid:

  if (PSYMTAB_TEXTHIGH (pst) == 0 && last_function_name
      && gdbarch_sofun_address_maybe_missing (gdbarch))

?

There's also this line in dbx_read_symtab that might qualify (from case N_SCOPE):

	      valu = nlist.n_value + last_function_start;
	      if (PSYMTAB_TEXTHIGH (pst) == 0 || valu > PSYMTAB_TEXTHIGH (pst))
		SET_PSYMTAB_TEXTHIGH (pst, valu);
	      break;

Also in this function, can textlow_not_set be replaced by textlow_valid? [The same with the textlow_not_set parameter to dbx_end_psymtab?]

> 	* mdebugread.c (parse_partial_symbols): Use textlow_valid.
> 	(psymtab_to_symtab_1): Use texthigh_valid and textlow_valid.
> 	* psympriv.h (struct partial_symtab) <textlow_, texthigh_>: Update
> 	comment.
> 	<textlow_valid, texthigh_valid>: New fields.
> 	(set_psymtab_textlow, set_psymtab_texthigh): New inline functions.
> 	(SET_PSYMTAB_TEXTLOW, SET_PSYMTAB_TEXTHIGH): Redefine.
> 	* xcoffread.c (scan_xcoff_symtab): Use textlow_valid.

Otherwise, this all LGTM (IANAM).

Keith

* https://sourceware.org/ml/gdb-patches/2018-05/msg00325.html

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 2/6] Change representation of psymbol to flush out accessors
  2018-06-01 19:19   ` Keith Seitz
@ 2018-06-04 18:11     ` Tom Tromey
  2018-06-05 19:49       ` Simon Marchi
  0 siblings, 1 reply; 25+ messages in thread
From: Tom Tromey @ 2018-06-04 18:11 UTC (permalink / raw)
  To: Keith Seitz; +Cc: Tom Tromey, gdb-patches

>>>>> "Keith" == Keith Seitz <keiths@redhat.com> writes:

>> +  h = hash_continue (&psymbol->pginfo.name, sizeof (psymbol->pginfo.name), h);

Keith> I realize this is just a renaming of the existing code, but since
Keith> there is an accessor for `name', I think it better to use it (in
Keith> case someone ends up grepping for this).
[...]
Keith> Same here for PSYMBOL_LANGUAGE and PSYMBOL_LINKAGE_NAME?

I've made these changes locally.

Tom

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 4/6] Introduce accessors for psymtab high and low fields
  2018-06-01 20:48   ` Keith Seitz
@ 2018-06-04 18:14     ` Tom Tromey
  0 siblings, 0 replies; 25+ messages in thread
From: Tom Tromey @ 2018-06-04 18:14 UTC (permalink / raw)
  To: Keith Seitz; +Cc: Tom Tromey, gdb-patches

>>>>> "Keith" == Keith Seitz <keiths@redhat.com> writes:

>> * dbxread.c (read_dbx_symtab, end_psymtab, read_ofile_symtab):
>> Update.
>> * mdebugread.c (parse_lines, parse_partial_symbols)
>> (psymtab_to_symtab_1): Update.

Keith> These files still mention ->textlow and/or ->texthigh. Could you
Keith> please adjust the comments accordingly?

I did this.

Tom

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 5/6] Add validity bits for psymtab high and low fields
  2018-06-01 21:23   ` Keith Seitz
@ 2018-06-05 17:25     ` Tom Tromey
  2018-06-05 17:38       ` Keith Seitz
  0 siblings, 1 reply; 25+ messages in thread
From: Tom Tromey @ 2018-06-05 17:25 UTC (permalink / raw)
  To: Keith Seitz; +Cc: Tom Tromey, gdb-patches

>>>>> "Keith" == Keith Seitz <keiths@redhat.com> writes:

>> * dbxread.c (end_psymtab): Use texthigh_valid and textlow_valid.

Keith> Does this line not also qualify for texthigh_valid:
Keith>   if (PSYMTAB_TEXTHIGH (pst) == 0 && last_function_name
Keith>       && gdbarch_sofun_address_maybe_missing (gdbarch))
Keith> ?

This is a bit obscure, and I'm not totally sure it is correct.  The idea
is that this only happens in a pathological case, which we want to
detect.  There is a comment there:

  /* Under Solaris, the N_SO symbols always have a value of 0,
     instead of the usual address of the .o file.  Therefore,
     we have to do some tricks to fill in texthigh and textlow.
..


Also the final patch in this series changes this line to:

  if (PSYMTAB_RAW_TEXTHIGH (pst) == 0 && last_function_name
      && gdbarch_sofun_address_maybe_missing (gdbarch))


Keith> There's also this line in dbx_read_symtab that might qualify (from case N_SCOPE):

Keith> 	      valu = nlist.n_value + last_function_start;
Keith> 	      if (PSYMTAB_TEXTHIGH (pst) == 0 || valu > PSYMTAB_TEXTHIGH (pst))
Keith> 		SET_PSYMTAB_TEXTHIGH (pst, valu);
Keith> 	      break;

This also gets changed to use the RAW_ forms.

Keith> Also in this function, can textlow_not_set be replaced by
Keith> textlow_valid? [The same with the textlow_not_set parameter to
Keith> dbx_end_psymtab?]

I think it is a good idea, but there is one spot setting textlow_not_set
without invoking SET_PSYMTAB_TEXTLOW.  From the N_SO case:

	    prev_textlow_not_set = textlow_not_set;

	    /* A zero value is probably an indication for the SunPRO 3.0
	       compiler.  dbx_end_psymtab explicitly tests for zero, so
	       don't relocate it.  */

	    if (nlist.n_value == 0
		&& gdbarch_sofun_address_maybe_missing (gdbarch))
	      {
		textlow_not_set = 1;
		valu = 0;
	      }
	    else
	      textlow_not_set = 0;

I don't know anything about stabs, so my basic idea in this area was to
make the changes as minimal as possible.

Tom

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 5/6] Add validity bits for psymtab high and low fields
  2018-06-05 17:25     ` Tom Tromey
@ 2018-06-05 17:38       ` Keith Seitz
  0 siblings, 0 replies; 25+ messages in thread
From: Keith Seitz @ 2018-06-05 17:38 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

On 06/05/2018 10:25 AM, Tom Tromey wrote:
>>>>>> "Keith" == Keith Seitz <keiths@redhat.com> writes:
> Also the final patch in this series changes this line to:
> 
>   if (PSYMTAB_RAW_TEXTHIGH (pst) == 0 && last_function_name
>       && gdbarch_sofun_address_maybe_missing (gdbarch))
> 

Sorry, I missed that. In that case, ignore my comment.

> Keith> There's also this line in dbx_read_symtab that might qualify (from case N_SCOPE):
> 
> Keith> 	      valu = nlist.n_value + last_function_start;
> Keith> 	      if (PSYMTAB_TEXTHIGH (pst) == 0 || valu > PSYMTAB_TEXTHIGH (pst))
> Keith> 		SET_PSYMTAB_TEXTHIGH (pst, valu);
> Keith> 	      break;
> 
> This also gets changed to use the RAW_ forms.

Likewise.

> Keith> Also in this function, can textlow_not_set be replaced by
> Keith> textlow_valid? [The same with the textlow_not_set parameter to
> Keith> dbx_end_psymtab?]
> 
> I think it is a good idea, but there is one spot setting textlow_not_set
> without invoking SET_PSYMTAB_TEXTLOW.  From the N_SO case:
> 
> 	    prev_textlow_not_set = textlow_not_set;
> 
> 	    /* A zero value is probably an indication for the SunPRO 3.0
> 	       compiler.  dbx_end_psymtab explicitly tests for zero, so
> 	       don't relocate it.  */
> 
> 	    if (nlist.n_value == 0
> 		&& gdbarch_sofun_address_maybe_missing (gdbarch))
> 	      {
> 		textlow_not_set = 1;
> 		valu = 0;
> 	      }
> 	    else
> 	      textlow_not_set = 0;
> 
> I don't know anything about stabs, so my basic idea in this area was to
> make the changes as minimal as possible.

I should have looked a little more closely at the viability of my suggestion. I agree with you, erring on the side of minimal invasion in "obscure" code is always prudent.

Thank you for the explanations.

Keith

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 1/6] Remove dead code in end_psymtab
  2018-06-01 18:55   ` Keith Seitz
@ 2018-06-05 19:41     ` Simon Marchi
  0 siblings, 0 replies; 25+ messages in thread
From: Simon Marchi @ 2018-06-05 19:41 UTC (permalink / raw)
  To: Keith Seitz; +Cc: Tom Tromey, gdb-patches

On 2018-06-01 14:55, Keith Seitz wrote:
> On 05/03/2018 03:36 PM, Tom Tromey wrote:
>> Normally I would investigate a fix for the code.  However, considering
>> that the code has been this way a long time (since the first import to
>> sourceware) and considering that dbxread.c is not as important any
>> more, I think it's safe to just consider that there's no bug.
> 
> I agree. If it's not tested and the comments aren't clear about what
> problem it is trying to solve, wait for a new bug report. :-)
> 
> IANAMBLGTM*
> 
> Keith
> 
> * "I am not a maintainer, but looks good to me."

Thanks Keith for taking a look.  LGTM too.

Simon

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 2/6] Change representation of psymbol to flush out accessors
  2018-06-04 18:11     ` Tom Tromey
@ 2018-06-05 19:49       ` Simon Marchi
  2018-06-05 22:56         ` Tom Tromey
  0 siblings, 1 reply; 25+ messages in thread
From: Simon Marchi @ 2018-06-05 19:49 UTC (permalink / raw)
  To: Tom Tromey; +Cc: Keith Seitz, gdb-patches

On 2018-06-04 14:11, Tom Tromey wrote:
>>>>>> "Keith" == Keith Seitz <keiths@redhat.com> writes:
> 
>>> +  h = hash_continue (&psymbol->pginfo.name, sizeof 
>>> (psymbol->pginfo.name), h);
> 
> Keith> I realize this is just a renaming of the existing code, but 
> since
> Keith> there is an accessor for `name', I think it better to use it (in
> Keith> case someone ends up grepping for this).
> [...]
> Keith> Same here for PSYMBOL_LANGUAGE and PSYMBOL_LINKAGE_NAME?
> 
> I've made these changes locally.
> 
> Tom

I wanted for a while to convert all these macros to static inline 
functions, it just hasn't been high on the todo list.  Since you're 
adding new code, would you mind making them static inline functions 
instead of macros (if you agree with the idea, of course)?

Simon

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 6/6] Make psymbols and psymtabs independent of the program space
  2018-05-03 22:36 ` [RFA 6/6] Make psymbols and psymtabs independent of the program space Tom Tromey
@ 2018-06-05 20:34   ` Keith Seitz
  0 siblings, 0 replies; 25+ messages in thread
From: Keith Seitz @ 2018-06-05 20:34 UTC (permalink / raw)
  To: Tom Tromey, gdb-patches

On 05/03/2018 03:36 PM, Tom Tromey wrote:
> This patch finally makes partial symbols and partial symtabs
> independent of the program space.
> 

SHAZAM!

I've looked over this patch, and I'd say go for it (warning IANAM), but I would like to bring up one or two general questions that came to mind. [A lot of this stuff is pretty foreign to me, so please pardon my ignorance.]

> diff --git a/gdb/dbxread.c b/gdb/dbxread.c
> index da675abb68..91bc25a87d 100644
> --- a/gdb/dbxread.c
> +++ b/gdb/dbxread.c
> @@ -2296,8 +2281,8 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst)
>  
>    sym_offset = LDSYMOFF (pst);
>    sym_size = LDSYMLEN (pst);
> -  text_offset = PSYMTAB_TEXTLOW (pst);
> -  text_size = PSYMTAB_TEXTHIGH (pst) - PSYMTAB_TEXTLOW (pst);
> +  text_offset = PSYMTAB_TEXTLOW (objfile, pst);
> +  text_size = PSYMTAB_TEXTHIGH (objfile, pst) - PSYMTAB_TEXTLOW (objfile, pst);
>    section_offsets = objfile->section_offsets;

IIUC, text_offset can be computed using the RAW flavors since both macros simply add ANOFFSET (...). [Compilers are probably smart enough to optimize this, so take this with a grain of salt. Or a block of salt lick.]

> diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
> index 3cb0475b3b..f8630de47a 100644
> --- a/gdb/dwarf2read.c
> +++ b/gdb/dwarf2read.c
> @@ -3178,8 +3178,8 @@ create_addrmap_from_index (struct dwarf2_per_objfile *dwarf2_per_objfile,
>  	  continue;
>  	}
>  
> -      lo = gdbarch_adjust_dwarf2_addr (gdbarch, lo + baseaddr);
> -      hi = gdbarch_adjust_dwarf2_addr (gdbarch, hi + baseaddr);
> +      lo = gdbarch_adjust_dwarf2_addr (gdbarch, lo + baseaddr) - baseaddr;
> +      hi = gdbarch_adjust_dwarf2_addr (gdbarch, hi + baseaddr) - baseaddr;
>        addrmap_set_empty (mutable_map, lo, hi - 1,
>  			 dwarf2_per_objfile->get_cu (cu_index));
>      }

I have to admit... The above expressions look odd, but I am completely unfamiliar with gdbarch_adjust_dwarf2_addr. From the description of that function, it seems that this is okay, though.

Keith

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument
  2018-06-01 21:03     ` Tom Tromey
@ 2018-06-05 20:50       ` Simon Marchi
  0 siblings, 0 replies; 25+ messages in thread
From: Simon Marchi @ 2018-06-05 20:50 UTC (permalink / raw)
  To: Tom Tromey; +Cc: Keith Seitz, gdb-patches

On 2018-06-01 17:03, Tom Tromey wrote:
>>>>>> "Keith" == Keith Seitz <keiths@redhat.com> writes:
> 
> Keith> Just a word of warning: ANOFFSET will assert if PSYMBOL_SECTION 
> is
> Keith> -1. [Setting that field isn't added until the last patch.] As a
> Keith> result, I am seeing a lot of temporary regressions. I build with 
> -O0,
> Keith> so maybe these won't show up during a buildbot test run?
> 
> Maybe they would, and anyway it seems like bad form to rely on this
> being optimized out.
> 
> Since the goal here is just to do some syntax checking maybe there is
> another form that could be used, like
> 
> (0 ? 0 : (ANOFFSET ((objfile)->section_offsets, 
> ((symbol)->pginfo.section))))
> 
> Not sure if that will trigger warnings, but I can find out.
> 
> If that doesn't work one idea would be to just drop it from the patch,
> since it has done its job already.
> 
> Tom

Or change these macros to be functions :).  Types will be properly 
checked even though the parameter is unused.

Simon

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 4/6] Introduce accessors for psymtab high and low fields
  2018-05-03 22:36 ` [RFA 4/6] Introduce accessors for psymtab high and low fields Tom Tromey
  2018-06-01 20:48   ` Keith Seitz
@ 2018-06-05 21:03   ` Simon Marchi
  1 sibling, 0 replies; 25+ messages in thread
From: Simon Marchi @ 2018-06-05 21:03 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

On 2018-05-03 18:36, Tom Tromey wrote:
> This introduces accessors for the partial symbol table textlow and
> texthigh fields.  This lets us later arrange to relocate these values
> at their point of use.
> 
> I did this conversion by renaming the fields.  I didn't rename the
> fields back afterward, thinking that on the off chance that someone
> has a patch touching this area, then a merge would helpfully break
> their compile.

Good idea to rename the field.  What do you think of renaming them to 
text_low/text_high instead?  Like in the previous patches, it would be 
nice to make the new accessors functions instead of macros.

Instead of adding "old school" accessors, another choice would have been 
to introduce methods instead and make those fields private.

Simon

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 2/6] Change representation of psymbol to flush out accessors
  2018-06-05 19:49       ` Simon Marchi
@ 2018-06-05 22:56         ` Tom Tromey
  2018-06-05 23:31           ` Simon Marchi
  0 siblings, 1 reply; 25+ messages in thread
From: Tom Tromey @ 2018-06-05 22:56 UTC (permalink / raw)
  To: Simon Marchi; +Cc: Tom Tromey, Keith Seitz, gdb-patches

>>>>> "Simon" == Simon Marchi <simon.marchi@polymtl.ca> writes:

Simon> I wanted for a while to convert all these macros to static inline
Simon> functions, it just hasn't been high on the todo list.  Since you're
Simon> adding new code, would you mind making them static inline functions
Simon> instead of macros (if you agree with the idea, of course)?

How about just getting rid of them entirely and referring to the members
directly?  IMO the macros don't add any value, and I suppose functions
wouldn't really, either, with the exception of one for computing the
address.  This could be the only method.

Tom

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [RFA 2/6] Change representation of psymbol to flush out accessors
  2018-06-05 22:56         ` Tom Tromey
@ 2018-06-05 23:31           ` Simon Marchi
  0 siblings, 0 replies; 25+ messages in thread
From: Simon Marchi @ 2018-06-05 23:31 UTC (permalink / raw)
  To: Tom Tromey; +Cc: Keith Seitz, gdb-patches

On 2018-06-05 18:56, Tom Tromey wrote:
>>>>>> "Simon" == Simon Marchi <simon.marchi@polymtl.ca> writes:
> 
> Simon> I wanted for a while to convert all these macros to static 
> inline
> Simon> functions, it just hasn't been high on the todo list.  Since 
> you're
> Simon> adding new code, would you mind making them static inline 
> functions
> Simon> instead of macros (if you agree with the idea, of course)?
> 
> How about just getting rid of them entirely and referring to the 
> members
> directly?  IMO the macros don't add any value, and I suppose functions
> wouldn't really, either, with the exception of one for computing the
> address.  This could be the only method.
> 
> Tom

I am fine with that too.

Simon

^ permalink raw reply	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2018-06-05 23:31 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-03 22:36 [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
2018-05-03 22:36 ` [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument Tom Tromey
2018-06-01 20:06   ` Keith Seitz
2018-06-01 21:03     ` Tom Tromey
2018-06-05 20:50       ` Simon Marchi
2018-05-03 22:36 ` [RFA 4/6] Introduce accessors for psymtab high and low fields Tom Tromey
2018-06-01 20:48   ` Keith Seitz
2018-06-04 18:14     ` Tom Tromey
2018-06-05 21:03   ` Simon Marchi
2018-05-03 22:36 ` [RFA 1/6] Remove dead code in end_psymtab Tom Tromey
2018-06-01 18:55   ` Keith Seitz
2018-06-05 19:41     ` Simon Marchi
2018-05-03 22:36 ` [RFA 6/6] Make psymbols and psymtabs independent of the program space Tom Tromey
2018-06-05 20:34   ` Keith Seitz
2018-05-03 22:36 ` [RFA 2/6] Change representation of psymbol to flush out accessors Tom Tromey
2018-06-01 19:19   ` Keith Seitz
2018-06-04 18:11     ` Tom Tromey
2018-06-05 19:49       ` Simon Marchi
2018-06-05 22:56         ` Tom Tromey
2018-06-05 23:31           ` Simon Marchi
2018-05-03 22:36 ` [RFA 5/6] Add validity bits for psymtab high and low fields Tom Tromey
2018-06-01 21:23   ` Keith Seitz
2018-06-05 17:25     ` Tom Tromey
2018-06-05 17:38       ` Keith Seitz
2018-05-25 17:58 ` [RFA 0/6] Make psymbols independent of the progspace Tom Tromey

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).