Re: [rfa] ENUM BITFIELD, here it comes again

Michael Elizabeth Chastain
2003-08-20T16:49:18Z

[Argh, I keep sending to gdb-patches@redhat.com instead of
gdb-patches@sources.redhat.com. My mistake.]

Okay, here is the next round, with the commments edited in symtab.h.

Testing: I rebuilt gdb and it compiles. Since it's just a comment
change, I didn't run the test suite again.

Okay to commit?

If there are more issues in symtab.h, can I commit the defs.h part,
at least?

Michael C

===

2003-08-20 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 -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 -c -3 -p -r1.77 symtab.h
*** symtab.h 22 Jul 2003 15:41:59 -0000 1.77
--- symtab.h 20 Aug 2003 16:34:31 -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
*************** extern char *symbol_demangled_name (stru
*** 227,232 ****
--- 216,252 ----
#define SYMBOL_MATCHES_NATURAL_NAME(symbol, name) \
(strcmp_iw (SYMBOL_NATURAL_NAME (symbol), (name)) == 0)

+ /* Classification types for a minimal 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.
*************** struct minimal_symbol
*** 268,304 ****
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;

/* Minimal symbols with the same hash key are kept on a linked
list. This is the link. */
--- 288,296 ----
char *filename;
#endif

! /* Classification type for this minimal symbol. */

! 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
--- 313,319 ----
/* 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
--- 570,580 ----

/* Domain code. */

! ENUM_BITFIELD(domain_enum_tag) domain : 6;

/* Address class */

! 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
*************** struct partial_symbol
*** 655,665 ****

/* Name space code. */

! domain_enum domain BYTE_BITFIELD;

/* Address class (for info_symbols) */

! enum address_class aclass BYTE_BITFIELD;

};

--- 647,657 ----

/* Name space code. */

! ENUM_BITFIELD(domain_enum_tag) domain : 6;

/* Address class (for info_symbols) */

! ENUM_BITFIELD(address_class) aclass : 6;

};

--h7KGdDs21142.1061397553/int-mx1.corp.redhat.com--