summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_codegen_llvm/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_codegen_llvm/src/lib.rs')
-rw-r--r--compiler/rustc_codegen_llvm/src/lib.rs77
1 files changed, 44 insertions, 33 deletions
diff --git a/compiler/rustc_codegen_llvm/src/lib.rs b/compiler/rustc_codegen_llvm/src/lib.rs
index 24ba28bbc..d283299ac 100644
--- a/compiler/rustc_codegen_llvm/src/lib.rs
+++ b/compiler/rustc_codegen_llvm/src/lib.rs
@@ -28,7 +28,7 @@ pub use llvm_util::target_features;
use rustc_ast::expand::allocator::AllocatorKind;
use rustc_codegen_ssa::back::lto::{LtoModuleCodegen, SerializedModule, ThinModule};
use rustc_codegen_ssa::back::write::{
- CodegenContext, FatLTOInput, ModuleConfig, TargetMachineFactoryConfig, TargetMachineFactoryFn,
+ CodegenContext, FatLtoInput, ModuleConfig, TargetMachineFactoryConfig, TargetMachineFactoryFn,
};
use rustc_codegen_ssa::traits::*;
use rustc_codegen_ssa::ModuleCodegen;
@@ -40,12 +40,13 @@ use rustc_metadata::EncodedMetadata;
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
use rustc_middle::query::Providers;
use rustc_middle::ty::TyCtxt;
-use rustc_session::config::{OptLevel, OutputFilenames, PrintRequest};
+use rustc_session::config::{OptLevel, OutputFilenames, PrintKind, PrintRequest};
use rustc_session::Session;
use rustc_span::symbol::Symbol;
use std::any::Any;
use std::ffi::CStr;
+use std::io::Write;
mod back {
pub mod archive;
@@ -140,18 +141,6 @@ impl ExtraBackendMethods for LlvmCodegenBackend {
back::write::target_machine_factory(sess, optlvl, target_features)
}
- fn spawn_thread<F, T>(time_trace: bool, f: F) -> std::thread::JoinHandle<T>
- where
- F: FnOnce() -> T,
- F: Send + 'static,
- T: Send + 'static,
- {
- std::thread::spawn(move || {
- let _profiler = TimeTraceProfiler::new(time_trace);
- f()
- })
- }
-
fn spawn_named_thread<F, T>(
time_trace: bool,
name: String,
@@ -178,7 +167,28 @@ impl WriteBackendMethods for LlvmCodegenBackend {
type ThinBuffer = back::lto::ThinBuffer;
fn print_pass_timings(&self) {
unsafe {
- llvm::LLVMRustPrintPassTimings();
+ let mut size = 0;
+ let cstr = llvm::LLVMRustPrintPassTimings(&mut size as *mut usize);
+ if cstr.is_null() {
+ println!("failed to get pass timings");
+ } else {
+ let timings = std::slice::from_raw_parts(cstr as *const u8, size);
+ std::io::stdout().write_all(timings).unwrap();
+ libc::free(cstr as *mut _);
+ }
+ }
+ }
+ fn print_statistics(&self) {
+ unsafe {
+ let mut size = 0;
+ let cstr = llvm::LLVMRustPrintStatistics(&mut size as *mut usize);
+ if cstr.is_null() {
+ println!("failed to get pass stats");
+ } else {
+ let stats = std::slice::from_raw_parts(cstr as *const u8, size);
+ std::io::stdout().write_all(stats).unwrap();
+ libc::free(cstr as *mut _);
+ }
}
}
fn run_link(
@@ -190,7 +200,7 @@ impl WriteBackendMethods for LlvmCodegenBackend {
}
fn run_fat_lto(
cgcx: &CodegenContext<Self>,
- modules: Vec<FatLTOInput<Self>>,
+ modules: Vec<FatLtoInput<Self>>,
cached_modules: Vec<(SerializedModule<Self::ModuleBuffer>, WorkProduct)>,
) -> Result<LtoModuleCodegen<Self>, FatalError> {
back::lto::run_fat(cgcx, modules, cached_modules)
@@ -262,10 +272,10 @@ impl CodegenBackend for LlvmCodegenBackend {
|tcx, ()| llvm_util::global_llvm_features(tcx.sess, true)
}
- fn print(&self, req: PrintRequest, sess: &Session) {
- match req {
- PrintRequest::RelocationModels => {
- println!("Available relocation models:");
+ fn print(&self, req: &PrintRequest, out: &mut dyn PrintBackendInfo, sess: &Session) {
+ match req.kind {
+ PrintKind::RelocationModels => {
+ writeln!(out, "Available relocation models:");
for name in &[
"static",
"pic",
@@ -276,26 +286,27 @@ impl CodegenBackend for LlvmCodegenBackend {
"ropi-rwpi",
"default",
] {
- println!(" {}", name);
+ writeln!(out, " {name}");
}
- println!();
+ writeln!(out);
}
- PrintRequest::CodeModels => {
- println!("Available code models:");
+ PrintKind::CodeModels => {
+ writeln!(out, "Available code models:");
for name in &["tiny", "small", "kernel", "medium", "large"] {
- println!(" {}", name);
+ writeln!(out, " {name}");
}
- println!();
+ writeln!(out);
}
- PrintRequest::TlsModels => {
- println!("Available TLS models:");
+ PrintKind::TlsModels => {
+ writeln!(out, "Available TLS models:");
for name in &["global-dynamic", "local-dynamic", "initial-exec", "local-exec"] {
- println!(" {}", name);
+ writeln!(out, " {name}");
}
- println!();
+ writeln!(out);
}
- PrintRequest::StackProtectorStrategies => {
- println!(
+ PrintKind::StackProtectorStrategies => {
+ writeln!(
+ out,
r#"Available stack protector strategies:
all
Generate stack canaries in all functions.
@@ -319,7 +330,7 @@ impl CodegenBackend for LlvmCodegenBackend {
"#
);
}
- req => llvm_util::print(req, sess),
+ _other => llvm_util::print(req, out, sess),
}
}