[PATCH] D30015: [OpenMP] Add arch-specific directory to search path

Jonas Hahnfeld via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 16 03:46:41 PST 2017


Hahnfeld added a comment.

Maybe something like the following (without tests):

  diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h
  index ffb0d60..0f3507d 100644
  --- a/include/clang/Driver/ToolChain.h
  +++ b/include/clang/Driver/ToolChain.h
  @@ -299,6 +299,11 @@ public:
     const char *getCompilerRTArgString(const llvm::opt::ArgList &Args,
                                        StringRef Component,
                                        bool Shared = false) const;
  +
  +  /// Returns <ResourceDir>/lib/<OSName>/<arch>.  This is used by runtimes (such
  +  /// as OpenMP) to find arch-specific libraries.
  +  const std::string getArchSpecificLibPath() const;
  +
     /// needsProfileRT - returns true if instrumentation profile is on.
     static bool needsProfileRT(const llvm::opt::ArgList &Args);
   
  diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp
  index 6adc038..ae2c08e 100644
  --- a/lib/Driver/ToolChain.cpp
  +++ b/lib/Driver/ToolChain.cpp
  @@ -10,6 +10,7 @@
   #include "clang/Driver/ToolChain.h"
   #include "Tools.h"
   #include "clang/Basic/ObjCRuntime.h"
  +#include "clang/Basic/VirtualFileSystem.h"
   #include "clang/Config/config.h"
   #include "clang/Driver/Action.h"
   #include "clang/Driver/Driver.h"
  @@ -74,6 +75,10 @@ ToolChain::ToolChain(const Driver &D, const llvm::Triple &T,
       if (!isThreadModelSupported(A->getValue()))
         D.Diag(diag::err_drv_invalid_thread_model_for_target)
             << A->getValue() << A->getAsString(Args);
  +
  +  std::string CandidateLibPath = getArchSpecificLibPath();
  +  if (getVFS().exists(CandidateLibPath))
  +    getFilePaths().push_back(CandidateLibPath);
   }
   
   ToolChain::~ToolChain() {
  @@ -320,6 +325,14 @@ const char *ToolChain::getCompilerRTArgString(const llvm::opt::ArgList &Args,
     return Args.MakeArgString(getCompilerRT(Args, Component, Shared));
   }
   
  +const std::string ToolChain::getArchSpecificLibPath() const {
  +  SmallString<128> Path(getDriver().ResourceDir);
  +  StringRef OSLibName = getTriple().isOSFreeBSD() ? "freebsd" : getOS();
  +  llvm::sys::path::append(Path, "lib", OSLibName,
  +                          llvm::Triple::getArchTypeName(getArch()));
  +  return Path.str();
  +}
  +
   bool ToolChain::needsProfileRT(const ArgList &Args) {
     if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
                      false) ||
  diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
  index cc7d9e1..c0fb4bc 100644
  --- a/lib/Driver/Tools.cpp
  +++ b/lib/Driver/Tools.cpp
  @@ -14,6 +14,7 @@
   #include "clang/Basic/LangOptions.h"
   #include "clang/Basic/ObjCRuntime.h"
   #include "clang/Basic/Version.h"
  +#include "clang/Basic/VirtualFileSystem.h"
   #include "clang/Config/config.h"
   #include "clang/Driver/Action.h"
   #include "clang/Driver/Compilation.h"
  @@ -276,8 +277,15 @@ static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
   
     // LIBRARY_PATH - included following the user specified library paths.
     //                and only supported on native toolchains.
  -  if (!TC.isCrossCompiling())
  +  if (!TC.isCrossCompiling()) {
       addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
  +
  +    std::string CandidateRPath = TC.getArchSpecificLibPath();
  +    if (D.getVFS().exists(CandidateRPath)) {
  +      CmdArgs.push_back("-rpath");
  +      CmdArgs.push_back(Args.MakeArgString(CandidateRPath.c_str()));
  +    }
  +  }
   }
   
   /// Add OpenMP linker script arguments at the end of the argument list so that


https://reviews.llvm.org/D30015





More information about the cfe-commits mailing list