diff options
author | Kostya Serebryany <kcc@google.com> | 2014-01-17 11:00:30 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2014-01-17 11:00:30 +0000 |
commit | bd2c711cddceb95ab2dc0c28b40760372cb66178 (patch) | |
tree | d1f359c5f7d4a5888e56363e87b84d27488fa30a /test/Instrumentation | |
parent | 0c25726596b2619144c50778338f849ec5a21219 (diff) | |
download | llvm-bd2c711cddceb95ab2dc0c28b40760372cb66178.tar.gz llvm-bd2c711cddceb95ab2dc0c28b40760372cb66178.tar.bz2 llvm-bd2c711cddceb95ab2dc0c28b40760372cb66178.tar.xz |
[asan] extend asan-coverage (still experimental).
- add a mode for collecting per-block coverage (-asan-coverage=2).
So far the implementation is naive (all blocks are instrumented),
the performance overhead on top of asan could be as high as 30%.
- Make sure the one-time calls to __sanitizer_cov are moved to function buttom,
which in turn required to copy the original debug info into the call insn.
Here is the performance data on SPEC 2006
(train data, comparing asan with asan-coverage={0,1,2}):
asan+cov0 asan+cov1 diff 0-1 asan+cov2 diff 0-2 diff 1-2
400.perlbench, 65.60, 65.80, 1.00, 76.20, 1.16, 1.16
401.bzip2, 65.10, 65.50, 1.01, 75.90, 1.17, 1.16
403.gcc, 1.64, 1.69, 1.03, 2.04, 1.24, 1.21
429.mcf, 21.90, 22.60, 1.03, 23.20, 1.06, 1.03
445.gobmk, 166.00, 169.00, 1.02, 205.00, 1.23, 1.21
456.hmmer, 88.30, 87.90, 1.00, 91.00, 1.03, 1.04
458.sjeng, 210.00, 222.00, 1.06, 258.00, 1.23, 1.16
462.libquantum, 1.73, 1.75, 1.01, 2.11, 1.22, 1.21
464.h264ref, 147.00, 152.00, 1.03, 160.00, 1.09, 1.05
471.omnetpp, 115.00, 116.00, 1.01, 140.00, 1.22, 1.21
473.astar, 133.00, 131.00, 0.98, 142.00, 1.07, 1.08
483.xalancbmk, 118.00, 120.00, 1.02, 154.00, 1.31, 1.28
433.milc, 19.80, 20.00, 1.01, 20.10, 1.02, 1.01
444.namd, 16.20, 16.20, 1.00, 17.60, 1.09, 1.09
447.dealII, 41.80, 42.20, 1.01, 43.50, 1.04, 1.03
450.soplex, 7.51, 7.82, 1.04, 8.25, 1.10, 1.05
453.povray, 14.00, 14.40, 1.03, 15.80, 1.13, 1.10
470.lbm, 33.30, 34.10, 1.02, 34.10, 1.02, 1.00
482.sphinx3, 12.40, 12.30, 0.99, 13.00, 1.05, 1.06
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199488 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Instrumentation')
-rw-r--r-- | test/Instrumentation/AddressSanitizer/coverage.ll | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/test/Instrumentation/AddressSanitizer/coverage.ll b/test/Instrumentation/AddressSanitizer/coverage.ll index 47a54c0ef8..6697f4b0f2 100644 --- a/test/Instrumentation/AddressSanitizer/coverage.ll +++ b/test/Instrumentation/AddressSanitizer/coverage.ll @@ -1,13 +1,30 @@ -; RUN: opt < %s -asan -asan-coverage=1 -S | FileCheck %s +; RUN: opt < %s -asan -asan-coverage=1 -S | FileCheck %s --check-prefix=CHECK1 +; RUN: opt < %s -asan -asan-coverage=2 -S | FileCheck %s --check-prefix=CHECK2 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 i32 @foo(i32* %a) sanitize_address { +define void @foo(i32* %a) sanitize_address { entry: - ret i32 0 + %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 } -; CHECK: define i32 @foo(i32* %a) #0 { -; CHECK: %0 = load atomic i8* @__asan_gen_cov_foo monotonic, align 1 -; CHECK: %1 = icmp eq i8 0, %0 -; CHECK: br i1 %1, label %2, label %3 -; CHECK: call void @__sanitizer_cov(i64 ptrtoint (i32 (i32*)* @foo to i64)) -; CHECK: store atomic i8 1, i8* @__asan_gen_cov_foo monotonic, align 1 +; CHECK1-LABEL: define void @foo +; CHECK1: %0 = load atomic i8* @__asan_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* @__asan_gen_cov_foo monotonic, align 1 + +; 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 |