diff options
| author | Jacques Pienaar <jpienaar@google.com> | 2016-03-28 21:02:54 +0000 |
|---|---|---|
| committer | Jacques Pienaar <jpienaar@google.com> | 2016-03-28 21:02:54 +0000 |
| commit | d964cc22d1432ae41b19fea1f543cf8b76c37323 (patch) | |
| tree | 55c19ff3b0a962fb22a4d178c7be9c78c52bb6bf /clang/lib/Driver | |
| parent | 83c3bd3e59ffeda483f4fa16a18b4050df8be0f7 (diff) | |
| download | bcm5719-llvm-d964cc22d1432ae41b19fea1f543cf8b76c37323.tar.gz bcm5719-llvm-d964cc22d1432ae41b19fea1f543cf8b76c37323.zip | |
[lanai] Add Lanai backend to clang driver.
Changes to clang to add Lanai backend. Adds a new target, ABI and toolchain.
General Lanai backend discussion on llvm-dev thread "[RFC] Lanai backend" (http://lists.llvm.org/pipermail/llvm-dev/2016-February/095118.html).
Differential Revision: http://reviews.llvm.org/D17002
llvm-svn: 264655
Diffstat (limited to 'clang/lib/Driver')
| -rw-r--r-- | clang/lib/Driver/Driver.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/Driver/ToolChains.h | 8 | ||||
| -rw-r--r-- | clang/lib/Driver/Tools.cpp | 37 | ||||
| -rw-r--r-- | clang/lib/Driver/Tools.h | 2 |
4 files changed, 50 insertions, 0 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 75dcfc96cd8..e434e68c7b9 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -2459,6 +2459,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, case llvm::Triple::hexagon: TC = new toolchains::HexagonToolChain(*this, Target, Args); break; + case llvm::Triple::lanai: + TC = new toolchains::LanaiToolChain(*this, Target, Args); + break; case llvm::Triple::xcore: TC = new toolchains::XCoreToolChain(*this, Target, Args); break; diff --git a/clang/lib/Driver/ToolChains.h b/clang/lib/Driver/ToolChains.h index 458fd03feda..49283a9c201 100644 --- a/clang/lib/Driver/ToolChains.h +++ b/clang/lib/Driver/ToolChains.h @@ -874,6 +874,14 @@ private: std::string LibSuffix; }; +class LLVM_LIBRARY_VISIBILITY LanaiToolChain : public Generic_ELF { +public: + LanaiToolChain(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args) + : Generic_ELF(D, Triple, Args) {} + bool IsIntegratedAssemblerDefault() const override { return true; } +}; + class LLVM_LIBRARY_VISIBILITY HexagonToolChain : public Linux { protected: GCCVersion GCCLibAndIncVersion; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index e725e5af488..118e1afb214 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -1619,6 +1619,13 @@ static std::string getR600TargetGPU(const ArgList &Args) { return ""; } +static std::string getLanaiTargetCPU(const ArgList &Args) { + if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { + return A->getValue(); + } + return ""; +} + void Clang::AddSparcTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const { const Driver &D = getToolChain().getDriver(); @@ -1836,6 +1843,9 @@ static std::string getCPUName(const ArgList &Args, const llvm::Triple &T, return "hexagon" + toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str(); + case llvm::Triple::lanai: + return getLanaiTargetCPU(Args); + case llvm::Triple::systemz: return getSystemZTargetCPU(Args); @@ -2145,6 +2155,29 @@ void Clang::AddHexagonTargetArgs(const ArgList &Args, CmdArgs.push_back("-machine-sink-split=0"); } +void Clang::AddLanaiTargetArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { + StringRef CPUName = A->getValue(); + + CmdArgs.push_back("-target-cpu"); + CmdArgs.push_back(Args.MakeArgString(CPUName)); + } + if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) { + StringRef Value = A->getValue(); + // Only support mregparm=4 to support old usage. Report error for all other + // cases. + int Mregparm; + if (Value.getAsInteger(10, Mregparm)) { + if (Mregparm != 4) { + getToolChain().getDriver().Diag( + diag::err_drv_unsupported_option_argument) + << A->getOption().getName() << Value; + } + } + } +} + void Clang::AddWebAssemblyTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const { // Default to "hidden" visibility. @@ -4176,6 +4209,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, AddX86TargetArgs(Args, CmdArgs); break; + case llvm::Triple::lanai: + AddLanaiTargetArgs(Args, CmdArgs); + break; + case llvm::Triple::hexagon: AddHexagonTargetArgs(Args, CmdArgs); break; diff --git a/clang/lib/Driver/Tools.h b/clang/lib/Driver/Tools.h index 6884cd42f3b..c9d5c2238d6 100644 --- a/clang/lib/Driver/Tools.h +++ b/clang/lib/Driver/Tools.h @@ -82,6 +82,8 @@ private: llvm::opt::ArgStringList &CmdArgs) const; void AddHexagonTargetArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; + void AddLanaiTargetArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; void AddWebAssemblyTargetArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; |

