This is the mail archive of the gdb-patches@sources.redhat.com 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]

Re: RFC: allow syms_from_objfile to take a section offset table directly


Here is a new version of this patch, updated to apply to the current
sources.  The meaningful content is just as before.

2002-12-23  Jim Blandy  <jimb@redhat.com>

	* symfile.c: #include "gdb_assert.h".
	(syms_from_objfile): Add the ability to pass in a section offset
	table directly, as an alternative to the section_addr_info table.
	Document arguments better.
	(symbol_file_add): Pass extra arguments to syms_from_objfile.
	* symfile.h (syms_from_objfile): Update declaration.
	* rs6000-nat.c (objfile_symbol_add): Pass new arguments to
	syms_from_objfile.
	* Makefile.in (symfile.o): List dependency on $(gdb_assert_h).

Index: gdb/Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.297
diff -c -r1.297 Makefile.in
*** gdb/Makefile.in	21 Dec 2002 05:07:36 -0000	1.297
--- gdb/Makefile.in	23 Dec 2002 08:38:17 -0000
***************
*** 2247,2253 ****
  	$(gdbcmd_h) $(breakpoint_h) $(language_h) $(complaints_h) \
  	$(demangle_h) $(inferior_h) $(gdb_stabs_h) $(gdb_obstack_h) \
  	$(completer_h) $(bcache_h) $(gdb_string_h) $(gdb_stat_h) $(source_h) \
! 	$(readline_h)
  symm-nat.o: symm-nat.c $(defs_h) $(frame_h) $(inferior_h) $(symtab_h) \
  	$(target_h) $(regcache_h) $(gdb_stat_h) $(gdbcore_h) $(gdbcore_h)
  symm-tdep.o: symm-tdep.c $(defs_h) $(frame_h) $(inferior_h) $(symtab_h) \
--- 2247,2253 ----
  	$(gdbcmd_h) $(breakpoint_h) $(language_h) $(complaints_h) \
  	$(demangle_h) $(inferior_h) $(gdb_stabs_h) $(gdb_obstack_h) \
  	$(completer_h) $(bcache_h) $(gdb_string_h) $(gdb_stat_h) $(source_h) \
! 	$(gdb_assert_h) $(readline_h)
  symm-nat.o: symm-nat.c $(defs_h) $(frame_h) $(inferior_h) $(symtab_h) \
  	$(target_h) $(regcache_h) $(gdb_stat_h) $(gdbcore_h) $(gdbcore_h)
  symm-tdep.o: symm-tdep.c $(defs_h) $(frame_h) $(inferior_h) $(symtab_h) \
Index: gdb/rs6000-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/rs6000-nat.c,v
retrieving revision 1.27
diff -c -r1.27 rs6000-nat.c
*** gdb/rs6000-nat.c	26 Jul 2002 23:12:59 -0000	1.27
--- gdb/rs6000-nat.c	23 Dec 2002 08:38:18 -0000
***************
*** 685,691 ****
  {
    struct objfile *obj = (struct objfile *) arg;
  
!   syms_from_objfile (obj, NULL, 0, 0);
    new_symfile_objfile (obj, 0, 0);
    return 1;
  }
--- 685,691 ----
  {
    struct objfile *obj = (struct objfile *) arg;
  
!   syms_from_objfile (obj, NULL, 0, 0, 0, 0);
    new_symfile_objfile (obj, 0, 0);
    return 1;
  }
Index: gdb/symfile.c
===================================================================
RCS file: /cvs/src/src/gdb/symfile.c,v
retrieving revision 1.75
diff -c -r1.75 symfile.c
*** gdb/symfile.c	9 Dec 2002 00:59:26 -0000	1.75
--- gdb/symfile.c	23 Dec 2002 08:38:20 -0000
***************
*** 43,48 ****
--- 43,49 ----
  #include "completer.h"
  #include "bcache.h"
  #include <readline/readline.h>
+ #include "gdb_assert.h"
  
  #include <sys/types.h>
  #include <fcntl.h>
***************
*** 572,579 ****
  
     OBJFILE is where the symbols are to be read from.
  
!    ADDR is the address where the text segment was loaded, unless the
!    objfile is the main symbol file, in which case it is zero.
  
     MAINLINE is nonzero if this is the main symbol file, or zero if
     it's an extra symbol file such as dynamically loaded code.
--- 573,598 ----
  
     OBJFILE is where the symbols are to be read from.
  
!    ADDRS is the list of section load addresses.  If the user has given
!    an 'add-symbol-file' command, then this is the list of offsets and
!    addresses he or she provided as arguments to the command; or, if
!    we're handling a shared library, these are the actual addresses the
!    sections are loaded at, according to the inferior's dynamic linker
!    (as gleaned by GDB's shared library code).  We convert each address
!    into an offset from the section VMA's as it appears in the object
!    file, and then call the file's sym_offsets function to convert this
!    into a format-specific offset table --- a `struct section_offsets'.
!    If ADDRS is non-zero, OFFSETS must be zero.
! 
!    OFFSETS is a table of section offsets already in the right
!    format-specific representation.  NUM_OFFSETS is the number of
!    elements present in OFFSETS->offsets.  If OFFSETS is non-zero, we
!    assume this is the proper table the call to sym_offsets described
!    above would produce.  Instead of calling sym_offsets, we just dump
!    it right into objfile->section_offsets.  (When we're re-reading
!    symbols from an objfile, we don't have the original load address
!    list any more; all we have is the section offset table.)  If
!    OFFSETS is non-zero, ADDRS must be zero.
  
     MAINLINE is nonzero if this is the main symbol file, or zero if
     it's an extra symbol file such as dynamically loaded code.
***************
*** 582,589 ****
     the symbol reading (and complaints can be more terse about it).  */
  
  void
! syms_from_objfile (struct objfile *objfile, struct section_addr_info *addrs,
! 		   int mainline, int verbo)
  {
    asection *lower_sect;
    asection *sect;
--- 601,612 ----
     the symbol reading (and complaints can be more terse about it).  */
  
  void
! syms_from_objfile (struct objfile *objfile,
!                    struct section_addr_info *addrs,
!                    struct section_offsets *offsets,
!                    int num_offsets,
! 		   int mainline,
!                    int verbo)
  {
    asection *lower_sect;
    asection *sect;
***************
*** 592,607 ****
    struct cleanup *old_chain;
    int i;
  
!   /* If ADDRS is NULL, initialize the local section_addr_info struct and
!      point ADDRS to it.  We now establish the convention that an addr of
!      zero means no load address was specified. */
  
!   if (addrs == NULL)
      {
        memset (&local_addr, 0, sizeof (local_addr));
        addrs = &local_addr;
      }
  
    init_entry_point_info (objfile);
    find_sym_fns (objfile);
  
--- 615,633 ----
    struct cleanup *old_chain;
    int i;
  
!   gdb_assert (! (addrs && offsets));
  
!   /* If ADDRS and OFFSETS are both NULL, put together a dummy address
!      list.  We now establish the convention that an addr of zero means
!      no load address was specified. */
!   if (! addrs && ! offsets)
      {
        memset (&local_addr, 0, sizeof (local_addr));
        addrs = &local_addr;
      }
  
+   /* Now either addrs or offsets is non-zero.  */
+ 
    init_entry_point_info (objfile);
    find_sym_fns (objfile);
  
***************
*** 674,703 ****
   	 this_offset = lower_offset = lower_addr - lower_orig_addr */
  
        /* Calculate offsets for sections. */
!       for (i=0 ; i < MAX_SECTIONS && addrs->other[i].name; i++)
! 	{
! 	  if (addrs->other[i].addr != 0)
!  	    {
!  	      sect = bfd_get_section_by_name (objfile->obfd,
!                                               addrs->other[i].name);
!  	      if (sect)
!  		{
!  		  addrs->other[i].addr
!                     -= bfd_section_vma (objfile->obfd, sect);
!  		  lower_offset = addrs->other[i].addr;
! 		  /* This is the index used by BFD. */
! 		  addrs->other[i].sectindex = sect->index ;
!  		}
!  	      else
! 		{
! 		  warning ("section %s not found in %s", addrs->other[i].name, 
! 			   objfile->name);
! 		  addrs->other[i].addr = 0;
! 		}
!  	    }
!  	  else
!  	    addrs->other[i].addr = lower_offset;
! 	}
      }
  
    /* Initialize symbol reading routines for this objfile, allow complaints to
--- 700,731 ----
   	 this_offset = lower_offset = lower_addr - lower_orig_addr */
  
        /* Calculate offsets for sections. */
!       if (addrs)
!         for (i=0 ; i < MAX_SECTIONS && addrs->other[i].name; i++)
!           {
!             if (addrs->other[i].addr != 0)
!               {
!                 sect = bfd_get_section_by_name (objfile->obfd,
!                                                 addrs->other[i].name);
!                 if (sect)
!                   {
!                     addrs->other[i].addr
!                       -= bfd_section_vma (objfile->obfd, sect);
!                     lower_offset = addrs->other[i].addr;
!                     /* This is the index used by BFD. */
!                     addrs->other[i].sectindex = sect->index ;
!                   }
!                 else
!                   {
!                     warning ("section %s not found in %s",
!                              addrs->other[i].name, 
!                              objfile->name);
!                     addrs->other[i].addr = 0;
!                   }
!               }
!             else
!               addrs->other[i].addr = lower_offset;
!           }
      }
  
    /* Initialize symbol reading routines for this objfile, allow complaints to
***************
*** 707,713 ****
    (*objfile->sf->sym_init) (objfile);
    clear_complaints (&symfile_complaints, 1, verbo);
  
!   (*objfile->sf->sym_offsets) (objfile, addrs);
  
  #ifndef IBM6000_TARGET
    /* This is a SVR4/SunOS specific hack, I think.  In any event, it
--- 735,755 ----
    (*objfile->sf->sym_init) (objfile);
    clear_complaints (&symfile_complaints, 1, verbo);
  
!   if (addrs)
!     (*objfile->sf->sym_offsets) (objfile, addrs);
!   else
!     {
!       size_t size = SIZEOF_N_SECTION_OFFSETS (num_offsets);
! 
!       /* Just copy in the offset table directly as given to us.  */
!       objfile->num_sections = num_offsets;
!       objfile->section_offsets
!         = ((struct section_offsets *)
!            obstack_alloc (&objfile->psymbol_obstack, size));
!       memcpy (objfile->section_offsets, offsets, size);
! 
!       init_objfile_sect_indices (objfile);
!     }
  
  #ifndef IBM6000_TARGET
    /* This is a SVR4/SunOS specific hack, I think.  In any event, it
***************
*** 888,894 ****
  	      gdb_flush (gdb_stdout);
  	    }
  	}
!       syms_from_objfile (objfile, addrs, mainline, from_tty);
      }
  
    /* We now have at least a partial symbol table.  Check to see if the
--- 930,936 ----
  	      gdb_flush (gdb_stdout);
  	    }
  	}
!       syms_from_objfile (objfile, addrs, 0, 0, mainline, from_tty);
      }
  
    /* We now have at least a partial symbol table.  Check to see if the
Index: gdb/symfile.h
===================================================================
RCS file: /cvs/src/src/gdb/symfile.h,v
retrieving revision 1.14
diff -c -r1.14 symfile.h
*** gdb/symfile.h	17 Oct 2002 21:16:12 -0000	1.14
--- gdb/symfile.h	23 Dec 2002 08:38:21 -0000
***************
*** 175,181 ****
  extern void init_entry_point_info (struct objfile *);
  
  extern void
! syms_from_objfile (struct objfile *, struct section_addr_info *, int, int);
  
  extern void new_symfile_objfile (struct objfile *, int, int);
  
--- 175,184 ----
  extern void init_entry_point_info (struct objfile *);
  
  extern void
! syms_from_objfile (struct objfile *,
!                    struct section_addr_info *, 
!                    struct section_offsets *, int,
!                    int, int);
  
  extern void new_symfile_objfile (struct objfile *, int, int);
  


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