From: Petr Hosek Date: Wed, 12 Sep 2018 03:26:10 +0000 (+0000) Subject: [Driver] Search LibraryPaths when handling -print-file-name X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6208c64db7c27006797384d9550f2b0f9deb97ea;p=clang [Driver] Search LibraryPaths when handling -print-file-name This is necessary to handle the multiarch runtime directories. Differential Revision: https://reviews.llvm.org/D51573 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342021 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 4764d4e38d..e84c7558e7 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -4152,16 +4152,24 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA, } std::string Driver::GetFilePath(StringRef Name, const ToolChain &TC) const { - // Respect a limited subset of the '-Bprefix' functionality in GCC by - // attempting to use this prefix when looking for file paths. - for (const std::string &Dir : PrefixDirs) { - if (Dir.empty()) - continue; - SmallString<128> P(Dir[0] == '=' ? SysRoot + Dir.substr(1) : Dir); - llvm::sys::path::append(P, Name); - if (llvm::sys::fs::exists(Twine(P))) - return P.str(); - } + // Seach for Name in a list of paths. + auto SearchPaths = [&](const llvm::SmallVectorImpl &P) + -> llvm::Optional { + // Respect a limited subset of the '-Bprefix' functionality in GCC by + // attempting to use this prefix when looking for file paths. + for (const auto &Dir : P) { + if (Dir.empty()) + continue; + SmallString<128> P(Dir[0] == '=' ? SysRoot + Dir.substr(1) : Dir); + llvm::sys::path::append(P, Name); + if (llvm::sys::fs::exists(Twine(P))) + return {P.str()}; + } + return None; + }; + + if (auto P = SearchPaths(PrefixDirs)) + return *P; SmallString<128> R(ResourceDir); llvm::sys::path::append(R, Name); @@ -4173,14 +4181,11 @@ std::string Driver::GetFilePath(StringRef Name, const ToolChain &TC) const { if (llvm::sys::fs::exists(Twine(P))) return P.str(); - for (const std::string &Dir : TC.getFilePaths()) { - if (Dir.empty()) - continue; - SmallString<128> P(Dir[0] == '=' ? SysRoot + Dir.substr(1) : Dir); - llvm::sys::path::append(P, Name); - if (llvm::sys::fs::exists(Twine(P))) - return P.str(); - } + if (auto P = SearchPaths(TC.getLibraryPaths())) + return *P; + + if (auto P = SearchPaths(TC.getFilePaths())) + return *P; return Name; } diff --git a/test/Driver/linux-per-target-runtime-dir.c b/test/Driver/linux-per-target-runtime-dir.c index aa9c1017f6..bbd11570f5 100644 --- a/test/Driver/linux-per-target-runtime-dir.c +++ b/test/Driver/linux-per-target-runtime-dir.c @@ -19,3 +19,9 @@ // RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ // RUN: | FileCheck --check-prefix=CHECK-CLANGRT-X8664 %s // CHECK-CLANGRT-X8664: x86_64-linux-gnu{{/|\\}}lib{{/|\\}}libclang_rt.builtins.a + +// RUN: %clang -rtlib=compiler-rt -print-file-name=libclang_rt.builtins.a 2>&1 \ +// RUN: --target=x86_64-linux-gnu \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: | FileCheck --check-prefix=CHECK-FILE-NAME-X8664 %s +// CHECK-FILE-NAME-X8664: x86_64-linux-gnu{{/|\\}}lib{{/|\\}}libclang_rt.builtins.a