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