xref: /llvm-project/llvm/test/Instrumentation/AddressSanitizer/instrument-no-return.ll (revision 855fe35064674c4601ea9c659a015cacdcec9f63)
1; RUN: opt < %s -passes=asan -S | FileCheck %s
2; AddressSanitizer must insert __asan_handle_no_return
3; before noreturn calls that aren't inserted by sanitizers.
4
5target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
6target triple = "x86_64-unknown-linux-gnu"
7
8declare void @NormalFunc()
9declare void @NoReturnFunc() noreturn
10
11; Instrument noreturn callsites (regardless of function)
12define i32 @Call1() sanitize_address {
13  call void @NormalFunc() noreturn
14  unreachable
15}
16; CHECK-LABEL:  @Call1
17; CHECK-NEXT:   call void @__asan_handle_no_return
18; CHECK-NEXT:   call void @NormalFunc
19
20; Instrument calls to noreturn functions (regardless of callsite)
21define i32 @Call2() sanitize_address {
22  call void @NoReturnFunc()
23  unreachable
24}
25; CHECK-LABEL:  @Call2
26; CHECK-NEXT:   call void @__asan_handle_no_return
27; CHECK-NEXT:   call void @NoReturnFunc
28
29; Do *not* instrument callsites marked !nosanitize
30define i32 @Call3() sanitize_address {
31  call void @NoReturnFunc() noreturn, !nosanitize !{}
32  unreachable
33}
34; CHECK-LABEL:  @Call3
35; CHECK-NOT:    call void @__asan_handle_no_return
36; CHECK:        call void @NoReturnFunc
37
38; Do *not* instrument functions without ASan
39define i32 @Call4() {
40  call void @NoReturnFunc() noreturn
41  unreachable
42}
43; CHECK-LABEL:  @Call4
44; CHECK-NOT:    call void @__asan_handle_no_return
45; CHECK:        call void @NoReturnFunc
46
47declare i32 @__gxx_personality_v0(...)
48
49define i64 @Invoke1() nounwind uwtable ssp sanitize_address personality ptr @__gxx_personality_v0 {
50entry:
51  invoke void @NoReturnFunc()
52          to label %invoke.cont unwind label %lpad
53
54invoke.cont:
55  ret i64 0
56
57lpad:
58  %0 = landingpad { ptr, i32 }
59          filter [0 x ptr] zeroinitializer
60  ret i64 1
61}
62; CHECK-LABEL:  @Invoke1
63; CHECK:        call void @__asan_handle_no_return
64; CHECK-NEXT:   invoke void @NoReturnFunc
65; CHECK: ret i64 0
66; CHECK: ret i64 1
67