From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8961 invoked by alias); 7 Nov 2003 19:47:44 -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 8954 invoked from network); 7 Nov 2003 19:47:42 -0000 Received: from unknown (HELO concert.shout.net) (204.253.184.25) by sources.redhat.com with SMTP; 7 Nov 2003 19:47:42 -0000 Received: from duracef.shout.net (duracef.shout.net [204.253.184.12]) by concert.shout.net (8.12.10/8.12.10) with ESMTP id hA7JlfXw007827 for ; Fri, 7 Nov 2003 13:47:41 -0600 Received: from duracef.shout.net (localhost [127.0.0.1]) by duracef.shout.net (8.12.10/8.12.9) with ESMTP id hA7Jlffa024486 for ; Fri, 7 Nov 2003 13:47:41 -0600 Received: (from mec@localhost) by duracef.shout.net (8.12.10/8.12.9/Submit) id hA7JlfHv024485 for gdb-patches@sources.redhat.com; Fri, 7 Nov 2003 14:47:41 -0500 Date: Fri, 07 Nov 2003 19:47:00 -0000 From: Michael Elizabeth Chastain Message-Id: <200311071947.hA7JlfHv024485@duracef.shout.net> To: gdb-patches@sources.redhat.com Subject: [rfc] msymbol.size X-SW-Source: 2003-11/txt/msg00124.txt.bz2 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. 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? 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)