[cfe-commits] r160068 - in /cfe/trunk: include/clang/Frontend/ lib/Frontend/ test/Frontend/ test/Lexer/ test/Modules/ test/Modules/Inputs/Module.framework/Headers/ test/PCH/ test/Preprocessor/ test/SemaCXX/
Andy Gibbs
andyg1001 at hotmail.co.uk
Wed Jul 11 22:41:40 PDT 2012
On Thursday, July 12, 2012 3:48 AM, Jordan Rose wrote:
> On Jul 11, 2012, at 2:56 PM, Andy Gibbs wrote:
>
>> Hi,
>>
>> Firstly, thank you ever so much for all your work getting all these
>> patches
>> through.
>>
>> I had a quick scan through to see what you changed, and it all seemed
>> fine to
>> me, although you could simplify the \r \n algorithm somewhat but this is
>> far
>> from critical. (I'm afraid I come from an embedded background and my
>> mind is
>> unfortunately tuned to spotting reducible branch operations. It is a
>> truly
>> terrible habit! :o)
>
> Yeah, the real code to do this is Lexer::SkipEscapedNewLines, which
> handles
> trigraphs, but then the fast path gets a little slower. I wanted to handle
> the
> really rare case of \r (not \r\n), but maybe that's silly. (The
> bounds-check
> is probably a good "don't crash" sort of thing, though.)
Yes, no harm there. As I said, coming from the embedded world I tend to get
stuck in the mindset of the implicit bounds-checking. Having it explicitly
is
always better where clock cycles are not so critical.
>> The one change I am in two minds about is this:
>>
>>> + if (!C2.empty())
>>> + if (ParseDirective(C2, ED, SM, CommentBegin, PP.getDiagnostics()))
>>> + if (const FileEntry *E =
>>> SM.getFileEntryForID(SM.getFileID(CommentBegin)))
>>> + FilesWithDirectives.insert(E);
>>
>> (This appears in a similar way in an earlier location).
>>
>> Superficially this change makes sense, and in the end once we've
>> eliminated
>> the need for the FilesWithDiagnostics and FilesWithDirectives lists then
>> it
>> is irrelevant. In the meantime, it means that files with directives only
>> inside #if blocks will now always get reparsed at the end of processing
>> and
>> all the directives contained will be exposed.
>>
>> In the case in my patch, if that file at least had a comment outside a
>> skipped
>> #if block, then this file was considered to have been parsed for
>> directives
>> and was not parsed again. Its tenuous and I'm wrestling in my head as to
>> whether the change in behaviour really matters or not...
>
> I was trying to think about the common case here, where we only have /one/
> main
> file, but then it doesn't matter. (Although too many tests run
> with -verify
> just to check that there are no errors...that's probably worth a later
> cleanup.)
>
> In the less common case, my code tries to avoid having to grow the
> SmallPtrSet.
> We have very few test headers with -verify directives in them (11,
> according to
> grep on **/*.h) but quite a few with any comments (80, out of 273 total).
> Your
> code tries to avoid reparses, which are definitely more expensive but are
> quite
> rare. In fact, none of the 11 headers I found actually have directives
> within
> conditionals.
>
> I then searched for files which include non-headers (i.e. files without
> .h)
> using this command:
>
> % grep -le '#include ".*\.c"' test/**/*
>
> and similar for .cpp, .m, and .mm, and didn't find any dangerous cases.
>
> Well, in any case, the presence of comments /without/ any directives seems
> like
> a very weird thing to switch this behavior on. If this were a real
> PPCallbacks
> instance, it would know when #includes are processed, but it isn't.
Yes I agree it is a bit weird, but as you say it was to avoid the expensive
(and
dangerous!) reparse. Fortunately, all of this list business will disappear
in
the final revision to come.
>> Obviously the sooner I can pin down all the exceptions that currently
>> make
>> this post-processing necessary, the better.
>
> Here are the tests that fail for me:
> Clang :: ARCMT/GC-check.m
> Clang :: ARCMT/atautorelease-check.m
> Clang :: ARCMT/check-api.m
> Clang :: ARCMT/checking.m
> Clang :: ARCMT/cxx-checking.mm
> Clang :: ARCMT/no-canceling-bridge-to-bridge-cast.m
> Clang :: ARCMT/nonobjc-to-objc-cast-2.m
> Clang :: Modules/lookup.cpp
> Clang :: Modules/objc-categories.m
>
> The ARCMT checks are because arcmt-test has a filtering diagnostic
> consumer
> which replays the diagnostics later...not sure what the best way to solve
> that
> is. (Perhaps it could /not/ filter for -verify, and the tests would just
> pass
> -w?) The Modules problems seem equivalent to the PCH problems and should
> probably have their checks moved into the main source files.
Well, for the ARCMT checks, test the Part 6 patch -- that should solve
these.
The solution may not be to everyone's liking, so don't commit it yet. I can
work on a better patch over the next day or two (depending on the imminent
arrival of a baby).
For the modules tests, I had something in the works a week ago, but put it
aside to get the first round of patches through. There is good hope
then that it can all be finalised very soon...
>> Anyway, I am very grateful to you for all your patience while I got the
>> patches up to scratch.
>
> And thank you again for writing them in the first place!
> Jordan
No problems! Although it was only the groundwork for some other patches I
have in the pipeline...
Andy
More information about the cfe-commits
mailing list