67 lines · plain
1; RUN: opt < %s -passes=asan -S | FileCheck %s2; AddressSanitizer must insert __asan_handle_no_return3; 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() noreturn10 11; Instrument noreturn callsites (regardless of function)12define i32 @Call1() sanitize_address {13 call void @NormalFunc() noreturn14 unreachable15}16; CHECK-LABEL: @Call117; CHECK-NEXT: call void @__asan_handle_no_return18; CHECK-NEXT: call void @NormalFunc19 20; Instrument calls to noreturn functions (regardless of callsite)21define i32 @Call2() sanitize_address {22 call void @NoReturnFunc()23 unreachable24}25; CHECK-LABEL: @Call226; CHECK-NEXT: call void @__asan_handle_no_return27; CHECK-NEXT: call void @NoReturnFunc28 29; Do *not* instrument callsites marked !nosanitize30define i32 @Call3() sanitize_address {31 call void @NoReturnFunc() noreturn, !nosanitize !{}32 unreachable33}34; CHECK-LABEL: @Call335; CHECK-NOT: call void @__asan_handle_no_return36; CHECK: call void @NoReturnFunc37 38; Do *not* instrument functions without ASan39define i32 @Call4() {40 call void @NoReturnFunc() noreturn41 unreachable42}43; CHECK-LABEL: @Call444; CHECK-NOT: call void @__asan_handle_no_return45; CHECK: call void @NoReturnFunc46 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 %lpad53 54invoke.cont:55 ret i64 056 57lpad:58 %0 = landingpad { ptr, i32 }59 filter [0 x ptr] zeroinitializer60 ret i64 161}62; CHECK-LABEL: @Invoke163; CHECK: call void @__asan_handle_no_return64; CHECK-NEXT: invoke void @NoReturnFunc65; CHECK: ret i64 066; CHECK: ret i64 167