Skip to content

Commit a76cf06

Browse files
authored
[HWASan] fix missing BTI attribute on personality function thunks (llvm#139138)
This used to work because the BTI attribute was taken from the module in the CodeGen. e15d67c changed that to actually look at the function attributes. This led to crashes for BTI, because we did not emit the proper landing pads for the thunk.
1 parent 948bffa commit a76cf06

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1847,6 +1847,12 @@ void HWAddressSanitizer::instrumentPersonalityFunctions() {
18471847
IsLocal ? GlobalValue::InternalLinkage
18481848
: GlobalValue::LinkOnceODRLinkage,
18491849
ThunkName, &M);
1850+
// TODO: think about other attributes as well.
1851+
if (any_of(P.second, [](const Function *F) {
1852+
return F->hasFnAttribute("branch-target-enforcement");
1853+
})) {
1854+
ThunkFn->addFnAttr("branch-target-enforcement");
1855+
}
18501856
if (!IsLocal) {
18511857
ThunkFn->setVisibility(GlobalValue::HiddenVisibility);
18521858
ThunkFn->setComdat(M.getOrInsertComdat(ThunkName));
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
; RUN: opt < %s -mtriple aarch64-linux-android29 -passes=hwasan -S | FileCheck %s --check-prefix=NOPERS
2+
; RUN: opt < %s -mtriple aarch64-linux-android30 -passes=hwasan -S | FileCheck %s --check-prefix=PERS
3+
4+
; NOPERS: define void @nostack() #{{[0-9]+}} {
5+
; PERS: define void @nostack() #{{[0-9]+}} {
6+
define void @nostack() sanitize_hwaddress "branch-target-enforcement" {
7+
ret void
8+
}
9+
10+
; NOPERS: define void @stack1() #{{[0-9]+}} {
11+
; PERS: personality {{.*}} @__hwasan_personality_thunk
12+
define void @stack1() sanitize_hwaddress "branch-target-enforcement" {
13+
%p = alloca i8
14+
call void @sink(ptr %p)
15+
ret void
16+
}
17+
18+
19+
; NOPERS: personality ptr @global
20+
; PERS: personality {{.*}} @__hwasan_personality_thunk.global
21+
define void @stack2() sanitize_hwaddress "branch-target-enforcement" personality ptr @global {
22+
%p = alloca i8
23+
call void @sink(ptr %p)
24+
ret void
25+
}
26+
27+
define internal void @local() {
28+
ret void
29+
}
30+
31+
@local_alias = internal alias void (), ptr @local
32+
33+
; NOPERS: personality ptr @local
34+
; PERS: personality {{.*}} @__hwasan_personality_thunk.local
35+
define void @stack3() sanitize_hwaddress "branch-target-enforcement" personality ptr @local {
36+
%p = alloca i8
37+
call void @sink(ptr %p)
38+
ret void
39+
}
40+
41+
; NOPERS: personality ptr @local_alias
42+
; PERS: personality {{.*}} @__hwasan_personality_thunk.local_alias
43+
define void @stack4() sanitize_hwaddress "branch-target-enforcement" personality ptr @local_alias {
44+
%p = alloca i8
45+
call void @sink(ptr %p)
46+
ret void
47+
}
48+
49+
; NOPERS: personality ptr inttoptr (i64 1 to ptr)
50+
; PERS: personality ptr @__hwasan_personality_thunk.
51+
define void @stack5() sanitize_hwaddress "branch-target-enforcement" personality ptr inttoptr (i64 1 to ptr) {
52+
%p = alloca i8
53+
call void @sink(ptr %p)
54+
ret void
55+
}
56+
57+
; NOPERS: personality ptr inttoptr (i64 2 to ptr)
58+
; PERS: personality ptr @__hwasan_personality_thunk..1
59+
define void @stack6() sanitize_hwaddress "branch-target-enforcement" personality ptr inttoptr (i64 2 to ptr) {
60+
%p = alloca i8
61+
call void @sink(ptr %p)
62+
ret void
63+
}
64+
65+
declare void @global()
66+
declare void @sink(ptr)
67+
68+
!llvm.module.flags = !{!0}
69+
!0 = !{i32 8, !"branch-target-enforcement", i32 1}
70+
71+
; PERS: define linkonce_odr hidden i32 @__hwasan_personality_thunk(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4) [[ATTRS:#[0-9]+]] comdat
72+
; PERS: %5 = tail call i32 @__hwasan_personality_wrapper(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4, ptr null, ptr @_Unwind_GetGR, ptr @_Unwind_GetCFA)
73+
; PERS: ret i32 %5
74+
75+
; PERS: define linkonce_odr hidden i32 @__hwasan_personality_thunk.global(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4) {{.*}}[[ATTRS]] comdat
76+
; PERS: %5 = tail call i32 @__hwasan_personality_wrapper(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4, ptr @global, ptr @_Unwind_GetGR, ptr @_Unwind_GetCFA)
77+
; PERS: ret i32 %5
78+
79+
; PERS: define internal i32 @__hwasan_personality_thunk.local(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4) {{.*}}[[ATTRS]]
80+
; PERS: %5 = tail call i32 @__hwasan_personality_wrapper(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4, ptr @local, ptr @_Unwind_GetGR, ptr @_Unwind_GetCFA)
81+
; PERS: ret i32 %5
82+
83+
; PERS: define internal i32 @__hwasan_personality_thunk.local_alias(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4) {{.*}}[[ATTRS]]
84+
; PERS: %5 = tail call i32 @__hwasan_personality_wrapper(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4, ptr @local_alias, ptr @_Unwind_GetGR, ptr @_Unwind_GetCFA)
85+
; PERS: ret i32 %5
86+
87+
; PERS: define internal i32 @__hwasan_personality_thunk.(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4) {{.*}}[[ATTRS]] {
88+
; PERS: %5 = tail call i32 @__hwasan_personality_wrapper(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4, ptr inttoptr (i64 1 to ptr), ptr @_Unwind_GetGR, ptr @_Unwind_GetCFA)
89+
; PERS: ret i32 %5
90+
91+
; PERS: define internal i32 @__hwasan_personality_thunk..1(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4) {{.*}}[[ATTRS]] {
92+
; PERS: %5 = tail call i32 @__hwasan_personality_wrapper(i32 %0, i32 %1, i64 %2, ptr %3, ptr %4, ptr inttoptr (i64 2 to ptr), ptr @_Unwind_GetGR, ptr @_Unwind_GetCFA)
93+
; PERS: ret i32 %5
94+
95+
; PERS: {{.*}}[[ATTRS]] = {{.*}}branch-target-enforcement

0 commit comments

Comments
 (0)