Skip to content

Commit 0784c92

Browse files
committed
Use assembler in tests
1 parent 5dcb068 commit 0784c92

File tree

3 files changed

+46
-61
lines changed

3 files changed

+46
-61
lines changed

rustc_codegen_spirv/Cargo.toml

+7-2
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,16 @@ tar = "0.4"
1919
thiserror = "1.0.20"
2020
topological-sort = "0.1"
2121

22+
[dependencies.spirv-tools]
23+
version = "0.1.0"
24+
path = "../spirv-tools"
25+
features = ["opt", "val"]
26+
2227
[dev-dependencies]
2328
pretty_assertions = "0.6"
2429
tempfile = "3.1"
2530

26-
[dependencies.spirv-tools]
31+
[dev-dependencies.spirv-tools]
2732
version = "0.1.0"
2833
path = "../spirv-tools"
29-
features = ["opt", "val"]
34+
features = ["as"]

rustc_codegen_spirv/src/linker/mod.rs

+10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ pub enum LinkerError {
3333
import_type: String,
3434
export_type: String,
3535
},
36+
#[error("spirv-tools error {:#}", .0)]
37+
#[cfg(test)]
38+
SpirvTool(spirv_tools::Error),
39+
}
40+
41+
#[cfg(test)]
42+
impl From<spirv_tools::Error> for LinkerError {
43+
fn from(err: spirv_tools::Error) -> Self {
44+
Self::SpirvTool(err)
45+
}
3646
}
3747

3848
pub type Result<T> = std::result::Result<T, LinkerError>;

rustc_codegen_spirv/src/linker/test.rs

+29-59
Original file line numberDiff line numberDiff line change
@@ -12,54 +12,24 @@ impl<'a> std::fmt::Debug for PrettyString<'a> {
1212
}
1313
}
1414

15-
fn assemble_spirv(spirv: &str) -> Vec<u8> {
16-
use std::process::Command;
17-
use tempfile::tempdir;
15+
fn assemble_spirv(spirv: &str) -> Result<Vec<u8>> {
16+
use spirv_tools::assembler;
1817

19-
let temp = tempdir().expect("Unable to create temp dir");
20-
let input = temp.path().join("code.txt");
21-
let output = temp.path().join("code.spv");
18+
let assembler = assembler::Assembler::new(spirv_tools::default_target_env());
2219

23-
std::fs::write(&input, spirv).unwrap();
20+
let spv_binary = assembler.assemble(spirv, assembler::AssemblerOptions::default())?;
2421

25-
let process = Command::new("spirv-as")
26-
.arg(input.to_str().unwrap())
27-
.arg("-o")
28-
.arg(output.to_str().unwrap())
29-
.output()
30-
.expect("failed to execute process");
31-
32-
println!("status: {}", process.status);
33-
println!("stdout: {}", String::from_utf8_lossy(&process.stdout));
34-
println!("stderr: {}", String::from_utf8_lossy(&process.stderr));
35-
36-
assert!(process.status.success());
37-
38-
std::fs::read(&output).unwrap()
22+
let contents: &[u8] = spv_binary.as_ref();
23+
Ok(contents.to_vec())
3924
}
4025

4126
#[allow(unused)]
4227
fn validate(spirv: &[u32]) {
43-
use std::process::Command;
44-
use tempfile::tempdir;
45-
46-
let temp = tempdir().expect("Unable to create temp dir");
47-
let input = temp.path().join("code.spv");
48-
49-
let spirv = unsafe { std::slice::from_raw_parts(spirv.as_ptr() as *const u8, spirv.len() * 4) };
50-
51-
std::fs::write(&input, spirv).unwrap();
52-
53-
let process = Command::new("spirv-val.exe")
54-
.arg(input.to_str().unwrap())
55-
.output()
56-
.expect("failed to execute process");
28+
let validator = spirv_tools::val::Validator::new(spirv_tools::default_target_env());
5729

58-
println!("status: {}", process.status);
59-
println!("stdout: {}", String::from_utf8_lossy(&process.stdout));
60-
println!("stderr: {}", String::from_utf8_lossy(&process.stderr));
61-
62-
assert!(process.status.success());
30+
validator
31+
.validate(spirv, &spirv_tools::val::ValidatorOptions::default())
32+
.expect("validation error occurred");
6333
}
6434

6535
fn load(bytes: &[u8]) -> Module {
@@ -126,7 +96,7 @@ fn standard() -> Result<()> {
12696
%2 = OpTypeFloat 32
12797
%1 = OpVariable %2 Uniform
12898
%3 = OpVariable %2 Input"#,
129-
);
99+
)?;
130100

131101
let b = assemble_spirv(
132102
r#"OpCapability Linkage
@@ -135,7 +105,7 @@ fn standard() -> Result<()> {
135105
%3 = OpConstant %2 42
136106
%1 = OpVariable %2 Uniform %3
137107
"#,
138-
);
108+
)?;
139109

140110
let result = assemble_and_link(&[&a, &b])?;
141111
let expect = r#"OpModuleProcessed "Linked by rspirv-linker"
@@ -155,7 +125,7 @@ fn not_a_lib_extra_exports() -> Result<()> {
155125
OpDecorate %1 LinkageAttributes "foo" Export
156126
%2 = OpTypeFloat 32
157127
%1 = OpVariable %2 Uniform"#,
158-
);
128+
)?;
159129

160130
let result = assemble_and_link(&[&a])?;
161131
let expect = r#"OpModuleProcessed "Linked by rspirv-linker"
@@ -194,9 +164,9 @@ fn unresolved_symbol() -> Result<()> {
194164
OpDecorate %1 LinkageAttributes "foo" Import
195165
%2 = OpTypeFloat 32
196166
%1 = OpVariable %2 Uniform"#,
197-
);
167+
)?;
198168

199-
let b = assemble_spirv("OpCapability Linkage");
169+
let b = assemble_spirv("OpCapability Linkage")?;
200170

201171
let result = assemble_and_link(&[&a, &b]);
202172

@@ -216,7 +186,7 @@ fn type_mismatch() -> Result<()> {
216186
%2 = OpTypeFloat 32
217187
%1 = OpVariable %2 Uniform
218188
%3 = OpVariable %2 Input"#,
219-
);
189+
)?;
220190

221191
let b = assemble_spirv(
222192
r#"OpCapability Linkage
@@ -225,7 +195,7 @@ fn type_mismatch() -> Result<()> {
225195
%3 = OpConstant %2 42
226196
%1 = OpVariable %2 Uniform %3
227197
"#,
228-
);
198+
)?;
229199

230200
let result = assemble_and_link(&[&a, &b]);
231201
assert_eq!(
@@ -247,7 +217,7 @@ fn multiple_definitions() -> Result<()> {
247217
%2 = OpTypeFloat 32
248218
%1 = OpVariable %2 Uniform
249219
%3 = OpVariable %2 Input"#,
250-
);
220+
)?;
251221

252222
let b = assemble_spirv(
253223
r#"OpCapability Linkage
@@ -256,15 +226,15 @@ fn multiple_definitions() -> Result<()> {
256226
%2 = OpTypeFloat 32
257227
%3 = OpConstant %2 42
258228
%1 = OpVariable %2 Uniform %3"#,
259-
);
229+
)?;
260230

261231
let c = assemble_spirv(
262232
r#"OpCapability Linkage
263233
OpDecorate %1 LinkageAttributes "foo" Export
264234
%2 = OpTypeFloat 32
265235
%3 = OpConstant %2 -1
266236
%1 = OpVariable %2 Uniform %3"#,
267-
);
237+
)?;
268238

269239
let result = assemble_and_link(&[&a, &b, &c]);
270240
assert_eq!(
@@ -282,7 +252,7 @@ fn multiple_definitions_different_types() -> Result<()> {
282252
%2 = OpTypeFloat 32
283253
%1 = OpVariable %2 Uniform
284254
%3 = OpVariable %2 Input"#,
285-
);
255+
)?;
286256

287257
let b = assemble_spirv(
288258
r#"OpCapability Linkage
@@ -291,15 +261,15 @@ fn multiple_definitions_different_types() -> Result<()> {
291261
%2 = OpTypeInt 32 0
292262
%3 = OpConstant %2 42
293263
%1 = OpVariable %2 Uniform %3"#,
294-
);
264+
)?;
295265

296266
let c = assemble_spirv(
297267
r#"OpCapability Linkage
298268
OpDecorate %1 LinkageAttributes "foo" Export
299269
%2 = OpTypeFloat 32
300270
%3 = OpConstant %2 12
301271
%1 = OpVariable %2 Uniform %3"#,
302-
);
272+
)?;
303273

304274
let result = assemble_and_link(&[&a, &b, &c]);
305275
assert_eq!(
@@ -348,7 +318,7 @@ fn func_ctrl() -> Result<()> {
348318
%5 = OpVariable %4 Uniform
349319
%1 = OpFunction %2 None %3
350320
OpFunctionEnd"#,
351-
);
321+
)?;
352322

353323
let b = assemble_spirv(
354324
r#"OpCapability Linkage
@@ -359,7 +329,7 @@ fn func_ctrl() -> Result<()> {
359329
%4 = OpLabel
360330
OpReturn
361331
OpFunctionEnd"#,
362-
);
332+
)?;
363333

364334
let result = assemble_and_link(&[&a, &b])?;
365335

@@ -396,7 +366,7 @@ fn use_exported_func_param_attr() -> Result<()> {
396366
%4 = OpFunctionParameter %6
397367
OpFunctionEnd
398368
"#,
399-
);
369+
)?;
400370

401371
let b = assemble_spirv(
402372
r#"OpCapability Kernel
@@ -412,7 +382,7 @@ fn use_exported_func_param_attr() -> Result<()> {
412382
OpReturn
413383
OpFunctionEnd
414384
"#,
415-
);
385+
)?;
416386

417387
let result = assemble_and_link(&[&a, &b])?;
418388

@@ -461,7 +431,7 @@ fn names_and_decorations() -> Result<()> {
461431
%4 = OpFunctionParameter %9
462432
OpFunctionEnd
463433
"#,
464-
);
434+
)?;
465435

466436
let b = assemble_spirv(
467437
r#"OpCapability Kernel
@@ -480,7 +450,7 @@ fn names_and_decorations() -> Result<()> {
480450
OpReturn
481451
OpFunctionEnd
482452
"#,
483-
);
453+
)?;
484454

485455
let result = assemble_and_link(&[&a, &b])?;
486456

0 commit comments

Comments
 (0)