This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Add validity bits for psymtab high and low fields


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=52948f01e4a11f5fcebdca112036f907ac69e7ad

commit 52948f01e4a11f5fcebdca112036f907ac69e7ad
Author: Tom Tromey <tom@tromey.com>
Date:   Thu May 3 16:36:20 2018 -0600

    Add validity bits for psymtab high and low fields
    
    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.
    
    gdb/ChangeLog
    2018-07-26  Tom Tromey  <tromey@redhat.com>
    
    	* dbxread.c (end_psymtab): Use text_high_valid and
    	text_low_valid.
    	* mdebugread.c (parse_partial_symbols): Use text_low_valid.
    	(psymtab_to_symtab_1): Use text_high_valid and text_low_valid.
    	* psympriv.h (struct partial_symtab) <m_text_low, m_text_high>:
    	Update comment.
    	<text_low_valid, text_high_valid>: New fields.
    	<set_text_low, set_text_high>: Update.
    	* xcoffread.c (scan_xcoff_symtab): Use text_low_valid.

Diff:
---
 gdb/ChangeLog    | 12 ++++++++++++
 gdb/dbxread.c    |  8 +++-----
 gdb/mdebugread.c |  8 ++++----
 gdb/psympriv.h   | 11 ++++++++++-
 gdb/xcoffread.c  |  2 +-
 5 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e6972c2..b4ab4ff 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,15 @@
+2018-07-26  Tom Tromey  <tromey@redhat.com>
+
+	* dbxread.c (end_psymtab): Use text_high_valid and
+	text_low_valid.
+	* mdebugread.c (parse_partial_symbols): Use text_low_valid.
+	(psymtab_to_symtab_1): Use text_high_valid and text_low_valid.
+	* psympriv.h (struct partial_symtab) <m_text_low, m_text_high>:
+	Update comment.
+	<text_low_valid, text_high_valid>: New fields.
+	<set_text_low, set_text_high>: Update.
+	* xcoffread.c (scan_xcoff_symtab): Use text_low_valid.
+
 2018-07-26  Tom Tromey  <tom@tromey.com>
 
 	* dbxread.c (read_dbx_symtab, end_psymtab, read_ofile_symtab):
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index d5d4e08..5409a72 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -2002,7 +2002,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->text_high () == 0 && last_function_name
+  if (!pst->text_high_valid && last_function_name
       && gdbarch_sofun_address_maybe_missing (gdbarch))
     {
       int n;
@@ -2047,13 +2047,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 (p1->text_high () == 0 && p1->text_low () != 0
-	    && p1 != pst)
+	if (!p1->text_high_valid && p1->text_low_valid && p1 != pst)
 	  p1->set_text_high (pst->text_low ());
       }
     }
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index 262c619..436ef95 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -2736,7 +2736,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
 			  /* Kludge for Irix 5.2 zero fh->adr.  */
 			  if (!relocatable
-			      && (pst->text_low () == 0
+			      && (!pst->text_low_valid
 				  || procaddr < pst->text_low ()))
 			    pst->set_text_low (procaddr);
 			  if (high > pst->text_high ())
@@ -3512,7 +3512,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
 		  /* Kludge for Irix 5.2 zero fh->adr.  */
 		  if (!relocatable
-		      && (pst->text_low () == 0
+		      && (!pst->text_low_valid
 			  || procaddr < pst->text_low ()))
 		    pst->set_text_low (procaddr);
 
@@ -3711,7 +3711,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
          other cases.  */
       save_pst = fdr_to_pst[f_idx].pst;
       if (save_pst != NULL
-	  && save_pst->text_low () != 0
+	  && save_pst->text_low_valid
 	  && !(objfile->flags & OBJF_REORDERED))
 	{
 	  ALL_OBJFILE_PSYMTABS (objfile, pst)
@@ -3922,7 +3922,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->text_low () == 0 && pst->text_high () == 0)
+      && !pst->text_low_valid && !pst->text_high_valid)
     return;
 
   /* Now read the symbols for this symtab.  */
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 7116a1a..b3bda82 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -114,12 +114,14 @@ struct partial_symtab
   void set_text_low (CORE_ADDR addr)
   {
     m_text_low = addr;
+    text_low_valid = 1;
   }
 
   /* Set the hight text address of this partial_symtab.  */
   void set_text_high (CORE_ADDR addr)
   {
     m_text_high = addr;
+    text_high_valid = 1;
   }
 
 
@@ -144,7 +146,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
-     accessors.  */
+     accessors.  The validity of these fields is determined by the
+     text_low_valid and text_high_valid fields; these are located later
+     in this structure for better packing.  */
 
   CORE_ADDR m_text_low;
   CORE_ADDR m_text_high;
@@ -230,6 +234,11 @@ struct partial_symtab
 
   ENUM_BITFIELD (psymtab_search_status) searched_flag : 2;
 
+  /* Validity of the m_text_low and m_text_high fields.  */
+
+  unsigned int text_low_valid : 1;
+  unsigned int text_high_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.  */
 
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 1aa2e52..7ca4b3e 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2344,7 +2344,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 
 			if (highval > pst->text_high ())
 			  pst->set_text_high (highval);
-			if (pst->text_low () == 0
+			if (!pst->text_low_valid
 			    || symbol.n_value < pst->text_low ())
 			  pst->set_text_low (symbol.n_value);
 		      }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]