1*673dc3d4SNico Weber // Test for "sancov.py missing ...".
2*673dc3d4SNico Weber 
3*673dc3d4SNico Weber // First case: coverage from executable. main() is called on every code path.
4*673dc3d4SNico Weber // RUN: %clangxx_asan -fsanitize-coverage=func,trace-pc-guard %s -o %t -DFOOBAR -DMAIN
5*673dc3d4SNico Weber // RUN: rm -rf %t-dir
6*673dc3d4SNico Weber // RUN: mkdir -p %t-dir
7*673dc3d4SNico Weber // RUN: cd %t-dir
8*673dc3d4SNico Weber // RUN: %env_asan_opts=coverage=1:coverage_dir=%t-dir %run %t
9*673dc3d4SNico Weber // RUN: %sancov print *.sancov > main.txt
10*673dc3d4SNico Weber // RUN: rm *.sancov
11*673dc3d4SNico Weber // RUN: count 1 < main.txt
12*673dc3d4SNico Weber // RUN: %env_asan_opts=coverage=1:coverage_dir=%t-dir %run %t x
13*673dc3d4SNico Weber // RUN: %sancov print *.sancov > foo.txt
14*673dc3d4SNico Weber // RUN: rm *.sancov
15*673dc3d4SNico Weber // RUN: count 3 < foo.txt
16*673dc3d4SNico Weber // RUN: %env_asan_opts=coverage=1:coverage_dir=%t-dir %run %t x x
17*673dc3d4SNico Weber // RUN: %sancov print *.sancov > bar.txt
18*673dc3d4SNico Weber // RUN: rm *.sancov
19*673dc3d4SNico Weber // RUN: count 4 < bar.txt
20*673dc3d4SNico Weber // RUN: %sancov missing %t < foo.txt > foo-missing.txt
21*673dc3d4SNico Weber // RUN: sort main.txt foo-missing.txt -o foo-missing-with-main.txt
22*673dc3d4SNico Weber // The "missing from foo" set may contain a few bogus PCs from the sanitizer
23*673dc3d4SNico Weber // runtime, but it must include the entire "bar" code path as a subset. Sorted
24*673dc3d4SNico Weber // lists can be tested for set inclusion with diff + grep.
25*673dc3d4SNico Weber // RUN: diff bar.txt foo-missing-with-main.txt > %t.log || true
26*673dc3d4SNico Weber // RUN: not grep "^<" %t.log
27*673dc3d4SNico Weber 
28*673dc3d4SNico Weber // Second case: coverage from DSO.
29*673dc3d4SNico Weber // cd %t-dir
30*673dc3d4SNico Weber // RUN: %clangxx_asan -fsanitize-coverage=func,trace-pc-guard %s -o %dynamiclib -DFOOBAR -shared -fPIC
31*673dc3d4SNico Weber // RUN: %clangxx_asan -fsanitize-coverage=func,trace-pc-guard %s %dynamiclib -o %t -DMAIN
32*673dc3d4SNico Weber // RUN: cd ..
33*673dc3d4SNico Weber // RUN: rm -rf %t-dir
34*673dc3d4SNico Weber // RUN: mkdir -p %t-dir
35*673dc3d4SNico Weber // RUN: cd %t-dir
36*673dc3d4SNico Weber // RUN: %env_asan_opts=coverage=1:coverage_dir=%t-dir %run %t x
37*673dc3d4SNico Weber // RUN: %sancov print %xdynamiclib_filename.*.sancov > foo.txt
38*673dc3d4SNico Weber // RUN: rm *.sancov
39*673dc3d4SNico Weber // RUN: count 2 < foo.txt
40*673dc3d4SNico Weber // RUN: %env_asan_opts=coverage=1:coverage_dir=%t-dir %run %t x x
41*673dc3d4SNico Weber // RUN: %sancov print %xdynamiclib_filename.*.sancov > bar.txt
42*673dc3d4SNico Weber // RUN: rm *.sancov
43*673dc3d4SNico Weber // RUN: count 3 < bar.txt
44*673dc3d4SNico Weber // RUN: %sancov missing %dynamiclib < foo.txt > foo-missing.txt
45*673dc3d4SNico Weber // RUN: diff bar.txt foo-missing.txt > %t.log || true
46*673dc3d4SNico Weber // RUN: not grep "^<" %t.log
47*673dc3d4SNico Weber 
48*673dc3d4SNico Weber // FIXME %sancov GetInstrumentedPCs relies on objdump -d to
49*673dc3d4SNico Weber // obtain the number of instrumented PCs.  The i386
50*673dc3d4SNico Weber // %dynamiclib has .plt entries that are not recognized by
51*673dc3d4SNico Weber // objdump,
52*673dc3d4SNico Weber // "sancov.py: found 0 instrumented PCs in *.so",
53*673dc3d4SNico Weber // causing AddressSanitizer-i386-linux to fail.
54*673dc3d4SNico Weber // Change it back to x86-target-arch after %sancov switches to a more robust approach.
55*673dc3d4SNico Weber 
56*673dc3d4SNico Weber // REQUIRES: x86_64-target-arch
57*673dc3d4SNico Weber // XFAIL: android
58*673dc3d4SNico Weber 
59*673dc3d4SNico Weber #include <stdio.h>
60*673dc3d4SNico Weber 
61*673dc3d4SNico Weber void foo1();
62*673dc3d4SNico Weber void foo2();
63*673dc3d4SNico Weber void bar1();
64*673dc3d4SNico Weber void bar2();
65*673dc3d4SNico Weber void bar3();
66*673dc3d4SNico Weber 
67*673dc3d4SNico Weber #if defined(FOOBAR)
foo1()68*673dc3d4SNico Weber void foo1() { fprintf(stderr, "foo1\n"); }
foo2()69*673dc3d4SNico Weber void foo2() { fprintf(stderr, "foo2\n"); }
70*673dc3d4SNico Weber 
bar1()71*673dc3d4SNico Weber void bar1() { fprintf(stderr, "bar1\n"); }
bar2()72*673dc3d4SNico Weber void bar2() { fprintf(stderr, "bar2\n"); }
bar3()73*673dc3d4SNico Weber void bar3() { fprintf(stderr, "bar3\n"); }
74*673dc3d4SNico Weber #endif
75*673dc3d4SNico Weber 
76*673dc3d4SNico Weber #if defined(MAIN)
main(int argc,char ** argv)77*673dc3d4SNico Weber int main(int argc, char **argv) {
78*673dc3d4SNico Weber   switch (argc) {
79*673dc3d4SNico Weber     case 1:
80*673dc3d4SNico Weber       break;
81*673dc3d4SNico Weber     case 2:
82*673dc3d4SNico Weber       foo1();
83*673dc3d4SNico Weber       foo2();
84*673dc3d4SNico Weber       break;
85*673dc3d4SNico Weber     case 3:
86*673dc3d4SNico Weber       bar1();
87*673dc3d4SNico Weber       bar2();
88*673dc3d4SNico Weber       bar3();
89*673dc3d4SNico Weber       break;
90*673dc3d4SNico Weber   }
91*673dc3d4SNico Weber }
92*673dc3d4SNico Weber #endif
93