123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- //===--- SPIRV.cpp - SPIR-V Tool Implementations ----------------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #include "SPIRV.h"
- #include "CommonArgs.h"
- #include "clang/Driver/Compilation.h"
- #include "clang/Driver/Driver.h"
- #include "clang/Driver/InputInfo.h"
- #include "clang/Driver/Options.h"
- using namespace clang::driver;
- using namespace clang::driver::toolchains;
- using namespace clang::driver::tools;
- using namespace llvm::opt;
- void SPIRV::constructTranslateCommand(Compilation &C, const Tool &T,
- const JobAction &JA,
- const InputInfo &Output,
- const InputInfo &Input,
- const llvm::opt::ArgStringList &Args) {
- llvm::opt::ArgStringList CmdArgs(Args);
- CmdArgs.push_back(Input.getFilename());
- if (Input.getType() == types::TY_PP_Asm)
- CmdArgs.push_back("-to-binary");
- if (Output.getType() == types::TY_PP_Asm)
- CmdArgs.push_back("--spirv-tools-dis");
- CmdArgs.append({"-o", Output.getFilename()});
- const char *Exec =
- C.getArgs().MakeArgString(T.getToolChain().GetProgramPath("llvm-spirv"));
- C.addCommand(std::make_unique<Command>(JA, T, ResponseFileSupport::None(),
- Exec, CmdArgs, Input, Output));
- }
- void SPIRV::Translator::ConstructJob(Compilation &C, const JobAction &JA,
- const InputInfo &Output,
- const InputInfoList &Inputs,
- const ArgList &Args,
- const char *LinkingOutput) const {
- claimNoWarnArgs(Args);
- if (Inputs.size() != 1)
- llvm_unreachable("Invalid number of input files.");
- constructTranslateCommand(C, *this, JA, Output, Inputs[0], {});
- }
- clang::driver::Tool *SPIRVToolChain::getTranslator() const {
- if (!Translator)
- Translator = std::make_unique<SPIRV::Translator>(*this);
- return Translator.get();
- }
- clang::driver::Tool *SPIRVToolChain::SelectTool(const JobAction &JA) const {
- Action::ActionClass AC = JA.getKind();
- return SPIRVToolChain::getTool(AC);
- }
- clang::driver::Tool *SPIRVToolChain::getTool(Action::ActionClass AC) const {
- switch (AC) {
- default:
- break;
- case Action::BackendJobClass:
- case Action::AssembleJobClass:
- return SPIRVToolChain::getTranslator();
- }
- return ToolChain::getTool(AC);
- }
- clang::driver::Tool *SPIRVToolChain::buildLinker() const {
- return new tools::SPIRV::Linker(*this);
- }
- void SPIRV::Linker::ConstructJob(Compilation &C, const JobAction &JA,
- const InputInfo &Output,
- const InputInfoList &Inputs,
- const ArgList &Args,
- const char *LinkingOutput) const {
- const ToolChain &ToolChain = getToolChain();
- std::string Linker = ToolChain.GetProgramPath(getShortName());
- ArgStringList CmdArgs;
- AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA);
- CmdArgs.push_back("-o");
- CmdArgs.push_back(Output.getFilename());
- C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
- Args.MakeArgString(Linker), CmdArgs,
- Inputs, Output));
- }
|