From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6758 invoked by alias); 20 Aug 2003 02:50:23 -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 6739 invoked from network); 20 Aug 2003 02:50:22 -0000 Received: from unknown (HELO concert.shout.net) (204.253.184.25) by sources.redhat.com with SMTP; 20 Aug 2003 02:50:22 -0000 Received: from duracef.shout.net (duracef.shout.net [204.253.184.12]) by concert.shout.net (8.12.9/8.12.9) with ESMTP id h7K2oMca013423 for ; Tue, 19 Aug 2003 21:50:22 -0500 Received: from duracef.shout.net (localhost [127.0.0.1]) by duracef.shout.net (8.12.9/8.12.9) with ESMTP id h7K2oMHK029492 for ; Tue, 19 Aug 2003 21:50:22 -0500 Received: (from mec@localhost) by duracef.shout.net (8.12.9/8.12.9/Submit) id h7K2oM6p029491 for gdb-patches@sources.redhat.com; Tue, 19 Aug 2003 22:50:22 -0400 Date: Wed, 20 Aug 2003 02:50:00 -0000 From: Michael Elizabeth Chastain Message-Id: <200308200250.h7K2oM6p029491@duracef.shout.net> To: gdb-patches@sources.redhat.com Subject: [rfa] ENUM_BITFIELD, here it comes again X-SW-Source: 2003-08/txt/msg00331.txt.bz2 Here we go again ... a new version of my ENUM_BITFIELD patch. First the good part: before: 99360768 after: 90001408 This is a medium sized program (a specific build of gdb) along with a debugging version of glibc using "gdb -readnow HEAD-gdb-old". Then I typed 'maint space 1'. The major difference from the previous version is that I hoisted the definition of 'enum minimal_symbol_type' from inside 'struct minimal_symbol' to the top level. This avoids trouble with gcc warnings (gcc 3.3.1) or errors (gcc 3.2-7-rh). Testing: as before, I ran the test suite with gcc v2 and v3, dwarf-2 and stabs+, binutils 2.14. Also, I tested the non-gcc case by putting an "#if 0" into the defs.h test in order to get the non-gcc path. Size reduction (on my vanilla native i686-pc-linux-gnu): struct general_symbol_info 24 20 struct minimal_symbol 44 40 struct symbol 60 48 struct partial_symbol 32 24 Jim B approved an earlier version of this patch, but then I noticed that little enum glitch. Sigh. Okay to commit? Michael C === 2003-08-19 Michael Chastain * defs.h (ENUM_BITFIELD): New macro. * symtab.h (ENUM_BITFIELD): Use it. (BYTE_BITFIELD): Remove old macro, which was already disabled. Index: defs.h =================================================================== RCS file: /cvs/src/src/gdb/defs.h,v retrieving revision 1.127 diff -u -r1.127 defs.h --- defs.h 9 Aug 2003 14:57:30 -0000 1.127 +++ defs.h 19 Aug 2003 18:34:31 -0000 @@ -285,6 +285,15 @@ #endif #endif +/* Be conservative and use enum bitfields only with GCC. + This is copied from gcc 3.3.1, system.h. */ + +#if defined(__GNUC__) && (__GNUC__ >= 2) +#define ENUM_BITFIELD(TYPE) enum TYPE +#else +#define ENUM_BITFIELD(TYPE) unsigned int +#endif + /* Needed for various prototypes */ struct symtab; Index: symtab.h =================================================================== RCS file: /cvs/src/src/gdb/symtab.h,v retrieving revision 1.77 diff -u -r1.77 symtab.h --- symtab.h 22 Jul 2003 15:41:59 -0000 1.77 +++ symtab.h 19 Aug 2003 18:34:33 -0000 @@ -35,17 +35,6 @@ struct axs_value; struct agent_expr; -/* Don't do this; it means that if some .o's are compiled with GNU C - and some are not (easy to do accidentally the way we configure - things; also it is a pain to have to "make clean" every time you - want to switch compilers), then GDB dies a horrible death. */ -/* GNU C supports enums that are bitfields. Some compilers don't. */ -#if 0 && defined(__GNUC__) && !defined(BYTE_BITFIELD) -#define BYTE_BITFIELD :8; -#else -#define BYTE_BITFIELD /*nothing */ -#endif - /* Define a structure for the information that is common to all symbol types, including minimal symbols, partial symbols, and full symbols. In a multilanguage environment, some language specific information may need to @@ -107,7 +96,7 @@ This is used to select one of the fields from the language specific union above. */ - enum language language BYTE_BITFIELD; + ENUM_BITFIELD(language) language : 8; /* Which section is this symbol in? This is an index into section_offsets for this objfile. Negative means that the symbol @@ -227,6 +216,37 @@ #define SYMBOL_MATCHES_NATURAL_NAME(symbol, name) \ (strcmp_iw (SYMBOL_NATURAL_NAME (symbol), (name)) == 0) +/* Classification types for this symbol. These should be taken as "advisory + only", since if gdb can't easily figure out a classification it simply + selects mst_unknown. It may also have to guess when it can't figure out + which is a better match between two types (mst_data versus mst_bss) for + example. Since the minimal symbol info is sometimes derived from the + BFD library's view of a file, we need to live with what information bfd + supplies. */ + +enum minimal_symbol_type +{ + mst_unknown = 0, /* Unknown type, the default */ + mst_text, /* Generally executable instructions */ + mst_data, /* Generally initialized data */ + mst_bss, /* Generally uninitialized data */ + mst_abs, /* Generally absolute (nonrelocatable) */ + /* GDB uses mst_solib_trampoline for the start address of a shared + library trampoline entry. Breakpoints for shared library functions + are put there if the shared library is not yet loaded. + After the shared library is loaded, lookup_minimal_symbol will + prefer the minimal symbol from the shared library (usually + a mst_text symbol) over the mst_solib_trampoline symbol, and the + breakpoints will be moved to their true address in the shared + library via breakpoint_re_set. */ + mst_solib_trampoline, /* Shared library trampoline code */ + /* For the mst_file* types, the names are only guaranteed to be unique + within a given .o file. */ + mst_file_text, /* Static version of mst_text */ + mst_file_data, /* Static version of mst_data */ + mst_file_bss /* Static version of mst_bss */ +}; + /* Define a simple structure used to hold some very basic information about all defined global symbols (text, data, bss, abs, etc). The only required information is the general_symbol_info. @@ -268,37 +288,7 @@ char *filename; #endif - /* Classification types for this symbol. These should be taken as "advisory - only", since if gdb can't easily figure out a classification it simply - selects mst_unknown. It may also have to guess when it can't figure out - which is a better match between two types (mst_data versus mst_bss) for - example. Since the minimal symbol info is sometimes derived from the - BFD library's view of a file, we need to live with what information bfd - supplies. */ - - enum minimal_symbol_type - { - mst_unknown = 0, /* Unknown type, the default */ - mst_text, /* Generally executable instructions */ - mst_data, /* Generally initialized data */ - mst_bss, /* Generally uninitialized data */ - mst_abs, /* Generally absolute (nonrelocatable) */ - /* GDB uses mst_solib_trampoline for the start address of a shared - library trampoline entry. Breakpoints for shared library functions - are put there if the shared library is not yet loaded. - After the shared library is loaded, lookup_minimal_symbol will - prefer the minimal symbol from the shared library (usually - a mst_text symbol) over the mst_solib_trampoline symbol, and the - breakpoints will be moved to their true address in the shared - library via breakpoint_re_set. */ - mst_solib_trampoline, /* Shared library trampoline code */ - /* For the mst_file* types, the names are only guaranteed to be unique - within a given .o file. */ - mst_file_text, /* Static version of mst_text */ - mst_file_data, /* Static version of mst_data */ - mst_file_bss /* Static version of mst_bss */ - } - type BYTE_BITFIELD; + ENUM_BITFIELD(minimal_symbol_type) type : 8; /* Minimal symbols with the same hash key are kept on a linked list. This is the link. */ @@ -321,7 +311,7 @@ /* Different name domains for symbols. Looking up a symbol specifies a domain and ignores symbol definitions in other name domains. */ -typedef enum +typedef enum domain_enum_tag { /* UNDEF_DOMAIN is used when a domain has not been discovered or none of the following apply. This usually indicates an error either @@ -578,11 +568,11 @@ /* Domain code. */ - domain_enum domain BYTE_BITFIELD; + ENUM_BITFIELD(domain_enum_tag) domain : 6; /* Address class */ - enum address_class aclass BYTE_BITFIELD; + ENUM_BITFIELD(address_class) aclass : 6; /* Line number of definition. FIXME: Should we really make the assumption that nobody will try to debug files longer than 64K lines? What about @@ -655,11 +645,11 @@ /* Name space code. */ - domain_enum domain BYTE_BITFIELD; + ENUM_BITFIELD(domain_enum_tag) domain : 6; /* Address class (for info_symbols) */ - enum address_class aclass BYTE_BITFIELD; + ENUM_BITFIELD(address_class) aclass : 6; }; --h7K2nks22828.1061347786/int-mx1.corp.redhat.com--