]> granicus.if.org Git - clang/commitdiff
Driver: Add AMDGPU toolchain
authorTom Stellard <thomas.stellard@amd.com>
Sat, 18 Jul 2015 01:49:05 +0000 (01:49 +0000)
committerTom Stellard <thomas.stellard@amd.com>
Sat, 18 Jul 2015 01:49:05 +0000 (01:49 +0000)
Summary:
This is a minimal toolchain, which sets the integrated assembler as default,
and uses lld for linking.

Reviewers: arsenm, mcrosier

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D10700

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242601 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/Driver.cpp
lib/Driver/ToolChains.cpp
lib/Driver/ToolChains.h
lib/Driver/Tools.cpp
lib/Driver/Tools.h
test/Driver/amdgpu-toolchain.c [new file with mode: 0644]

index 180c412bd791f767aeee3800627bf22ea04bc59e..d7a5ee9139a03fc533e0b31e332e33af93aaca6a 100644 (file)
@@ -2195,6 +2195,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
     case llvm::Triple::Solaris:
       TC = new toolchains::Solaris(*this, Target, Args);
       break;
+    case llvm::Triple::AMDHSA:
+      TC = new toolchains::AMDGPUToolChain(*this, Target, Args);
+      break;
     case llvm::Triple::Win32:
       switch (Target.getEnvironment()) {
       default:
index 15e36a1e6ce085012613887452134aead1c8bd97..685a51a630284321b9468f2313200a936a0f6d31 100644 (file)
@@ -2293,6 +2293,16 @@ StringRef Hexagon_TC::GetTargetCPU(const ArgList &Args) {
 }
 // End Hexagon
 
+/// AMDGPU Toolchain
+AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
+                                 const ArgList &Args)
+  : Generic_ELF(D, Triple, Args) { }
+
+Tool *AMDGPUToolChain::buildLinker() const {
+  return new tools::amdgpu::Linker(*this);
+}
+// End AMDGPU
+
 /// NaCl Toolchain
 NaCl_TC::NaCl_TC(const Driver &D, const llvm::Triple &Triple,
                  const ArgList &Args)
index 327ff9b13b19bffd7594f595cc51612bcacce159..56a94ab685af13dd679c8adfba24b0d65dcfd119 100644 (file)
@@ -742,6 +742,16 @@ public:
   static bool UsesG0(const char *smallDataThreshold);
 };
 
+class LLVM_LIBRARY_VISIBILITY AMDGPUToolChain : public Generic_ELF {
+protected:
+  Tool *buildLinker() const override;
+
+public:
+  AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
+            const llvm::opt::ArgList &Args);
+  bool IsIntegratedAssemblerDefault() const override { return true; }
+};
+
 class LLVM_LIBRARY_VISIBILITY NaCl_TC : public Generic_ELF {
 public:
   NaCl_TC(const Driver &D, const llvm::Triple &Triple,
index 40643ccb67e4a31f42c05f6f3246f1406165c258..6dc25b5a1f9ad58141de65e451f6c73a44378e62 100644 (file)
@@ -5777,6 +5777,26 @@ void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
 }
 // Hexagon tools end.
 
+void amdgpu::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;
+  CmdArgs.push_back("-flavor");
+  CmdArgs.push_back("gnu");
+  CmdArgs.push_back("-target");
+  CmdArgs.push_back(getToolChain().getTripleString().c_str());
+  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
+  CmdArgs.push_back("-o");
+  CmdArgs.push_back(Output.getFilename());
+  C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
+                                          CmdArgs, Inputs));
+}
+// AMDGPU tools end.
+
 const std::string arm::getARMArch(const ArgList &Args,
                                   const llvm::Triple &Triple) {
   std::string MArch;
index a730245227743fb9ee20d1867e714965156b8b7a..4f816a0ba97af8d64753f1ae3671016cd41eb3c2 100644 (file)
@@ -224,6 +224,21 @@ public:
 };
 } // end namespace hexagon.
 
+namespace amdgpu {
+
+class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
+public:
+  Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "lld", TC) {}
+  bool isLinkJob() const override { return true; }
+  bool hasIntegratedCPP() const override { return false; }
+  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 amdgpu
+
 namespace arm {
 std::string getARMTargetCPU(const llvm::opt::ArgList &Args,
                             const llvm::Triple &Triple);
diff --git a/test/Driver/amdgpu-toolchain.c b/test/Driver/amdgpu-toolchain.c
new file mode 100644 (file)
index 0000000..3f82ce5
--- /dev/null
@@ -0,0 +1,5 @@
+// RUN: %clang -### -target amdgcn--amdhsa -x assembler -mcpu=kaveri %s 2>&1 | FileCheck -check-prefix=AS_LINK %s
+// AS_LINK-LABEL: clang
+// AS_LINK: "-cc1as"
+// AS_LINK-LABEL: lld
+// AS_LINK: "-flavor" "gnu" "-target" "amdgcn--amdhsa"