From 3a0fbb3bb368cc59bf6780579d8cedc3c2d604cf Mon Sep 17 00:00:00 2001
From: Jeff Law <law@redhat.com>
Date: Sat, 4 Mar 1995 00:55:45 +0000
Subject: 	* hpread.c (hpread_record_lines): New argument "offset".  All 
 callers changed.  Use it to handle dynamic address relocation. 
 (hpread_build_psymtabs): Adjust texthigh as we read each function 	debug
 symbol.  Fix computation of texthigh. 	(hpread_read_subrange_type): Work
 around macro bugs in HP's 	compilers. 
 (hpread_process_one_debug_symbol): Correctly map source lines.

---
 gdb/ChangeLog |  8 ++++++++
 gdb/hpread.c  | 49 +++++++++++++++++++++++++++++--------------------
 2 files changed, 37 insertions(+), 20 deletions(-)

(limited to 'gdb')

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0ddfcd3..ed7161e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
 Fri Mar  3 15:12:12 1995  Jeff Law  (law@snake.cs.utah.edu)
 
+	* hpread.c (hpread_record_lines): New argument "offset".  All
+	callers changed.  Use it to handle dynamic address relocation.
+	(hpread_build_psymtabs): Adjust texthigh as we read each function
+	debug symbol.  Fix computation of texthigh.
+	(hpread_read_subrange_type): Work around macro bugs in HP's
+	compilers.
+	(hpread_process_one_debug_symbol): Correctly map source lines.
+
 	* somread.c (check_strange_names): Filter names emitted by the HP
 	compiler when generating PIC code.
 
diff --git a/gdb/hpread.c b/gdb/hpread.c
index 099a883..bc8f834 100644
--- a/gdb/hpread.c
+++ b/gdb/hpread.c
@@ -174,7 +174,8 @@ static void hpread_process_one_debug_symbol
 	   struct objfile *, CORE_ADDR, int, char *, int));
 
 static sltpointer hpread_record_lines
-  PARAMS ((struct subfile *, sltpointer, sltpointer, struct objfile *));
+  PARAMS ((struct subfile *, sltpointer, sltpointer,
+	   struct objfile *, CORE_ADDR));
 
 static struct type *hpread_read_function_type
   PARAMS ((dnttpointer, union dnttentry *, struct objfile *));
@@ -448,7 +449,6 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
 
 		if (pst && past_first_source_file)
 		  {
-		    texthigh += ANOFFSET (section_offsets, SECT_OFF_TEXT);
 		    hpread_end_psymtab (pst, psymtab_include_list,
 					includes_used,
 					(hp_symnum
@@ -498,10 +498,12 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
 	    case DNTT_TYPE_ENTRY:
 	      /* The beginning of a function.  DNTT_TYPE_ENTRY may also denote
 		 a secondary entry point.  */
+	      valu = dn_bufp->dfunc.hiaddr + ANOFFSET (section_offsets,
+						       SECT_OFF_TEXT);
+	      if (valu > texthigh)
+		texthigh = valu;
 	      valu = dn_bufp->dfunc.lowaddr +
 		ANOFFSET (section_offsets, SECT_OFF_TEXT);
-	      if (dn_bufp->dfunc.hiaddr > texthigh)
-		texthigh = dn_bufp->dfunc.hiaddr;
 	      SET_NAMESTRING (dn_bufp, &namestring, objfile);
 	      ADD_PSYMBOL_TO_LIST (namestring, strlen (namestring),
 				   VAR_NAMESPACE, LOC_BLOCK,
@@ -515,7 +517,6 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
 		 and file blocks right now.  */
 	      if (dn_bufp->dend.endkind == DNTT_TYPE_MODULE)
 		{
-		  texthigh += ANOFFSET (section_offsets, SECT_OFF_TEXT);
 		  hpread_end_psymtab (pst, psymtab_include_list, includes_used,
 				      (hp_symnum
 				       * sizeof (struct dntt_type_block)),
@@ -1602,8 +1603,9 @@ hpread_read_subrange_type (hp_type, dn_bufp, objfile)
   TYPE_CODE (type) = TYPE_CODE_RANGE;
   TYPE_LENGTH (type) = dn_bufp->dsubr.bitlength / 8;
   TYPE_NFIELDS (type) = 2;
-  TYPE_FIELDS (type) = (struct field *) obstack_alloc
-    (&objfile->type_obstack, 2 * sizeof (struct field));
+  TYPE_FIELDS (type)
+    = (struct field *) obstack_alloc (&objfile->type_obstack,
+				      2 * sizeof (struct field));
 
   if (dn_bufp->dsubr.dyn_low)
     TYPE_FIELD_BITPOS (type, 0) = 0;
@@ -1738,10 +1740,11 @@ hpread_type_lookup (hp_type, objfile)
 }
 
 static sltpointer
-hpread_record_lines (subfile, s_idx, e_idx, objfile)
+hpread_record_lines (subfile, s_idx, e_idx, objfile, offset)
      struct subfile *subfile;
      sltpointer s_idx, e_idx;
      struct objfile *objfile;
+     CORE_ADDR offset;
 {
   union sltentry *sl_bufp;
 
@@ -1751,7 +1754,8 @@ hpread_record_lines (subfile, s_idx, e_idx, objfile)
       /* Only record "normal" entries in the SLT.  */
       if (sl_bufp->snorm.sltdesc == SLT_NORMAL
 	  || sl_bufp->snorm.sltdesc == SLT_EXIT)
-	record_line (subfile, sl_bufp->snorm.line, sl_bufp->snorm.address);
+	record_line (subfile, sl_bufp->snorm.line,
+		     sl_bufp->snorm.address + offset);
       s_idx++;
     }
   return e_idx;
@@ -1808,14 +1812,19 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile,
          finish the symbol table of the previous source file
          (if any) and start accumulating a new symbol table.  */
 
-      valu = text_offset + offset;	/* Relocate for dynamic loading */
+      valu = text_offset;
       if (!last_source_file)
-	start_symtab (name, NULL, valu);
-
-      SL_INDEX (objfile) = hpread_record_lines (current_subfile,
-						SL_INDEX (objfile),
-						dn_bufp->dsfile.address,
-						objfile);
+	{
+	  start_symtab (name, NULL, valu);
+	  SL_INDEX (objfile) = dn_bufp->dsfile.address;
+	}
+      else
+	{
+	  SL_INDEX (objfile) = hpread_record_lines (current_subfile,
+						    SL_INDEX (objfile),
+						    dn_bufp->dsfile.address,
+						    objfile, offset);
+	}
       start_subfile (name, NULL);
       break;
       
@@ -1830,7 +1839,7 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile,
       SL_INDEX (objfile) = hpread_record_lines (current_subfile,
 						SL_INDEX (objfile),
 						dn_bufp->dfunc.address,
-						objfile);
+						objfile, offset);
       
       WITHIN_FUNCTION (objfile) = 1;
       CURRENT_FUNCTION_VALUE (objfile) = valu;
@@ -1858,7 +1867,7 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile,
       SL_INDEX (objfile) = hpread_record_lines (current_subfile,
 						SL_INDEX (objfile),
 						dn_bufp->dbegin.address,
-						objfile);
+						objfile, offset);
       SYMBOL_LINE (sym) = hpread_get_line (dn_bufp->dbegin.address, objfile);
       record_line (current_subfile, SYMBOL_LINE (sym), valu);
       break;
@@ -1868,7 +1877,7 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile,
       SL_INDEX (objfile) = hpread_record_lines (current_subfile,
 						SL_INDEX (objfile),
 						dn_bufp->dbegin.address,
-						objfile);
+						objfile, offset);
       valu = hpread_get_location (dn_bufp->dbegin.address, objfile);
       valu += offset;		/* Relocate for dynamic loading */
       desc = hpread_get_depth (dn_bufp->dbegin.address, objfile);
@@ -1880,7 +1889,7 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile,
       SL_INDEX (objfile) = hpread_record_lines (current_subfile,
 						SL_INDEX (objfile),
 						dn_bufp->dend.address + 1,
-						objfile);
+						objfile, offset);
       switch (dn_bufp->dend.endkind)
 	{
 	case DNTT_TYPE_MODULE:
-- 
cgit v1.1