[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug#806241: clang-3.6 on kfreebsd-*: fatal error: 'sys/cdefs.h' file not found



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


Reply to: