r198942 - Remove unexpected code completion handling from ConsumeToken()
Sean Silva
silvas at purdue.edu
Fri Jan 10 15:11:23 PST 2014
On Fri, Jan 10, 2014 at 2:35 PM, Alp Toker <alp at nuanti.com> wrote:
>
> On 10/01/2014 20:50, Sean Silva wrote:
>
>
>>
>>
>> On Fri, Jan 10, 2014 at 7:37 AM, Alp Toker <alp at nuanti.com <mailto:
>> alp at nuanti.com>> wrote:
>>
>> Author: alp
>> Date: Fri Jan 10 08:37:02 2014
>> New Revision: 198942
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=198942&view=rev
>> Log:
>> Remove unexpected code completion handling from ConsumeToken()
>>
>> With this change tok::code_completion is finally handled
>> exclusively as a
>> special token kind like other tokens that need special treatment.
>>
>> All callers have been updated to use the specific token
>> consumption methods and
>> the parser has a clear idea the current token isn't special by the
>> time
>> ConsumeToken() gets called, so this has been unreachable for some
>> time.
>>
>> ConsumeAnyToken() behaviour is unchanged and will continue to support
>> unexpected code completion as part of the special token path.
>>
>> This survived an amount of fuzzing and validation, but please ping
>> the list if
>> you hit a code path that previously relied on the old unexpected
>> handler and
>> now asserts.
>>
>> Modified:
>> cfe/trunk/include/clang/Parse/Parser.h
>>
>> Modified: cfe/trunk/include/clang/Parse/Parser.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
>> clang/Parse/Parser.h?rev=198942&r1=198941&r2=198942&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/include/clang/Parse/Parser.h (original)
>> +++ cfe/trunk/include/clang/Parse/Parser.h Fri Jan 10 08:37:02 2014
>> @@ -273,16 +273,12 @@ public:
>> bool ParseTopLevelDecl(DeclGroupPtrTy &Result);
>>
>> /// ConsumeToken - Consume the current 'peek token' and lex the
>> next one.
>> - /// This does not work with all kinds of tokens: strings and
>> specific other
>> - /// tokens must be consumed with custom methods below. This
>> returns the
>> - /// location of the consumed token.
>> + /// This does not work with special tokens: string literals,
>> code completion
>> + /// and balanced tokens must be handled using the specific
>> consume methods.
>> + /// Returns the location of the consumed token.
>> SourceLocation ConsumeToken() {
>> assert(!isTokenSpecial() &&
>> "Should consume special tokens with Consume*Token");
>> -
>> - if (LLVM_UNLIKELY(Tok.is(tok::code_completion)))
>> - return handleUnexpectedCodeCompletionToken();
>>
>>
>> Is there some central place where we can mark tok::code_completion as
>> unlikely?
>>
>
> The unexpected code completion tokens that used to end up here are checked
> for precisely now, so the parser will efficiently reach code completion in
> every case without needing to get as far as ConsumeToken().
>
> The checks themselves are of the form Tok.is(tok::code_completion) or
> otherwise exist in switch statements. Perhaps try an LLVM_UNLIKELY() in
> Tok.is() / Tok.isNot()? Not sure if it'd add value -- there are plenty of
> other equally unlikely tokens like tok::eof after all.
>
> To venture a guess, the next lowest hanging fruit might rather be
> ConsumeAnyToken() which has to test and branch for various kinds of special
> token kinds and gets called in tight loops. I don't have numbers and it's
> never showed up on profiles so I'd be still be cautious to spend too much
> time micro-optimizing there.
>
Ok. Sounds like these code sequences will be a good fit for the upcoming
PGO work.
-- Sean Silva
>
> Alp.
>
>
>
>
>> -- Sean Silva
>>
>> -
>> PrevTokLocation = Tok.getLocation();
>> PP.Lex(Tok);
>> return PrevTokLocation;
>> @@ -329,7 +325,7 @@ private:
>> /// isTokenSpecial - True if this token requires special
>> consumption methods.
>> bool isTokenSpecial() const {
>> return isTokenStringLiteral() || isTokenParen() ||
>> isTokenBracket() ||
>> - isTokenBrace();
>> + isTokenBrace() || Tok.is(tok::code_completion);
>> }
>>
>> /// \brief Returns true if the current token is '=' or is a
>> type of '='.
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu <mailto:cfe-commits at cs.uiuc.edu>
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>>
>>
> --
> http://www.nuanti.com
> the browser experts
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140110/1133c350/attachment.html>
More information about the cfe-commits
mailing list