summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbdoulaye Walsimou Gaye <awg@embtoolkit.org>2014-04-04 13:58:10 +0200
committerAbdoulaye Walsimou Gaye <awg@embtoolkit.org>2014-05-09 23:20:47 +0200
commit677ff22d1907a315e33cd3f5ef636ba3d580e20b (patch)
treec0e6b75d7afdae77646e9006dbba4e62ec96acd7
parent23e9dd25fe64b78dce3037f99e84c2c11225be84 (diff)
downloadclang-677ff22d1907a315e33cd3f5ef636ba3d580e20b.tar.gz
clang-677ff22d1907a315e33cd3f5ef636ba3d580e20b.tar.bz2
clang-677ff22d1907a315e33cd3f5ef636ba3d580e20b.tar.xz
[Embtk] MIPS32/ARM: support musl and uClibc dynamic linkers
Signed-off-by: Abdoulaye Walsimou Gaye <awg@embtoolkit.org>
-rw-r--r--lib/Driver/Tools.cpp27
1 files changed, 23 insertions, 4 deletions
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index e1cf68be26..30782e995d 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -6353,6 +6353,9 @@ static bool hasMipsN32ABIArg(const ArgList &Args) {
static StringRef getLinuxDynamicLinker(const ArgList &Args,
const toolchains::Linux &ToolChain) {
+ StringRef EnvironmentName = ToolChain.getTriple().getEnvironmentName();
+ const Driver &D = ToolChain.getDriver();
+
if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
return "/system/bin/linker";
else if (ToolChain.getArch() == llvm::Triple::x86)
@@ -6361,14 +6364,30 @@ static StringRef getLinuxDynamicLinker(const ArgList &Args,
return "/lib/ld-linux-aarch64.so.1";
else if (ToolChain.getArch() == llvm::Triple::arm ||
ToolChain.getArch() == llvm::Triple::thumb) {
- if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
+ if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF &&
+ EnvironmentName != "musleabi" && EnvironmentName != "uclibceabi")
return "/lib/ld-linux-armhf.so.3";
+ else if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF &&
+ EnvironmentName == "musleabi")
+ return "/lib/ld-musl-armhf.so.1";
+ else if (EnvironmentName == "musleabi")
+ return "/lib/ld-musl-arm.so.1";
+ else if (EnvironmentName == "uclibceabi")
+ return "/lib/ld-uClibc.so.0";
else
return "/lib/ld-linux.so.3";
} else if (ToolChain.getArch() == llvm::Triple::mips ||
- ToolChain.getArch() == llvm::Triple::mipsel)
- return "/lib/ld.so.1";
- else if (ToolChain.getArch() == llvm::Triple::mips64 ||
+ ToolChain.getArch() == llvm::Triple::mipsel) {
+ StringRef FloatABI = getMipsFloatABI(D, Args);
+ if (EnvironmentName == "musl" && FloatABI == "hard")
+ return ToolChain.getArch() == llvm::Triple::mipsel ? "/lib/ld-musl-mipsel.so.1" : "/lib/ld-musl-mips.so.1";
+ else if (EnvironmentName == "musl" && FloatABI == "soft")
+ return ToolChain.getArch() == llvm::Triple::mipsel ? "/lib/ld-musl-mipsel-sf.so.1" : "/lib/ld-musl-mips-sf.so.1";
+ else if (EnvironmentName == "uclibc")
+ return "/lib/ld-uClibc.so.0";
+ else
+ return "/lib/ld.so.1";
+ } else if (ToolChain.getArch() == llvm::Triple::mips64 ||
ToolChain.getArch() == llvm::Triple::mips64el) {
if (hasMipsN32ABIArg(Args))
return "/lib32/ld.so.1";