mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
address feedback from nikic and oli-obk https://github.com/rust-lang/rust/pull/113723/files
use slice memcpy rather than strcpy and write it on stdout use println on failure Co-authored-by: Oli Scherer <github35764891676564198441@oli-obk.de>
This commit is contained in:
parent
4d307c4822
commit
c7bf20dfdc
@ -46,6 +46,7 @@ use rustc_span::symbol::Symbol;
|
||||
|
||||
use std::any::Any;
|
||||
use std::ffi::CStr;
|
||||
use std::io::Write;
|
||||
|
||||
mod back {
|
||||
pub mod archive;
|
||||
@ -177,32 +178,30 @@ impl WriteBackendMethods for LlvmCodegenBackend {
|
||||
type ThinData = back::lto::ThinData;
|
||||
type ThinBuffer = back::lto::ThinBuffer;
|
||||
fn print_pass_timings(&self) {
|
||||
let msg = unsafe {
|
||||
let cstr = llvm::LLVMRustPrintPassTimings();
|
||||
unsafe {
|
||||
let mut size = 0;
|
||||
let cstr = llvm::LLVMRustPrintPassTimings(&mut size as *mut usize);
|
||||
if cstr.is_null() {
|
||||
"failed to get pass timings".into()
|
||||
println!("failed to get pass timings");
|
||||
} else {
|
||||
let timings = CStr::from_ptr(cstr).to_bytes();
|
||||
let timings = String::from_utf8_lossy(timings).to_string();
|
||||
let timings = std::slice::from_raw_parts(cstr as *const u8, size);
|
||||
std::io::stdout().write_all(timings).unwrap();
|
||||
libc::free(cstr as *mut _);
|
||||
timings
|
||||
}
|
||||
};
|
||||
println!("{}", msg);
|
||||
}
|
||||
}
|
||||
fn print_statistics(&self) {
|
||||
let msg = unsafe {
|
||||
let cstr = llvm::LLVMRustPrintStatistics();
|
||||
unsafe {
|
||||
let mut size = 0;
|
||||
let cstr = llvm::LLVMRustPrintStatistics(&mut size as *mut usize);
|
||||
if cstr.is_null() {
|
||||
"failed to get stats".into()
|
||||
println!("failed to get pass stats");
|
||||
} else {
|
||||
let stats = CStr::from_ptr(cstr).to_bytes();
|
||||
let stats = String::from_utf8_lossy(stats).to_string();
|
||||
let stats = std::slice::from_raw_parts(cstr as *const u8, size);
|
||||
std::io::stdout().write_all(stats).unwrap();
|
||||
libc::free(cstr as *mut _);
|
||||
stats
|
||||
}
|
||||
};
|
||||
println!("{}", msg);
|
||||
}
|
||||
}
|
||||
fn run_link(
|
||||
cgcx: &CodegenContext<Self>,
|
||||
|
@ -1868,10 +1868,10 @@ extern "C" {
|
||||
pub fn LLVMRustGetLastError() -> *const c_char;
|
||||
|
||||
/// Print the pass timings since static dtors aren't picking them up.
|
||||
pub fn LLVMRustPrintPassTimings() -> *const c_char;
|
||||
pub fn LLVMRustPrintPassTimings(size: *const size_t) -> *const c_char;
|
||||
|
||||
/// Print the statistics since static dtors aren't picking them up.
|
||||
pub fn LLVMRustPrintStatistics() -> *const c_char;
|
||||
pub fn LLVMRustPrintStatistics(size: *const size_t) -> *const c_char;
|
||||
|
||||
pub fn LLVMStructCreateNamed(C: &Context, Name: *const c_char) -> &Type;
|
||||
|
||||
|
@ -112,23 +112,25 @@ extern "C" void LLVMRustSetNormalizedTarget(LLVMModuleRef M,
|
||||
unwrap(M)->setTargetTriple(Triple::normalize(Triple));
|
||||
}
|
||||
|
||||
extern "C" const char *LLVMRustPrintPassTimings(void) {
|
||||
extern "C" const char *LLVMRustPrintPassTimings(size_t *Len) {
|
||||
std::string buf;
|
||||
raw_string_ostream SS(buf);
|
||||
TimerGroup::printAll(SS);
|
||||
SS.flush();
|
||||
char* CStr = (char*) malloc((buf.length() + 1) * sizeof(char));
|
||||
strcpy(CStr, buf.c_str());
|
||||
*Len = buf.length();
|
||||
char *CStr = (char *)malloc(*Len);
|
||||
memcpy(CStr, buf.c_str(), *Len);
|
||||
return CStr;
|
||||
}
|
||||
|
||||
extern "C" const char *LLVMRustPrintStatistics(void) {
|
||||
extern "C" const char *LLVMRustPrintStatistics(size_t *Len) {
|
||||
std::string buf;
|
||||
raw_string_ostream SS(buf);
|
||||
llvm::PrintStatistics(SS);
|
||||
SS.flush();
|
||||
char* CStr = (char*) malloc((buf.length() + 1) * sizeof(char));
|
||||
strcpy(CStr, buf.c_str());
|
||||
*Len = buf.length();
|
||||
char *CStr = (char *)malloc(*Len);
|
||||
memcpy(CStr, buf.c_str(), *Len);
|
||||
return CStr;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user