On 18/04/16 21:06, Richard Smith wrote:
On Mon, Apr 18, 2016 at 11:49 AM, Vassil Vassilev
<v.g.vassi...@gmail.com <mailto:v.g.vassi...@gmail.com>> wrote:
On 18/04/16 20:32, Richard Smith wrote:
On Mon, Apr 18, 2016 at 6:28 AM, Vassil Vassilev
<v.g.vassi...@gmail.com <mailto:v.g.vassi...@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?
Suppose we have:
foo/bar.h:
#include "baz.h"
foo/baz.h:
// ...
foo/module.modulemap
textual header "bar.h"
module Baz { header "baz.h" }
foo.cc:
#include "foo/bar.h"
We currently produce a preprocessed source file like this:
# 1 "foo/bar.h"
#include "baz.h"
This is, in some sense, "correct" -- the #include line from
"foo/bar.h" did say "baz.h". But we'll look for "baz.h" relative to
the current preprocessed source file, not relative to "foo/bar.h".
We could change the preprocessor so that in the above case it searches
relative to "foo/" instead, but that will break a collection of other
use cases (and is different from GCC's behavior, and breaks the common
flow of deleting the #line markers when reducing a test case, and so
on). So instead, we could provide a modified syntax for the above that
requests that the #include of "baz.h" be found relative to
"foo/bar.h". We would only need to do this in the narrow case that (a)
the include names a module header, and (b) that module header was
found relative to the including file, and (c) the including file was
itself included into the main source file.
Another alternative would be to provide a module import keyword that
works across languages. Given that the C++ Modules TS is making good
progress, perhaps we can just ignore this problem for now (this change
is at least not a regression) and solve it by generating an import
once we implement the real syntax.
Okay, sounds reasonable to me.
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@lists.llvm.org
<mailto:cfe-commits@lists.llvm.org>
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits