* config/powerpc/tm-ppc-aix4.h, config/rs6000/tm-rs6000-aix4.h
authorPeter Schauer <Peter.Schauer@mytum.de>
Sat, 19 Apr 1997 08:52:17 +0000 (08:52 +0000)
committerPeter Schauer <Peter.Schauer@mytum.de>
Sat, 19 Apr 1997 08:52:17 +0000 (08:52 +0000)
(DONT_RELOCATE_SYMFILE_OBJFILE):  Removed.
* xcoffsolib.h (struct vmap):  Add new members tvma, toffs and dvma,
remove tadj.
* exec.c (bfdsec_to_vmap):  Initialize new vmap members, initialize
tstart and dstart with section VMA.
* rs6000-nat.c (vmap_symtab):  Relocate relative to the VMA in the
object file.
(vmap_ldinfo, xcoff_relocate_core):  Adjust tstart by section offset
of the text section, remove DONT_RELOCATE_SYMFILE_OBJFILE hack.
(vmap_exec):  Relocate relative to the VMA in the object file,
relocate .bss section as well.
(xcoff_relocate_core):  No longer adjust section addresses by VMA.
* rs6000-tdep.c (find_toc_address):  Change type of tocbase
to CORE_ADDR.
* xcoffread.c (secnum_to_bfd_section):  New routine to get
BFD section from CS section number.
(scan_xcoff_symtab):  Make toc_offset section relative.

* symtab.c (total_number_of_methods):  Avoid core dump if
baseclass type is still undefined.

gdb/ChangeLog
gdb/rs6000-nat.c
gdb/rs6000-tdep.c
gdb/symtab.c
gdb/xcoffread.c
gdb/xcoffsolib.h

index 7400b9401db37007f6eead6e06c621e99e332fa3..d96171bf979b05d774dcb8be889d3db60f1d878b 100644 (file)
@@ -1,3 +1,27 @@
+Sat Apr 19 01:49:37 1997  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
+
+       * config/powerpc/tm-ppc-aix4.h, config/rs6000/tm-rs6000-aix4.h
+       (DONT_RELOCATE_SYMFILE_OBJFILE):  Removed.
+       * xcoffsolib.h (struct vmap):  Add new members tvma, toffs and dvma,
+       remove tadj.
+       * exec.c (bfdsec_to_vmap):  Initialize new vmap members, initialize
+       tstart and dstart with section VMA.
+       * rs6000-nat.c (vmap_symtab):  Relocate relative to the VMA in the
+       object file.
+       (vmap_ldinfo, xcoff_relocate_core):  Adjust tstart by section offset
+       of the text section, remove DONT_RELOCATE_SYMFILE_OBJFILE hack.
+       (vmap_exec):  Relocate relative to the VMA in the object file,
+       relocate .bss section as well.
+       (xcoff_relocate_core):  No longer adjust section addresses by VMA.
+       * rs6000-tdep.c (find_toc_address):  Change type of tocbase
+       to CORE_ADDR.
+       * xcoffread.c (secnum_to_bfd_section):  New routine to get
+       BFD section from CS section number.
+       (scan_xcoff_symtab):  Make toc_offset section relative.
+
+       * symtab.c (total_number_of_methods):  Avoid core dump if
+       baseclass type is still undefined.
+
 Fri Apr 18 17:25:10 1997  Stu Grossman  (grossman@critters.cygnus.com)
 
        * Makefile.in (SUBDIRS):  Add mswin so that make cleanup cleans up
index 38944c0f727aab6c32465f49c3fb967c38c6edf7..73110558664bb095e56563f76f17203296d62dd3 100644 (file)
@@ -1,5 +1,5 @@
 /* IBM RS/6000 native-dependent code for GDB, the GNU debugger.
-   Copyright 1986, 1987, 1989, 1991, 1992, 1994, 1995, 1996
+   Copyright 1986, 1987, 1989, 1991, 1992, 1994, 1995, 1996, 1997
             Free Software Foundation, Inc.
 
 This file is part of GDB.
@@ -316,9 +316,6 @@ vmap_symtab (vp)
      register struct vmap *vp;
 {
   register struct objfile *objfile;
-  CORE_ADDR text_delta;
-  CORE_ADDR data_delta;
-  CORE_ADDR bss_delta;
   struct section_offsets *new_offsets;
   int i;
   
@@ -340,17 +337,11 @@ vmap_symtab (vp)
   for (i = 0; i < objfile->num_sections; ++i)
     ANOFFSET (new_offsets, i) = ANOFFSET (objfile->section_offsets, i);
   
-  text_delta =
-    vp->tstart - ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
-  ANOFFSET (new_offsets, SECT_OFF_TEXT) = vp->tstart;
-
-  data_delta =
-    vp->dstart - ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
-  ANOFFSET (new_offsets, SECT_OFF_DATA) = vp->dstart;
-  
-  bss_delta =
-    vp->dstart - ANOFFSET (objfile->section_offsets, SECT_OFF_BSS);
-  ANOFFSET (new_offsets, SECT_OFF_BSS) = vp->dstart;
+  /* The symbols in the object file are linked to the VMA of the section,
+     relocate them VMA relative.  */
+  ANOFFSET (new_offsets, SECT_OFF_TEXT) = vp->tstart - vp->tvma;
+  ANOFFSET (new_offsets, SECT_OFF_DATA) = vp->dstart - vp->dvma;
+  ANOFFSET (new_offsets, SECT_OFF_BSS) = vp->dstart - vp->dvma;
 
   objfile_relocate (objfile, new_offsets);
 }
@@ -520,26 +511,16 @@ vmap_ldinfo (ldi)
        vp->dstart = (CORE_ADDR) ldi->ldinfo_dataorg;
        vp->dend   = vp->dstart + ldi->ldinfo_datasize;
 
-       if (vp->tadj)
-         {
-           vp->tstart += vp->tadj;
-           vp->tend   += vp->tadj;
-         }
+       /* The run time loader maps the file header in addition to the text
+          section and returns a pointer to the header in ldinfo_textorg.
+          Adjust the text start address to point to the real start address
+          of the text section.  */
+       vp->tstart += vp->toffs;
 
        /* The objfile is only NULL for the exec file.  */
        if (vp->objfile == NULL)
          got_exec_file = 1;
 
-#ifdef DONT_RELOCATE_SYMFILE_OBJFILE
-       if (vp->objfile == symfile_objfile
-           || vp->objfile == NULL)
-         {
-           ldi->ldinfo_dataorg = 0;
-           vp->dstart = (CORE_ADDR) 0;
-           vp->dend = ldi->ldinfo_datasize;
-         }
-#endif
-
        /* relocate symbol table(s). */
        vmap_symtab (vp);
 
@@ -604,13 +585,18 @@ vmap_exec ()
     {
       if (STREQ(".text", exec_ops.to_sections[i].the_bfd_section->name))
        {
-         exec_ops.to_sections[i].addr += vmap->tstart;
-         exec_ops.to_sections[i].endaddr += vmap->tstart;
+         exec_ops.to_sections[i].addr += vmap->tstart - vmap->tvma;
+         exec_ops.to_sections[i].endaddr += vmap->tstart - vmap->tvma;
        }
       else if (STREQ(".data", exec_ops.to_sections[i].the_bfd_section->name))
        {
-         exec_ops.to_sections[i].addr += vmap->dstart;
-         exec_ops.to_sections[i].endaddr += vmap->dstart;
+         exec_ops.to_sections[i].addr += vmap->dstart - vmap->dvma;
+         exec_ops.to_sections[i].endaddr += vmap->dstart - vmap->dvma;
+       }
+      else if (STREQ(".bss", exec_ops.to_sections[i].the_bfd_section->name))
+       {
+         exec_ops.to_sections[i].addr += vmap->dstart - vmap->dvma;
+         exec_ops.to_sections[i].endaddr += vmap->dstart - vmap->dvma;
        }
     }
 }
@@ -747,19 +733,11 @@ xcoff_relocate_core (target)
       vp->dstart = (CORE_ADDR) ldip->ldinfo_dataorg;
       vp->dend = vp->dstart + ldip->ldinfo_datasize;
 
-#ifdef DONT_RELOCATE_SYMFILE_OBJFILE
-      if (vp == vmap)
-       {
-         vp->dstart = (CORE_ADDR) 0;
-         vp->dend = ldip->ldinfo_datasize;
-       }
-#endif
-
-      if (vp->tadj != 0)
-       {
-         vp->tstart += vp->tadj;
-         vp->tend += vp->tadj;
-       }
+      /* The run time loader maps the file header in addition to the text
+        section and returns a pointer to the header in ldinfo_textorg.
+        Adjust the text start address to point to the real start address
+        of the text section.  */
+      vp->tstart += vp->toffs;
 
       /* Unless this is the exec file,
         add our sections to the section table for the core target.  */
@@ -789,22 +767,16 @@ xcoff_relocate_core (target)
            }
          stp = target->to_sections_end - 2;
 
-         /* "Why do we add bfd_section_vma?", I hear you cry.
-            Well, the start of the section in the file is actually
-            that far into the section as the struct vmap understands it.
-            So for text sections, bfd_section_vma tends to be 0x200,
-            and if vp->tstart is 0xd0002000, then the first byte of
-            the text section on disk corresponds to address 0xd0002200.  */
          stp->bfd = vp->bfd;
          stp->the_bfd_section = bfd_get_section_by_name (stp->bfd, ".text");
-         stp->addr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->tstart;
-         stp->endaddr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->tend;
+         stp->addr = vp->tstart;
+         stp->endaddr = vp->tend;
          stp++;
          
          stp->bfd = vp->bfd;
          stp->the_bfd_section = bfd_get_section_by_name (stp->bfd, ".data");
-         stp->addr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->dstart;
-         stp->endaddr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->dend;
+         stp->addr = vp->dstart;
+         stp->endaddr = vp->dend;
        }
 
       vmap_symtab (vp);
index ea7be55ac04433e62e3ff784685913d66e262742..5b616f5605a605512a0da06b1ba5d6c709b3ede7 100644 (file)
@@ -1,5 +1,5 @@
 /* Target-dependent code for GDB, the GNU debugger.
-   Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996
+   Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997
    Free Software Foundation, Inc.
 
 This file is part of GDB.
@@ -1228,7 +1228,8 @@ static CORE_ADDR
 find_toc_address (pc)
      CORE_ADDR pc;
 {
-  int ii, toc_entry, tocbase = 0;
+  int ii, toc_entry;
+  CORE_ADDR tocbase = 0;
 
   toc_entry = -1;
   for (ii=0; ii < loadinfotextindex; ++ii)
index 654098e6529083d1894dc8d0ba6a897470c2a3d8..61bbe28b50cfcf09c447b291eb7428babe81411f 100644 (file)
@@ -358,11 +358,19 @@ gdb_mangle_name (type, i, j)
 }
 
 \f
-/* Find which partial symtab on contains PC.  Return 0 if none.  */
+
+struct symbol         * fixup_symbol_section  PARAMS ((struct symbol  *,
+                                                      struct objfile *));
+struct partial_symbol * fixup_psymbol_section PARAMS ((struct partial_symbol *,
+                                                      struct objfile *));
+
+
+/* Find which partial symtab on contains PC and SECTION.  Return 0 if none.  */
 
 struct partial_symtab *
-find_pc_psymtab (pc)
-     register CORE_ADDR pc;
+find_pc_sect_psymtab (pc, section)
+     CORE_ADDR pc;
+     asection *section;
 {
   register struct partial_symtab *pst;
   register struct objfile *objfile;
@@ -378,10 +386,11 @@ find_pc_psymtab (pc)
             many partial symbol tables containing the PC, but
             we want the partial symbol table that contains the
             function containing the PC.  */
-         if (!(objfile->flags & OBJF_REORDERED))
+         if (!(objfile->flags & OBJF_REORDERED) &&
+             section == 0)     /* can't validate section this way */
            return (pst);
 
-         msymbol = lookup_minimal_symbol_by_pc (pc);
+         msymbol = lookup_minimal_symbol_by_pc_section (pc, section);
          if (msymbol == NULL)
            return (pst);
 
@@ -391,7 +400,7 @@ find_pc_psymtab (pc)
                {
                  struct partial_symbol *p;
 
-                 p = find_pc_psymbol (tpst, pc);
+                 p = find_pc_sect_psymbol (tpst, pc, section);
                  if (p != NULL
                      && SYMBOL_VALUE_ADDRESS(p)
                         == SYMBOL_VALUE_ADDRESS (msymbol))
@@ -404,18 +413,30 @@ find_pc_psymtab (pc)
   return (NULL);
 }
 
-/* Find which partial symbol within a psymtab contains PC.  Return 0
-   if none.  Check all psymtabs if PSYMTAB is 0.  */
+/* Find which partial symtab contains PC.  Return 0 if none. 
+   Backward compatibility, no section */
+
+struct partial_symtab *
+find_pc_psymtab (pc)
+     CORE_ADDR pc;
+{
+  return find_pc_sect_psymtab (pc, find_pc_mapped_section (pc));
+}
+
+/* Find which partial symbol within a psymtab matches PC and SECTION.  
+   Return 0 if none.  Check all psymtabs if PSYMTAB is 0.  */
+
 struct partial_symbol *
-find_pc_psymbol (psymtab, pc)
+find_pc_sect_psymbol (psymtab, pc, section)
      struct partial_symtab *psymtab;
      CORE_ADDR pc;
+     asection *section;
 {
   struct partial_symbol *best = NULL, *p, **pp;
   CORE_ADDR best_pc;
   
   if (!psymtab)
-    psymtab = find_pc_psymtab (pc);
+    psymtab = find_pc_sect_psymtab (pc, section);
   if (!psymtab)
     return 0;
 
@@ -435,6 +456,12 @@ find_pc_psymbol (psymtab, pc)
          && pc >= SYMBOL_VALUE_ADDRESS (p)
          && SYMBOL_VALUE_ADDRESS (p) > best_pc)
        {
+         if (section)  /* match on a specific section */
+           {
+             fixup_psymbol_section (p, psymtab->objfile);
+             if (SYMBOL_BFD_SECTION (p) != section)
+               continue;
+           }
          best_pc = SYMBOL_VALUE_ADDRESS (p);
          best = p;
        }
@@ -450,6 +477,12 @@ find_pc_psymbol (psymtab, pc)
          && pc >= SYMBOL_VALUE_ADDRESS (p)
          && SYMBOL_VALUE_ADDRESS (p) > best_pc)
        {
+         if (section)  /* match on a specific section */
+           {
+             fixup_psymbol_section (p, psymtab->objfile);
+             if (SYMBOL_BFD_SECTION (p) != section)
+               continue;
+           }
          best_pc = SYMBOL_VALUE_ADDRESS (p);
          best = p;
        }
@@ -459,13 +492,33 @@ find_pc_psymbol (psymtab, pc)
   return best;
 }
 
+/* Find which partial symbol within a psymtab matches PC.  Return 0 if none.  
+   Check all psymtabs if PSYMTAB is 0.  Backwards compatibility, no section. */
+
+struct partial_symbol *
+find_pc_psymbol (psymtab, pc)
+     struct partial_symtab *psymtab;
+     CORE_ADDR pc;
+{
+  return find_pc_sect_psymbol (psymtab, pc, find_pc_mapped_section (pc));
+}
+\f
 /* Debug symbols usually don't have section information.  We need to dig that
    out of the minimal symbols and stash that in the debug symbol.  */
 
-static
-struct symbol * fixup_symbol_section PARAMS ((struct symbol *sym,
-                                             struct objfile *objfile));
-static struct symbol *
+static void
+fixup_section (ginfo, objfile)
+     struct general_symbol_info *ginfo;
+     struct objfile *objfile;
+{
+  struct minimal_symbol *msym;
+  msym = lookup_minimal_symbol (ginfo->name, NULL, objfile);
+
+  if (msym)
+    ginfo->bfd_section = SYMBOL_BFD_SECTION (msym);
+}
+
+struct symbol *
 fixup_symbol_section (sym, objfile)
      struct symbol *sym;
      struct objfile *objfile;
@@ -478,15 +531,29 @@ fixup_symbol_section (sym, objfile)
   if (SYMBOL_BFD_SECTION (sym))
     return sym;
 
-  msym = lookup_minimal_symbol (SYMBOL_NAME (sym), NULL, objfile);
-
-  if (msym)
-    SYMBOL_BFD_SECTION (sym) = SYMBOL_BFD_SECTION (msym);
+  fixup_section (&sym->ginfo, objfile);
 
   return sym;
 }
 
-\f
+struct partial_symbol *
+fixup_psymbol_section (psym, objfile)
+     struct partial_symbol *psym;
+     struct objfile *objfile;
+{
+  struct minimal_symbol *msym;
+
+  if (!psym)
+    return NULL;
+
+  if (SYMBOL_BFD_SECTION (psym))
+    return psym;
+
+  fixup_section (&psym->ginfo, objfile);
+
+  return psym;
+}
+
 /* Find the definition for a specified symbol name NAME
    in namespace NAMESPACE, visible from lexical block BLOCK.
    Returns the struct symbol pointer, or zero if no symbol is found.
@@ -626,7 +693,8 @@ found:
       msymbol = lookup_minimal_symbol (name, NULL, NULL);
       if (msymbol != NULL)
        {
-         s = find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol));
+         s = find_pc_sect_symtab (SYMBOL_VALUE_ADDRESS (msymbol),
+                                 SYMBOL_BFD_SECTION (msymbol));
          if (s != NULL)
            {
              /* This is a function which has a symtab for its address.  */
@@ -665,10 +733,8 @@ found:
            {
              /* This is a mangled variable, look it up by its
                 mangled name.  */
-             return fixup_symbol_section
-               (lookup_symbol (SYMBOL_NAME (msymbol), block,
-                               namespace, is_a_field_of_this, symtab),
-                NULL);
+             return lookup_symbol (SYMBOL_NAME (msymbol), block, 
+                                   namespace, is_a_field_of_this, symtab);
            }
          /* There are no debug symbols for this file, or we are looking
             for an unmangled variable.
@@ -989,12 +1055,13 @@ block_function (bl)
   return BLOCK_FUNCTION (bl);
 }
 
-/* Find the symtab associated with PC.  Look through the psymtabs and read in
-   another symtab if necessary. */
+/* Find the symtab associated with PC and SECTION.  Look through the
+   psymtabs and read in another symtab if necessary. */
 
 struct symtab *
-find_pc_symtab (pc)
-     register CORE_ADDR pc;
+find_pc_sect_symtab (pc, section)
+     CORE_ADDR pc;
+     asection *section;
 {
   register struct block *b;
   struct blockvector *bv;
@@ -1031,14 +1098,27 @@ find_pc_symtab (pc)
          /* For an objfile that has its functions reordered,
             find_pc_psymtab will find the proper partial symbol table
             and we simply return its corresponding symtab.  */
+         /* In order to better support objfiles that contain both
+            stabs and coff debugging info, we continue on if a psymtab
+            can't be found. */
          if ((objfile->flags & OBJF_REORDERED) && objfile->psymtabs)
            {
-             ps = find_pc_psymtab (pc);
+             ps = find_pc_sect_psymtab (pc, section);
              if (ps)
-               s = PSYMTAB_TO_SYMTAB (ps);
-             else
-               s = NULL;
-             return (s);
+               return PSYMTAB_TO_SYMTAB (ps);
+           }
+         if (section != 0)
+           {
+             int i;
+
+             for (i = 0; i < b->nsyms; i++)
+               {
+                 fixup_symbol_section (b->sym[i], objfile);
+                 if (section == SYMBOL_BFD_SECTION (b->sym[i]))
+                   break;
+               }
+             if (i >= b->nsyms)
+               continue;       /* no symbol in this symtab matches section */
            }
          distance = BLOCK_END (b) - BLOCK_START (b);
          best_s = s;
@@ -1049,7 +1129,7 @@ find_pc_symtab (pc)
     return(best_s);
 
   s = NULL;
-  ps = find_pc_psymtab (pc);
+  ps = find_pc_sect_psymtab (pc, section);
   if (ps)
     {
       if (ps->readin)
@@ -1064,6 +1144,17 @@ find_pc_symtab (pc)
     }
   return (s);
 }
+
+/* Find the symtab associated with PC.  Look through the psymtabs and
+   read in another symtab if necessary.  Backward compatibility, no section */
+
+struct symtab *
+find_pc_symtab (pc)
+     CORE_ADDR pc;
+{
+  return find_pc_sect_symtab (pc, find_pc_mapped_section (pc));
+}
+
 \f
 #if 0
 
@@ -1145,7 +1236,7 @@ find_addr_symbol (addr, symtabp, symaddrp)
 }
 #endif /* 0 */
 
-/* Find the source file and line number for a given PC value.
+/* Find the source file and line number for a given PC value and section.
    Return a structure containing a symtab pointer, a line number,
    and a pc range for the entire source line.
    The value's .pc field is NOT the specified pc.
@@ -1163,8 +1254,9 @@ find_addr_symbol (addr, symtabp, symaddrp)
 /* If it's worth the effort, we could be using a binary search.  */
 
 struct symtab_and_line
-find_pc_line (pc, notcurrent)
+find_pc_sect_line (pc, section, notcurrent)
      CORE_ADDR pc;
+     struct sec *section;
      int notcurrent;
 {
   struct symtab *s;
@@ -1201,10 +1293,10 @@ find_pc_line (pc, notcurrent)
 
   INIT_SAL (&val);     /* initialize to zeroes */
 
-  if (notcurrent) 
+  if (notcurrent)
     pc -= 1;
 
-  s = find_pc_symtab (pc);
+  s = find_pc_sect_symtab (pc, section);
   if (!s)
     {
       val.pc = pc;
@@ -1304,8 +1396,25 @@ find_pc_line (pc, notcurrent)
       else
        val.end = BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
     }
+  val.section = section;
   return val;
 }
+
+/* Backward compatibility (no section) */
+
+struct symtab_and_line
+find_pc_line (pc, notcurrent)
+     CORE_ADDR pc;
+     int notcurrent;
+{
+  asection     *section;
+
+  section = find_pc_overlay (pc);
+  if (pc_in_unmapped_range (pc, section))
+    pc = overlay_mapped_address (pc, section);
+  return find_pc_sect_line (pc, section, notcurrent);
+}
+
 \f
 static int find_line_symtab PARAMS ((struct symtab *, int, struct linetable **,
                                     int *, int *));
@@ -1449,7 +1558,7 @@ find_line_pc_range (sal, startptr, endptr)
      This also insures that we never give a range like "starts at 0x134
      and ends at 0x12c".  */
 
-  found_sal = find_pc_line (startaddr, 0);
+  found_sal = find_pc_sect_line (startaddr, sal.section, 0);
   if (found_sal.line != sal.line)
     {
       /* The specified line (sal) has zero bytes.  */
@@ -1545,12 +1654,23 @@ find_function_start_sal (sym, funfirstline)
   struct symtab_and_line sal;
 
   pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
+  fixup_symbol_section (sym, NULL);
   if (funfirstline)
-    {
+    { /* skip "first line" of function (which is actually its prologue) */
+      asection *section = SYMBOL_BFD_SECTION (sym);
+      /* If function is in an unmapped overlay, use its unmapped LMA
+        address, so that SKIP_PROLOGUE has something unique to work on */
+      if (section_is_overlay (section) &&
+         !section_is_mapped (section))
+       pc = overlay_unmapped_address (pc, section);
+
       pc += FUNCTION_START_OFFSET;
       SKIP_PROLOGUE (pc);
+
+      /* For overlays, map pc back into its mapped VMA range */
+      pc = overlay_mapped_address (pc, section);
     }
-  sal = find_pc_line (pc, 0);
+  sal = find_pc_sect_line (pc, SYMBOL_BFD_SECTION (sym), 0);
 
 #ifdef PROLOGUE_FIRSTLINE_OVERLAP
   /* Convex: no need to suppress code on first line, if any */
@@ -1565,7 +1685,7 @@ find_function_start_sal (sym, funfirstline)
       /* First pc of next line */
       pc = sal.end;
       /* Recalculate the line number (might not be N+1).  */
-      sal = find_pc_line (pc, 0);
+      sal = find_pc_sect_line (pc, SYMBOL_BFD_SECTION (sym), 0);
     }
   sal.pc = pc;
 #endif
@@ -1673,6 +1793,8 @@ total_number_of_methods (type)
   int count;
 
   CHECK_TYPEDEF (type);
+  if (TYPE_CPLUS_SPECIFIC (type) == NULL)
+    return 0;
   count = TYPE_NFN_FIELDS_TOTAL (type);
 
   for (n = 0; n < TYPE_N_BASECLASSES (type); n++)
@@ -1941,7 +2063,6 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
        xmalloc (sizeof (struct symtab_and_line));
       values.nelts = 1;
       values.sals[0] = find_pc_line (pc, 0);
-      values.sals[0].pc = pc;
       return values;
     }
 
@@ -2076,7 +2197,8 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
 
                  if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK)
                    {
-                     values.sals = (struct symtab_and_line *)xmalloc (sizeof (struct symtab_and_line));
+                     values.sals = (struct symtab_and_line *)
+                       xmalloc (sizeof (struct symtab_and_line));
                      values.nelts = 1;
                      values.sals[0] = find_function_start_sal (sym,
                                                                funfirstline);
@@ -2214,7 +2336,8 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
        s = default_symtab;
       val.symtab = s;
       val.pc = 0;
-      values.sals = (struct symtab_and_line *)xmalloc (sizeof (struct symtab_and_line));
+      values.sals = (struct symtab_and_line *)
+       xmalloc (sizeof (struct symtab_and_line));
       values.sals[0] = val;
       values.nelts = 1;
       if (need_canonical)
@@ -2295,7 +2418,8 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
       if (SYMBOL_CLASS (sym) == LOC_BLOCK)
        {
          /* Arg is the name of a function */
-         values.sals = (struct symtab_and_line *)xmalloc (sizeof (struct symtab_and_line));
+         values.sals = (struct symtab_and_line *)
+           xmalloc (sizeof (struct symtab_and_line));
          values.sals[0] = find_function_start_sal (sym, funfirstline);
          values.nelts = 1;
 
@@ -2342,7 +2466,8 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
   msymbol = lookup_minimal_symbol (copy, NULL, NULL);
   if (msymbol != NULL)
     {
-      val.pc = SYMBOL_VALUE_ADDRESS (msymbol);
+      val.pc      = SYMBOL_VALUE_ADDRESS (msymbol);
+      val.section = SYMBOL_BFD_SECTION (msymbol);
       if (funfirstline)
        {
          val.pc += FUNCTION_START_OFFSET;
@@ -2399,8 +2524,10 @@ decode_line_2 (sym_arr, nelts, funfirstline, canonical)
   struct cleanup *old_chain;
   char **canonical_arr = (char **)NULL;
 
-  values.sals = (struct symtab_and_line *) alloca (nelts * sizeof(struct symtab_and_line));
-  return_values.sals = (struct symtab_and_line *) xmalloc (nelts * sizeof(struct symtab_and_line));
+  values.sals = (struct symtab_and_line *) 
+    alloca (nelts * sizeof(struct symtab_and_line));
+  return_values.sals = (struct symtab_and_line *) 
+    xmalloc (nelts * sizeof(struct symtab_and_line));
   old_chain = make_cleanup (free, return_values.sals);
 
   if (canonical)
@@ -3292,7 +3419,7 @@ make_symbol_completion_list (text, word)
    between the first instruction of a function, and the first executable line.
    Returns 1 if PC *might* be in prologue, 0 if definately *not* in prologue.
 
-   If non-zero, func_start is where we thing the prologue starts, possibly
+   If non-zero, func_start is where we think the prologue starts, possibly
    by previous examination of symbol table information.
  */
 
index 89df7dfa0c119175366edc26e05a71361ebaf66a..49814c3800de50d6bd771c4ec735ee45a5e94099 100644 (file)
@@ -1,5 +1,5 @@
 /* Read AIX xcoff symbol tables and convert to internal format, for GDB.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
+   Copyright 1986, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 1997
             Free Software Foundation, Inc.
    Derived from coffread.c, dbxread.c, and a lot of hacking.
    Contributed by IBM Corporation.
@@ -272,10 +272,12 @@ process_linenos PARAMS ((CORE_ADDR, CORE_ADDR));
 /* Translate from a COFF section number (target_index) to a SECT_OFF_*
    code.  */
 static int secnum_to_section PARAMS ((int, struct objfile *));
+static asection * secnum_to_bfd_section PARAMS ((int, struct objfile *));
 
 struct find_targ_sec_arg {
   int targ_index;
   int *resultp;
+  asection **bfd_sect;
 };
 
 static void find_targ_sec PARAMS ((bfd *, asection *, void *));
@@ -295,6 +297,7 @@ static void find_targ_sec (abfd, sect, obj)
        *args->resultp = SECT_OFF_DATA;
       else
        *args->resultp = SECT_OFF_BSS;
+      *args->bfd_sect = sect;
     }
 }
 
@@ -305,12 +308,30 @@ secnum_to_section (secnum, objfile)
      struct objfile *objfile;
 {
   int off = SECT_OFF_TEXT;
+  asection *sect = NULL;
   struct find_targ_sec_arg args;
   args.targ_index = secnum;
   args.resultp = &off;
+  args.bfd_sect = &sect;
   bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
   return off;
 }
+
+/* Return the BFD section that CS points to.  */
+static asection *
+secnum_to_bfd_section (secnum, objfile)
+     int secnum;
+     struct objfile *objfile;
+{
+  int off = SECT_OFF_TEXT;
+  asection *sect = NULL;
+  struct find_targ_sec_arg args;
+  args.targ_index = secnum;
+  args.resultp = &off;
+  args.bfd_sect = &sect;
+  bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
+  return sect;
+}
 \f
 /* add a given stab string into given stab vector. */
 
@@ -2195,12 +2216,13 @@ scan_xcoff_symtab (section_offsets, objfile)
      struct section_offsets *section_offsets;
      struct objfile *objfile;
 {
-  int toc_offset = 0;          /* toc offset value in data section. */
+  CORE_ADDR toc_offset = 0;            /* toc offset value in data section. */
   char *filestring = NULL;
 
   char *namestring;
   int past_first_source_file = 0;
   bfd *abfd;
+  asection *bfd_sect;
   unsigned int nsyms;
 
   /* Current partial symtab */
@@ -2363,6 +2385,11 @@ scan_xcoff_symtab (section_offsets, objfile)
                    if (toc_offset)
                      warning ("More than one XMC_TC0 symbol found.");
                    toc_offset = symbol.n_value;
+
+                   /* Make TOC offset relative to start address of section.  */
+                   bfd_sect = secnum_to_bfd_section (symbol.n_scnum, objfile);
+                   if (bfd_sect)
+                     toc_offset -= bfd_section_vma (objfile->obfd, bfd_sect);
                    break;
 
                  case XMC_TC:
index 2b75d22fecdce5eda41b3901cb750c61a9908111..6ef98cbd49eb5b55a4b63a21ad337d39e4fdd864 100644 (file)
@@ -1,5 +1,5 @@
 /* Data structures for RS/6000 shared libraries, for GDB.
-   Copyright 1991, 1992, 1994 Free Software Foundation, Inc.
+   Copyright 1991, 1992, 1994, 1997 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -32,9 +32,11 @@ struct vmap {
   char *member;                /* ptr to member name                   */
   CORE_ADDR tstart;    /* virtual addr where member is mapped  */
   CORE_ADDR tend;      /* virtual upper bound of member        */
-  CORE_ADDR tadj;      /* heuristically derived adjustment     */
+  CORE_ADDR tvma;      /* virtual addr of text section in object file */
+  CORE_ADDR toffs;     /* offset of text section in object file */
   CORE_ADDR dstart;    /* virtual address of data start        */
-  CORE_ADDR dend;      /* vitrual address of data end          */
+  CORE_ADDR dend;      /* virtual address of data end          */
+  CORE_ADDR dvma;      /* virtual addr of data section in object file */
 
   /* This is NULL for the exec-file.  */
   struct objfile *objfile;