Emit basic XRay instrumentation attributes
Add the attributes to functions according to the settings. "xray-always" overrides "xray-never", and they both override "xray-ignore-loops" and "xray-instruction-threshold", but we'll let lints deal with warnings about silly attribute combinations.
This commit is contained in:
parent
b3cadd2dcf
commit
bac15db1d0
@ -134,6 +134,34 @@ fn instrument_function_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> SmallVec<[&'ll Attr
|
|||||||
&mcount_name,
|
&mcount_name,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
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
|
attrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user