mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Do not request sanitizers for naked functions
Naked functions can only contain inline asm, so any instrumentation inserted by sanitizers is illegal. Don't request it. Fixes https://github.com/rust-lang/rust/issues/129224.
This commit is contained in:
parent
9b82580c73
commit
54ebb9d489
@ -411,26 +411,31 @@ pub(crate) fn llfn_attrs_from_instance<'ll, 'tcx>(
|
|||||||
// the string "false". Now it is disabled by absence of the attribute.
|
// the string "false". Now it is disabled by absence of the attribute.
|
||||||
to_add.push(llvm::CreateAttrStringValue(cx.llcx, "branch-target-enforcement", "false"));
|
to_add.push(llvm::CreateAttrStringValue(cx.llcx, "branch-target-enforcement", "false"));
|
||||||
}
|
}
|
||||||
} else if llvm_util::get_version() >= (19, 0, 0) {
|
} else {
|
||||||
// For non-naked functions, set branch protection attributes on aarch64.
|
// Do not set sanitizer attributes for naked functions.
|
||||||
if let Some(BranchProtection { bti, pac_ret }) =
|
to_add.extend(sanitize_attrs(cx, codegen_fn_attrs.no_sanitize));
|
||||||
cx.sess().opts.unstable_opts.branch_protection
|
|
||||||
{
|
if llvm_util::get_version() >= (19, 0, 0) {
|
||||||
assert!(cx.sess().target.arch == "aarch64");
|
// For non-naked functions, set branch protection attributes on aarch64.
|
||||||
if bti {
|
if let Some(BranchProtection { bti, pac_ret }) =
|
||||||
to_add.push(llvm::CreateAttrString(cx.llcx, "branch-target-enforcement"));
|
cx.sess().opts.unstable_opts.branch_protection
|
||||||
}
|
{
|
||||||
if let Some(PacRet { leaf, key }) = pac_ret {
|
assert!(cx.sess().target.arch == "aarch64");
|
||||||
to_add.push(llvm::CreateAttrStringValue(
|
if bti {
|
||||||
cx.llcx,
|
to_add.push(llvm::CreateAttrString(cx.llcx, "branch-target-enforcement"));
|
||||||
"sign-return-address",
|
}
|
||||||
if leaf { "all" } else { "non-leaf" },
|
if let Some(PacRet { leaf, key }) = pac_ret {
|
||||||
));
|
to_add.push(llvm::CreateAttrStringValue(
|
||||||
to_add.push(llvm::CreateAttrStringValue(
|
cx.llcx,
|
||||||
cx.llcx,
|
"sign-return-address",
|
||||||
"sign-return-address-key",
|
if leaf { "all" } else { "non-leaf" },
|
||||||
if key == PAuthKey::A { "a_key" } else { "b_key" },
|
));
|
||||||
));
|
to_add.push(llvm::CreateAttrStringValue(
|
||||||
|
cx.llcx,
|
||||||
|
"sign-return-address-key",
|
||||||
|
if key == PAuthKey::A { "a_key" } else { "b_key" },
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -485,7 +490,6 @@ pub(crate) fn llfn_attrs_from_instance<'ll, 'tcx>(
|
|||||||
if let Some(backchain) = backchain_attr(cx) {
|
if let Some(backchain) = backchain_attr(cx) {
|
||||||
to_add.push(backchain);
|
to_add.push(backchain);
|
||||||
}
|
}
|
||||||
to_add.extend(sanitize_attrs(cx, codegen_fn_attrs.no_sanitize));
|
|
||||||
to_add.extend(patchable_function_entry_attrs(cx, codegen_fn_attrs.patchable_function_entry));
|
to_add.extend(patchable_function_entry_attrs(cx, codegen_fn_attrs.patchable_function_entry));
|
||||||
|
|
||||||
// Always annotate functions with the target-cpu they are compiled for.
|
// Always annotate functions with the target-cpu they are compiled for.
|
||||||
|
22
tests/codegen/naked-asan.rs
Normal file
22
tests/codegen/naked-asan.rs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// Make sure we do not request sanitizers for naked functions.
|
||||||
|
|
||||||
|
//@ only-x86_64
|
||||||
|
//@ needs-sanitizer-address
|
||||||
|
//@ compile-flags: -Zsanitizer=address -Ctarget-feature=-crt-static
|
||||||
|
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
#![no_std]
|
||||||
|
#![feature(abi_x86_interrupt, naked_functions)]
|
||||||
|
|
||||||
|
// CHECK: define x86_intrcc void @page_fault_handler(ptr {{.*}}%0, i64 {{.*}}%1){{.*}}#[[ATTRS:[0-9]+]] {
|
||||||
|
// CHECK-NOT: memcpy
|
||||||
|
#[naked]
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "x86-interrupt" fn page_fault_handler(_: u64, _: u64) {
|
||||||
|
unsafe {
|
||||||
|
core::arch::asm!("ud2", options(noreturn));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK: #[[ATTRS]] =
|
||||||
|
// CHECK-NOT: sanitize_address
|
Loading…
Reference in New Issue
Block a user