@@ -26,13 +26,10 @@ 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" );
3130
32- // The text output from spirv-dis is not in the format expected
33- // by llvm-spirv, so use the text output from llvm-spirv.
3431 if (Output.getType () == types::TY_PP_Asm)
35- CmdArgs.push_back (" -to-text " );
32+ CmdArgs.push_back (" --spirv-tools-dis " );
3633
3734 CmdArgs.append ({" -o" , Output.getFilename ()});
3835
@@ -49,6 +46,31 @@ void SPIRV::constructTranslateCommand(Compilation &C, const Tool &T,
4946 Exec, CmdArgs, Input, Output));
5047}
5148
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+
5274void SPIRV::Translator::ConstructJob (Compilation &C, const JobAction &JA,
5375 const InputInfo &Output,
5476 const InputInfoList &Inputs,
@@ -60,12 +82,29 @@ void SPIRV::Translator::ConstructJob(Compilation &C, const JobAction &JA,
6082 constructTranslateCommand (C, *this , JA, Output, Inputs[0 ], {});
6183}
6284
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+
6396clang::driver::Tool *SPIRVToolChain::getTranslator () const {
6497 if (!Translator)
6598 Translator = std::make_unique<SPIRV::Translator>(*this );
6699 return Translator.get ();
67100}
68101
102+ clang::driver::Tool *SPIRVToolChain::getAssembler () const {
103+ if (!Assembler)
104+ Assembler = std::make_unique<SPIRV::Assembler>(*this );
105+ return Assembler.get ();
106+ }
107+
69108clang::driver::Tool *SPIRVToolChain::SelectTool (const JobAction &JA) const {
70109 Action::ActionClass AC = JA.getKind ();
71110 return SPIRVToolChain::getTool (AC);
@@ -76,8 +115,9 @@ clang::driver::Tool *SPIRVToolChain::getTool(Action::ActionClass AC) const {
76115 default :
77116 break ;
78117 case Action::BackendJobClass:
79- case Action::AssembleJobClass:
80118 return SPIRVToolChain::getTranslator ();
119+ case Action::AssembleJobClass:
120+ return SPIRVToolChain::getAssembler ();
81121 }
82122 return ToolChain::getTool (AC);
83123}
0 commit comments