Steven Chamberlain wrote: > I've attached ...this time. Regards, -- Steven Chamberlain steven@pyro.eu.org
From: Steven Chamberlain <steven@pyro.eu.org> Date: Tue, 09 Feb 2016 00:44:46 +0000 Subject: Add support for GNU/kFreeBSD targets Extend the GNU/Linux toolchain to trivially support Debian GNU/kFreeBSD (arches x86, x86_64; and armhf although still in development). Define ld.so name and LD emulation for each of these. Look for target includes in the Debian-style multiarch path, or /usr/include otherwise. Multilib is only implemented on kfreebsd-amd64, having -m32 libraries in /lib32; in all other cases the libraries are found already in /lib. kfreebsd-amd64 does not implement x32. --- a/clang/lib/Driver/ToolChains.cpp +++ b/clang/lib/Driver/ToolChains.cpp @@ -1280,9 +1280,25 @@ bool Generic_GCC::GCCInstallationDetecto SmallVectorImpl<StringRef> &TripleAliases, SmallVectorImpl<StringRef> &BiarchLibDirs, SmallVectorImpl<StringRef> &BiarchTripleAliases) { + using std::begin; + using std::end; + // Declare a bunch of static data sets that we'll select between below. These // are specifically designed to always refer to string literals to avoid any // lifetime or initialization issues. + if (TargetTriple.getOS() == llvm::Triple::KFreeBSD) { + // GNU/kFreeBSD + static const char *const KFreeBSDX86BiarchLibDirs[] = { "/lib32" }; + switch (TargetTriple.getArch()) { + case llvm::Triple::x86_64: + BiarchLibDirs.append(begin(KFreeBSDX86BiarchLibDirs), end(KFreeBSDX86BiarchLibDirs)); + break; + default: + // By default, just rely on the standard lib directories and the original + // triple. + break; + } + } else { static const char *const AArch64LibDirs[] = { "/lib64", "/lib" }; static const char *const AArch64Triples[] = { "aarch64-none-linux-gnu", "aarch64-linux-gnu", @@ -1369,9 +1385,6 @@ bool Generic_GCC::GCCInstallationDetecto "s390x-suse-linux", "s390x-redhat-linux" }; - using std::begin; - using std::end; - switch (TargetTriple.getArch()) { case llvm::Triple::aarch64: LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs)); @@ -1486,6 +1499,7 @@ bool Generic_GCC::GCCInstallationDetecto // triple. break; } + } // Always append the drivers target triple to the end, in case it doesn't // match any of our aliases. @@ -3189,6 +3203,10 @@ void Linux::AddClangSystemIncludeArgs(co } // Implement generic Debian multiarch support. + if (getTriple().getOS() == llvm::Triple::KFreeBSD) { + // GNU/kFreeBSD + addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/" + getTriple().str()); + } else { const StringRef X86_64MultiarchIncludeDirs[] = { "/usr/include/x86_64-linux-gnu", @@ -3277,6 +3295,7 @@ void Linux::AddClangSystemIncludeArgs(co break; } } + } if (getTriple().getOS() == llvm::Triple::RTEMS) return; --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -7277,6 +7277,20 @@ static void AddLibgcc(const llvm::Triple static std::string getLinuxDynamicLinker(const ArgList &Args, const toolchains::Linux &ToolChain) { + // GNU/kFreeBSD + if (ToolChain.getTriple().getOS() == llvm::Triple::KFreeBSD) { + switch (ToolChain.getArch()) { + case llvm::Triple::x86_64: + return "/lib/ld-kfreebsd-x86-64.so.1"; + case llvm::Triple::arm: + if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF) + return "/lib/ld-kfreebsd-armhf.so.1"; + // else follow through... + case llvm::Triple::x86: + default: + return "/lib/ld.so.1"; + } + } else { if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) { if (ToolChain.getTriple().isArch64Bit()) return "/system/bin/linker64"; @@ -7341,6 +7355,7 @@ static std::string getLinuxDynamicLinker return "/libx32/ld-linux-x32.so.2"; else return "/lib64/ld-linux-x86-64.so.2"; + } } static void AddRunTimeLibs(const ToolChain &TC, const Driver &D, @@ -7365,6 +7380,20 @@ static void AddRunTimeLibs(const ToolCha } static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) { + // GNU/kFreeBSD + if (T.getOS() == llvm::Triple::KFreeBSD) { + switch (T.getArch()) { + case llvm::Triple::x86_64: + return "elf_x86_64_fbsd"; + case llvm::Triple::arm: + return "armelf_fbsd"; + case llvm::Triple::x86: + return "elf_i386_fbsd"; + default: + llvm_unreachable("Unsupported architecture"); + } + } + switch (T.getArch()) { case llvm::Triple::x86: return "elf_i386"; --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -2032,6 +2032,7 @@ const ToolChain &Driver::getToolChain(co case llvm::Triple::Minix: TC = new toolchains::Minix(*this, Target, Args); break; + case llvm::Triple::KFreeBSD: /* GNU/kFreeBSD */ case llvm::Triple::Linux: if (Target.getArch() == llvm::Triple::hexagon) TC = new toolchains::Hexagon_TC(*this, Target, Args);
Attachment:
signature.asc
Description: Digital signature