1 //===--- SPIRV.cpp - SPIR-V Tool Implementations ----------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "CommonArgs.h"
10 #include "clang/Driver/Compilation.h"
11 #include "clang/Driver/Driver.h"
12 #include "clang/Driver/InputInfo.h"
13 #include "clang/Driver/Options.h"
15 using namespace clang::driver
;
16 using namespace clang::driver::toolchains
;
17 using namespace clang::driver::tools
;
18 using namespace llvm::opt
;
20 void SPIRV::constructTranslateCommand(Compilation
&C
, const Tool
&T
,
22 const InputInfo
&Output
,
23 const InputInfo
&Input
,
24 const llvm::opt::ArgStringList
&Args
) {
25 llvm::opt::ArgStringList
CmdArgs(Args
);
26 CmdArgs
.push_back(Input
.getFilename());
28 if (Input
.getType() == types::TY_PP_Asm
)
29 CmdArgs
.push_back("-to-binary");
30 if (Output
.getType() == types::TY_PP_Asm
)
31 CmdArgs
.push_back("--spirv-tools-dis");
33 CmdArgs
.append({"-o", Output
.getFilename()});
36 C
.getArgs().MakeArgString(T
.getToolChain().GetProgramPath("llvm-spirv"));
37 C
.addCommand(std::make_unique
<Command
>(JA
, T
, ResponseFileSupport::None(),
38 Exec
, CmdArgs
, Input
, Output
));
41 void SPIRV::Translator::ConstructJob(Compilation
&C
, const JobAction
&JA
,
42 const InputInfo
&Output
,
43 const InputInfoList
&Inputs
,
45 const char *LinkingOutput
) const {
46 claimNoWarnArgs(Args
);
47 if (Inputs
.size() != 1)
48 llvm_unreachable("Invalid number of input files.");
49 constructTranslateCommand(C
, *this, JA
, Output
, Inputs
[0], {});
52 clang::driver::Tool
*SPIRVToolChain::getTranslator() const {
54 Translator
= std::make_unique
<SPIRV::Translator
>(*this);
55 return Translator
.get();
58 clang::driver::Tool
*SPIRVToolChain::SelectTool(const JobAction
&JA
) const {
59 Action::ActionClass AC
= JA
.getKind();
60 return SPIRVToolChain::getTool(AC
);
63 clang::driver::Tool
*SPIRVToolChain::getTool(Action::ActionClass AC
) const {
67 case Action::BackendJobClass
:
68 case Action::AssembleJobClass
:
69 return SPIRVToolChain::getTranslator();
71 return ToolChain::getTool(AC
);
73 clang::driver::Tool
*SPIRVToolChain::buildLinker() const {
74 return new tools::SPIRV::Linker(*this);
77 void SPIRV::Linker::ConstructJob(Compilation
&C
, const JobAction
&JA
,
78 const InputInfo
&Output
,
79 const InputInfoList
&Inputs
,
81 const char *LinkingOutput
) const {
82 const ToolChain
&ToolChain
= getToolChain();
83 std::string Linker
= ToolChain
.GetProgramPath(getShortName());
84 ArgStringList CmdArgs
;
85 AddLinkerInputs(getToolChain(), Inputs
, Args
, CmdArgs
, JA
);
87 CmdArgs
.push_back("-o");
88 CmdArgs
.push_back(Output
.getFilename());
90 C
.addCommand(std::make_unique
<Command
>(JA
, *this, ResponseFileSupport::None(),
91 Args
.MakeArgString(Linker
), CmdArgs
,