From: Michael Snyder <msnyder@redhat.com>
To: Michael Elizabeth Chastain <mec@shout.net>
Cc: ezannoni@redhat.com, gdb-patches@sources.redhat.com,
jimb@redhat.com, ac131313@redhat.com
Subject: Re: [rfa] save space by using enum bitfields
Date: Mon, 18 Aug 2003 20:50:00 -0000 [thread overview]
Message-ID: <3F413BF4.2070200@redhat.com> (raw)
In-Reply-To: <200308180700.h7I70nAW028032@duracef.shout.net>
I gotta say, this looks like uglification to me. Is it worth it?
Michael Elizabeth Chastain wrote:
>This adds an ENUM_BITFIELD macro to defs.h and uses it in the
>symbol table to save space.
>
>Per Andrew C, this version uses the same macro that gcc 3.3.1, for the
>sake of inter-project consistency. The macro is in defs.h so that
>any structure definition can use it, if they want.
>
>In gcc land, Zack Weinberg originally did an autoconf test, but then he
>ran into platforms where the autoconf test succeeded but the compiler
>generated buggy code. So now gcc does an explicit test on the compiler
>used (gcc version 2 or later). I wrote this patch the same way.
>
>If the compiler does not give us enum bitfields, then we can choose
>between integer bitfields (still save space) or full-width enum
>(chew up space, improve debugability). The gcc code chose the
>former, so I followed it.
>
>Testing: I ran the test suite with gcc v2 and v3, dwarf-2 and stabs+,
>binutils 2.14. I also tested the non-gcc case by putting an "#if 0"
>into the feature 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
> struct symtab 68 64
>
>I also loaded a medium-sized program (a specific version of gdb) with a
>debugging version of libc and measured memory usage at the first command
>prompt with 'ps axu'. Total memory usage dropped from 23420 kilobytes
>to 23280 kilobytes, a savings of 0.6%. Sigh.
>
>Comments?
>
>OK to apply?
>
>Michael C
>
>2003-08-17 Michael Chastain <mec@shout.net>
>
> * 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 -c -3 -p -r1.127 defs.h
>*** defs.h 9 Aug 2003 14:57:30 -0000 1.127
>--- defs.h 17 Aug 2003 23:17:26 -0000
>*************** struct cleanup
>*** 285,290 ****
>--- 285,299 ----
> #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 -c -3 -p -r1.77 symtab.h
>*** symtab.h 22 Jul 2003 15:41:59 -0000 1.77
>--- symtab.h 17 Aug 2003 23:17:28 -0000
>*************** struct blockvector;
>*** 35,51 ****
> 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
>--- 35,40 ----
>*************** struct general_symbol_info
>*** 107,113 ****
> This is used to select one of the fields from the language specific
> union above. */
>
>! enum language language BYTE_BITFIELD;
>
> /* Which section is this symbol in? This is an index into
> section_offsets for this objfile. Negative means that the symbol
>--- 96,102 ----
> This is used to select one of the fields from the language specific
> union above. */
>
>! 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
>*************** struct minimal_symbol
>*** 297,304 ****
> 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;
>
> /* Minimal symbols with the same hash key are kept on a linked
> list. This is the link. */
>--- 286,294 ----
> mst_file_text, /* Static version of mst_text */
> mst_file_data, /* Static version of mst_data */
> mst_file_bss /* Static version of mst_bss */
>! };
>!
>! ENUM_BITFIELD(minimal_symbol_type) type : 8;
>
> /* Minimal symbols with the same hash key are kept on a linked
> list. This is the link. */
>*************** struct minimal_symbol
>*** 321,327 ****
> /* Different name domains for symbols. Looking up a symbol specifies a
> domain and ignores symbol definitions in other name domains. */
>
>! typedef enum
> {
> /* UNDEF_DOMAIN is used when a domain has not been discovered or
> none of the following apply. This usually indicates an error either
>--- 311,317 ----
> /* Different name domains for symbols. Looking up a symbol specifies a
> domain and ignores symbol definitions in other name domains. */
>
>! 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
>*************** struct symbol
>*** 578,588 ****
>
> /* Domain code. */
>
>! domain_enum domain BYTE_BITFIELD;
>
> /* Address class */
>
>! enum address_class aclass BYTE_BITFIELD;
>
> /* Line number of definition. FIXME: Should we really make the assumption
> that nobody will try to debug files longer than 64K lines? What about
>--- 568,578 ----
>
> /* Domain code. */
>
>! ENUM_BITFIELD(domain_enum_tag) domain : 8;
>
> /* Address class */
>
>! ENUM_BITFIELD(address_class) aclass : 8;
>
> /* Line number of definition. FIXME: Should we really make the assumption
> that nobody will try to debug files longer than 64K lines? What about
>*************** struct partial_symbol
>*** 655,665 ****
>
> /* Name space code. */
>
>! domain_enum domain BYTE_BITFIELD;
>
> /* Address class (for info_symbols) */
>
>! enum address_class aclass BYTE_BITFIELD;
>
> };
>
>--- 645,655 ----
>
> /* Name space code. */
>
>! ENUM_BITFIELD(domain_enum_tag) domain : 8;
>
> /* Address class (for info_symbols) */
>
>! ENUM_BITFIELD(address_class) aclass : 8;
>
> };
>
>*************** struct symtab
>*** 775,793 ****
>
> char *dirname;
>
>- /* This component says how to free the data we point to:
>- free_contents => do a tree walk and free each object.
>- free_nothing => do nothing; some other symtab will free
>- the data this one uses.
>- free_linetable => free just the linetable. FIXME: Is this redundant
>- with the primary field? */
>-
>- enum free_code
>- {
>- free_nothing, free_contents, free_linetable
>- }
>- free_code;
>-
> /* A function to call to free space, if necessary. This is IN
> ADDITION to the action indicated by free_code. */
>
>--- 765,770 ----
>*************** struct symtab
>*** 803,811 ****
>
> int *line_charpos;
>
> /* Language of this source file. */
>
>! enum language language;
>
> /* String that identifies the format of the debugging information, such
> as "stabs", "dwarf 1", "dwarf 2", "coff", etc. This is mostly useful
>--- 780,802 ----
>
> int *line_charpos;
>
>+ /* This component says how to free the data we point to:
>+ free_contents => do a tree walk and free each object.
>+ free_nothing => do nothing; some other symtab will free
>+ the data this one uses.
>+ free_linetable => free just the linetable. FIXME: Is this redundant
>+ with the primary field? */
>+
>+ enum free_code
>+ {
>+ free_nothing, free_contents, free_linetable
>+ };
>+
>+ ENUM_BITFIELD(free_code) free_code : 8;
>+
> /* Language of this source file. */
>
>! ENUM_BITFIELD(language) language : 8;
>
> /* String that identifies the format of the debugging information, such
> as "stabs", "dwarf 1", "dwarf 2", "coff", etc. This is mostly useful
>
>
>
next prev parent reply other threads:[~2003-08-18 20:50 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-08-18 7:00 Michael Elizabeth Chastain
2003-08-18 20:50 ` Michael Snyder [this message]
2003-08-18 20:56 ` Daniel Jacobowitz
2003-08-18 21:47 ` Jim Blandy
2003-08-18 21:50 ` David Carlton
2003-08-18 21:53 ` Daniel Jacobowitz
2003-08-18 21:06 ` David Carlton
2003-08-18 22:07 Michael Elizabeth Chastain
2003-08-18 23:02 ` Andrew Cagney
2003-08-18 22:35 Michael Elizabeth Chastain
2003-08-19 19:25 ` Jim Blandy
2003-08-19 19:38 Michael Elizabeth Chastain
2003-08-19 21:57 ` Jim Blandy
2003-08-19 19:42 Michael Elizabeth Chastain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3F413BF4.2070200@redhat.com \
--to=msnyder@redhat.com \
--cc=ac131313@redhat.com \
--cc=ezannoni@redhat.com \
--cc=gdb-patches@sources.redhat.com \
--cc=jimb@redhat.com \
--cc=mec@shout.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox