Created
February 14, 2017 14:23
-
-
Save asb/a999fe44099deaa017696112b8bb4cb2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp | |
index 2ccb459..6f92eeb 100644 | |
--- a/lib/Basic/Targets.cpp | |
+++ b/lib/Basic/Targets.cpp | |
@@ -6651,6 +6651,57 @@ ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const { | |
return llvm::makeArrayRef(GCCRegAliases); | |
} | |
+// RISC-V Target | |
+// TODO: need to handle 64-bit as well as 32-bit | |
+class RISCVTargetInfo : public TargetInfo { | |
+public: | |
+ RISCVTargetInfo(const llvm::Triple &Triple, const TargetOptions &) | |
+ : TargetInfo(Triple) { | |
+ TLSSupported = false; | |
+ resetDataLayout("e-m:e-p:32:32-i64:64-n32-S128"); | |
+ } | |
+ | |
+ void getTargetDefines(const LangOptions &Opts, | |
+ MacroBuilder &Builder) const override { | |
+ Builder.defineMacro("__riscv__"); | |
+ } | |
+ | |
+ ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; } | |
+ | |
+ BuiltinVaListKind getBuiltinVaListKind() const override { | |
+ return TargetInfo::VoidPtrBuiltinVaList; | |
+ } | |
+ | |
+ const char *getClobbers() const override { return ""; } | |
+ | |
+ ArrayRef<const char *> getGCCRegNames() const override { | |
+ static const char *const GCCRegNames[] = { | |
+ "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", | |
+ "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", | |
+ "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", | |
+ "x24", "x25", "x26", "x27", "x28", "x29", "x30", "x31"}; | |
+ return llvm::makeArrayRef(GCCRegNames); | |
+ } | |
+ | |
+ ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { | |
+ static const TargetInfo::GCCRegAlias GCCRegAliases[] = { | |
+ {{"zero"}, "x0"}, {{"ra"}, "x1"}, {{"sp"}, "x2"}, {{"gp"}, "x3"}, | |
+ {{"tp"}, "x4"}, {{"t0"}, "x5"}, {{"t1"}, "x6"}, {{"t2"}, "x7"}, | |
+ {{"s0"}, "x8"}, {{"s1"}, "x9"}, {{"a0"}, "x10"}, {{"a1"}, "x11"}, | |
+ {{"a2"}, "x12"}, {{"a3"}, "x13"}, {{"a4"}, "x15"}, {{"a5"}, "x15"}, | |
+ {{"a6"}, "x16"}, {{"a7"}, "x17"}, {{"s2"}, "x18"}, {{"s3"}, "x19"}, | |
+ {{"s4"}, "x20"}, {{"s5"}, "x21"}, {{"s6"}, "x22"}, {{"s7"}, "x23"}, | |
+ {{"s8"}, "x24"}, {{"s9"}, "x25"}, {{"s10"}, "x26"}, {{"s11"}, "x27"}, | |
+ {{"t3"}, "x28"}, {{"t4"}, "x29"}, {{"t5"}, "x30"}, {{"t6"}, "x31"}}; | |
+ return llvm::makeArrayRef(GCCRegAliases); | |
+ } | |
+ | |
+ bool validateAsmConstraint(const char *&Name, | |
+ TargetInfo::ConstraintInfo &Info) const override { | |
+ return false; | |
+ } | |
+}; | |
+ | |
// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit). | |
class SparcTargetInfo : public TargetInfo { | |
static const TargetInfo::GCCRegAlias GCCRegAliases[]; | |
@@ -9153,6 +9204,9 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple, | |
case llvm::Triple::r600: | |
return new AMDGPUTargetInfo(Triple, Opts); | |
+ case llvm::Triple::riscv32: | |
+ return new RISCVTargetInfo(Triple, Opts); | |
+ | |
case llvm::Triple::sparc: | |
switch (os) { | |
case llvm::Triple::Linux: | |
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp | |
index 0dcab7c..41859ef 100644 | |
--- a/lib/Driver/Driver.cpp | |
+++ b/lib/Driver/Driver.cpp | |
@@ -3774,6 +3774,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, | |
case llvm::Triple::avr: | |
TC = llvm::make_unique<toolchains::AVRToolChain>(*this, Target, Args); | |
break; | |
+ case llvm::Triple::riscv32: | |
+ TC = llvm::make_unique<toolchains::RISCVToolChain>(*this, Target, Args); | |
+ break; | |
default: | |
if (Target.getVendor() == llvm::Triple::Myriad) | |
TC = llvm::make_unique<toolchains::MyriadToolChain>(*this, Target, | |
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp | |
index 44fb226..d2e5366 100644 | |
--- a/lib/Driver/ToolChains.cpp | |
+++ b/lib/Driver/ToolChains.cpp | |
@@ -5340,3 +5340,11 @@ Tool *AVRToolChain::buildLinker() const { | |
return new tools::AVR::Linker(*this); | |
} | |
// End AVR | |
+ | |
+/// RISCV Toolchain | |
+RISCVToolChain::RISCVToolChain(const Driver &D, const llvm::Triple &Triple, | |
+ const ArgList &Args) | |
+ : Generic_ELF(D, Triple, Args) {} | |
+Tool *RISCVToolChain::buildLinker() const { | |
+ return new tools::RISCV::Linker(*this); | |
+} | |
diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h | |
index 3240357..86c1534 100644 | |
--- a/lib/Driver/ToolChains.h | |
+++ b/lib/Driver/ToolChains.h | |
@@ -1380,6 +1380,15 @@ public: | |
bool IsIntegratedAssemblerDefault() const override { return true; } | |
}; | |
+class LLVM_LIBRARY_VISIBILITY RISCVToolChain : public Generic_ELF { | |
+protected: | |
+ Tool *buildLinker() const override; | |
+ | |
+public: | |
+ RISCVToolChain(const Driver &D, const llvm::Triple &Triple, | |
+ const llvm::opt::ArgList &Args); | |
+ bool IsIntegratedAssemblerDefault() const override { return true; } | |
+}; | |
} // end namespace toolchains | |
} // end namespace driver | |
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp | |
index 87153c3..b728b50 100644 | |
--- a/lib/Driver/Tools.cpp | |
+++ b/lib/Driver/Tools.cpp | |
@@ -12321,3 +12321,18 @@ void AVR::Linker::ConstructJob(Compilation &C, const JobAction &JA, | |
CmdArgs, Inputs)); | |
} | |
// AVR tools end. | |
+ | |
+void RISCV::Linker::ConstructJob(Compilation &C, const JobAction &JA, | |
+ const InputInfo &Output, | |
+ const InputInfoList &Inputs, | |
+ const ArgList &Args, | |
+ const char *LinkingOutput) const { | |
+ | |
+ std::string Linker = getToolChain().GetProgramPath(getShortName()); | |
+ ArgStringList CmdArgs; | |
+ AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA); | |
+ CmdArgs.push_back("-o"); | |
+ CmdArgs.push_back(Output.getFilename()); | |
+ C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker), | |
+ CmdArgs, Inputs)); | |
+} | |
diff --git a/lib/Driver/Tools.h b/lib/Driver/Tools.h | |
index 9d5b892..48a4252 100644 | |
--- a/lib/Driver/Tools.h | |
+++ b/lib/Driver/Tools.h | |
@@ -1003,6 +1003,19 @@ public: | |
}; | |
} // end namespace AVR | |
+namespace RISCV { | |
+class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { | |
+public: | |
+ Linker(const ToolChain &TC) : GnuTool("RISCV::Linker", "riscv-ld", TC) {} | |
+ bool hasIntegratedCPP() const override { return false; } | |
+ bool isLinkJob() const override { return true; } | |
+ void ConstructJob(Compilation &C, const JobAction &JA, | |
+ const InputInfo &Output, const InputInfoList &Inputs, | |
+ const llvm::opt::ArgList &TCArgs, | |
+ const char *LinkingOutput) const override; | |
+}; | |
+} // end namespace RISCV | |
+ | |
} // end namespace tools | |
} // end namespace driver | |
} // end namespace clang | |
diff --git a/test/Driver/riscv32-toolchain.c b/test/Driver/riscv32-toolchain.c | |
new file mode 100644 | |
index 0000000..5f8a544 | |
--- /dev/null | |
+++ b/test/Driver/riscv32-toolchain.c | |
@@ -0,0 +1,4 @@ | |
+// A basic clang -cc1 command-line. | |
+ | |
+// RUN: %clang %s -### -no-canonical-prefixes -target riscv32 2>&1 | FileCheck -check-prefix=CC1 %s | |
+// CC1: clang{{.*}} "-cc1" "-triple" "riscv32" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment