xref: /freebsd-src/contrib/llvm-project/clang/lib/Driver/ToolChains/SPIRV.cpp (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
1*349cc55cSDimitry Andric //===--- SPIRV.cpp - SPIR-V Tool Implementations ----------------*- C++ -*-===//
2*349cc55cSDimitry Andric //
3*349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*349cc55cSDimitry Andric //
7*349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8*349cc55cSDimitry Andric #include "SPIRV.h"
9*349cc55cSDimitry Andric #include "CommonArgs.h"
10*349cc55cSDimitry Andric #include "clang/Driver/Compilation.h"
11*349cc55cSDimitry Andric #include "clang/Driver/Driver.h"
12*349cc55cSDimitry Andric #include "clang/Driver/InputInfo.h"
13*349cc55cSDimitry Andric #include "clang/Driver/Options.h"
14*349cc55cSDimitry Andric 
15*349cc55cSDimitry Andric using namespace clang::driver;
16*349cc55cSDimitry Andric using namespace clang::driver::tools;
17*349cc55cSDimitry Andric using namespace llvm::opt;
18*349cc55cSDimitry Andric 
19*349cc55cSDimitry Andric void SPIRV::constructTranslateCommand(Compilation &C, const Tool &T,
20*349cc55cSDimitry Andric                                       const JobAction &JA,
21*349cc55cSDimitry Andric                                       const InputInfo &Output,
22*349cc55cSDimitry Andric                                       const InputInfo &Input,
23*349cc55cSDimitry Andric                                       const llvm::opt::ArgStringList &Args) {
24*349cc55cSDimitry Andric   llvm::opt::ArgStringList CmdArgs(Args);
25*349cc55cSDimitry Andric   CmdArgs.push_back(Input.getFilename());
26*349cc55cSDimitry Andric 
27*349cc55cSDimitry Andric   if (Input.getType() == types::TY_PP_Asm)
28*349cc55cSDimitry Andric     CmdArgs.push_back("-to-binary");
29*349cc55cSDimitry Andric   if (Output.getType() == types::TY_PP_Asm)
30*349cc55cSDimitry Andric     CmdArgs.push_back("-spirv-text");
31*349cc55cSDimitry Andric 
32*349cc55cSDimitry Andric   CmdArgs.append({"-o", Output.getFilename()});
33*349cc55cSDimitry Andric 
34*349cc55cSDimitry Andric   const char *Exec =
35*349cc55cSDimitry Andric       C.getArgs().MakeArgString(T.getToolChain().GetProgramPath("llvm-spirv"));
36*349cc55cSDimitry Andric   C.addCommand(std::make_unique<Command>(JA, T, ResponseFileSupport::None(),
37*349cc55cSDimitry Andric                                          Exec, CmdArgs, Input, Output));
38*349cc55cSDimitry Andric }
39*349cc55cSDimitry Andric 
40*349cc55cSDimitry Andric void SPIRV::Translator::ConstructJob(Compilation &C, const JobAction &JA,
41*349cc55cSDimitry Andric                                      const InputInfo &Output,
42*349cc55cSDimitry Andric                                      const InputInfoList &Inputs,
43*349cc55cSDimitry Andric                                      const ArgList &Args,
44*349cc55cSDimitry Andric                                      const char *LinkingOutput) const {
45*349cc55cSDimitry Andric   claimNoWarnArgs(Args);
46*349cc55cSDimitry Andric   if (Inputs.size() != 1)
47*349cc55cSDimitry Andric     llvm_unreachable("Invalid number of input files.");
48*349cc55cSDimitry Andric   constructTranslateCommand(C, *this, JA, Output, Inputs[0], {});
49*349cc55cSDimitry Andric }
50