]> granicus.if.org Git - clang/commitdiff
[Driver] Search compiler-rt paths in -print-file-name=
authorPetr Hosek <phosek@chromium.org>
Thu, 10 Aug 2017 04:16:38 +0000 (04:16 +0000)
committerPetr Hosek <phosek@chromium.org>
Thu, 10 Aug 2017 04:16:38 +0000 (04:16 +0000)
This makes it possible to print the name of compiler-rt libraries
by using simply clang -print-file-name=libclang_rt.${runtime}-${arch}.so
same as other libraries, without having to know the details of the
resource directory organization.

Differential Revision: https://reviews.llvm.org/D35820

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@310548 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Driver/ToolChain.h
lib/Driver/Driver.cpp
lib/Driver/ToolChain.cpp

index d74d1e0e58aaec8b98d239895a3452e938228e98..e354acb6d0ce13c58dc6ac821d2747e5e3398ffe 100644 (file)
@@ -309,6 +309,8 @@ public:
     return ToolChain::CST_Libstdcxx;
   }
 
+  virtual std::string getCompilerRTPath() const;
+
   virtual std::string getCompilerRT(const llvm::opt::ArgList &Args,
                                     StringRef Component,
                                     bool Shared = false) const;
index e1c632569df43601989525c4bc8b4cc4e4e383e0..b11629aacefa07c797a4739263d0a82dd998ce3a 100644 (file)
@@ -3682,7 +3682,12 @@ std::string Driver::GetFilePath(StringRef Name, const ToolChain &TC) const {
       return P.str();
   }
 
-  SmallString<128> P(ResourceDir);
+  SmallString<128> R(ResourceDir);
+  llvm::sys::path::append(R, Name);
+  if (llvm::sys::fs::exists(Twine(R)))
+    return R.str();
+
+  SmallString<128> P(TC.getCompilerRTPath());
   llvm::sys::path::append(P, Name);
   if (llvm::sys::fs::exists(Twine(P)))
     return P.str();
index 10fad752cfe0268f624e4144f54c5a97b2ed903c..c7c377971e54113ea240082ebc1cb9f9b6e203ea 100644 (file)
@@ -308,6 +308,13 @@ static StringRef getArchNameForCompilerRTLib(const ToolChain &TC,
   return TC.getArchName();
 }
 
+std::string ToolChain::getCompilerRTPath() const {
+  SmallString<128> Path(getDriver().ResourceDir);
+  StringRef OSLibName = Triple.isOSFreeBSD() ? "freebsd" : getOS();
+  llvm::sys::path::append(Path, "lib", OSLibName);
+  return Path.str();
+}
+
 std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
                                      bool Shared) const {
   const llvm::Triple &TT = getTriple();
@@ -320,9 +327,7 @@ std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
   const char *Suffix = Shared ? (Triple.isOSWindows() ? ".dll" : ".so")
                               : (IsITANMSVCWindows ? ".lib" : ".a");
 
-  SmallString<128> Path(getDriver().ResourceDir);
-  StringRef OSLibName = Triple.isOSFreeBSD() ? "freebsd" : getOS();
-  llvm::sys::path::append(Path, "lib", OSLibName);
+  SmallString<128> Path(getCompilerRTPath());
   llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
                                     Arch + Env + Suffix);
   return Path.str();