Skip to content

Commit d6354da

Browse files
committed
Add a real assembler job that calls spirv-as
1 parent 998827f commit d6354da

File tree

3 files changed

+70
-11
lines changed

3 files changed

+70
-11
lines changed

clang/lib/Driver/ToolChains/SPIRV.cpp

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
5274
void 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+
6396
clang::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+
69108
clang::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
}

clang/lib/Driver/ToolChains/SPIRV.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ void constructTranslateCommand(Compilation &C, const Tool &T,
2222
const InputInfo &Input,
2323
const llvm::opt::ArgStringList &Args);
2424

25+
void constructAssembleCommand(Compilation &C, const Tool &T,
26+
const JobAction &JA, const InputInfo &Output,
27+
const InputInfo &Input,
28+
const llvm::opt::ArgStringList &Args);
29+
2530
class LLVM_LIBRARY_VISIBILITY Translator : public Tool {
2631
public:
2732
Translator(const ToolChain &TC)
@@ -47,13 +52,25 @@ class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {
4752
const char *LinkingOutput) const override;
4853
};
4954

55+
class LLVM_LIBRARY_VISIBILITY Assembler final : public Tool {
56+
public:
57+
Assembler(const ToolChain &TC) : Tool("SPIRV::Assembler", "spirv-as", TC) {}
58+
bool hasIntegratedAssembler() const override { return false; }
59+
bool hasIntegratedCPP() const override { return false; }
60+
void ConstructJob(Compilation &C, const JobAction &JA,
61+
const InputInfo &Output, const InputInfoList &Inputs,
62+
const llvm::opt::ArgList &TCArgs,
63+
const char *AssembleOutput) const override;
64+
};
65+
5066
} // namespace SPIRV
5167
} // namespace tools
5268

5369
namespace toolchains {
5470

5571
class LLVM_LIBRARY_VISIBILITY SPIRVToolChain final : public ToolChain {
5672
mutable std::unique_ptr<Tool> Translator;
73+
mutable std::unique_ptr<Tool> Assembler;
5774

5875
public:
5976
SPIRVToolChain(const Driver &D, const llvm::Triple &Triple,
@@ -81,6 +98,8 @@ class LLVM_LIBRARY_VISIBILITY SPIRVToolChain final : public ToolChain {
8198

8299
private:
83100
clang::driver::Tool *getTranslator() const;
101+
clang::driver::Tool *getAssembler() const;
102+
84103
bool NativeLLVMSupport;
85104
};
86105

clang/test/Driver/spirv-toolchain.cl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
// SPT64: "-cc1" "-triple" "spirv64"
3030
// SPT64-SAME: "-o" [[BC:".*bc"]]
31-
// SPT64: {{llvm-spirv.*"}} [[BC]] "-to-text" "-o" {{".*s"}}
31+
// SPT64: {{llvm-spirv.*"}} [[BC]] "--spirv-tools-dis" "-o" {{".*s"}}
3232

3333
// RUN: %clang -### --target=spirv32 -x cl -S %s 2>&1 | FileCheck --check-prefix=SPT32 %s
3434
// RUN: %clang -### --target=spirv32 -x ir -S %s 2>&1 | FileCheck --check-prefix=SPT32 %s
@@ -37,13 +37,13 @@
3737

3838
// SPT32: "-cc1" "-triple" "spirv32"
3939
// SPT32-SAME: "-o" [[BC:".*bc"]]
40-
// SPT32: {{llvm-spirv.*"}} [[BC]] "-to-text" "-o" {{".*s"}}
40+
// SPT32: {{llvm-spirv.*"}} [[BC]] "--spirv-tools-dis" "-o" {{".*s"}}
4141

4242
//-----------------------------------------------------------------------------
4343
// Check assembly input -> object output
4444
// RUN: %clang -### --target=spirv64 -x assembler -c %s 2>&1 | FileCheck --check-prefix=ASM %s
4545
// RUN: %clang -### --target=spirv32 -x assembler -c %s 2>&1 | FileCheck --check-prefix=ASM %s
46-
// ASM: {{llvm-spirv.*"}} {{".*"}} "-to-binary" "-o" {{".*o"}}
46+
// ASM: {{spirv-as.*"}} {{".*"}} "-o" {{".*o"}}
4747

4848
//-----------------------------------------------------------------------------
4949
// Check --save-temps.
@@ -55,8 +55,8 @@
5555
// TMP: "-cc1" "-triple" "spirv64"
5656
// TMP-SAME: "-o" [[BC:".*bc"]]
5757
// TMP-SAME: [[I]]
58-
// TMP: {{llvm-spirv.*"}} [[BC]] "-to-text" "-o" [[S:".*s"]]
59-
// TMP: {{llvm-spirv.*"}} [[S]] "-to-binary" "-o" {{".*o"}}
58+
// TMP: {{llvm-spirv.*"}} [[BC]] "--spirv-tools-dis" "-o" [[S:".*s"]]
59+
// TMP: {{spirv-as.*"}} [[S]] "-o" {{".*o"}}
6060

6161
//-----------------------------------------------------------------------------
6262
// Check linking when multiple input files are passed.

0 commit comments

Comments
 (0)