Implement printing to file in codegen_backend.print
This commit is contained in:
parent
5a60660ff8
commit
c80cbe4bae
@ -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.
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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 => {}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user