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 http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits