--- llvm-3.3.src.orig/include/llvm/ADT/Triple.h +++ llvm-3.3.src/include/llvm/ADT/Triple.h @@ -117,7 +117,11 @@ EABI, MachO, Android, - ELF + ELF, + UClibc, + Musl, + MuslEABI, + MuslEABIHF }; private: --- llvm-3.3.src.orig/lib/Support/Triple.cpp +++ llvm-3.3.src/lib/Support/Triple.cpp @@ -151,6 +151,10 @@ case MachO: return "macho"; case Android: return "android"; case ELF: return "elf"; + case UClibc: return "uclibc"; + case Musl: return "musl"; + case MuslEABI: return "muslgnueabi"; + case MuslEABIHF: return "muslgnueabihf"; } llvm_unreachable("Invalid EnvironmentType!"); @@ -300,6 +304,10 @@ .StartsWith("macho", Triple::MachO) .StartsWith("android", Triple::Android) .StartsWith("elf", Triple::ELF) + .StartsWith("uclibc", Triple::UClibc) + .StartsWith("muslgnueabihf", Triple::MuslEABIHF) + .StartsWith("muslgnueabi", Triple::MuslEABI) + .StartsWith("musl", Triple::Musl) .Default(Triple::UnknownEnvironment); } --- llvm-3.3.src.orig/tools/clang/lib/Driver/ToolChains.cpp +++ llvm-3.3.src/tools/clang/lib/Driver/ToolChains.cpp @@ -1086,7 +1086,9 @@ }; static const char *const ARMHFTriples[] = { "arm-linux-gnueabihf", - "armv7hl-redhat-linux-gnueabi" + "armv7hl-redhat-linux-gnueabi", + "armv6-alpine-linux-muslgnueabihf", + "armv7-alpine-linux-muslgnueabihf" }; static const char *const X86_64LibDirs[] = { "/lib64", "/lib" }; @@ -1099,7 +1101,9 @@ "x86_64-suse-linux", "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", - "x86_64-slackware-linux" + "x86_64-slackware-linux", + "x86_64-alpine-linux-uclibc", + "x86_64-alpine-linux-musl" }; static const char *const X86LibDirs[] = { "/lib32", "/lib" }; static const char *const X86Triples[] = { @@ -1113,7 +1117,9 @@ "i386-redhat-linux", "i586-suse-linux", "i486-slackware-linux", - "i686-montavista-linux" + "i686-montavista-linux", + "i486-alpine-linux-uclibc", + "i486-alpine-linux-musl" }; static const char *const MIPSLibDirs[] = { "/lib" }; @@ -1980,6 +1986,7 @@ /// Distribution (very bare-bones at the moment). enum Distro { + AlpineLinux, ArchLinux, DebianLenny, DebianSqueeze, @@ -2108,6 +2115,9 @@ if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists) return ArchLinux; + + if (!llvm::sys::fs::exists("/etc/alpine-release", Exists) && Exists) + return AlpineLinux; return UnknownDistro; } --- llvm-3.3.src.orig/tools/clang/lib/Driver/Tools.cpp +++ llvm-3.3.src/tools/clang/lib/Driver/Tools.cpp @@ -5983,16 +5983,37 @@ CmdArgs.push_back("-dynamic-linker"); if (isAndroid) CmdArgs.push_back("/system/bin/linker"); - else if (ToolChain.getArch() == llvm::Triple::x86) - CmdArgs.push_back("/lib/ld-linux.so.2"); - else if (ToolChain.getArch() == llvm::Triple::aarch64) + else if (ToolChain.getArch() == llvm::Triple::x86) { + switch (ToolChain.getTriple().getEnvironment()) { + case llvm::Triple::UClibc: + CmdArgs.push_back("/lib/ld-uClibc.so.0.9.32"); + break; + case llvm::Triple::Musl: + CmdArgs.push_back("/lib/ld-musl-i386.so.1"); + break; + default: + CmdArgs.push_back("/lib/ld-linux.so.2"); + break; + } + } else if (ToolChain.getArch() == llvm::Triple::aarch64) CmdArgs.push_back("/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) + switch (ToolChain.getTriple().getEnvironment()) { + case llvm::Triple::Musl: + case llvm::Triple::MuslEABI: + CmdArgs.push_back("/lib/ld-musl-arm.so.3"); + break; + case llvm::Triple::MuslEABIHF: + CmdArgs.push_back("/lib/ld-musl-armhf.so.3"); + break; + case llvm::Triple::GNUEABIHF: CmdArgs.push_back("/lib/ld-linux-armhf.so.3"); - else + break; + default: CmdArgs.push_back("/lib/ld-linux.so.3"); + break; + } } else if (ToolChain.getArch() == llvm::Triple::mips || ToolChain.getArch() == llvm::Triple::mipsel) @@ -6009,8 +6030,19 @@ else if (ToolChain.getArch() == llvm::Triple::ppc64 || ToolChain.getArch() == llvm::Triple::systemz) CmdArgs.push_back("/lib64/ld64.so.1"); - else - CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2"); + else { + switch (ToolChain.getTriple().getEnvironment()) { + case llvm::Triple::Musl: + CmdArgs.push_back("/lib/ld-musl-x86_64.so.1"); + break; + case llvm::Triple::UClibc: + CmdArgs.push_back("/lib/ld64-uClibc.so.0.9.32"); + break; + default: + CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2"); + break; + } + } } CmdArgs.push_back("-o");