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