On Fri, 2016-07-22 at 13:06 +0200, Jakub Jelinek wrote:
> On Fri, Jul 22, 2016 at 12:44:07PM +0200, Marek Polacek wrote:
> > --- gcc/gcc/cp/parser.h
> > +++ gcc/gcc/cp/parser.h
> > @@ -46,7 +46,7 @@ struct GTY (()) cp_token {
> > Otherwise, this value is RID_MAX. */
> > ENUM_BITFIELD (rid) keyword : 8;
> > /* Token flags. */
> > - unsigned char flags;
> > + unsigned short flags;
> > /* True if this token is from a context where it is implicitly
> > extern "C" */
> > BOOL_BITFIELD implicit_extern_c : 1;
> > /* True if an error has already been reported for this token,
> > such as a
>
> I'm afraid this is really bad.
> Right now, there are 8 and 8 bit bitfields, then 8-bit char, 3
> individual
> bits, 5 unused bits and 32-bit int, nicely packed into 64-bit word
> before a
> union with pointer members, and the C++ FE lexes everything first, so
> there
> are possibly millions of tokens in memory.
> Can't you just make it unsigned int flags : 11; instead? Or instead
> reshuffle the cpplib.h flags? E.g. I don't see the C++ FE to use the
> NO_EXPAND flag, so moving it to the upper byte of the short and
> moving the
> new flag to its bit? Perhaps that is even better for now
Would something like this be appropriate, if it bootstraps?
gcc/cp/ChangeLog:
* parser.h (struct cp_token): Add a STATIC_ASSERT on the
size of the struct.
---
gcc/cp/parser.h | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/gcc/cp/parser.h b/gcc/cp/parser.h
index ccbace9..8c1de57 100644
--- a/gcc/cp/parser.h
+++ b/gcc/cp/parser.h
@@ -71,6 +71,15 @@ struct GTY (()) cp_token {
"|| (%1.type == CPP_DECLTYPE)"))) u;
};
+/* The C++ frontend lexes everything first, and keeps the tokens
+ in memory, so there are possibly millions of tokens in memory.
+ Ensure that we don't accidentally grow the structure. */
+STATIC_ASSERT (sizeof (cp_token) ==
+ (2 // "type" and "keyword"
+ + 1 // "flags"
+ + 1 // bitfields
+ + 4 // location_t
+ + sizeof (void *))); // union
/* We use a stack of token pointer for saving token sets. */
typedef struct cp_token *cp_token_position;
--
1.8.5.3