forked from OSchip/llvm-project
clang support for Bitrig (an OpenBSD fork); patch by David Hill.
llvm-svn: 161546
This commit is contained in:
parent
bf387df302
commit
9fa2885522
|
@ -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> {
|
||||
|
@ -2442,6 +2465,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:
|
||||
|
@ -2775,6 +2810,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.
|
||||
|
@ -4155,6 +4202,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:
|
||||
|
@ -4314,6 +4363,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:
|
||||
|
@ -4349,6 +4400,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:
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1099,6 +1099,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";
|
||||
|
@ -4958,6 +4963,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,
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue