Add support for enabling the LLVM time-trace feature
I found this helpful while investigating an LLVM performance issue. Passing `-Z llvm-time-trace` causes a `llvm_timings.json` file to be created. This file can be inspected in either the Chrome Profiler tools or with any other compatible tool like SpeedScope. More information on the LLVM feature: - https://aras-p.info/blog/2019/01/16/time-trace-timeline-flame-chart-profiler-for-Clang/ - https://reviews.llvm.org/rL357340
This commit is contained in:
parent
cd1ef390e7
commit
f5f86be1d4
5 changed files with 48 additions and 0 deletions
|
@ -113,6 +113,15 @@ unsafe fn configure_llvm(sess: &Session) {
|
|||
}
|
||||
}
|
||||
|
||||
if sess.opts.debugging_opts.llvm_time_trace && get_major_version() >= 9 {
|
||||
// time-trace is not thread safe and running it in parallel will cause seg faults.
|
||||
if !sess.opts.debugging_opts.no_parallel_llvm {
|
||||
bug!("`-Z llvm-time-trace` requires `-Z no-parallel-llvm")
|
||||
}
|
||||
|
||||
llvm::LLVMTimeTraceProfilerInitialize();
|
||||
}
|
||||
|
||||
llvm::LLVMInitializePasses();
|
||||
|
||||
::rustc_llvm::initialize_available_targets();
|
||||
|
@ -120,6 +129,15 @@ unsafe fn configure_llvm(sess: &Session) {
|
|||
llvm::LLVMRustSetLLVMOptions(llvm_args.len() as c_int, llvm_args.as_ptr());
|
||||
}
|
||||
|
||||
pub fn time_trace_profiler_finish(file_name: &str) {
|
||||
unsafe {
|
||||
if get_major_version() >= 9 {
|
||||
let file_name = CString::new(file_name).unwrap();
|
||||
llvm::LLVMTimeTraceProfilerFinish(file_name.as_ptr());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// WARNING: the features after applying `to_llvm_feature` must be known
|
||||
// to LLVM or the feature detection code will walk past the end of the feature
|
||||
// array, leading to crashes.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue