1; Test -sanitizer-coverage-experimental-tracing 2 3; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=3 -sanitizer-coverage-trace-pc -S | FileCheck %s --check-prefix=CHECK_PC 4; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=3 -sanitizer-coverage-trace-pc-guard -S | FileCheck %s --check-prefix=CHECK_PC_GUARD 5; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=3 -sanitizer-coverage-trace-pc-guard -S -mtriple=x86_64-apple-macosx | FileCheck %s --check-prefix=CHECK_PC_GUARD_DARWIN 6 7target 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" 8target triple = "x86_64-unknown-linux-gnu" 9define void @foo(i32* %a) sanitize_address { 10entry: 11 %tobool = icmp eq i32* %a, null 12 br i1 %tobool, label %if.end, label %if.then 13 14 if.then: ; preds = %entry 15 store i32 0, i32* %a, align 4 16 br label %if.end 17 18 if.end: ; preds = %entry, %if.then 19 ret void 20} 21 22define available_externally void @external_bar(i32* %a) sanitize_address { 23entry: 24 ret void 25} 26 27declare void @longjmp(i8*) noreturn 28 29; We expect three coverage points here for each BB. 30define void @cond_longjmp(i1 %cond, i8* %jmp_buf) sanitize_address { 31entry: 32 br i1 %cond, label %lj, label %done 33done: 34 ret void 35lj: 36 call void @longjmp(i8* %jmp_buf) 37 unreachable 38} 39 40 41; CHECK_PC-LABEL: define void @foo 42; CHECK_PC: call void @__sanitizer_cov_trace_pc 43; CHECK_PC: call void @__sanitizer_cov_trace_pc 44; CHECK_PC: call void @__sanitizer_cov_trace_pc 45; CHECK_PC-NOT: call void @__sanitizer_cov_trace_pc 46; CHECK_PC: ret void 47; CHECK_PC-NOT: call void @__sanitizer_cov_module_init 48; CHECK_PC-LABEL: @cond_longjmp 49; CHECK_PC: call void @__sanitizer_cov_trace_pc 50; CHECK_PC: call void @__sanitizer_cov_trace_pc 51; CHECK_PC: ret void 52; CHECK_PC: call void @__sanitizer_cov_trace_pc 53; CHECK_PC: call void @longjmp 54; CHECK_PC: unreachable 55 56; CHECK_PC_GUARD: section "__sancov_guards", comdat($foo), align 4 57; CHECK_PC_GUARD-LABEL: define void @foo 58; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard 59; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard 60; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard 61; CHECK_PC_GUARD-NOT: call void @__sanitizer_cov_trace_pc 62; CHECK_PC_GUARD: ret void 63; CHECK_PC_GUARD-LABEL: @external_bar 64; CHECK_PC_GUARD-NOT: call void @__sanitizer_cov_trace_pc 65; CHECK_PC_GUARD: ret void 66; CHECK_PC_GUARD-LABEL: @cond_longjmp 67; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard 68; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard 69; CHECK_PC_GUARD: ret void 70; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard 71; CHECK_PC_GUARD: call void @longjmp 72; CHECK_PC_GUARD: unreachable 73 74; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard_init(i32* @__start___sancov_guards, i32* @__stop___sancov_guards) 75 76; CHECK_PC_GUARD_DARWIN-LABEL: define void @foo 77; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard 78; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard 79; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard 80; CHECK_PC_GUARD_DARWIN-NOT: call void @__sanitizer_cov_trace_pc 81; CHECK_PC_GUARD_DARWIN: ret void 82; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard_init(i32* @"\01section$start$__DATA$__sancov_guards", i32* @"\01section$end$__DATA$__sancov_guards") 83