diff options
| author | bjorn3 <bjorn3@users.noreply.github.com> | 2020-12-14 12:52:41 +0100 |
|---|---|---|
| committer | bjorn3 <bjorn3@users.noreply.github.com> | 2020-12-14 12:54:18 +0100 |
| commit | 44b331047dd5ab70d2e1e8671aeb8ee799a3b38d (patch) | |
| tree | b60a79faa3ad03e5ac9b6a0b2b5cb4c95a4345d1 | |
| parent | cd21269ae0b3c9f516b0322b522255da03afcc76 (diff) | |
| download | rust-44b331047dd5ab70d2e1e8671aeb8ee799a3b38d.tar.gz rust-44b331047dd5ab70d2e1e8671aeb8ee799a3b38d.zip | |
Also emit vcode when emitting clif ir while using new style backends
| -rw-r--r-- | src/base.rs | 10 | ||||
| -rw-r--r-- | src/pretty_clif.rs | 96 |
2 files changed, 64 insertions, 42 deletions
diff --git a/src/base.rs b/src/base.rs index 3af4897b4f0..5ba992d9372 100644 --- a/src/base.rs +++ b/src/base.rs @@ -118,6 +118,8 @@ pub(crate) fn codegen_fn<'tcx>( context.eliminate_unreachable_code(cx.module.isa()).unwrap(); context.dce(cx.module.isa()).unwrap(); + context.want_disasm = crate::pretty_clif::should_write_ir(tcx); + // Define function let module = &mut cx.module; tcx.sess.time("define function", || { @@ -140,6 +142,14 @@ pub(crate) fn codegen_fn<'tcx>( &clif_comments, ); + if let Some(mach_compile_result) = &context.mach_compile_result { + if let Some(disasm) = &mach_compile_result.disasm { + crate::pretty_clif::write_ir_file(tcx, &format!("{}.vcode", tcx.symbol_name(instance).name), |file| { + file.write_all(disasm.as_bytes()) + }) + } + } + // Define debuginfo for function let isa = cx.module.isa(); let debug_context = &mut cx.debug_context; diff --git a/src/pretty_clif.rs b/src/pretty_clif.rs index a9f060e51d8..1d17157a876 100644 --- a/src/pretty_clif.rs +++ b/src/pretty_clif.rs @@ -53,6 +53,7 @@ //! ``` use std::fmt; +use std::io::Write; use cranelift_codegen::{ entity::SecondaryMap, @@ -200,32 +201,24 @@ impl<M: Module> FunctionCx<'_, '_, M> { } } -pub(crate) fn write_clif_file<'tcx>( - tcx: TyCtxt<'tcx>, - postfix: &str, - isa: Option<&dyn cranelift_codegen::isa::TargetIsa>, - instance: Instance<'tcx>, - context: &cranelift_codegen::Context, - mut clif_comments: &CommentWriter, -) { - use std::io::Write; - - if !cfg!(debug_assertions) - && !tcx +pub(crate) fn should_write_ir(tcx: TyCtxt<'_>) -> bool { + cfg!(debug_assertions) + || tcx .sess .opts .output_types .contains_key(&OutputType::LlvmAssembly) - { +} + +pub(crate) fn write_ir_file<'tcx>( + tcx: TyCtxt<'tcx>, + name: &str, + write: impl FnOnce(&mut dyn Write) -> std::io::Result<()>, +) { + if !should_write_ir(tcx) { return; } - let value_ranges = isa.map(|isa| { - context - .build_value_labels_ranges(isa) - .expect("value location ranges") - }); - let clif_output_dir = tcx.output_filenames(LOCAL_CRATE).with_extension("clif"); match std::fs::create_dir(&clif_output_dir) { @@ -234,39 +227,58 @@ pub(crate) fn write_clif_file<'tcx>( res @ Err(_) => res.unwrap(), } - let clif_file_name = clif_output_dir.join(format!( + let clif_file_name = clif_output_dir.join(name); + + let res: std::io::Result<()> = try { + let mut file = std::fs::File::create(clif_file_name)?; + write(&mut file)?; + }; + if let Err(err) = res { + tcx.sess.warn(&format!("error writing ir file: {}", err)); + } +} + +pub(crate) fn write_clif_file<'tcx>( + tcx: TyCtxt<'tcx>, + postfix: &str, + isa: Option<&dyn cranelift_codegen::isa::TargetIsa>, + instance: Instance<'tcx>, + context: &cranelift_codegen::Context, + mut clif_comments: &CommentWriter, +) { + write_ir_file(tcx, &format!( "{}.{}.clif", tcx.symbol_name(instance).name, postfix - )); + ), |file| { + let value_ranges = isa.map(|isa| { + context + .build_value_labels_ranges(isa) + .expect("value location ranges") + }); - let mut clif = String::new(); - cranelift_codegen::write::decorate_function( - &mut clif_comments, - &mut clif, - &context.func, - &DisplayFunctionAnnotations { - isa: Some(&*crate::build_isa( - tcx.sess, true, /* PIC doesn't matter here */ - )), - value_ranges: value_ranges.as_ref(), - }, - ) - .unwrap(); + let mut clif = String::new(); + cranelift_codegen::write::decorate_function( + &mut clif_comments, + &mut clif, + &context.func, + &DisplayFunctionAnnotations { + isa: Some(&*crate::build_isa( + tcx.sess, true, /* PIC doesn't matter here */ + )), + value_ranges: value_ranges.as_ref(), + }, + ) + .unwrap(); - let res: std::io::Result<()> = try { - let mut file = std::fs::File::create(clif_file_name)?; - let target_triple = crate::target_triple(tcx.sess); writeln!(file, "test compile")?; writeln!(file, "set is_pic")?; writeln!(file, "set enable_simd")?; - writeln!(file, "target {} haswell", target_triple)?; + writeln!(file, "target {} haswell", crate::target_triple(tcx.sess))?; writeln!(file)?; file.write_all(clif.as_bytes())?; - }; - if let Err(err) = res { - tcx.sess.warn(&format!("err writing clif file: {}", err)); - } + Ok(()) + }); } impl<M: Module> fmt::Debug for FunctionCx<'_, '_, M> { |
