@@ -26,8 +26,8 @@ void SPIRV::constructTranslateCommand(Compilation &C, const Tool &T,
2626 llvm::opt::ArgStringList CmdArgs (Args);
2727 CmdArgs.push_back (Input.getFilename ());
2828
29- if (Input.getType () == types::TY_PP_Asm)
30- CmdArgs. push_back ( " -to-binary " );
29+ assert (Input.getType () != types::TY_PP_Asm && " Unexpected input type " );
30+
3131 if (Output.getType () == types::TY_PP_Asm)
3232 CmdArgs.push_back (" --spirv-tools-dis" );
3333
@@ -46,6 +46,31 @@ void SPIRV::constructTranslateCommand(Compilation &C, const Tool &T,
4646 Exec, CmdArgs, Input, Output));
4747}
4848
49+ void SPIRV::constructAssembleCommand (Compilation &C, const Tool &T,
50+ const JobAction &JA,
51+ const InputInfo &Output,
52+ const InputInfo &Input,
53+ const llvm::opt::ArgStringList &Args) {
54+ llvm::opt::ArgStringList CmdArgs (Args);
55+ CmdArgs.push_back (Input.getFilename ());
56+
57+ assert (Input.getType () == types::TY_PP_Asm && " Unexpected input type" );
58+
59+ CmdArgs.append ({" -o" , Output.getFilename ()});
60+
61+ // Try to find "spirv-as-<LLVM_VERSION_MAJOR>". Otherwise, fall back to
62+ // plain "spirv-as".
63+ using namespace std ::string_literals;
64+ auto VersionedTool = " spirv-as-" s + std::to_string (LLVM_VERSION_MAJOR);
65+ std::string ExeCand = T.getToolChain ().GetProgramPath (VersionedTool.c_str ());
66+ if (!llvm::sys::fs::can_execute (ExeCand))
67+ ExeCand = T.getToolChain ().GetProgramPath (" spirv-as" );
68+
69+ const char *Exec = C.getArgs ().MakeArgString (ExeCand);
70+ C.addCommand (std::make_unique<Command>(JA, T, ResponseFileSupport::None (),
71+ Exec, CmdArgs, Input, Output));
72+ }
73+
4974void SPIRV::Translator::ConstructJob (Compilation &C, const JobAction &JA,
5075 const InputInfo &Output,
5176 const InputInfoList &Inputs,
@@ -57,12 +82,29 @@ void SPIRV::Translator::ConstructJob(Compilation &C, const JobAction &JA,
5782 constructTranslateCommand (C, *this , JA, Output, Inputs[0 ], {});
5883}
5984
85+ void SPIRV::Assembler::ConstructJob (Compilation &C, const JobAction &JA,
86+ const InputInfo &Output,
87+ const InputInfoList &Inputs,
88+ const ArgList &Args,
89+ const char *AssembleOutput) const {
90+ claimNoWarnArgs (Args);
91+ if (Inputs.size () != 1 )
92+ llvm_unreachable (" Invalid number of input files." );
93+ constructAssembleCommand (C, *this , JA, Output, Inputs[0 ], {});
94+ }
95+
6096clang::driver::Tool *SPIRVToolChain::getTranslator () const {
6197 if (!Translator)
6298 Translator = std::make_unique<SPIRV::Translator>(*this );
6399 return Translator.get ();
64100}
65101
102+ clang::driver::Tool *SPIRVToolChain::getAssembler () const {
103+ if (!Assembler)
104+ Assembler = std::make_unique<SPIRV::Assembler>(*this );
105+ return Assembler.get ();
106+ }
107+
66108clang::driver::Tool *SPIRVToolChain::SelectTool (const JobAction &JA) const {
67109 Action::ActionClass AC = JA.getKind ();
68110 return SPIRVToolChain::getTool (AC);
@@ -73,8 +115,9 @@ clang::driver::Tool *SPIRVToolChain::getTool(Action::ActionClass AC) const {
73115 default :
74116 break ;
75117 case Action::BackendJobClass:
76- case Action::AssembleJobClass:
77118 return SPIRVToolChain::getTranslator ();
119+ case Action::AssembleJobClass:
120+ return SPIRVToolChain::getAssembler ();
78121 }
79122 return ToolChain::getTool (AC);
80123}
0 commit comments