xref: /aosp_15_r20/external/compiler-rt/test/asan/TestCases/coverage-order-pcs.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot // Test coverage_order_pcs=1 flag which orders the PCs by their appearance.
2*7c3d14c8STreehugger Robot // RUN: DIR=%T/coverage-order-pcs
3*7c3d14c8STreehugger Robot // RUN: rm -rf $DIR
4*7c3d14c8STreehugger Robot // RUN: mkdir $DIR
5*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=func %s -o %t
6*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage_dir=$DIR:coverage=1:coverage_order_pcs=0 %run %t
7*7c3d14c8STreehugger Robot // RUN: mv $DIR/*sancov $DIR/A
8*7c3d14c8STreehugger Robot 
9*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage_dir=$DIR:coverage=1:coverage_order_pcs=0 %run %t 1
10*7c3d14c8STreehugger Robot // RUN: mv $DIR/*sancov $DIR/B
11*7c3d14c8STreehugger Robot 
12*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage_dir=$DIR:coverage=1:coverage_order_pcs=1 %run %t
13*7c3d14c8STreehugger Robot // RUN: mv $DIR/*sancov $DIR/C
14*7c3d14c8STreehugger Robot 
15*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage_dir=$DIR:coverage=1:coverage_order_pcs=1 %run %t 1
16*7c3d14c8STreehugger Robot // RUN: mv $DIR/*sancov $DIR/D
17*7c3d14c8STreehugger Robot //
18*7c3d14c8STreehugger Robot // RUN: (%sancov print $DIR/A; %sancov print $DIR/B; %sancov print $DIR/C; %sancov print $DIR/D) | FileCheck %s
19*7c3d14c8STreehugger Robot //
20*7c3d14c8STreehugger Robot // RUN: rm -rf $DIR
21*7c3d14c8STreehugger Robot // Ordering works only in 64-bit mode for now.
22*7c3d14c8STreehugger Robot // REQUIRES: asan-64-bits
23*7c3d14c8STreehugger Robot // UNSUPPORTED: android
24*7c3d14c8STreehugger Robot #include <stdio.h>
25*7c3d14c8STreehugger Robot 
foo()26*7c3d14c8STreehugger Robot void foo() { fprintf(stderr, "FOO\n"); }
bar()27*7c3d14c8STreehugger Robot void bar() { fprintf(stderr, "BAR\n"); }
28*7c3d14c8STreehugger Robot 
main(int argc,char ** argv)29*7c3d14c8STreehugger Robot int main(int argc, char **argv) {
30*7c3d14c8STreehugger Robot   if (argc == 2) {
31*7c3d14c8STreehugger Robot     foo();
32*7c3d14c8STreehugger Robot     bar();
33*7c3d14c8STreehugger Robot   } else {
34*7c3d14c8STreehugger Robot     bar();
35*7c3d14c8STreehugger Robot     foo();
36*7c3d14c8STreehugger Robot   }
37*7c3d14c8STreehugger Robot }
38*7c3d14c8STreehugger Robot 
39*7c3d14c8STreehugger Robot // Run A: no ordering
40*7c3d14c8STreehugger Robot // CHECK: [[FOO:0x[0-9a-f]*]]
41*7c3d14c8STreehugger Robot // CHECK-NEXT: [[BAR:0x[0-9a-f]*]]
42*7c3d14c8STreehugger Robot // CHECK-NEXT: [[MAIN:0x[0-9a-f]*]]
43*7c3d14c8STreehugger Robot //
44*7c3d14c8STreehugger Robot // Run B: still no ordering
45*7c3d14c8STreehugger Robot // CHECK-NEXT: [[FOO]]
46*7c3d14c8STreehugger Robot // CHECK-NEXT: [[BAR]]
47*7c3d14c8STreehugger Robot // CHECK-NEXT: [[MAIN]]
48*7c3d14c8STreehugger Robot //
49*7c3d14c8STreehugger Robot // Run C: MAIN, BAR, FOO
50*7c3d14c8STreehugger Robot // CHECK-NEXT: [[MAIN]]
51*7c3d14c8STreehugger Robot // CHECK-NEXT: [[BAR]]
52*7c3d14c8STreehugger Robot // CHECK-NEXT: [[FOO]]
53*7c3d14c8STreehugger Robot //
54*7c3d14c8STreehugger Robot // Run D: MAIN, FOO, BAR
55*7c3d14c8STreehugger Robot // CHECK-NEXT: [[MAIN]]
56*7c3d14c8STreehugger Robot // CHECK-NEXT: [[FOO]]
57*7c3d14c8STreehugger Robot // CHECK-NEXT: [[BAR]]
58