]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc_codegen_llvm/llvm_util.rs
Rollup merge of #69477 - Pulkit07:issue69298, r=cramertj
[rust.git] / src / librustc_codegen_llvm / llvm_util.rs
index 4823fe10c463fee932a7b86b3a1acd4b1497f935..6d3498f8b800b90680f8a0ee852e3c9f50d2c596 100644 (file)
@@ -113,6 +113,15 @@ fn llvm_arg_to_arg_name(full_arg: &str) -> &str {
         }
     }
 
+    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 @@ fn llvm_arg_to_arg_name(full_arg: &str) -> &str {
     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.