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