diff options
Diffstat (limited to 'test/Instrumentation/SanitizerCoverage')
4 files changed, 264 insertions, 0 deletions
diff --git a/test/Instrumentation/SanitizerCoverage/coverage-dbg.ll b/test/Instrumentation/SanitizerCoverage/coverage-dbg.ll new file mode 100644 index 0000000..eea93b8 --- /dev/null +++ b/test/Instrumentation/SanitizerCoverage/coverage-dbg.ll @@ -0,0 +1,67 @@ +; Test that coverage instrumentation does not lose debug location. + +; RUN: opt < %s -sancov -sanitizer-coverage-level=1 -S | FileCheck %s + +; C++ source: +; 1: struct A { +; 2: int f(); +; 3: int x; +; 4: }; +; 5: +; 6: int A::f() { +; 7: return x; +; 8: } +; clang++ ../1.cc -O3 -g -S -emit-llvm -fno-strict-aliasing +; and add sanitize_address to @_ZN1A1fEv + +; Test that __sanitizer_cov call has !dbg pointing to the opening { of A::f(). +; CHECK: call void @__sanitizer_cov(), !dbg [[A:!.*]] +; CHECK: [[A]] = metadata !{i32 6, i32 0, metadata !{{.*}}, null} + + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +%struct.A = type { i32 } + +; Function Attrs: nounwind readonly uwtable +define i32 @_ZN1A1fEv(%struct.A* nocapture readonly %this) #0 align 2 { +entry: + tail call void @llvm.dbg.value(metadata !{%struct.A* %this}, i64 0, metadata !15, metadata !{metadata !"0x102"}), !dbg !20 + %x = getelementptr inbounds %struct.A* %this, i64 0, i32 0, !dbg !21 + %0 = load i32* %x, align 4, !dbg !21 + ret i32 %0, !dbg !21 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1 + +attributes #0 = { sanitize_address nounwind readonly uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!17, !18} +!llvm.ident = !{!19} + +!0 = metadata !{metadata !"0x11\004\00clang version 3.5.0 (210251)\001\00\000\00\001", metadata !1, metadata !2, metadata !3, metadata !12, metadata !2, metadata !2} ; [ DW_TAG_compile_unit ] [/code/llvm/build0/../1.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"../1.cc", metadata !"/code/llvm/build0"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !"0x13\00A\001\0032\0032\000\000\000", metadata !1, null, null, metadata !5, null, null, metadata !"_ZTS1A"} ; [ DW_TAG_structure_type ] [A] [line 1, size 32, align 32, offset 0] [def] [from ] +!5 = metadata !{metadata !6, metadata !8} +!6 = metadata !{metadata !"0xd\00x\003\0032\0032\000\000", metadata !1, metadata !"_ZTS1A", metadata !7} ; [ DW_TAG_member ] [x] [line 3, size 32, align 32, offset 0] [from int] +!7 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!8 = metadata !{metadata !"0x2e\00f\00f\00_ZN1A1fEv\002\000\000\000\006\00256\001\002", metadata !1, metadata !"_ZTS1A", metadata !9, null, null, null, i32 0, null} ; [ DW_TAG_subprogram ] [line 2] [f] +!9 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", i32 0, null, null, metadata !10, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!10 = metadata !{metadata !7, metadata !11} +!11 = metadata !{metadata !"0xf\00\000\0064\0064\000\001088", null, null, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1A] +!12 = metadata !{metadata !13} +!13 = metadata !{metadata !"0x2e\00f\00f\00_ZN1A1fEv\006\000\001\000\006\00256\001\006", metadata !1, metadata !"_ZTS1A", metadata !9, null, i32 (%struct.A*)* @_ZN1A1fEv, null, metadata !8, metadata !14} ; [ DW_TAG_subprogram ] [line 6] [def] [f] +!14 = metadata !{metadata !15} +!15 = metadata !{metadata !"0x101\00this\0016777216\001088", metadata !13, null, metadata !16} ; [ DW_TAG_arg_variable ] [this] [line 0] +!16 = metadata !{metadata !"0xf\00\000\0064\0064\000\000", null, null, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1A] +!17 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!18 = metadata !{i32 2, metadata !"Debug Info Version", i32 2} +!19 = metadata !{metadata !"clang version 3.5.0 (210251)"} +!20 = metadata !{i32 0, i32 0, metadata !13, null} +!21 = metadata !{i32 7, i32 0, metadata !13, null} diff --git a/test/Instrumentation/SanitizerCoverage/coverage.ll b/test/Instrumentation/SanitizerCoverage/coverage.ll new file mode 100644 index 0000000..da0498d --- /dev/null +++ b/test/Instrumentation/SanitizerCoverage/coverage.ll @@ -0,0 +1,89 @@ +; RUN: opt < %s -sancov -sanitizer-coverage-level=0 -S | FileCheck %s --check-prefix=CHECK0 +; RUN: opt < %s -sancov -sanitizer-coverage-level=1 -S | FileCheck %s --check-prefix=CHECK1 +; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -S | FileCheck %s --check-prefix=CHECK2 +; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-block-threshold=10 -S | FileCheck %s --check-prefix=CHECK2 +; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-block-threshold=1 -S | FileCheck %s --check-prefix=CHECK1 +; RUN: opt < %s -sancov -sanitizer-coverage-level=3 -sanitizer-coverage-block-threshold=10 -S | FileCheck %s --check-prefix=CHECK3 +; RUN: opt < %s -sancov -sanitizer-coverage-level=4 -S | FileCheck %s --check-prefix=CHECK4 + +; RUN: opt < %s -sancov -sanitizer-coverage-level=0 -S | FileCheck %s --check-prefix=CHECK0 +; RUN: opt < %s -sancov -sanitizer-coverage-level=1 -S | FileCheck %s --check-prefix=CHECK1 +; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -S | FileCheck %s --check-prefix=CHECK2 +; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-block-threshold=10 \ +; RUN: -S | FileCheck %s --check-prefix=CHECK2 +; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-block-threshold=1 \ +; RUN: -S | FileCheck %s --check-prefix=CHECK1 + +target 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" +target triple = "x86_64-unknown-linux-gnu" +define void @foo(i32* %a) sanitize_address { +entry: + %tobool = icmp eq i32* %a, null + br i1 %tobool, label %if.end, label %if.then + + if.then: ; preds = %entry + store i32 0, i32* %a, align 4 + br label %if.end + + if.end: ; preds = %entry, %if.then + ret void +} + +; CHECK0-NOT: call void @__sanitizer_cov( +; CHECK0-NOT: call void @__sanitizer_cov_module_init( + +; CHECK1-LABEL: define void @foo +; CHECK1: %0 = load atomic i8* @__sancov_gen_cov_foo monotonic, align 1 +; CHECK1: %1 = icmp eq i8 0, %0 +; CHECK1: br i1 %1, label %2, label %3 +; CHECK1: call void @__sanitizer_cov +; CHECK1-NOT: call void @__sanitizer_cov +; CHECK1: store atomic i8 1, i8* @__sancov_gen_cov_foo monotonic, align 1 + +; CHECK1-LABEL: define internal void @sancov.module_ctor +; CHECK1-NOT: ret +; CHECK1: call void @__sanitizer_cov_module_init(i64 2) +; CHECK1: ret + + +; CHECK2-LABEL: define void @foo +; CHECK2: call void @__sanitizer_cov +; CHECK2: call void @__sanitizer_cov +; CHECK2: call void @__sanitizer_cov +; CHECK2-NOT: call void @__sanitizer_cov +; CHECK2: ret void + +; CHECK2-LABEL: define internal void @sancov.module_ctor +; CHECK2-NOT: ret +; CHECK2: call void @__sanitizer_cov_module_init(i64 4) +; CHECK2: ret + +; CHECK3-LABEL: define void @foo +; CHECK3: call void @__sanitizer_cov +; CHECK3: call void @__sanitizer_cov +; CHECK3: call void @__sanitizer_cov +; CHECK3-NOT: ret void +; CHECK3: call void @__sanitizer_cov +; CHECK3-NOT: call void @__sanitizer_cov +; CHECK3: ret void + + +%struct.StructWithVptr = type { i32 (...)** } + +define void @CallViaVptr(%struct.StructWithVptr* %foo) uwtable sanitize_address { +entry: + %0 = bitcast %struct.StructWithVptr* %foo to void (%struct.StructWithVptr*)*** + %vtable = load void (%struct.StructWithVptr*)*** %0, align 8 + %1 = load void (%struct.StructWithVptr*)** %vtable, align 8 + tail call void %1(%struct.StructWithVptr* %foo) + tail call void %1(%struct.StructWithVptr* %foo) + tail call void asm sideeffect "", ""() + ret void +} + +; We expect to see two calls to __sanitizer_cov_indir_call16 +; with different values of second argument. +; CHECK4-LABEL: define void @CallViaVptr +; CHECK4: call void @__sanitizer_cov_indir_call16({{.*}},[[CACHE:.*]]) +; CHECK4-NOT: call void @__sanitizer_cov_indir_call16({{.*}},[[CACHE]]) +; CHECK4: ret void diff --git a/test/Instrumentation/SanitizerCoverage/coverage2-dbg.ll b/test/Instrumentation/SanitizerCoverage/coverage2-dbg.ll new file mode 100644 index 0000000..9b26329 --- /dev/null +++ b/test/Instrumentation/SanitizerCoverage/coverage2-dbg.ll @@ -0,0 +1,75 @@ +; Test that coverage instrumentation does not lose debug location. + +; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -S | FileCheck %s + +; C++ source: +; 1: void foo(int *a) { +; 2: if (a) +; 3: *a = 0; +; 4: } +; clang++ if.cc -O3 -g -S -emit-llvm +; and add sanitize_address to @_Z3fooPi + + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; Check that __sanitizer_cov call has !dgb pointing to the beginning +; of appropriate basic blocks. +; CHECK-LABEL:_Z3fooPi +; CHECK: call void @__sanitizer_cov(), !dbg [[A:!.*]] +; CHECK: call void @__sanitizer_cov(), !dbg [[B:!.*]] +; CHECK: call void @__sanitizer_cov(), !dbg [[C:!.*]] +; CHECK: ret void +; CHECK: [[A]] = metadata !{i32 1, i32 0, metadata !{{.*}}, null} +; CHECK: [[B]] = metadata !{i32 3, i32 5, metadata !{{.*}}, null} +; CHECK: [[C]] = metadata !{i32 4, i32 1, metadata !{{.*}}, null} + +define void @_Z3fooPi(i32* %a) #0 { +entry: + tail call void @llvm.dbg.value(metadata !{i32* %a}, i64 0, metadata !11, metadata !{metadata !"0x102"}), !dbg !15 + %tobool = icmp eq i32* %a, null, !dbg !16 + br i1 %tobool, label %if.end, label %if.then, !dbg !16 + +if.then: ; preds = %entry + store i32 0, i32* %a, align 4, !dbg !18, !tbaa !19 + br label %if.end, !dbg !18 + +if.end: ; preds = %entry, %if.then + ret void, !dbg !23 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1 + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" sanitize_address} +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!12, !13} +!llvm.ident = !{!14} + +!0 = metadata !{metadata !"0x11\004\00clang version 3.6.0 (217079)\001\00\000\00\001", metadata !1, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2} ; [ DW_TAG_compile_unit ] [FOO/if.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"if.cc", metadata !"FOO"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !"0x2e\00foo\00foo\00_Z3fooPi\001\000\001\000\006\00256\001\001", metadata !1, metadata !5, metadata !6, null, void (i32*)* @_Z3fooPi, null, null, metadata !10} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!5 = metadata !{metadata !"0x29", metadata !1} ; [ DW_TAG_file_type ] [FOO/if.cc] +!6 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", i32 0, null, null, metadata !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null, metadata !8} +!8 = metadata !{metadata !"0xf\00\000\0064\0064\000\000", null, null, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!9 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{metadata !11} +!11 = metadata !{metadata !"0x101\00a\0016777217\000", metadata !4, metadata !5, metadata !8} ; [ DW_TAG_arg_variable ] [a] [line 1] +!12 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!13 = metadata !{i32 2, metadata !"Debug Info Version", i32 2} +!14 = metadata !{metadata !"clang version 3.6.0 (217079)"} +!15 = metadata !{i32 1, i32 15, metadata !4, null} +!16 = metadata !{i32 2, i32 7, metadata !17, null} +!17 = metadata !{metadata !"0xb\002\007\000", metadata !1, metadata !4} ; [ DW_TAG_lexical_block ] [FOO/if.cc] +!18 = metadata !{i32 3, i32 5, metadata !17, null} +!19 = metadata !{metadata !20, metadata !20, i64 0} +!20 = metadata !{metadata !"int", metadata !21, i64 0} +!21 = metadata !{metadata !"omnipotent char", metadata !22, i64 0} +!22 = metadata !{metadata !"Simple C/C++ TBAA"} +!23 = metadata !{i32 4, i32 1, metadata !4, null} diff --git a/test/Instrumentation/SanitizerCoverage/tracing.ll b/test/Instrumentation/SanitizerCoverage/tracing.ll new file mode 100644 index 0000000..c39cb1c --- /dev/null +++ b/test/Instrumentation/SanitizerCoverage/tracing.ll @@ -0,0 +1,33 @@ +; Test -sanitizer-coverage-experimental-tracing +; RUN: opt < %s -sancov -sanitizer-coverage-level=1 -sanitizer-coverage-experimental-tracing -S | FileCheck %s --check-prefix=CHECK1 +; RUN: opt < %s -sancov -sanitizer-coverage-level=3 -sanitizer-coverage-experimental-tracing -S | FileCheck %s --check-prefix=CHECK3 + +target 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" +target triple = "x86_64-unknown-linux-gnu" +define void @foo(i32* %a) sanitize_address { +entry: + %tobool = icmp eq i32* %a, null + br i1 %tobool, label %if.end, label %if.then + + if.then: ; preds = %entry + store i32 0, i32* %a, align 4 + br label %if.end + + if.end: ; preds = %entry, %if.then + ret void +} + +; CHECK1-LABEL: define void @foo +; CHECK1: call void @__sanitizer_cov_trace_func_enter +; CHECK1: call void @__sanitizer_cov_trace_basic_block +; CHECK1: call void @__sanitizer_cov_trace_basic_block +; CHECK1-NOT: call void @__sanitizer_cov_trace_basic_block +; CHECK1: ret void + +; CHECK3-LABEL: define void @foo +; CHECK3: call void @__sanitizer_cov_trace_func_enter +; CHECK3: call void @__sanitizer_cov_trace_basic_block +; CHECK3: call void @__sanitizer_cov_trace_basic_block +; CHECK3: call void @__sanitizer_cov_trace_basic_block +; CHECK3-NOT: call void @__sanitizer_cov_trace_basic_block +; CHECK3: ret void |