[cfe-commits] [Patch] Add suppor for Bitrig, an OpenBSD fork.

David Hill dhill at mindcry.org
Tue Aug 7 20:59:53 PDT 2012


Ping.

On Tue, Aug 07, 2012 at 12:03:28AM -0400, David Hill wrote:
>On Mon, Aug 06, 2012 at 08:18:57PM -0700, Eli Friedman wrote:
>>On Mon, Aug 6, 2012 at 7:28 PM, David Hill <dhill at mindcry.org> wrote:
>>> Attached is a diff to add support for Bitrig, an OpenBSD fork.
>>>
>>> Please review.
>>
>>I'm a little uncomfortable with the amount of code which appears to be
>>copy-pasted in lib/Driver/, but I'm not sure how much of it can be
>>refactored.  Worth considering, at least.
>>
>>+void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
>>+                                          ArgStringList &CC1Args) const {
>>+  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
>>+      DriverArgs.hasArg(options::OPT_nostdincxx))
>>+    return;
>>+
>>+  std::string Triple = getTriple().str();
>>+  if (Triple.substr(0, 5) == "amd64")
>>+    Triple.replace(0, 5, "x86_64");
>>+
>>+  addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2");
>>+  addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2/backward");
>>+  addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2/" + Triple);
>>+
>>+}
>>
>>Are you sure you want to hardcode this path?
>
>Yes, for now.  We are working on getting libcxx in.
>
>>
>>Also, I think you want support for libc++; not sure what the path
>>would be, though.
>>
>>+    } else if (getToolChain().getOS().startswith("bitrig"))  {
>>+      if (getToolChain().getArch() == llvm::Triple::x86_64)
>>+        CPUName = "x86-64";
>>+      else if (getToolChain().getArch() == llvm::Triple::x86)
>>+        CPUName = "i486";
>
>Done.
>
>>
>>This is actually a non-trivial decision... LLVM code generation will
>>be much happier if you bump it up to at least i686.
>>
>>Otherwise, looks fine.
>>
>>-Eli
>
>Attached is a new diff with the i686 change and sparcv9 code removed.
>
>Thanks,
>David
>

>diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
>index 558ae84..5c7f3cb 100644
>--- a/lib/Basic/Targets.cpp
>+++ b/lib/Basic/Targets.cpp
>@@ -394,6 +394,29 @@ public:
>   }
> };
> 
>+// Bitrig Target
>+template<typename Target>
>+class BitrigTargetInfo : public OSTargetInfo<Target> {
>+protected:
>+  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
>+                            MacroBuilder &Builder) const {
>+    // Bitrig defines; list based off of gcc output
>+
>+    Builder.defineMacro("__Bitrig__");
>+    DefineStd(Builder, "unix", Opts);
>+    Builder.defineMacro("__ELF__");
>+    if (Opts.POSIXThreads)
>+      Builder.defineMacro("_REENTRANT");
>+  }
>+public:
>+  BitrigTargetInfo(const std::string &triple)
>+    : OSTargetInfo<Target>(triple) {
>+      this->UserLabelPrefix = "";
>+      this->TLSSupported = false;
>+      this->MCountName = "__mcount";
>+  }
>+};
>+
> // PSP Target
> template<typename Target>
> class PSPTargetInfo : public OSTargetInfo<Target> {
>@@ -2444,6 +2467,18 @@ public:
> } // end anonymous namespace
> 
> namespace {
>+class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
>+public:
>+  BitrigI386TargetInfo(const std::string& triple) :
>+    BitrigTargetInfo<X86_32TargetInfo>(triple) {
>+    SizeType = UnsignedLong;
>+    IntPtrType = SignedLong;
>+    PtrDiffType = SignedLong;
>+  }
>+};
>+} // end anonymous namespace
>+
>+namespace {
> class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
> public:
>   DarwinI386TargetInfo(const std::string& triple) :
>@@ -2777,6 +2812,18 @@ public:
> } // end anonymous namespace
> 
> namespace {
>+class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
>+public:
>+  BitrigX86_64TargetInfo(const std::string& triple)
>+      : BitrigTargetInfo<X86_64TargetInfo>(triple) {
>+     IntMaxType = SignedLongLong;
>+     UIntMaxType = UnsignedLongLong;
>+     Int64Type = SignedLongLong;
>+  }
>+};
>+} // end anonymous namespace
>+
>+namespace {
> class ARMTargetInfo : public TargetInfo {
>   // Possible FPU choices.
>   enum FPUMode {
>@@ -4156,6 +4203,8 @@ static TargetInfo *AllocateTarget(const std::string &T) {
>       return new NetBSDTargetInfo<ARMTargetInfo>(T);
>     case llvm::Triple::OpenBSD:
>       return new OpenBSDTargetInfo<ARMTargetInfo>(T);
>+    case llvm::Triple::Bitrig:
>+      return new BitrigTargetInfo<ARMTargetInfo>(T);
>     case llvm::Triple::RTEMS:
>       return new RTEMSTargetInfo<ARMTargetInfo>(T);
>     default:
>@@ -4315,6 +4364,8 @@ static TargetInfo *AllocateTarget(const std::string &T) {
>       return new NetBSDI386TargetInfo(T);
>     case llvm::Triple::OpenBSD:
>       return new OpenBSDI386TargetInfo(T);
>+    case llvm::Triple::Bitrig:
>+      return new BitrigI386TargetInfo(T);
>     case llvm::Triple::FreeBSD:
>       return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
>     case llvm::Triple::Minix:
>@@ -4350,6 +4401,8 @@ static TargetInfo *AllocateTarget(const std::string &T) {
>       return new NetBSDTargetInfo<X86_64TargetInfo>(T);
>     case llvm::Triple::OpenBSD:
>       return new OpenBSDX86_64TargetInfo(T);
>+    case llvm::Triple::Bitrig:
>+      return new BitrigX86_64TargetInfo(T);
>     case llvm::Triple::FreeBSD:
>       return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
>     case llvm::Triple::Solaris:
>diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp
>index 2095cb9..c8ec392 100644
>--- a/lib/CodeGen/TargetInfo.cpp
>+++ b/lib/CodeGen/TargetInfo.cpp
>@@ -3821,6 +3821,7 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() {
>     case llvm::Triple::DragonFly:
>     case llvm::Triple::FreeBSD:
>     case llvm::Triple::OpenBSD:
>+    case llvm::Triple::Bitrig:
>       return *(TheTargetCodeGenInfo =
>                new X86_32TargetCodeGenInfo(Types, false, true, DisableMMX,
>                                            false,
>diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
>index 012d79f..87d533d 100644
>--- a/lib/Driver/Driver.cpp
>+++ b/lib/Driver/Driver.cpp
>@@ -1776,6 +1776,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
>     case llvm::Triple::OpenBSD:
>       TC = new toolchains::OpenBSD(*this, Target, Args);
>       break;
>+    case llvm::Triple::Bitrig:
>+      TC = new toolchains::Bitrig(*this, Target, Args);
>+      break;
>     case llvm::Triple::NetBSD:
>       TC = new toolchains::NetBSD(*this, Target, Args);
>       break;
>diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
>index 45b46df..01c6623 100644
>--- a/lib/Driver/ToolChains.cpp
>+++ b/lib/Driver/ToolChains.cpp
>@@ -1567,6 +1567,67 @@ Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
>   return *T;
> }
> 
>+/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
>+
>+Bitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
>+  : Generic_ELF(D, Triple, Args) {
>+  getFilePaths().push_back(getDriver().Dir + "/../lib");
>+  getFilePaths().push_back("/usr/lib");
>+}
>+
>+Tool &Bitrig::SelectTool(const Compilation &C, const JobAction &JA,
>+                         const ActionList &Inputs) const {
>+  Action::ActionClass Key;
>+  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>+    Key = Action::AnalyzeJobClass;
>+  else
>+    Key = JA.getKind();
>+
>+  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
>+                                             options::OPT_no_integrated_as,
>+                                             IsIntegratedAssemblerDefault());
>+
>+  Tool *&T = Tools[Key];
>+  if (!T) {
>+    switch (Key) {
>+    case Action::AssembleJobClass: {
>+      if (UseIntegratedAs)
>+        T = new tools::ClangAs(*this);
>+      else
>+        T = new tools::bitrig::Assemble(*this);
>+      break;
>+    }
>+    case Action::LinkJobClass:
>+      T = new tools::bitrig::Link(*this); break;
>+    default:
>+      T = &Generic_GCC::SelectTool(C, JA, Inputs);
>+    }
>+  }
>+
>+  return *T;
>+}
>+
>+void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
>+                                          ArgStringList &CC1Args) const {
>+  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
>+      DriverArgs.hasArg(options::OPT_nostdincxx))
>+    return;
>+
>+  std::string Triple = getTriple().str();
>+  if (Triple.substr(0, 5) == "amd64")
>+    Triple.replace(0, 5, "x86_64");
>+
>+  addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2");
>+  addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2/backward");
>+  addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2/" + Triple);
>+
>+}
>+
>+void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
>+                                 ArgStringList &CmdArgs) const {
>+  CmdArgs.push_back("-lstdc++");
>+}
>+
> /// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
> 
> FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
>diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h
>index 0446ebd..95a11be 100644
>--- a/lib/Driver/ToolChains.h
>+++ b/lib/Driver/ToolChains.h
>@@ -445,6 +445,26 @@ public:
>                            const ActionList &Inputs) const;
> };
> 
>+class LLVM_LIBRARY_VISIBILITY Bitrig : public Generic_ELF {
>+public:
>+  Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
>+
>+  virtual bool IsMathErrnoDefault() const { return false; }
>+  virtual bool IsObjCNonFragileABIDefault() const { return true; }
>+  virtual bool IsObjCLegacyDispatchDefault() const { return false; }
>+
>+  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
>+                           const ActionList &Inputs) const;
>+
>+  virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
>+                                            ArgStringList &CC1Args) const;
>+  virtual void AddCXXStdlibLibArgs(const ArgList &Args,
>+                                   ArgStringList &CmdArgs) const;
>+  virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {
>+     return 1;
>+  }
>+};
>+
> class LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF {
> public:
>   FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
>diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
>index a096382..88c9297 100644
>--- a/lib/Driver/Tools.cpp
>+++ b/lib/Driver/Tools.cpp
>@@ -1097,6 +1097,11 @@ void Clang::AddX86TargetArgs(const ArgList &Args,
>         CPUName = "x86-64";
>       else if (getToolChain().getArch() == llvm::Triple::x86)
>         CPUName = "i486";
>+    } else if (getToolChain().getOS().startswith("bitrig"))  {
>+      if (getToolChain().getArch() == llvm::Triple::x86_64)
>+        CPUName = "x86-64";
>+      else if (getToolChain().getArch() == llvm::Triple::x86)
>+        CPUName = "i686";
>     } else if (getToolChain().getOS().startswith("freebsd"))  {
>       if (getToolChain().getArch() == llvm::Triple::x86_64)
>         CPUName = "x86-64";
>@@ -4956,6 +4961,138 @@ void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
>   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
> }
> 
>+void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
>+                                    const InputInfo &Output,
>+                                    const InputInfoList &Inputs,
>+                                    const ArgList &Args,
>+                                    const char *LinkingOutput) const {
>+  ArgStringList CmdArgs;
>+
>+  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
>+                       options::OPT_Xassembler);
>+
>+  CmdArgs.push_back("-o");
>+  CmdArgs.push_back(Output.getFilename());
>+
>+  for (InputInfoList::const_iterator
>+         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
>+    const InputInfo &II = *it;
>+    CmdArgs.push_back(II.getFilename());
>+  }
>+
>+  const char *Exec =
>+    Args.MakeArgString(getToolChain().GetProgramPath("as"));
>+  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
>+}
>+
>+void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
>+                                const InputInfo &Output,
>+                                const InputInfoList &Inputs,
>+                                const ArgList &Args,
>+                                const char *LinkingOutput) const {
>+  const Driver &D = getToolChain().getDriver();
>+  ArgStringList CmdArgs;
>+
>+  if ((!Args.hasArg(options::OPT_nostdlib)) &&
>+      (!Args.hasArg(options::OPT_shared))) {
>+    CmdArgs.push_back("-e");
>+    CmdArgs.push_back("__start");
>+  }
>+
>+  if (Args.hasArg(options::OPT_static)) {
>+    CmdArgs.push_back("-Bstatic");
>+  } else {
>+    if (Args.hasArg(options::OPT_rdynamic))
>+      CmdArgs.push_back("-export-dynamic");
>+    CmdArgs.push_back("--eh-frame-hdr");
>+    CmdArgs.push_back("-Bdynamic");
>+    if (Args.hasArg(options::OPT_shared)) {
>+      CmdArgs.push_back("-shared");
>+    } else {
>+      CmdArgs.push_back("-dynamic-linker");
>+      CmdArgs.push_back("/usr/libexec/ld.so");
>+    }
>+  }
>+
>+  if (Output.isFilename()) {
>+    CmdArgs.push_back("-o");
>+    CmdArgs.push_back(Output.getFilename());
>+  } else {
>+    assert(Output.isNothing() && "Invalid output.");
>+  }
>+
>+  if (!Args.hasArg(options::OPT_nostdlib) &&
>+      !Args.hasArg(options::OPT_nostartfiles)) {
>+    if (!Args.hasArg(options::OPT_shared)) {
>+      if (Args.hasArg(options::OPT_pg))
>+        CmdArgs.push_back(Args.MakeArgString(
>+                                getToolChain().GetFilePath("gcrt0.o")));
>+      else
>+        CmdArgs.push_back(Args.MakeArgString(
>+                                getToolChain().GetFilePath("crt0.o")));
>+      CmdArgs.push_back(Args.MakeArgString(
>+                              getToolChain().GetFilePath("crtbegin.o")));
>+    } else {
>+      CmdArgs.push_back(Args.MakeArgString(
>+                              getToolChain().GetFilePath("crtbeginS.o")));
>+    }
>+  }
>+
>+  Args.AddAllArgs(CmdArgs, options::OPT_L);
>+  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
>+  Args.AddAllArgs(CmdArgs, options::OPT_e);
>+
>+  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
>+
>+  if (!Args.hasArg(options::OPT_nostdlib) &&
>+      !Args.hasArg(options::OPT_nodefaultlibs)) {
>+    if (D.CCCIsCXX) {
>+      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
>+      if (Args.hasArg(options::OPT_pg))
>+        CmdArgs.push_back("-lm_p");
>+      else
>+        CmdArgs.push_back("-lm");
>+    }
>+
>+    if (Args.hasArg(options::OPT_pthread))
>+      CmdArgs.push_back("-lpthread");
>+    if (!Args.hasArg(options::OPT_shared)) {
>+      if (Args.hasArg(options::OPT_pg))
>+        CmdArgs.push_back("-lc_p");
>+      else
>+        CmdArgs.push_back("-lc");
>+    }
>+
>+    std::string myarch = "-lclang_rt.";
>+    const llvm::Triple &T = getToolChain().getTriple();
>+    llvm::Triple::ArchType Arch = T.getArch();
>+    switch (Arch) {
>+          case llvm::Triple::arm:
>+            myarch += ("arm");
>+            break;
>+          case llvm::Triple::x86:
>+            myarch += ("i386");
>+            break;
>+          case llvm::Triple::x86_64:
>+            myarch += ("amd64");
>+            break;
>+          default:
>+            assert(0 && "Unsupported architecture");
>+     }
>+     CmdArgs.push_back(Args.MakeArgString(myarch));
>+  }
>+
>+  if (!Args.hasArg(options::OPT_nostdlib) &&
>+      !Args.hasArg(options::OPT_nostartfiles)) {
>+    if (!Args.hasArg(options::OPT_shared))
>+      CmdArgs.push_back(Args.MakeArgString(
>+                              getToolChain().GetFilePath("crtend.o")));
>+    else
>+      CmdArgs.push_back(Args.MakeArgString(
>+                              getToolChain().GetFilePath("crtendS.o")));
>+  }
>+}
>+
> void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
>                                      const InputInfo &Output,
>                                      const InputInfoList &Inputs,
>diff --git a/lib/Driver/Tools.h b/lib/Driver/Tools.h
>index 0fc0690..999c57a 100644
>--- a/lib/Driver/Tools.h
>+++ b/lib/Driver/Tools.h
>@@ -377,6 +377,36 @@ namespace openbsd {
>   };
> } // end namespace openbsd
> 
>+  /// bitrig -- Directly call GNU Binutils assembler and linker
>+namespace bitrig {
>+  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
>+  public:
>+    Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
>+                                         TC) {}
>+
>+    virtual bool hasIntegratedCPP() const { return false; }
>+
>+    virtual void ConstructJob(Compilation &C, const JobAction &JA,
>+                              const InputInfo &Output,
>+                              const InputInfoList &Inputs,
>+                              const ArgList &TCArgs,
>+                              const char *LinkingOutput) const;
>+  };
>+  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
>+  public:
>+    Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
>+
>+    virtual bool hasIntegratedCPP() const { return false; }
>+    virtual bool isLinkJob() const { return true; }
>+
>+    virtual void ConstructJob(Compilation &C, const JobAction &JA,
>+                              const InputInfo &Output,
>+                              const InputInfoList &Inputs,
>+                              const ArgList &TCArgs,
>+                              const char *LinkingOutput) const;
>+  };
>+} // end namespace bitrig
>+
>   /// freebsd -- Directly call GNU Binutils assembler and linker
> namespace freebsd {
>   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
>diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp
>index 628487e..8178f7a 100644
>--- a/lib/Frontend/InitHeaderSearch.cpp
>+++ b/lib/Frontend/InitHeaderSearch.cpp
>@@ -218,6 +218,7 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
>     case llvm::Triple::FreeBSD:
>     case llvm::Triple::NetBSD:
>     case llvm::Triple::OpenBSD:
>+    case llvm::Triple::Bitrig:
>       break;
>     default:
>       // FIXME: temporary hack: hard-coded paths.
>diff --git a/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp b/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp
>index dde9071..b8b7c36 100644
>--- a/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp
>+++ b/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp
>@@ -31,6 +31,7 @@ static bool isArc4RandomAvailable(const ASTContext &Ctx) {
>          T.getOS() == llvm::Triple::FreeBSD ||
>          T.getOS() == llvm::Triple::NetBSD ||
>          T.getOS() == llvm::Triple::OpenBSD ||
>+         T.getOS() == llvm::Triple::Bitrig ||
>          T.getOS() == llvm::Triple::DragonFly;
> }
> 

>_______________________________________________
>cfe-commits mailing list
>cfe-commits at cs.uiuc.edu
>http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list