summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/Tools.cpp
diff options
context:
space:
mode:
authorPirama Arumuga Nainar <pirama@google.com>2017-03-03 23:20:49 +0000
committerPirama Arumuga Nainar <pirama@google.com>2017-03-03 23:20:49 +0000
commit65a16dd85811f385f36c8d94bb960d88dce9a6c9 (patch)
tree1599cc157a227db452483a8f3093eb1cdd9cb943 /clang/lib/Driver/Tools.cpp
parent1c9d800fbc4e6552f30bf7ad807a02126f4cf8f0 (diff)
downloadbcm5719-llvm-65a16dd85811f385f36c8d94bb960d88dce9a6c9.tar.gz
bcm5719-llvm-65a16dd85811f385f36c8d94bb960d88dce9a6c9.zip
Add arch-specific directory to search path
Summary: This change adds an arch-specific subdirectory in <ResourceDir>/lib/<OS> to the linker search path. This path also gets added as '-rpath' for native compilation if a runtime is linked in as a shared object. This allows arch-specific libraries to be installed alongside clang. Reviewers: danalbert, cbergstrom, javed.absar Subscribers: srhines Differential Revision: https://reviews.llvm.org/D30015 llvm-svn: 296927
Diffstat (limited to 'clang/lib/Driver/Tools.cpp')
-rw-r--r--clang/lib/Driver/Tools.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index 283d7ee0625..139fceadc11 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/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"
@@ -238,8 +239,9 @@ 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");
+ }
}
/// Add OpenMP linker script arguments at the end of the argument list so that
@@ -2000,6 +2002,19 @@ static void CollectArgsForIntegratedAssembler(Compilation &C,
}
}
+static void addArchSpecificRPath(const ToolChain &TC, const ArgList &Args,
+ ArgStringList &CmdArgs) {
+ // In the cross-compilation case, arch-specific library path is likely
+ // unavailable at runtime.
+ if (TC.isCrossCompiling()) return;
+
+ std::string CandidateRPath = TC.getArchSpecificLibPath();
+ if (TC.getVFS().exists(CandidateRPath)) {
+ CmdArgs.push_back("-rpath");
+ CmdArgs.push_back(Args.MakeArgString(CandidateRPath.c_str()));
+ }
+}
+
static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
const ArgList &Args) {
if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
@@ -2020,6 +2035,8 @@ static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
// Already diagnosed.
break;
}
+
+ addArchSpecificRPath(TC, Args, CmdArgs);
}
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
@@ -2030,6 +2047,10 @@ static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
if (IsWhole) CmdArgs.push_back("-whole-archive");
CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
if (IsWhole) CmdArgs.push_back("-no-whole-archive");
+
+ if (IsShared) {
+ addArchSpecificRPath(TC, Args, CmdArgs);
+ }
}
// Tries to use a file with the list of dynamic symbols that need to be exported
@@ -9002,6 +9023,8 @@ void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
}
if (JA.isHostOffloading(Action::OFK_OpenMP))
CmdArgs.push_back("-lomptarget");
+
+ addArchSpecificRPath(ToolChain, Args, CmdArgs);
}
AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
OpenPOWER on IntegriCloud