From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29801 invoked by alias); 17 Aug 2008 18:50:32 -0000 Received: (qmail 29793 invoked by uid 22791); 17 Aug 2008 18:50:31 -0000 X-Spam-Check-By: sourceware.org Received: from mx2.redhat.com (HELO mx2.redhat.com) (66.187.237.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sun, 17 Aug 2008 18:49:55 +0000 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id m7HInIAp003708 for ; Sun, 17 Aug 2008 14:49:38 -0400 Received: from opsy.redhat.com (vpn-10-34.bos.redhat.com [10.16.10.34]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m7HIn54W020947; Sun, 17 Aug 2008 14:49:05 -0400 Received: by opsy.redhat.com (Postfix, from userid 500) id DE1343782B7; Sun, 17 Aug 2008 12:49:10 -0600 (MDT) To: gdb-patches@sourceware.org Subject: RFA: shrink main_type From: Tom Tromey Reply-To: tromey@redhat.com X-Attribution: Tom Date: Sun, 17 Aug 2008 18:50:00 -0000 Message-ID: User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-08/txt/msg00464.txt.bz2 This patch shrinks struct main_type 32- and 64-bit machines by shrinking the type_code and flags fields and moving around a couple other fields. On my x86 box, this saves about 1% of memory on "gdb -readnow cc1" -- a few hundred K -- at the cost of slightly increasing gdb's text size. I turned the TYPE_FLAG_* defines into an enum to ensure that we'd get a warning if we ever overflow the 'flags' field. I noticed that the Ada code does not use TYPE_FLAG_* consistently with the rest of gdb (it tests the flags directly rather than using the macros), but I didn't change this. Built & regtested on x86-64. Ok? Tom :ADDPATCH types: 2008-08-17 Tom Tromey * gdbtypes.h (enum type_flag_value): New enum. (TYPE_FLAG_UNSIGNED, TYPE_FLAG_NOSIGN, TYPE_FLAG_STUB, TYPE_FLAG_TARGET_STUB, TYPE_FLAG_STATIC, TYPE_FLAG_CONST, TYPE_FLAG_VOLATILE, TYPE_FLAG_PROTOTYPED, TYPE_FLAG_INCOMPLETE, TYPE_FLAG_CODE_SPACE, TYPE_FLAG_DATA_SPACE, TYPE_FLAG_VARARGS, TYPE_FLAG_VECTOR, TYPE_FLAG_ADDRESS_CLASS_1, TYPE_FLAG_ADDRESS_CLASS_2, TYPE_FLAG_FIXED_INSTANCE, TYPE_FLAG_STUB_SUPPORTED, TYPE_FLAG_NOTTEXT): Now enum constants. (struct main_type) : Now 5 bits. : Move earlier. Now a bit field. : Move earlier. diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 7ef7d67..5948a8d 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -144,26 +144,47 @@ enum type_code #define TYPE_CODE_CLASS TYPE_CODE_STRUCT -/* Some bits for the type's flags word, and macros to test them. */ +/* Some bits for the type's flags word, and macros to test them. See + the bit-testing code, below, for documentation of each constant in + this enum. */ + +enum type_flag_value +{ + TYPE_FLAG_UNSIGNED = (1 << 0), + TYPE_FLAG_NOSIGN = (1 << 1), + TYPE_FLAG_STUB = (1 << 2), + TYPE_FLAG_TARGET_STUB = (1 << 3), + TYPE_FLAG_STATIC = (1 << 4), + TYPE_FLAG_CONST = (1 << 5), + TYPE_FLAG_VOLATILE = (1 << 6), + TYPE_FLAG_PROTOTYPED = (1 << 7), + TYPE_FLAG_INCOMPLETE = (1 << 8), + TYPE_FLAG_CODE_SPACE = (1 << 9), + TYPE_FLAG_DATA_SPACE = (1 << 10), + TYPE_FLAG_VARARGS = (1 << 11), + TYPE_FLAG_VECTOR = (1 << 12), + TYPE_FLAG_ADDRESS_CLASS_1 = (1 << 13), + TYPE_FLAG_ADDRESS_CLASS_2 = (1 << 14), + TYPE_FLAG_FIXED_INSTANCE = (1 << 15), + TYPE_FLAG_STUB_SUPPORTED = (1 << 16), + TYPE_FLAG_NOTTEXT = (1 << 17) +}; /* Unsigned integer type. If this is not set for a TYPE_CODE_INT, the type is signed (unless TYPE_FLAG_NOSIGN (below) is set). */ -#define TYPE_FLAG_UNSIGNED (1 << 0) #define TYPE_UNSIGNED(t) (TYPE_FLAGS (t) & TYPE_FLAG_UNSIGNED) /* No sign for this type. In C++, "char", "signed char", and "unsigned char" are distinct types; so we need an extra flag to indicate the absence of a sign! */ -#define TYPE_FLAG_NOSIGN (1 << 1) #define TYPE_NOSIGN(t) (TYPE_FLAGS (t) & TYPE_FLAG_NOSIGN) /* This appears in a type's flags word if it is a stub type (e.g., if someone referenced a type that wasn't defined in a source file via (struct sir_not_appearing_in_this_film *)). */ -#define TYPE_FLAG_STUB (1 << 2) #define TYPE_STUB(t) (TYPE_FLAGS (t) & TYPE_FLAG_STUB) /* The target type of this type is a stub type, and this type needs to @@ -172,7 +193,6 @@ enum type_code gets set based on the TYPE_LENGTH of the target type. Also, set for TYPE_CODE_TYPEDEF. */ -#define TYPE_FLAG_TARGET_STUB (1 << 3) #define TYPE_TARGET_STUB(t) (TYPE_FLAGS (t) & TYPE_FLAG_TARGET_STUB) /* Static type. If this is set, the corresponding type had @@ -181,21 +201,18 @@ enum type_code * are indicated by other means (bitpos == -1) */ -#define TYPE_FLAG_STATIC (1 << 4) #define TYPE_STATIC(t) (TYPE_FLAGS (t) & TYPE_FLAG_STATIC) /* Constant type. If this is set, the corresponding type has a * const modifier. */ -#define TYPE_FLAG_CONST (1 << 5) #define TYPE_CONST(t) (TYPE_INSTANCE_FLAGS (t) & TYPE_FLAG_CONST) /* Volatile type. If this is set, the corresponding type has a * volatile modifier. */ -#define TYPE_FLAG_VOLATILE (1 << 6) #define TYPE_VOLATILE(t) (TYPE_INSTANCE_FLAGS (t) & TYPE_FLAG_VOLATILE) @@ -203,7 +220,6 @@ enum type_code for function calls in order to tell us if it's necessary to coerce the args, or to just do the standard conversions. This is used with a short field. */ -#define TYPE_FLAG_PROTOTYPED (1 << 7) #define TYPE_PROTOTYPED(t) (TYPE_FLAGS (t) & TYPE_FLAG_PROTOTYPED) /* This flag is used to indicate that processing for this type @@ -214,7 +230,6 @@ enum type_code info; the incomplete type has to be marked so that the class and the method can be assigned correct types.) */ -#define TYPE_FLAG_INCOMPLETE (1 << 8) #define TYPE_INCOMPLETE(t) (TYPE_FLAGS (t) & TYPE_FLAG_INCOMPLETE) /* Instruction-space delimited type. This is for Harvard architectures @@ -236,22 +251,18 @@ enum type_code If neither flag is set, the default space for functions / methods is instruction space, and for data objects is data memory. */ -#define TYPE_FLAG_CODE_SPACE (1 << 9) #define TYPE_CODE_SPACE(t) (TYPE_INSTANCE_FLAGS (t) & TYPE_FLAG_CODE_SPACE) -#define TYPE_FLAG_DATA_SPACE (1 << 10) #define TYPE_DATA_SPACE(t) (TYPE_INSTANCE_FLAGS (t) & TYPE_FLAG_DATA_SPACE) /* FIXME drow/2002-06-03: Only used for methods, but applies as well to functions. */ -#define TYPE_FLAG_VARARGS (1 << 11) #define TYPE_VARARGS(t) (TYPE_FLAGS (t) & TYPE_FLAG_VARARGS) /* Identify a vector type. Gcc is handling this by adding an extra attribute to the array type. We slurp that in as a new flag of a type. This is used only in dwarf2read.c. */ -#define TYPE_FLAG_VECTOR (1 << 12) #define TYPE_VECTOR(t) (TYPE_FLAGS (t) & TYPE_FLAG_VECTOR) /* Address class flags. Some environments provide for pointers whose @@ -259,10 +270,8 @@ enum type_code where the bits are interpreted differently than normal addresses. The TYPE_FLAG_ADDRESS_CLASS_n flags may be used in target specific ways to represent these different types of address classes. */ -#define TYPE_FLAG_ADDRESS_CLASS_1 (1 << 13) #define TYPE_ADDRESS_CLASS_1(t) (TYPE_INSTANCE_FLAGS(t) \ & TYPE_FLAG_ADDRESS_CLASS_1) -#define TYPE_FLAG_ADDRESS_CLASS_2 (1 << 14) #define TYPE_ADDRESS_CLASS_2(t) (TYPE_INSTANCE_FLAGS(t) \ & TYPE_FLAG_ADDRESS_CLASS_2) #define TYPE_FLAG_ADDRESS_CLASS_ALL (TYPE_FLAG_ADDRESS_CLASS_1 \ @@ -279,20 +288,17 @@ enum type_code the necessary run-time information, and does not need further interpretation. Optionally marks ordinary, fixed-size GDB type. */ -#define TYPE_FLAG_FIXED_INSTANCE (1 << 15) /* This debug target supports TYPE_STUB(t). In the unsupported case we have to rely on NFIELDS to be zero etc., see TYPE_IS_OPAQUE (). TYPE_STUB(t) with !TYPE_STUB_SUPPORTED(t) may exist if we only guessed the TYPE_STUB(t) value (see dwarfread.c). */ -#define TYPE_FLAG_STUB_SUPPORTED (1 << 16) #define TYPE_STUB_SUPPORTED(t) (TYPE_FLAGS (t) & TYPE_FLAG_STUB_SUPPORTED) /* Not textual. By default, GDB treats all single byte integers as characters (or elements of strings) unless this flag is set. */ -#define TYPE_FLAG_NOTTEXT (1 << 17) #define TYPE_NOTTEXT(t) (TYPE_FLAGS (t) & TYPE_FLAG_NOTTEXT) /* Array bound type. */ @@ -313,7 +319,7 @@ struct main_type { /* Code for kind of type */ - ENUM_BITFIELD(type_code) code : 8; + ENUM_BITFIELD(type_code) code : 5; /* Array bounds. These fields appear at this location because they pack nicely here. */ @@ -321,6 +327,29 @@ struct main_type ENUM_BITFIELD(array_bound_type) upper_bound_type : 4; ENUM_BITFIELD(array_bound_type) lower_bound_type : 4; + /* Flags about this type. This field appears at this location + because it packs nicely here. */ + + ENUM_BITFIELD(type_flag_value) flags : 18; + + /* Number of fields described for this type. This field appears at + this location because it packs nicely here. */ + + short nfields; + + /* Field number of the virtual function table pointer in + VPTR_BASETYPE. If -1, we were unable to find the virtual + function table pointer in initial symbol reading, and + get_vptr_fieldno should be called to find it if possible. + get_vptr_fieldno will update this field if possible. + Otherwise the value is left at -1. + + Unused if this type does not have virtual functions. + + This field appears at this location because it packs nicely here. */ + + short vptr_fieldno; + /* Name of this type, or NULL if none. This is used for printing only, except by poorly designed C++ code. @@ -364,25 +393,6 @@ struct main_type struct type *target_type; - /* Flags about this type. */ - - int flags; - - /* Number of fields described for this type */ - - short nfields; - - /* Field number of the virtual function table pointer in - VPTR_BASETYPE. If -1, we were unable to find the virtual - function table pointer in initial symbol reading, and - get_vptr_fieldno should be called to find it if possible. - get_vptr_fieldno will update this field if possible. - Otherwise the value is left at -1. - - Unused if this type does not have virtual functions. */ - - short vptr_fieldno; - /* For structure and union types, a description of each field. For set and pascal array types, there is one "field", whose type is the domain type of the set or array.