This seems to fix it, but I don't know if it's the right fix: diff --git a/clang/lib/Frontend/CreateInvocationFromCommandLine.cpp b/clang/lib/Frontend/CreateInvocationFromCommandLine.cpp index b62416ffd9e..d933f8c1b70 100644 --- a/clang/lib/Frontend/CreateInvocationFromCommandLine.cpp +++ b/clang/lib/Frontend/CreateInvocationFromCommandLine.cpp @@ -47,6 +47,10 @@ std::unique_ptr<CompilerInvocation> clang::createInvocationFromCommandLine( driver::Driver TheDriver(Args[0], llvm::sys::getDefaultTargetTriple(), *Diags, VFS);
+ StringRef InstalledPathParent(llvm::sys::path::parent_path(Args[0])); + if (llvm::sys::fs::exists(InstalledPathParent)) + TheDriver.setInstalledDir(InstalledPathParent); + // Don't check that inputs exist, they may have been remapped. TheDriver.setCheckInputsExist(false); On Mon, Jan 28, 2019 at 10:08 AM Nico Weber <tha...@chromium.org> wrote: > I think c-index-test has the same problem: > > $ cat test.cc > #include <iostream> > $ out/gn/bin/c-index-test -write-pch foo.pch test.cc > test.cc:1:10: fatal error: 'iostream' file not found > > Since https://reviews.llvm.org/rL350714 was a driver-side fix and > c-index-test doesn't use lib/Driver, it didn't do anything here. Can you > take a look at c-index-test too? > > On Wed, Jan 9, 2019 at 8:15 AM Ilya Biryukov <ibiryu...@google.com> wrote: > >> Glad to help. The fix has landed. Let me know if the problem persists >> after it's integrated. >> >> On Tue, Jan 8, 2019 at 7:36 PM Nico Weber <tha...@chromium.org> wrote: >> >>> That looks like it should help. Thanks for the quick fix! >>> >>> On Tue, Jan 8, 2019 at 1:11 PM Ilya Biryukov <ibiryu...@google.com> >>> wrote: >>> >>>> Hi Nico, >>>> >>>> This is clearly a bug, it's supposed to search in a sibling directory. >>>> Are you running clang as './clang' in the scripts? The code seems to >>>> break in that case, https://reviews.llvm.org/D56446 should fix this. >>>> >>>> On Tue, Jan 8, 2019 at 5:12 PM Nico Weber <tha...@chromium.org> wrote: >>>> >>>>> It looks like clang now looks for libc++ headers in -internal-isystem >>>>> Release+Asserts/bin/include/c++/v1 , compared to -internal-isystem >>>>> Release+Asserts/include/c++/v1. `make install` puts the libc++ headers in >>>>> Release+Asserts/include, the old location. Was this an intentional change? >>>>> >>>>> As-is, this seems to break chromium's clang ability to find libc++ >>>>> headers (https://crbug.com/919761) because we bundle libc++ headers >>>>> in an "include" directory that's a sibling to the "bin" directory (and >>>>> have >>>>> been doing so for 4.5 years, since >>>>> https://codereview.chromium.org/281753002). >>>>> >>>>> On Mon, Nov 12, 2018 at 8:58 AM Ilya Biryukov via cfe-commits < >>>>> cfe-commits@lists.llvm.org> wrote: >>>>> >>>>>> Author: ibiryukov >>>>>> Date: Mon Nov 12 05:55:55 2018 >>>>>> New Revision: 346652 >>>>>> >>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=346652&view=rev >>>>>> Log: >>>>>> Make clang-based tools find libc++ on MacOS >>>>>> >>>>>> Summary: >>>>>> When they read compiler args from compile_commands.json. >>>>>> This change allows to run clang-based tools, like clang-tidy or >>>>>> clangd, >>>>>> built from head using the compile_commands.json file produced for >>>>>> XCode >>>>>> toolchains. >>>>>> >>>>>> On MacOS clang can find the C++ standard library relative to the >>>>>> compiler installation dir. >>>>>> >>>>>> The logic to do this was based on resource dir as an approximation of >>>>>> where the compiler is installed. This broke the tools that read >>>>>> 'compile_commands.json' and don't ship with the compiler, as they >>>>>> typically change resource dir. >>>>>> >>>>>> To workaround this, we now use compiler install dir detected by the >>>>>> driver >>>>>> to better mimic the behavior of the original compiler when replaying >>>>>> the >>>>>> compilations using other tools. >>>>>> >>>>>> Reviewers: sammccall, arphaman, EricWF >>>>>> >>>>>> Reviewed By: sammccall >>>>>> >>>>>> Subscribers: ioeric, christof, kadircet, cfe-commits >>>>>> >>>>>> Differential Revision: https://reviews.llvm.org/D54310 >>>>>> >>>>>> Added: >>>>>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/ >>>>>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/ >>>>>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/ >>>>>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/v1/ >>>>>> >>>>>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/v1/mock_vector >>>>>> cfe/trunk/test/Tooling/clang-check-mac-libcxx-abspath.cpp >>>>>> cfe/trunk/test/Tooling/clang-check-mac-libcxx-relpath.cpp >>>>>> Modified: >>>>>> cfe/trunk/include/clang/Lex/HeaderSearchOptions.h >>>>>> cfe/trunk/lib/Frontend/CreateInvocationFromCommandLine.cpp >>>>>> cfe/trunk/lib/Frontend/InitHeaderSearch.cpp >>>>>> cfe/trunk/lib/Tooling/Tooling.cpp >>>>>> >>>>>> Modified: cfe/trunk/include/clang/Lex/HeaderSearchOptions.h >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearchOptions.h?rev=346652&r1=346651&r2=346652&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/include/clang/Lex/HeaderSearchOptions.h (original) >>>>>> +++ cfe/trunk/include/clang/Lex/HeaderSearchOptions.h Mon Nov 12 >>>>>> 05:55:55 2018 >>>>>> @@ -108,6 +108,13 @@ public: >>>>>> /// etc.). >>>>>> std::string ResourceDir; >>>>>> >>>>>> + /// Compiler install dir as detected by the Driver. >>>>>> + /// This is typically the directory that contains the clang >>>>>> executable, i.e. >>>>>> + /// the 'bin/' subdir of a clang distribution. >>>>>> + /// Only used to add include dirs for libc++ on Darwin. Please >>>>>> avoid relying >>>>>> + /// on this field for other purposes. >>>>>> + std::string InstallDir; >>>>>> + >>>>>> /// The directory used for the module cache. >>>>>> std::string ModuleCachePath; >>>>>> >>>>>> >>>>>> Modified: cfe/trunk/lib/Frontend/CreateInvocationFromCommandLine.cpp >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CreateInvocationFromCommandLine.cpp?rev=346652&r1=346651&r2=346652&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/lib/Frontend/CreateInvocationFromCommandLine.cpp >>>>>> (original) >>>>>> +++ cfe/trunk/lib/Frontend/CreateInvocationFromCommandLine.cpp Mon >>>>>> Nov 12 05:55:55 2018 >>>>>> @@ -11,17 +11,18 @@ >>>>>> // >>>>>> >>>>>> >>>>>> //===----------------------------------------------------------------------===// >>>>>> >>>>>> -#include "clang/Frontend/Utils.h" >>>>>> #include "clang/Basic/DiagnosticOptions.h" >>>>>> +#include "clang/Driver/Action.h" >>>>>> #include "clang/Driver/Compilation.h" >>>>>> #include "clang/Driver/Driver.h" >>>>>> -#include "clang/Driver/Action.h" >>>>>> #include "clang/Driver/Options.h" >>>>>> #include "clang/Driver/Tool.h" >>>>>> #include "clang/Frontend/CompilerInstance.h" >>>>>> #include "clang/Frontend/FrontendDiagnostic.h" >>>>>> +#include "clang/Frontend/Utils.h" >>>>>> #include "llvm/Option/ArgList.h" >>>>>> #include "llvm/Support/Host.h" >>>>>> +#include "llvm/Support/Path.h" >>>>>> using namespace clang; >>>>>> using namespace llvm::opt; >>>>>> >>>>>> @@ -102,5 +103,8 @@ std::unique_ptr<CompilerInvocation> clan >>>>>> CCArgs.size(), >>>>>> *Diags)) >>>>>> return nullptr; >>>>>> + // Patch up the install dir, so we find the same standard library >>>>>> as the >>>>>> + // original compiler on MacOS. >>>>>> + CI->getHeaderSearchOpts().InstallDir = TheDriver.getInstalledDir(); >>>>>> return CI; >>>>>> } >>>>>> >>>>>> Modified: cfe/trunk/lib/Frontend/InitHeaderSearch.cpp >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitHeaderSearch.cpp?rev=346652&r1=346651&r2=346652&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/lib/Frontend/InitHeaderSearch.cpp (original) >>>>>> +++ cfe/trunk/lib/Frontend/InitHeaderSearch.cpp Mon Nov 12 05:55:55 >>>>>> 2018 >>>>>> @@ -476,14 +476,9 @@ void InitHeaderSearch::AddDefaultInclude >>>>>> if (triple.isOSDarwin()) { >>>>>> // On Darwin, libc++ may be installed alongside the compiler >>>>>> in >>>>>> // include/c++/v1. >>>>>> - if (!HSOpts.ResourceDir.empty()) { >>>>>> - // Remove version from foo/lib/clang/version >>>>>> - StringRef NoVer = >>>>>> llvm::sys::path::parent_path(HSOpts.ResourceDir); >>>>>> - // Remove clang from foo/lib/clang >>>>>> - StringRef Lib = llvm::sys::path::parent_path(NoVer); >>>>>> - // Remove lib from foo/lib >>>>>> - SmallString<128> P = llvm::sys::path::parent_path(Lib); >>>>>> - >>>>>> + if (!HSOpts.InstallDir.empty()) { >>>>>> + // Get from foo/bin to foo. >>>>>> + SmallString<128> >>>>>> P(llvm::sys::path::parent_path(HSOpts.InstallDir)); >>>>>> // Get foo/include/c++/v1 >>>>>> llvm::sys::path::append(P, "include", "c++", "v1"); >>>>>> AddUnmappedPath(P, CXXSystem, false); >>>>>> >>>>>> Modified: cfe/trunk/lib/Tooling/Tooling.cpp >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/Tooling.cpp?rev=346652&r1=346651&r2=346652&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/lib/Tooling/Tooling.cpp (original) >>>>>> +++ cfe/trunk/lib/Tooling/Tooling.cpp Mon Nov 12 05:55:55 2018 >>>>>> @@ -327,6 +327,9 @@ bool ToolInvocation::run() { >>>>>> Invocation->getPreprocessorOpts().addRemappedFile(It.getKey(), >>>>>> >>>>>> Input.release()); >>>>>> } >>>>>> + // Patch up the install dir, so we find the same standard library >>>>>> as the >>>>>> + // original compiler on MacOS. >>>>>> + Invocation->getHeaderSearchOpts().InstallDir = >>>>>> Driver->getInstalledDir(); >>>>>> return runInvocation(BinaryName, Compilation.get(), >>>>>> std::move(Invocation), >>>>>> std::move(PCHContainerOps)); >>>>>> } >>>>>> >>>>>> Added: >>>>>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/v1/mock_vector >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c%2B%2B/v1/mock_vector?rev=346652&view=auto >>>>>> >>>>>> ============================================================================== >>>>>> --- >>>>>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/v1/mock_vector >>>>>> (added) >>>>>> +++ >>>>>> cfe/trunk/test/Tooling/Inputs/mock-libcxx/include/c++/v1/mock_vector Mon >>>>>> Nov 12 05:55:55 2018 >>>>>> @@ -0,0 +1 @@ >>>>>> +class vector {}; >>>>>> >>>>>> Added: cfe/trunk/test/Tooling/clang-check-mac-libcxx-abspath.cpp >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/clang-check-mac-libcxx-abspath.cpp?rev=346652&view=auto >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/test/Tooling/clang-check-mac-libcxx-abspath.cpp (added) >>>>>> +++ cfe/trunk/test/Tooling/clang-check-mac-libcxx-abspath.cpp Mon Nov >>>>>> 12 05:55:55 2018 >>>>>> @@ -0,0 +1,17 @@ >>>>>> +// Clang on MacOS can find libc++ living beside the installed >>>>>> compiler. >>>>>> +// This test makes sure our libTooling-based tools emulate this >>>>>> properly. >>>>>> +// >>>>>> +// RUN: rm -rf %t >>>>>> +// RUN: mkdir %t >>>>>> +// >>>>>> +// Install the mock libc++ (simulates the libc++ directory >>>>>> structure). >>>>>> +// RUN: cp -r %S/Inputs/mock-libcxx %t/ >>>>>> +// >>>>>> +// Pretend clang is installed beside the mock library that we >>>>>> provided. >>>>>> +// RUN: echo >>>>>> '[{"directory":"%t","command":"%t/mock-libcxx/bin/clang++ -stdlib=libc++ >>>>>> -target x86_64-apple-darwin -c test.cpp","file":"test.cpp"}]' | sed -e >>>>>> 's/\\/\//g' > %t/compile_commands.json >>>>>> +// RUN: cp "%s" "%t/test.cpp" >>>>>> +// clang-check will produce an error code if the mock library is not >>>>>> found. >>>>>> +// RUN: clang-check -p "%t" "%t/test.cpp" >>>>>> + >>>>>> +#include <mock_vector> >>>>>> +vector v; >>>>>> >>>>>> Added: cfe/trunk/test/Tooling/clang-check-mac-libcxx-relpath.cpp >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/clang-check-mac-libcxx-relpath.cpp?rev=346652&view=auto >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/test/Tooling/clang-check-mac-libcxx-relpath.cpp (added) >>>>>> +++ cfe/trunk/test/Tooling/clang-check-mac-libcxx-relpath.cpp Mon Nov >>>>>> 12 05:55:55 2018 >>>>>> @@ -0,0 +1,17 @@ >>>>>> +// Clang on MacOS can find libc++ living beside the installed >>>>>> compiler. >>>>>> +// This test makes sure our libTooling-based tools emulate this >>>>>> properly. >>>>>> +// >>>>>> +// RUN: rm -rf %t >>>>>> +// RUN: mkdir %t >>>>>> +// >>>>>> +// Install the mock libc++ (simulates the libc++ directory >>>>>> structure). >>>>>> +// RUN: cp -r %S/Inputs/mock-libcxx %t/ >>>>>> +// >>>>>> +// Pretend clang is installed beside the mock library that we >>>>>> provided. >>>>>> +// RUN: echo '[{"directory":"%t","command":"mock-libcxx/bin/clang++ >>>>>> -stdlib=libc++ -target x86_64-apple-darwin -c >>>>>> test.cpp","file":"test.cpp"}]' | sed -e 's/\\/\//g' > >>>>>> %t/compile_commands.json >>>>>> +// RUN: cp "%s" "%t/test.cpp" >>>>>> +// clang-check will produce an error code if the mock library is not >>>>>> found. >>>>>> +// RUN: clang-check -p "%t" "%t/test.cpp" >>>>>> + >>>>>> +#include <mock_vector> >>>>>> +vector v; >>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> cfe-commits mailing list >>>>>> cfe-commits@lists.llvm.org >>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>>>>> >>>>> >>>> >>>> -- >>>> Regards, >>>> Ilya Biryukov >>>> >>> >> >> -- >> Regards, >> Ilya Biryukov >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits