xref: /openbsd-src/gnu/llvm/clang/lib/Driver/ToolChains/SPIRV.cpp (revision 12c855180aad702bbcca06e0398d774beeafb155)
1*12c85518Srobert //===--- SPIRV.cpp - SPIR-V Tool Implementations ----------------*- C++ -*-===//
2*12c85518Srobert //
3*12c85518Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*12c85518Srobert // See https://llvm.org/LICENSE.txt for license information.
5*12c85518Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*12c85518Srobert //
7*12c85518Srobert //===----------------------------------------------------------------------===//
8*12c85518Srobert #include "SPIRV.h"
9*12c85518Srobert #include "CommonArgs.h"
10*12c85518Srobert #include "clang/Driver/Compilation.h"
11*12c85518Srobert #include "clang/Driver/Driver.h"
12*12c85518Srobert #include "clang/Driver/InputInfo.h"
13*12c85518Srobert #include "clang/Driver/Options.h"
14*12c85518Srobert 
15*12c85518Srobert using namespace clang::driver;
16*12c85518Srobert using namespace clang::driver::toolchains;
17*12c85518Srobert using namespace clang::driver::tools;
18*12c85518Srobert using namespace llvm::opt;
19*12c85518Srobert 
constructTranslateCommand(Compilation & C,const Tool & T,const JobAction & JA,const InputInfo & Output,const InputInfo & Input,const llvm::opt::ArgStringList & Args)20*12c85518Srobert void SPIRV::constructTranslateCommand(Compilation &C, const Tool &T,
21*12c85518Srobert                                       const JobAction &JA,
22*12c85518Srobert                                       const InputInfo &Output,
23*12c85518Srobert                                       const InputInfo &Input,
24*12c85518Srobert                                       const llvm::opt::ArgStringList &Args) {
25*12c85518Srobert   llvm::opt::ArgStringList CmdArgs(Args);
26*12c85518Srobert   CmdArgs.push_back(Input.getFilename());
27*12c85518Srobert 
28*12c85518Srobert   if (Input.getType() == types::TY_PP_Asm)
29*12c85518Srobert     CmdArgs.push_back("-to-binary");
30*12c85518Srobert   if (Output.getType() == types::TY_PP_Asm)
31*12c85518Srobert     CmdArgs.push_back("--spirv-tools-dis");
32*12c85518Srobert 
33*12c85518Srobert   CmdArgs.append({"-o", Output.getFilename()});
34*12c85518Srobert 
35*12c85518Srobert   const char *Exec =
36*12c85518Srobert       C.getArgs().MakeArgString(T.getToolChain().GetProgramPath("llvm-spirv"));
37*12c85518Srobert   C.addCommand(std::make_unique<Command>(JA, T, ResponseFileSupport::None(),
38*12c85518Srobert                                          Exec, CmdArgs, Input, Output));
39*12c85518Srobert }
40*12c85518Srobert 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const41*12c85518Srobert void SPIRV::Translator::ConstructJob(Compilation &C, const JobAction &JA,
42*12c85518Srobert                                      const InputInfo &Output,
43*12c85518Srobert                                      const InputInfoList &Inputs,
44*12c85518Srobert                                      const ArgList &Args,
45*12c85518Srobert                                      const char *LinkingOutput) const {
46*12c85518Srobert   claimNoWarnArgs(Args);
47*12c85518Srobert   if (Inputs.size() != 1)
48*12c85518Srobert     llvm_unreachable("Invalid number of input files.");
49*12c85518Srobert   constructTranslateCommand(C, *this, JA, Output, Inputs[0], {});
50*12c85518Srobert }
51*12c85518Srobert 
getTranslator() const52*12c85518Srobert clang::driver::Tool *SPIRVToolChain::getTranslator() const {
53*12c85518Srobert   if (!Translator)
54*12c85518Srobert     Translator = std::make_unique<SPIRV::Translator>(*this);
55*12c85518Srobert   return Translator.get();
56*12c85518Srobert }
57*12c85518Srobert 
SelectTool(const JobAction & JA) const58*12c85518Srobert clang::driver::Tool *SPIRVToolChain::SelectTool(const JobAction &JA) const {
59*12c85518Srobert   Action::ActionClass AC = JA.getKind();
60*12c85518Srobert   return SPIRVToolChain::getTool(AC);
61*12c85518Srobert }
62*12c85518Srobert 
getTool(Action::ActionClass AC) const63*12c85518Srobert clang::driver::Tool *SPIRVToolChain::getTool(Action::ActionClass AC) const {
64*12c85518Srobert   switch (AC) {
65*12c85518Srobert   default:
66*12c85518Srobert     break;
67*12c85518Srobert   case Action::BackendJobClass:
68*12c85518Srobert   case Action::AssembleJobClass:
69*12c85518Srobert     return SPIRVToolChain::getTranslator();
70*12c85518Srobert   }
71*12c85518Srobert   return ToolChain::getTool(AC);
72*12c85518Srobert }
buildLinker() const73*12c85518Srobert clang::driver::Tool *SPIRVToolChain::buildLinker() const {
74*12c85518Srobert   return new tools::SPIRV::Linker(*this);
75*12c85518Srobert }
76*12c85518Srobert 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const77*12c85518Srobert void SPIRV::Linker::ConstructJob(Compilation &C, const JobAction &JA,
78*12c85518Srobert                                  const InputInfo &Output,
79*12c85518Srobert                                  const InputInfoList &Inputs,
80*12c85518Srobert                                  const ArgList &Args,
81*12c85518Srobert                                  const char *LinkingOutput) const {
82*12c85518Srobert   const ToolChain &ToolChain = getToolChain();
83*12c85518Srobert   std::string Linker = ToolChain.GetProgramPath(getShortName());
84*12c85518Srobert   ArgStringList CmdArgs;
85*12c85518Srobert   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA);
86*12c85518Srobert 
87*12c85518Srobert   CmdArgs.push_back("-o");
88*12c85518Srobert   CmdArgs.push_back(Output.getFilename());
89*12c85518Srobert 
90*12c85518Srobert   C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
91*12c85518Srobert                                          Args.MakeArgString(Linker), CmdArgs,
92*12c85518Srobert                                          Inputs, Output));
93*12c85518Srobert }
94