From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7723 invoked by alias); 23 Dec 2002 08:46:22 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 7665 invoked from network); 23 Dec 2002 08:46:18 -0000 Received: from unknown (HELO zenia.red-bean.com) (66.244.67.22) by 209.249.29.67 with SMTP; 23 Dec 2002 08:46:18 -0000 Received: from zenia.red-bean.com (localhost.localdomain [127.0.0.1]) by zenia.red-bean.com (8.12.5/8.12.5) with ESMTP id gBN8R75h023944; Mon, 23 Dec 2002 03:27:08 -0500 Received: (from jimb@localhost) by zenia.red-bean.com (8.12.5/8.12.5/Submit) id gBN8R678023940; Mon, 23 Dec 2002 03:27:06 -0500 To: gdb-patches@sources.redhat.com Subject: Re: RFC: allow syms_from_objfile to take a section offset table directly References: <15842.38074.837841.272380@localhost.redhat.com> From: Jim Blandy Date: Mon, 23 Dec 2002 01:22:00 -0000 In-Reply-To: Message-ID: User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2.92 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-12/txt/msg00628.txt.bz2 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 * 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 + #include "gdb_assert.h" #include #include *************** *** 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);