proposed Opengroup action for c99 command (XCU ERN 76)

Geoff Keating geoffk@geoffk.org
Fri Sep 16 18:29:00 GMT 2005


On 16/09/2005, at 5:12 AM, Joseph S. Myers wrote:

> On Fri, 16 Sep 2005, Geoffrey Keating wrote:
>
>
>> What this means in practise, I think, is that the structure that
>> represents a token, 'struct cpp_token' will grow from 16 bytes to 20
>> bytes, which makes it 2 cache lines rather than 1, and a subsequent
>> memory use increase and compiler performance decrease.  It might be
>> that someone will think of some clever way to avoid this, but I
>> couldn't think of any that would be likely to be a win overall, since
>> a significant proportion of tokens are identifiers.  (I especially
>> didn't like the alternative that required a second hash lookup for
>> every identifier.)
>>
>
> There are plenty of spare bits in cpp_token to flag extended  
> identifiers
> and handle them specially (as a slow path, marked as such with
> __builtin_expect).  There's one bit in the flags byte, two unused  
> bytes
> after it and a whole word not used in the case of identifiers  
> (identifiers
> use a cpp_hashnode * where strings and numbers use a struct cpp_string
> which is bigger) which could store a canonical form of an  
> identifier (or
> could store the noncanonical spelling for the use of the specific  
> places
> which care about the original spelling).

Yes, I think this can be made to work efficiently.

>> Adding salt to the wound, of course, is that for C the only  
>> difference
>> between an (A) or (B) and a (C) implementation is that a (C)
>> implementation is less expressive: there are some programs, all of
>> which are erroneous and require a diagnostic, that can't be written.
>> So you lose compiler performance just so users have another bullet
>> to shoot their feet with.
>>
>
> C++ requires (A)

This is true, but only in the sense that C requires (B).  Either  
language can be supported by any of the three implementations with an  
appropriate phase 1 rule.

> Implementation of (A) could start by a (slow path, if there are  
> extended
> characters present) conversion of the whole input to UCNs, or a more
> efficient conversion that avoids the need to convert within comments.

Although UCNs would be the most convenient form for the preprocessor,  
the backend would like strings to be in UTF-8, to avoid the need for  
conversion when outputting names to the assembler.

> But if any normalisation of UCNs is documented for C++ it does need  
> to be
> documented in the form of transforming UCNs to other UCNs (not to  
> UTF-8).

Yes; but this is not a difficult problem.  For C++, you would just  
say (following my proposed wording) that after they're converted to  
UTF-8, they are converted back to some canonical form of UCN ('the  
version with the most lower-case characters', for instance).  Then,  
when stringifying, you would convert UTF-8 characters in identifiers  
to that canonical UCN.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2410 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc/attachments/20050916/32040c43/attachment.p7s>


More information about the Gcc mailing list