MCPcopy Create free account
hub / github.com/Rust-GPU/rust-gpu / do_spirv_opt

Function do_spirv_opt

crates/rustc_codegen_spirv/src/link.rs:289–354  ·  view source on GitHub ↗
(
    sess: &Session,
    cg_args: &CodegenArgs,
    spv_binary: Vec<u32>,
    filename: &Path,
    options: spirv_tools::opt::Options,
)

Source from the content-addressed store, hash-verified

287}
288
289fn do_spirv_opt(
290 sess: &Session,
291 cg_args: &CodegenArgs,
292 spv_binary: Vec<u32>,
293 filename: &Path,
294 options: spirv_tools::opt::Options,
295) -> Vec<u32> {
296 use spirv_tools::{
297 error,
298 opt::{self, Optimizer},
299 };
300
301 let mut optimizer = opt::create(sess.target.options.env.parse().ok());
302
303 match sess.opts.optimize {
304 OptLevel::No => {}
305 OptLevel::Less | OptLevel::Default | OptLevel::Aggressive => {
306 optimizer.register_performance_passes();
307 }
308 OptLevel::Size | OptLevel::SizeMin => {
309 optimizer.register_size_passes();
310 }
311 }
312
313 if sess.opts.debuginfo == DebugInfo::None && cg_args.spirv_metadata == SpirvMetadata::None {
314 optimizer
315 .register_pass(opt::Passes::EliminateDeadConstant)
316 .register_pass(opt::Passes::StripDebugInfo);
317 }
318
319 let result = optimizer.optimize(
320 &spv_binary,
321 &mut |msg: error::Message| {
322 use error::MessageLevel as Level;
323
324 // TODO: Adds spans here? Not sure how useful with binary, but maybe?
325
326 let mut err = match msg.level {
327 Level::Fatal | Level::InternalError => {
328 // FIXME(eddyb) this was `struct_fatal` but that doesn't seem
329 // necessary and also lacks `.forget_guarantee()`.
330 sess.struct_err(msg.message).forget_guarantee()
331 }
332 Level::Error => sess.struct_err(msg.message).forget_guarantee(),
333 Level::Warning => sess.struct_warn(msg.message),
334 Level::Info | Level::Debug => sess.struct_note_without_error(msg.message),
335 };
336
337 err.note(format!("module `{}`", filename.display()));
338 err.emit();
339 },
340 Some(options),
341 );
342
343 match result {
344 Ok(spirv_tools::binary::Binary::OwnedU32(words)) => words,
345 Ok(binary) => binary.as_words().to_vec(),
346 Err(e) => {

Callers 1

post_link_single_moduleFunction · 0.85

Calls 5

optimizeMethod · 0.80
struct_errMethod · 0.80
noteMethod · 0.80
parseMethod · 0.45
emitMethod · 0.45

Tested by

no test coverage detected