This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Patch: reduce size of cp_token
- From: Tom Tromey <tromey at redhat dot com>
- To: Gcc Patch List <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 29 Feb 2008 21:12:50 -0700
- Subject: Patch: reduce size of cp_token
- Reply-to: Tom Tromey <tromey at redhat dot com>
My earlier patch to remove input_file_stack also removed a field from
struct cp_token. This made it possible to reduce the size of this
struct.
This patch rearranges cp_token. On my x86 box it now takes 12 bytes
rather than 16. This patch reduces the size of cp_token::type by one
bit, but it also adds a compile-time assertion to ensure that we don't
overflow this. I've also moved the 'location' field earlier to get
better packing on a 64-bit machine, though I did not actually verify
this in action. I also did not try to measure how much memory this
saves.
Bootstrapped & regtested on x86 FC-6. Ok?
Tom
cp/ChangeLog:
2008-02-29 Tom Tromey <tromey@redhat.com>
* parser.c (CP_TOKEN_BITS): New define.
(struct cp_token) <type>: Use it.
(struct cp_token) <ambiguous_p>: Move earlier.
(struct cp_token) <location>: Move earlier.
(cp_token_size_self_check): Declare.
(eof_token): Update.
Index: cp/parser.c
===================================================================
--- cp/parser.c (revision 132775)
+++ cp/parser.c (working copy)
@@ -58,12 +58,20 @@
tree qualifying_scope;
};
-/* A C++ token. */
+/* Number of bits used to represent a token in struct cp_token. */
+#define CP_TOKEN_BITS 7
+/* A C++ token. Note that this is carefully laid out to have the
+ least amount of padding. */
+
typedef struct cp_token GTY (())
{
/* The kind of token. */
- ENUM_BITFIELD (cpp_ttype) type : 8;
+ ENUM_BITFIELD (cpp_ttype) type : CP_TOKEN_BITS;
+ /* True for a CPP_NAME token that is not a keyword (i.e., for which
+ KEYWORD is RID_MAX) iff this name was looked up and found to be
+ ambiguous. An error has already been reported. */
+ BOOL_BITFIELD ambiguous_p : 1;
/* If this token is a keyword, this value indicates which keyword.
Otherwise, this value is RID_MAX. */
ENUM_BITFIELD (rid) keyword : 8;
@@ -75,10 +83,8 @@
BOOL_BITFIELD in_system_header : 1;
/* True if this token is from a context where it is implicitly extern "C" */
BOOL_BITFIELD implicit_extern_c : 1;
- /* True for a CPP_NAME token that is not a keyword (i.e., for which
- KEYWORD is RID_MAX) iff this name was looked up and found to be
- ambiguous. An error has already been reported. */
- BOOL_BITFIELD ambiguous_p : 1;
+ /* The location at which this token was found. */
+ location_t location;
/* The value associated with this token, if any. */
union cp_token_value {
/* Used for CPP_NESTED_NAME_SPECIFIER and CPP_TEMPLATE_ID. */
@@ -86,8 +92,6 @@
/* Use for all other tokens. */
tree GTY((tag ("0"))) value;
} GTY((desc ("(%1.type == CPP_TEMPLATE_ID) || (%1.type == CPP_NESTED_NAME_SPECIFIER)"))) u;
- /* The location at which this token was found. */
- location_t location;
} cp_token;
/* We use a stack of token pointer for saving token sets. */
@@ -97,8 +101,7 @@
static cp_token eof_token =
{
- CPP_EOF, RID_MAX, 0, PRAGMA_NONE, 0, false, 0, { NULL },
- 0
+ CPP_EOF, false, RID_MAX, 0, PRAGMA_NONE, 0, false, 0, { NULL }
};
/* The cp_lexer structure represents the C++ lexer. It is responsible
@@ -246,6 +249,9 @@
/* The number of token types, including C++-specific ones. */
#define N_CP_TTYPES ((int) (CPP_PURGED + 1))
+/* Self-check that we have enough bits reserved in cp_token. */
+extern int cp_token_size_self_check[(N_CP_TTYPES <= (1 << CP_TOKEN_BITS)) ? 1 : -1];
+
/* Variables. */
#ifdef ENABLE_CHECKING