(
sess: &Session,
cg_args: &CodegenArgs,
spv_binary: Vec<u32>,
filename: &Path,
options: spirv_tools::opt::Options,
)
| 287 | } |
| 288 | |
| 289 | fn 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) => { |
no test coverage detected