@@ -26,8 +26,8 @@ void SPIRV::constructTranslateCommand(Compilation &C, const Tool &T,
26
26
llvm::opt::ArgStringList CmdArgs (Args);
27
27
CmdArgs.push_back (Input.getFilename ());
28
28
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
+
31
31
if (Output.getType () == types::TY_PP_Asm)
32
32
CmdArgs.push_back (" --spirv-tools-dis" );
33
33
@@ -46,6 +46,31 @@ void SPIRV::constructTranslateCommand(Compilation &C, const Tool &T,
46
46
Exec, CmdArgs, Input, Output));
47
47
}
48
48
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
+
49
74
void SPIRV::Translator::ConstructJob (Compilation &C, const JobAction &JA,
50
75
const InputInfo &Output,
51
76
const InputInfoList &Inputs,
@@ -57,12 +82,29 @@ void SPIRV::Translator::ConstructJob(Compilation &C, const JobAction &JA,
57
82
constructTranslateCommand (C, *this , JA, Output, Inputs[0 ], {});
58
83
}
59
84
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
+
60
96
clang::driver::Tool *SPIRVToolChain::getTranslator () const {
61
97
if (!Translator)
62
98
Translator = std::make_unique<SPIRV::Translator>(*this );
63
99
return Translator.get ();
64
100
}
65
101
102
+ clang::driver::Tool *SPIRVToolChain::getAssembler () const {
103
+ if (!Assembler)
104
+ Assembler = std::make_unique<SPIRV::Assembler>(*this );
105
+ return Assembler.get ();
106
+ }
107
+
66
108
clang::driver::Tool *SPIRVToolChain::SelectTool (const JobAction &JA) const {
67
109
Action::ActionClass AC = JA.getKind ();
68
110
return SPIRVToolChain::getTool (AC);
@@ -73,8 +115,9 @@ clang::driver::Tool *SPIRVToolChain::getTool(Action::ActionClass AC) const {
73
115
default :
74
116
break ;
75
117
case Action::BackendJobClass:
76
- case Action::AssembleJobClass:
77
118
return SPIRVToolChain::getTranslator ();
119
+ case Action::AssembleJobClass:
120
+ return SPIRVToolChain::getAssembler ();
78
121
}
79
122
return ToolChain::getTool (AC);
80
123
}
0 commit comments