diff options
author | Abdoulaye Walsimou Gaye <awg@embtoolkit.org> | 2014-04-04 13:58:10 +0200 |
---|---|---|
committer | Abdoulaye Walsimou Gaye <awg@embtoolkit.org> | 2014-05-09 23:20:47 +0200 |
commit | 677ff22d1907a315e33cd3f5ef636ba3d580e20b (patch) | |
tree | c0e6b75d7afdae77646e9006dbba4e62ec96acd7 | |
parent | 23e9dd25fe64b78dce3037f99e84c2c11225be84 (diff) | |
download | clang-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.cpp | 27 |
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"; |