Auto merge of #102963 - ilammy:xray-basic, r=estebank
Add `-Z instrument-xray` flag Implement MCP https://github.com/rust-lang/compiler-team/issues/561, adding `-Z instrument-xray` flag which enables XRay instrumentation in LLVM.
This commit is contained in:
commit
a12d31d5a6
35 changed files with 312 additions and 9 deletions
|
@ -118,7 +118,8 @@ pub fn frame_pointer_type_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> Option<&'ll Attr
|
|||
|
||||
/// Tell LLVM what instrument function to insert.
|
||||
#[inline]
|
||||
fn instrument_function_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> Option<&'ll Attribute> {
|
||||
fn instrument_function_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> SmallVec<[&'ll Attribute; 4]> {
|
||||
let mut attrs = SmallVec::new();
|
||||
if cx.sess().opts.unstable_opts.instrument_mcount {
|
||||
// Similar to `clang -pg` behavior. Handled by the
|
||||
// `post-inline-ee-instrument` LLVM pass.
|
||||
|
@ -127,14 +128,41 @@ fn instrument_function_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> Option<&'ll Attribu
|
|||
// See test/CodeGen/mcount.c in clang.
|
||||
let mcount_name = cx.sess().target.mcount.as_ref();
|
||||
|
||||
Some(llvm::CreateAttrStringValue(
|
||||
attrs.push(llvm::CreateAttrStringValue(
|
||||
cx.llcx,
|
||||
"instrument-function-entry-inlined",
|
||||
&mcount_name,
|
||||
))
|
||||
} else {
|
||||
None
|
||||
));
|
||||
}
|
||||
if let Some(options) = &cx.sess().opts.unstable_opts.instrument_xray {
|
||||
// XRay instrumentation is similar to __cyg_profile_func_{enter,exit}.
|
||||
// Function prologue and epilogue are instrumented with NOP sleds,
|
||||
// a runtime library later replaces them with detours into tracing code.
|
||||
if options.always {
|
||||
attrs.push(llvm::CreateAttrStringValue(cx.llcx, "function-instrument", "xray-always"));
|
||||
}
|
||||
if options.never {
|
||||
attrs.push(llvm::CreateAttrStringValue(cx.llcx, "function-instrument", "xray-never"));
|
||||
}
|
||||
if options.ignore_loops {
|
||||
attrs.push(llvm::CreateAttrString(cx.llcx, "xray-ignore-loops"));
|
||||
}
|
||||
// LLVM will not choose the default for us, but rather requires specific
|
||||
// threshold in absence of "xray-always". Use the same default as Clang.
|
||||
let threshold = options.instruction_threshold.unwrap_or(200);
|
||||
attrs.push(llvm::CreateAttrStringValue(
|
||||
cx.llcx,
|
||||
"xray-instruction-threshold",
|
||||
&threshold.to_string(),
|
||||
));
|
||||
if options.skip_entry {
|
||||
attrs.push(llvm::CreateAttrString(cx.llcx, "xray-skip-entry"));
|
||||
}
|
||||
if options.skip_exit {
|
||||
attrs.push(llvm::CreateAttrString(cx.llcx, "xray-skip-exit"));
|
||||
}
|
||||
}
|
||||
attrs
|
||||
}
|
||||
|
||||
fn nojumptables_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> Option<&'ll Attribute> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue