|
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