r265766 - [modules] Add a comment to explain why -E leaves some #includes in the preprocessed output.

Vassil Vassilev via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 18 11:49:59 PDT 2016


On 18/04/16 20:32, Richard Smith wrote:
> On Mon, Apr 18, 2016 at 6:28 AM, Vassil Vassilev 
> <v.g.vassilev at gmail.com <mailto:v.g.vassilev at gmail.com>> wrote:
>
>     On 08/04/16 03:24, Richard Smith via cfe-commits wrote:
>
>         Author: rsmith
>         Date: Thu Apr  7 20:23:59 2016
>         New Revision: 265766
>
>         URL: http://llvm.org/viewvc/llvm-project?rev=265766&view=rev
>         Log:
>         [modules] Add a comment to explain why -E leaves some
>         #includes in the preprocessed output.
>
>         Modified:
>          cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp
>              cfe/trunk/test/Modules/preprocess.cpp
>
>         Modified: cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp
>         URL:
>         http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp?rev=265766&r1=265765&r2=265766&view=diff
>         ==============================================================================
>         --- cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp (original)
>         +++ cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp Thu
>         Apr  7 20:23:59 2016
>         @@ -336,7 +336,9 @@ void PrintPPOutputPPCallbacks::Inclusion
>                 OS << "#include "
>                    << (IsAngled ? '<' : '"')
>                    << FileName
>         -         << (IsAngled ? '>' : '"');
>         +         << (IsAngled ? '>' : '"')
>         +         << " /* clang -E: implicit import for module "
>         +         << Imported->getFullModuleName() << " */";
>
>     It seems that in some cases the FileName needs to be tweaked to be
>     able to compile the output back. For instance:
>     clang -I folder/ file.cxx
>     cat file.cxx
>     #include "subfolder/A.h"
>
>     cat folder/subfolder/A.h
>     #include "B.h"
>
>     B.h resides in folder/subfolder/ and FileName argument would be
>     B.h causing the printer to generate #include "B.h" /* clang -E:
>     implicit import for... */ which cannot be compiled back.
>
>
> Ugh, yeah, that makes sense.
>
> It seems superficially that what we should do for a file found 
> relative to the current file (or in MSVC mode, for a file found 
> relative to a possibly-indirect includer of the current file) is to 
> prepend the path from that file's search path to the current file. 
> That is, if we find "foo/bar.h" in search path "includes/x", and we 
> find "baz/quux.h" relative to bar.h, we should produce the path 
> "foo/baz/quux.h" (to be found relative to "includes/x"). However, that 
> won't work if there is a prior include path that also contains a 
> "foo/baz/quux.h", so we would need to also include the search path in 
> the include path. And *that* won't work if . is not a search path and 
> one of the search paths is a relative path.
:( at first looked like an easy, nice solution, but apparently "twin 
peaks" killer phase is true again :)
>
> I wonder whether the problem is really that we're handling #include 
> search paths incorrectly in the presence of #line markers.
I am not sure I understand this. Could you give an example?
> Perhaps for the relative path search we should somehow instruct clang 
> to look for files relative to the presumed file rather than the 
> physical file?
Could we detect that we are compiling a preprocessed file? I guess there 
are traces, eg. include stack push/pop values...
> That would match our intent for these files. However, this doesn't 
> match the GCC behavior, so we probably can't do it by default. =/

>             }
>               // Since we want a newline after the @import, but not a
>         #<line>, start a new
>               // line immediately.
>
>         Modified: cfe/trunk/test/Modules/preprocess.cpp
>         URL:
>         http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/preprocess.cpp?rev=265766&r1=265765&r2=265766&view=diff
>         ==============================================================================
>         --- cfe/trunk/test/Modules/preprocess.cpp (original)
>         +++ cfe/trunk/test/Modules/preprocess.cpp Thu Apr  7 20:23:59 2016
>         @@ -1,6 +1,6 @@
>           // RUN: rm -rf %t
>           // RUN: %clang_cc1 -fmodules -fimplicit-module-maps
>         -fmodules-cache-path=%t -I %S/Inputs -x c++ -E %s | \
>         -// RUN:   FileCheck -strict-whitespace %s
>         --check-prefix=CHECK --check-prefix=CXX
>         +// RUN:   FileCheck -strict-whitespace %s
>         --check-prefix=CHECK --check-prefix=CXX --check-prefix=CXX-DASHE
>           // RUN: %clang_cc1 -fmodules -fimplicit-module-maps
>         -fmodules-cache-path=%t -I %S/Inputs -x objective-c -E %s | \
>           // RUN:   FileCheck -strict-whitespace %s
>         --check-prefix=CHECK --check-prefix=OBJC
>           // RUN: %clang_cc1 -fmodules -fimplicit-module-maps
>         -fmodules-cache-path=%t -I %S/Inputs -x c++ -E
>         -frewrite-includes %s | \
>         @@ -14,7 +14,9 @@ foo bar baz
>           // The weird {{ }} here is to prevent the -frewrite-includes
>         test from matching its own CHECK lines.
>             // CXX: #include{{ }}"dummy.h"
>         +// CXX-DASHE-SAME: /* clang -E: implicit import for module
>         dummy */
>           // CXX: #include{{ }}"dummy.h"
>         +// CXX-DASHE-SAME: /* clang -E: implicit import for module
>         dummy */
>           // CXX: foo bar baz
>             // OBJC: @import{{ }}dummy; /* clang
>
>
>         _______________________________________________
>         cfe-commits mailing list
>         cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>
>         http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160418/05e65f58/attachment.html>


More information about the cfe-commits mailing list