[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