Skip to content

Commit 9dd4fd7

Browse files
[Instrumentation] Do not request sanitizers for naked functions
Sanitizers instrumentation may be incompatible with naked functions, which lack of standard prologue/epilogue.
1 parent 331b451 commit 9dd4fd7

File tree

5 files changed

+31
-41
lines changed

5 files changed

+31
-41
lines changed

llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2960,6 +2960,10 @@ bool AddressSanitizer::instrumentFunction(Function &F,
29602960

29612961
bool FunctionModified = false;
29622962

2963+
// Do not apply any instrumentation for naked functions.
2964+
if (F.hasFnAttribute(Attribute::Naked))
2965+
return FunctionModified;
2966+
29632967
// If needed, insert __asan_init before checking for SanitizeAddress attr.
29642968
// This function needs to be called even if the function body is not
29652969
// instrumented.

llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,6 +1598,10 @@ void HWAddressSanitizer::sanitizeFunction(Function &F,
15981598
if (&F == HwasanCtorFunction)
15991599
return;
16001600

1601+
// Do not apply any instrumentation for naked functions.
1602+
if (F.hasFnAttribute(Attribute::Naked))
1603+
return;
1604+
16011605
if (!F.hasFnAttribute(Attribute::SanitizeHWAddress))
16021606
return;
16031607

llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@ bool SanitizerBinaryMetadata::run() {
258258
void SanitizerBinaryMetadata::runOn(Function &F, MetadataInfoSet &MIS) {
259259
if (F.empty())
260260
return;
261+
// Do not apply any instrumentation for naked functions.
262+
if (F.hasFnAttribute(Attribute::Naked))
263+
return;
261264
if (F.hasFnAttribute(Attribute::DisableSanitizerInstrumentation))
262265
return;
263266
if (Ignorelist && Ignorelist->inSection("metadata", "fun", F.getName()))

llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,9 @@ void ModuleSanitizerCoverage::instrumentFunction(Function &F) {
629629
return;
630630
if (Blocklist && Blocklist->inSection("coverage", "fun", F.getName()))
631631
return;
632+
// Do not apply any instrumentation for naked functions.
633+
if (F.hasFnAttribute(Attribute::Naked))
634+
return;
632635
if (F.hasFnAttribute(Attribute::NoSanitizeCoverage))
633636
return;
634637
if (F.hasFnAttribute(Attribute::DisableSanitizerInstrumentation))

llvm/test/Instrumentation/sanitizers-naked.ll

Lines changed: 17 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -11,85 +11,65 @@
1111
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
1212
target triple = "x86_64-unknown-linux-gnu"
1313

14-
define void @naked_function(ptr byval(i32) %p) {
14+
define void @naked_function(ptr byval(i32) %p) naked {
1515
; CHECK-ASAN-LABEL: define void @naked_function(
16-
; CHECK-ASAN-SAME: ptr byval(i32) [[P:%.*]]) {
16+
; CHECK-ASAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR0:[0-9]+]] {
1717
; CHECK-ASAN-NEXT: call void asm sideeffect "nop", ""()
1818
; CHECK-ASAN-NEXT: unreachable
1919
;
2020
; CHECK-TSAN-LABEL: define void @naked_function(
21-
; CHECK-TSAN-SAME: ptr byval(i32) [[P:%.*]]) personality ptr @__gcc_personality_v0 {
22-
; CHECK-TSAN-NEXT: [[TMP1:%.*]] = call ptr @llvm.returnaddress(i32 0)
23-
; CHECK-TSAN-NEXT: call void @__tsan_func_entry(ptr [[TMP1]])
24-
; CHECK-TSAN-NEXT: invoke void asm sideeffect "nop", ""()
25-
; CHECK-TSAN-NEXT: to [[DOTNOEXC:label %.*]] unwind label %[[TSAN_CLEANUP:.*]]
26-
; CHECK-TSAN: [[_NOEXC:.*:]]
21+
; CHECK-TSAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR0:[0-9]+]] {
22+
; CHECK-TSAN-NEXT: call void asm sideeffect "nop", ""()
2723
; CHECK-TSAN-NEXT: unreachable
28-
; CHECK-TSAN: [[TSAN_CLEANUP]]:
29-
; CHECK-TSAN-NEXT: [[CLEANUP_LPAD:%.*]] = landingpad { ptr, i32 }
30-
; CHECK-TSAN-NEXT: cleanup
31-
; CHECK-TSAN-NEXT: call void @__tsan_func_exit()
32-
; CHECK-TSAN-NEXT: resume { ptr, i32 } [[CLEANUP_LPAD]]
3324
;
3425
; CHECK-MSAN-LABEL: define void @naked_function(
35-
; CHECK-MSAN-SAME: ptr byval(i32) [[P:%.*]]) {
26+
; CHECK-MSAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR0:[0-9]+]] {
3627
; CHECK-MSAN-NEXT: call void @llvm.donothing()
3728
; CHECK-MSAN-NEXT: call void asm sideeffect "nop", ""()
3829
; CHECK-MSAN-NEXT: unreachable
3930
;
4031
; CHECK-HWASAN-LABEL: define void @naked_function(
41-
; CHECK-HWASAN-SAME: ptr byval(i32) [[P:%.*]]) {
32+
; CHECK-HWASAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR0:[0-9]+]] {
4233
; CHECK-HWASAN-NEXT: call void asm sideeffect "nop", ""()
4334
; CHECK-HWASAN-NEXT: unreachable
4435
;
4536
; CHECK-SANCOV-LABEL: define void @naked_function(
46-
; CHECK-SANCOV-SAME: ptr byval(i32) [[P:%.*]]) {
37+
; CHECK-SANCOV-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR0:[0-9]+]] {
4738
; CHECK-SANCOV-NEXT: call void asm sideeffect "nop", ""()
4839
; CHECK-SANCOV-NEXT: unreachable
4940
;
5041
; CHECK-SANMD-LABEL: define void @naked_function(
51-
; CHECK-SANMD-SAME: ptr byval(i32) [[P:%.*]]) !pcsections [[META0:![0-9]+]] {
42+
; CHECK-SANMD-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR0:[0-9]+]] {
5243
; CHECK-SANMD-NEXT: call void asm sideeffect "nop", ""()
5344
; CHECK-SANMD-NEXT: unreachable
5445
;
5546
call void asm sideeffect "nop", ""()
5647
unreachable
5748
}
5849

59-
define void @naked_function_with_asan(ptr byval(i32) %p) sanitize_address {
50+
define void @naked_function_with_asan(ptr byval(i32) %p) sanitize_address naked {
6051
; CHECK-ASAN-LABEL: define void @naked_function_with_asan(
61-
; CHECK-ASAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR0:[0-9]+]] {
62-
; CHECK-ASAN-NEXT: [[P_BYVAL:%.*]] = alloca i32, align 4
63-
; CHECK-ASAN-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[P_BYVAL]], ptr align 4 [[P]], i64 4, i1 false)
52+
; CHECK-ASAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR1:[0-9]+]] {
6453
; CHECK-ASAN-NEXT: call void asm sideeffect "nop", ""()
6554
; CHECK-ASAN-NEXT: unreachable
6655
;
6756
call void asm sideeffect "nop", ""()
6857
unreachable
6958
}
7059

71-
define void @naked_function_with_tsan(ptr byval(i32) %p) sanitize_thread {
60+
define void @naked_function_with_tsan(ptr byval(i32) %p) sanitize_thread naked {
7261
; CHECK-TSAN-LABEL: define void @naked_function_with_tsan(
73-
; CHECK-TSAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR1:[0-9]+]] personality ptr @__gcc_personality_v0 {
74-
; CHECK-TSAN-NEXT: [[TMP1:%.*]] = call ptr @llvm.returnaddress(i32 0)
75-
; CHECK-TSAN-NEXT: call void @__tsan_func_entry(ptr [[TMP1]])
76-
; CHECK-TSAN-NEXT: invoke void asm sideeffect "nop", ""()
77-
; CHECK-TSAN-NEXT: to [[DOTNOEXC:label %.*]] unwind label %[[TSAN_CLEANUP:.*]]
78-
; CHECK-TSAN: [[_NOEXC:.*:]]
62+
; CHECK-TSAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR2:[0-9]+]] {
63+
; CHECK-TSAN-NEXT: call void asm sideeffect "nop", ""()
7964
; CHECK-TSAN-NEXT: unreachable
80-
; CHECK-TSAN: [[TSAN_CLEANUP]]:
81-
; CHECK-TSAN-NEXT: [[CLEANUP_LPAD:%.*]] = landingpad { ptr, i32 }
82-
; CHECK-TSAN-NEXT: cleanup
83-
; CHECK-TSAN-NEXT: call void @__tsan_func_exit()
84-
; CHECK-TSAN-NEXT: resume { ptr, i32 } [[CLEANUP_LPAD]]
8565
;
8666
call void asm sideeffect "nop", ""()
8767
unreachable
8868
}
8969

90-
define void @naked_function_with_msan(ptr byval(i32) %p) sanitize_memory {
70+
define void @naked_function_with_msan(ptr byval(i32) %p) sanitize_memory naked {
9171
; CHECK-MSAN-LABEL: define void @naked_function_with_msan(
92-
; CHECK-MSAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR2:[0-9]+]] {
72+
; CHECK-MSAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR3:[0-9]+]] {
9373
; CHECK-MSAN-NEXT: call void @llvm.donothing()
9474
; CHECK-MSAN-NEXT: call void asm sideeffect "nop", ""()
9575
; CHECK-MSAN-NEXT: unreachable
@@ -98,16 +78,12 @@ define void @naked_function_with_msan(ptr byval(i32) %p) sanitize_memory {
9878
unreachable
9979
}
10080

101-
define void @naked_function_with_hwasan(ptr byval(i32) %p) sanitize_hwaddress {
81+
define void @naked_function_with_hwasan(ptr byval(i32) %p) sanitize_hwaddress naked {
10282
; CHECK-HWASAN-LABEL: define void @naked_function_with_hwasan(
103-
; CHECK-HWASAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR3:[0-9]+]] {
83+
; CHECK-HWASAN-SAME: ptr byval(i32) [[P:%.*]]) #[[ATTR4:[0-9]+]] personality ptr @__hwasan_personality_thunk {
10484
; CHECK-HWASAN-NEXT: call void asm sideeffect "nop", ""()
10585
; CHECK-HWASAN-NEXT: unreachable
10686
;
10787
call void asm sideeffect "nop", ""()
10888
unreachable
10989
}
110-
;.
111-
; CHECK-SANMD: [[META0]] = !{!"sanmd_covered2!C", [[META1:![0-9]+]]}
112-
; CHECK-SANMD: [[META1]] = !{i64 1}
113-
;.

0 commit comments

Comments
 (0)