From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26236 invoked by alias); 7 Nov 2003 20:06:55 -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 26199 invoked from network); 7 Nov 2003 20:06:52 -0000 Received: from unknown (HELO localhost.redhat.com) (66.30.197.194) by sources.redhat.com with SMTP; 7 Nov 2003 20:06:52 -0000 Received: by localhost.redhat.com (Postfix, from userid 469) id 3810A1A42DB; Fri, 7 Nov 2003 15:06:52 -0500 (EST) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16299.64348.145224.689527@localhost.redhat.com> Date: Fri, 07 Nov 2003 20:06:00 -0000 To: Michael Elizabeth Chastain Cc: gdb-patches@sources.redhat.com Subject: Re: [rfc] msymbol.size In-Reply-To: <200311071947.hA7JlfHv024485@duracef.shout.net> References: <200311071947.hA7JlfHv024485@duracef.shout.net> X-SW-Source: 2003-11/txt/msg00126.txt.bz2 Michael Elizabeth Chastain writes: > This is a cleanup patch for MSYMBOL_SIZE. But I need help from > someone with a Solaris machine to test it. > > struct minimal_symbol has this icky field: > > struct minimal_symbol > { > ... > > /* The info field is available for caching machine-specific information > so it doesn't have to rederive the info constantly (over a serial line). > It is initialized to zero and stays that way until target-dependent code > sets it. Storage for any data pointed to by this field should be allo- > cated on the symbol_obstack for the associated objfile. > The type would be "void *" except for reasons of compatibility with older > compilers. This field is optional. > > Currently, the AMD 29000 tdep.c uses it to remember things it has decoded > from the instructions in the function header, and the MIPS-16 code uses > it to identify 16-bit procedures. */ > > char *info; > > ... > }; > > The comment is disconnected from reality. In reality, there are two > uses for msym.info: > > (A) The elf reader stores the size of each minimal symbol into this > field. Later on, the stabs reader reads this size to calculate > the 'texthigh' of a partial symbol table from the address of the > last symbol plus the size of the last symbol. > > (B) Several targets store flag bits into msym.info for their own > internal purposes. > > This patch cleans up (A) by adding a new msym.size field with the > proper data type of unsigned long. > > msym's are not space critical so it's okay to add fields to them. > > In the long run it might be better to calculate psymbol->texthigh > some other way entirely. This patch makes that job easier. > > Another benefit of this patch is that there was only one caller > of prim_record_minimal_symbol_and_info with a non-NULL 'info'. > After this patch there are no such callers. > yeah. I was going to do this today, too! > Testing: I am testing the *-tdep.c patches just by running gdb_mbuild.sh > (in progress). If you grep on MSYMBOL_SIZE you will see that *-tdep.c > never use these values. So if gdb builds, it ought to be fine. > > For the elfread.c and dbxread.c changes, I ran the test suite on > native i686-pc-linux-gnu with gcc 2 and gcc 3, dwarf-2 and stabs+. > Unfortunately, this is not good test coverage, because on this > platform finish_psymtab does not need the logic "address + size > of last symbol". > > Is there anyone with a Solaris machine who can help me? > let me see if I can get at one. elena > Michael C > > === > > 2003-11-07 Michael Chastain > > * symtab.h (struct minimal_symbol): Add size. > * dbxread.c: Use it. > * elfread.c: (record_minimal_symbol_and_info): Do not use info. > Rename to record_minimal_symbol. > (elf_symtab_read): Set MSYMBOL_SIZE explicitly. > * minsyms.c (prim_record_minimal_symbol_and_info): Initialize MSYMBOL_SIZE. > (install_minimal_symbols): Ditto. > * objfiles.c (terminate_minimal_symbol_table): Ditto. > * arm-tdep.c: Delete unused MSYMBOL_SIZE. > * m68hc11-tdep.c: Ditto. > * mips-tdep.c: Ditto. > * sh64-tdep.c: Ditto. > > Index: symtab.h > =================================================================== > RCS file: /cvs/src/src/gdb/symtab.h,v > retrieving revision 1.82 > diff -c -3 -p -r1.82 symtab.h > *** symtab.h 4 Nov 2003 22:22:31 -0000 1.82 > --- symtab.h 7 Nov 2003 17:45:07 -0000 > *************** struct minimal_symbol > *** 325,330 **** > --- 325,336 ---- > > char *info; > > + /* Size of this symbol. end_psymtab in dbxread.c uses this > + information to calculate the end of the partial symtab based on the > + address of the last symbol plus the size of the last symbol. */ > + > + unsigned long size; > + > #ifdef SOFUN_ADDRESS_MAYBE_MISSING > /* Which source file is this symbol in? Only relevant for mst_file_*. */ > char *filename; > *************** struct minimal_symbol > *** 346,351 **** > --- 352,358 ---- > }; > > #define MSYMBOL_INFO(msymbol) (msymbol)->info > + #define MSYMBOL_SIZE(msymbol) (msymbol)->size > #define MSYMBOL_TYPE(msymbol) (msymbol)->type > > > Index: dbxread.c > =================================================================== > RCS file: /cvs/src/src/gdb/dbxread.c,v > retrieving revision 1.58 > diff -c -3 -p -r1.58 dbxread.c > *** dbxread.c 6 Nov 2003 22:54:01 -0000 1.58 > --- dbxread.c 7 Nov 2003 17:45:08 -0000 > *************** > *** 64,77 **** > #include "aout/stab_gnu.h" /* We always use GNU stabs, not native, now */ > > > - /* This macro returns the size field of a minimal symbol, which is normally > - stored in the "info" field. The macro can be overridden for specific > - targets (e.g. MIPS16) that use the info field for other purposes. */ > - #ifndef MSYMBOL_SIZE > - #define MSYMBOL_SIZE(msym) ((long) MSYMBOL_INFO (msym)) > - #endif > - > - > /* We put a pointer to this structure in the read_symtab_private field > of the psymtab. */ > > --- 64,69 ---- > Index: elfread.c > =================================================================== > RCS file: /cvs/src/src/gdb/elfread.c,v > retrieving revision 1.37 > diff -c -3 -p -r1.37 elfread.c > *** elfread.c 6 Nov 2003 02:52:27 -0000 1.37 > --- elfread.c 7 Nov 2003 17:45:08 -0000 > *************** elf_locate_sections (bfd *ignore_abfd, a > *** 105,119 **** > } > > static struct minimal_symbol * > ! record_minimal_symbol_and_info (char *name, CORE_ADDR address, > ! enum minimal_symbol_type ms_type, char *info, /* FIXME, is this really char *? */ > ! asection *bfd_section, struct objfile *objfile) > { > if (ms_type == mst_text || ms_type == mst_file_text) > address = SMASH_TEXT_ADDRESS (address); > > return prim_record_minimal_symbol_and_info > ! (name, address, ms_type, info, bfd_section->index, bfd_section, objfile); > } > > /* > --- 105,119 ---- > } > > static struct minimal_symbol * > ! record_minimal_symbol (char *name, CORE_ADDR address, > ! enum minimal_symbol_type ms_type, > ! asection *bfd_section, struct objfile *objfile) > { > if (ms_type == mst_text || ms_type == mst_file_text) > address = SMASH_TEXT_ADDRESS (address); > > return prim_record_minimal_symbol_and_info > ! (name, address, ms_type, NULL, bfd_section->index, bfd_section, objfile); > } > > /* > *************** elf_symtab_read (struct objfile *objfile > *** 163,169 **** > char *filesymname = obsavestring ("", 0, &objfile->symbol_obstack); > #endif > struct dbx_symfile_info *dbx = objfile->sym_stab_info; > - unsigned long size; > int stripped = (bfd_get_symcount (objfile->obfd) == 0); > > if (dynamic) > --- 163,168 ---- > *************** elf_symtab_read (struct objfile *objfile > *** 223,231 **** > if (symaddr == 0) > continue; > symaddr += offset; > ! msym = record_minimal_symbol_and_info > ((char *) sym->name, symaddr, > ! mst_solib_trampoline, NULL, sym->section, objfile); > #ifdef SOFUN_ADDRESS_MAYBE_MISSING > if (msym != NULL) > msym->filename = filesymname; > --- 222,230 ---- > if (symaddr == 0) > continue; > symaddr += offset; > ! msym = record_minimal_symbol > ((char *) sym->name, symaddr, > ! mst_solib_trampoline, sym->section, objfile); > #ifdef SOFUN_ADDRESS_MAYBE_MISSING > if (msym != NULL) > msym->filename = filesymname; > *************** elf_symtab_read (struct objfile *objfile > *** 436,446 **** > /* ms_type = mst_unknown; */ > continue; /* Skip this symbol. */ > } > ! /* Pass symbol size field in via BFD. FIXME!!! */ > ! size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size; > ! msym = record_minimal_symbol_and_info > ((char *) sym->name, symaddr, > ! ms_type, (void *) size, sym->section, objfile); > #ifdef SOFUN_ADDRESS_MAYBE_MISSING > if (msym != NULL) > msym->filename = filesymname; > --- 435,449 ---- > /* ms_type = mst_unknown; */ > continue; /* Skip this symbol. */ > } > ! msym = record_minimal_symbol > ((char *) sym->name, symaddr, > ! ms_type, sym->section, objfile); > ! if (msym) > ! { > ! /* Pass symbol size field in via BFD. FIXME!!! */ > ! unsigned long size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size; > ! MSYMBOL_SIZE(msym) = size; > ! } > #ifdef SOFUN_ADDRESS_MAYBE_MISSING > if (msym != NULL) > msym->filename = filesymname; > Index: minsyms.c > =================================================================== > RCS file: /cvs/src/src/gdb/minsyms.c,v > retrieving revision 1.37 > diff -c -3 -p -r1.37 minsyms.c > *** minsyms.c 6 Nov 2003 22:54:01 -0000 1.37 > --- minsyms.c 7 Nov 2003 18:04:01 -0000 > *************** prim_record_minimal_symbol_and_info (con > *** 610,615 **** > --- 610,616 ---- > MSYMBOL_TYPE (msymbol) = ms_type; > /* FIXME: This info, if it remains, needs its own field. */ > MSYMBOL_INFO (msymbol) = info; /* FIXME! */ > + MSYMBOL_SIZE (msymbol) = 0; > > /* The hash pointers must be cleared! If they're not, > add_minsym_to_hash_table will NOT add this msymbol to the hash table. */ > *************** install_minimal_symbols (struct objfile > *** 889,894 **** > --- 890,896 ---- > SYMBOL_LINKAGE_NAME (&msymbols[mcount]) = NULL; > SYMBOL_VALUE_ADDRESS (&msymbols[mcount]) = 0; > MSYMBOL_INFO (&msymbols[mcount]) = NULL; > + MSYMBOL_SIZE (&msymbols[mcount]) = 0; > MSYMBOL_TYPE (&msymbols[mcount]) = mst_unknown; > SYMBOL_INIT_LANGUAGE_SPECIFIC (&msymbols[mcount], language_unknown); > > Index: objfiles.c > =================================================================== > RCS file: /cvs/src/src/gdb/objfiles.c,v > retrieving revision 1.40 > diff -c -3 -p -r1.40 objfiles.c > *** objfiles.c 6 Nov 2003 02:52:27 -0000 1.40 > --- objfiles.c 7 Nov 2003 17:45:09 -0000 > *************** terminate_minimal_symbol_table (struct o > *** 386,391 **** > --- 386,392 ---- > DEPRECATED_SYMBOL_NAME (m) = NULL; > SYMBOL_VALUE_ADDRESS (m) = 0; > MSYMBOL_INFO (m) = NULL; > + MSYMBOL_SIZE (m) = 0; > MSYMBOL_TYPE (m) = mst_unknown; > SYMBOL_INIT_LANGUAGE_SPECIFIC (m, language_unknown); > } > Index: arm-tdep.c > =================================================================== > RCS file: /cvs/src/src/gdb/arm-tdep.c,v > retrieving revision 1.154 > diff -c -3 -p -r1.154 arm-tdep.c > *** arm-tdep.c 31 Oct 2003 23:47:17 -0000 1.154 > --- arm-tdep.c 7 Nov 2003 17:45:10 -0000 > *************** static int arm_debug; > *** 81,95 **** > > /* Macros for setting and testing a bit in a minimal symbol that marks > it as Thumb function. The MSB of the minimal symbol's "info" field > ! is used for this purpose. This field is already being used to store > ! the symbol size, so the assumption is that the symbol size cannot > ! exceed 2^31. > > MSYMBOL_SET_SPECIAL Actually sets the "special" bit. > ! MSYMBOL_IS_SPECIAL Tests the "special" bit in a minimal symbol. > ! MSYMBOL_SIZE Returns the size of the minimal symbol, > ! i.e. the "info" field with the "special" bit > ! masked out. */ > > #define MSYMBOL_SET_SPECIAL(msym) \ > MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym)) \ > --- 81,90 ---- > > /* Macros for setting and testing a bit in a minimal symbol that marks > it as Thumb function. The MSB of the minimal symbol's "info" field > ! is used for this purpose. > > MSYMBOL_SET_SPECIAL Actually sets the "special" bit. > ! MSYMBOL_IS_SPECIAL Tests the "special" bit in a minimal symbol. */ > > #define MSYMBOL_SET_SPECIAL(msym) \ > MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym)) \ > *************** static int arm_debug; > *** 97,105 **** > > #define MSYMBOL_IS_SPECIAL(msym) \ > (((long) MSYMBOL_INFO (msym) & 0x80000000) != 0) > - > - #define MSYMBOL_SIZE(msym) \ > - ((long) MSYMBOL_INFO (msym) & 0x7fffffff) > > /* The list of available "set arm ..." and "show arm ..." commands. */ > static struct cmd_list_element *setarmcmdlist = NULL; > --- 92,97 ---- > Index: m68hc11-tdep.c > =================================================================== > RCS file: /cvs/src/src/gdb/m68hc11-tdep.c,v > retrieving revision 1.92 > diff -c -3 -p -r1.92 m68hc11-tdep.c > *** m68hc11-tdep.c 31 Oct 2003 23:47:17 -0000 1.92 > --- m68hc11-tdep.c 7 Nov 2003 17:45:10 -0000 > *************** Foundation, Inc., 59 Temple Place - Suit > *** 50,65 **** > analysis to compute correct stack frame layout. > > The MSB of the minimal symbol's "info" field is used for this purpose. > - This field is already being used to store the symbol size, so the > - assumption is that the symbol size cannot exceed 2^30. > > MSYMBOL_SET_RTC Actually sets the "RTC" bit. > MSYMBOL_SET_RTI Actually sets the "RTI" bit. > MSYMBOL_IS_RTC Tests the "RTC" bit in a minimal symbol. > ! MSYMBOL_IS_RTI Tests the "RTC" bit in a minimal symbol. > ! MSYMBOL_SIZE Returns the size of the minimal symbol, > ! i.e. the "info" field with the "special" bit > ! masked out. */ > > #define MSYMBOL_SET_RTC(msym) \ > MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym)) \ > --- 50,60 ---- > analysis to compute correct stack frame layout. > > The MSB of the minimal symbol's "info" field is used for this purpose. > > MSYMBOL_SET_RTC Actually sets the "RTC" bit. > MSYMBOL_SET_RTI Actually sets the "RTI" bit. > MSYMBOL_IS_RTC Tests the "RTC" bit in a minimal symbol. > ! MSYMBOL_IS_RTI Tests the "RTC" bit in a minimal symbol. */ > > #define MSYMBOL_SET_RTC(msym) \ > MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym)) \ > *************** Foundation, Inc., 59 Temple Place - Suit > *** 74,82 **** > > #define MSYMBOL_IS_RTI(msym) \ > (((long) MSYMBOL_INFO (msym) & 0x40000000) != 0) > - > - #define MSYMBOL_SIZE(msym) \ > - ((long) MSYMBOL_INFO (msym) & 0x3fffffff) > > enum insn_return_kind { > RETURN_RTS, > --- 69,74 ---- > Index: mips-tdep.c > =================================================================== > RCS file: /cvs/src/src/gdb/mips-tdep.c,v > retrieving revision 1.243 > diff -c -3 -p -r1.243 mips-tdep.c > *** mips-tdep.c 6 Nov 2003 02:52:27 -0000 1.243 > --- mips-tdep.c 7 Nov 2003 17:45:11 -0000 > *************** mips_saved_regsize (void) > *** 226,242 **** > > /* Functions for setting and testing a bit in a minimal symbol that > marks it as 16-bit function. The MSB of the minimal symbol's > ! "info" field is used for this purpose. This field is already > ! being used to store the symbol size, so the assumption is > ! that the symbol size cannot exceed 2^31. > > ELF_MAKE_MSYMBOL_SPECIAL tests whether an ELF symbol is "special", > i.e. refers to a 16-bit function, and sets a "special" bit in a > minimal symbol to mark it as a 16-bit function > > ! MSYMBOL_IS_SPECIAL tests the "special" bit in a minimal symbol > ! MSYMBOL_SIZE returns the size of the minimal symbol, i.e. > ! the "info" field with the "special" bit masked out */ > > static void > mips_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym) > --- 226,238 ---- > > /* Functions for setting and testing a bit in a minimal symbol that > marks it as 16-bit function. The MSB of the minimal symbol's > ! "info" field is used for this purpose. > > ELF_MAKE_MSYMBOL_SPECIAL tests whether an ELF symbol is "special", > i.e. refers to a 16-bit function, and sets a "special" bit in a > minimal symbol to mark it as a 16-bit function > > ! MSYMBOL_IS_SPECIAL tests the "special" bit in a minimal symbol */ > > static void > mips_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym) > Index: sh64-tdep.c > =================================================================== > RCS file: /cvs/src/src/gdb/sh64-tdep.c,v > retrieving revision 1.11 > diff -c -3 -p -r1.11 sh64-tdep.c > *** sh64-tdep.c 10 Oct 2003 07:13:11 -0000 1.11 > --- sh64-tdep.c 7 Nov 2003 17:45:11 -0000 > *************** sh_sh64_register_name (int reg_nr) > *** 197,213 **** > > /* Macros and functions for setting and testing a bit in a minimal > symbol that marks it as 32-bit function. The MSB of the minimal > ! symbol's "info" field is used for this purpose. This field is > ! already being used to store the symbol size, so the assumption is > ! that the symbol size cannot exceed 2^31. > > ELF_MAKE_MSYMBOL_SPECIAL > tests whether an ELF symbol is "special", i.e. refers > to a 32-bit function, and sets a "special" bit in a > minimal symbol to mark it as a 32-bit function > ! MSYMBOL_IS_SPECIAL tests the "special" bit in a minimal symbol > ! MSYMBOL_SIZE returns the size of the minimal symbol, i.e. > ! the "info" field with the "special" bit masked out */ > > #define MSYMBOL_IS_SPECIAL(msym) \ > (((long) MSYMBOL_INFO (msym) & 0x80000000) != 0) > --- 197,209 ---- > > /* Macros and functions for setting and testing a bit in a minimal > symbol that marks it as 32-bit function. The MSB of the minimal > ! symbol's "info" field is used for this purpose. > > ELF_MAKE_MSYMBOL_SPECIAL > tests whether an ELF symbol is "special", i.e. refers > to a 32-bit function, and sets a "special" bit in a > minimal symbol to mark it as a 32-bit function > ! MSYMBOL_IS_SPECIAL tests the "special" bit in a minimal symbol */ > > #define MSYMBOL_IS_SPECIAL(msym) \ > (((long) MSYMBOL_INFO (msym) & 0x80000000) != 0)