|
18 | 18 | include!("../dylib_util.rs"); |
19 | 19 |
|
20 | 20 | use std::env; |
| 21 | +use std::ffi::OsStr; |
21 | 22 | use std::path::PathBuf; |
22 | 23 | use std::process::{Child, Command}; |
23 | 24 | use std::str::FromStr; |
@@ -70,6 +71,46 @@ fn main() { |
70 | 71 | cmd.arg("-Ztime-passes"); |
71 | 72 | } |
72 | 73 | } |
| 74 | + |
| 75 | + if let Some(crate_targets) = env::var_os("RUSTC_EMIT") { |
| 76 | + let formats: Vec<&str> = crate_targets |
| 77 | + .to_str() |
| 78 | + .unwrap() |
| 79 | + .split(';') |
| 80 | + .filter_map(|target| { |
| 81 | + let mut iter = target.split('='); |
| 82 | + let krate = iter.next().unwrap(); |
| 83 | + let formats = iter.next().unwrap(); |
| 84 | + assert!(iter.next().is_none(), "Invalid format for RUSTC_EMIT"); |
| 85 | + (krate.trim() == crate_name || krate.trim() == "*").then_some(formats) |
| 86 | + }) |
| 87 | + .flat_map(|formats| formats.split(',').map(|format| format.trim())) |
| 88 | + .collect(); |
| 89 | + |
| 90 | + if !formats.is_empty() { |
| 91 | + let dir = PathBuf::from( |
| 92 | + env::var_os("RUSTC_EMIT_DIR").expect("RUSTC_EMIT_DIR was not set"), |
| 93 | + ); |
| 94 | + std::fs::create_dir_all(&dir).expect("unable to create dump directory"); |
| 95 | + |
| 96 | + for format in formats { |
| 97 | + let ext = match format { |
| 98 | + "llvm-ir" => "ll", |
| 99 | + "llvm-bc" => "bc", |
| 100 | + "asm" => { |
| 101 | + if target.map_or(false, |target| target.starts_with("x86")) { |
| 102 | + cmd.arg("-Cllvm-args=-x86-asm-syntax=intel"); |
| 103 | + } |
| 104 | + "s" |
| 105 | + } |
| 106 | + _ => format, |
| 107 | + }; |
| 108 | + let mut arg = OsStr::new(&format!("--emit={format}=")).to_owned(); |
| 109 | + arg.push(dir.join(format!("{crate_name}.{ext}")).as_os_str()); |
| 110 | + cmd.arg(arg); |
| 111 | + } |
| 112 | + } |
| 113 | + } |
73 | 114 | } |
74 | 115 |
|
75 | 116 | // Print backtrace in case of ICE |
|
0 commit comments