Implement printing to file in codegen_backend.print

This commit is contained in:
David Tolnay 2023-07-16 22:33:38 -07:00
parent 5a60660ff8
commit c80cbe4bae
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
4 changed files with 33 additions and 14 deletions

View File

@ -262,10 +262,10 @@ impl CodegenBackend for LlvmCodegenBackend {
|tcx, ()| llvm_util::global_llvm_features(tcx.sess, true) |tcx, ()| llvm_util::global_llvm_features(tcx.sess, true)
} }
fn print(&self, req: &PrintRequest, sess: &Session) { fn print(&self, req: &PrintRequest, out: &mut dyn PrintBackendInfo, sess: &Session) {
match req.kind { match req.kind {
PrintKind::RelocationModels => { PrintKind::RelocationModels => {
println!("Available relocation models:"); writeln!(out, "Available relocation models:");
for name in &[ for name in &[
"static", "static",
"pic", "pic",
@ -276,26 +276,27 @@ impl CodegenBackend for LlvmCodegenBackend {
"ropi-rwpi", "ropi-rwpi",
"default", "default",
] { ] {
println!(" {}", name); writeln!(out, " {}", name);
} }
println!(); writeln!(out);
} }
PrintKind::CodeModels => { PrintKind::CodeModels => {
println!("Available code models:"); writeln!(out, "Available code models:");
for name in &["tiny", "small", "kernel", "medium", "large"] { for name in &["tiny", "small", "kernel", "medium", "large"] {
println!(" {}", name); writeln!(out, " {}", name);
} }
println!(); writeln!(out);
} }
PrintKind::TlsModels => { PrintKind::TlsModels => {
println!("Available TLS models:"); writeln!(out, "Available TLS models:");
for name in &["global-dynamic", "local-dynamic", "initial-exec", "local-exec"] { for name in &["global-dynamic", "local-dynamic", "initial-exec", "local-exec"] {
println!(" {}", name); writeln!(out, " {}", name);
} }
println!(); writeln!(out);
} }
PrintKind::StackProtectorStrategies => { PrintKind::StackProtectorStrategies => {
println!( writeln!(
out,
r#"Available stack protector strategies: r#"Available stack protector strategies:
all all
Generate stack canaries in all functions. Generate stack canaries in all functions.

View File

@ -23,6 +23,8 @@ use rustc_span::symbol::Symbol;
use rustc_target::abi::call::FnAbi; use rustc_target::abi::call::FnAbi;
use rustc_target::spec::Target; use rustc_target::spec::Target;
use std::fmt;
pub trait BackendTypes { pub trait BackendTypes {
type Value: CodegenObject; type Value: CodegenObject;
type Function: CodegenObject; type Function: CodegenObject;
@ -61,7 +63,7 @@ pub trait CodegenBackend {
fn locale_resource(&self) -> &'static str; fn locale_resource(&self) -> &'static str;
fn init(&self, _sess: &Session) {} fn init(&self, _sess: &Session) {}
fn print(&self, _req: &PrintRequest, _sess: &Session) {} fn print(&self, _req: &PrintRequest, _out: &mut dyn PrintBackendInfo, _sess: &Session) {}
fn target_features(&self, _sess: &Session, _allow_unstable: bool) -> Vec<Symbol> { fn target_features(&self, _sess: &Session, _allow_unstable: bool) -> Vec<Symbol> {
vec![] vec![]
} }
@ -162,3 +164,19 @@ pub trait ExtraBackendMethods:
std::thread::Builder::new().name(name).spawn(f) std::thread::Builder::new().name(name).spawn(f)
} }
} }
pub trait PrintBackendInfo {
fn infallible_write_fmt(&mut self, args: fmt::Arguments<'_>);
}
impl PrintBackendInfo for String {
fn infallible_write_fmt(&mut self, args: fmt::Arguments<'_>) {
fmt::Write::write_fmt(self, args).unwrap();
}
}
impl dyn PrintBackendInfo + '_ {
pub fn write_fmt(&mut self, args: fmt::Arguments<'_>) {
self.infallible_write_fmt(args);
}
}

View File

@ -30,7 +30,7 @@ mod write;
pub use self::abi::AbiBuilderMethods; pub use self::abi::AbiBuilderMethods;
pub use self::asm::{AsmBuilderMethods, AsmMethods, GlobalAsmOperandRef, InlineAsmOperandRef}; pub use self::asm::{AsmBuilderMethods, AsmMethods, GlobalAsmOperandRef, InlineAsmOperandRef};
pub use self::backend::{Backend, BackendTypes, CodegenBackend, ExtraBackendMethods}; pub use self::backend::{Backend, BackendTypes, CodegenBackend, ExtraBackendMethods, PrintBackendInfo};
pub use self::builder::{BuilderMethods, OverflowOp}; pub use self::builder::{BuilderMethods, OverflowOp};
pub use self::consts::ConstMethods; pub use self::consts::ConstMethods;
pub use self::coverageinfo::CoverageInfoBuilderMethods; pub use self::coverageinfo::CoverageInfoBuilderMethods;

View File

@ -834,7 +834,7 @@ fn print_crate_info(
| TargetCPUs | TargetCPUs
| StackProtectorStrategies | StackProtectorStrategies
| TargetFeatures => { | TargetFeatures => {
codegen_backend.print(req, sess); codegen_backend.print(req, &mut crate_info, sess);
} }
// Any output here interferes with Cargo's parsing of other printed output // Any output here interferes with Cargo's parsing of other printed output
NativeStaticLibs => {} NativeStaticLibs => {}