xref: /aosp_15_r20/external/AFLplusplus/test/test-llvm-lto.sh (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker#!/bin/sh
2*08b48e0bSAndroid Build Coastguard Worker
3*08b48e0bSAndroid Build Coastguard Worker. ./test-pre.sh
4*08b48e0bSAndroid Build Coastguard Worker
5*08b48e0bSAndroid Build Coastguard Worker$ECHO "$BLUE[*] Testing: LTO llvm_mode"
6*08b48e0bSAndroid Build Coastguard Workertest -e ../afl-clang-lto -a -e ../SanitizerCoverageLTO.so && {
7*08b48e0bSAndroid Build Coastguard Worker  # on FreeBSD need to set AFL_CC
8*08b48e0bSAndroid Build Coastguard Worker  test `uname -s` = 'FreeBSD' && {
9*08b48e0bSAndroid Build Coastguard Worker    if type clang >/dev/null; then
10*08b48e0bSAndroid Build Coastguard Worker      export AFL_CC=`command -v clang`
11*08b48e0bSAndroid Build Coastguard Worker    else
12*08b48e0bSAndroid Build Coastguard Worker      export AFL_CC=`$LLVM_CONFIG --bindir`/clang
13*08b48e0bSAndroid Build Coastguard Worker    fi
14*08b48e0bSAndroid Build Coastguard Worker  }
15*08b48e0bSAndroid Build Coastguard Worker
16*08b48e0bSAndroid Build Coastguard Worker  ../afl-clang-lto -o test-instr.plain ../test-instr.c > /dev/null 2>&1
17*08b48e0bSAndroid Build Coastguard Worker  test -e test-instr.plain && {
18*08b48e0bSAndroid Build Coastguard Worker    $ECHO "$GREEN[+] llvm_mode LTO compilation succeeded"
19*08b48e0bSAndroid Build Coastguard Worker    echo 0 | AFL_QUIET=1 ../afl-showmap -m ${MEM_LIMIT} -o test-instr.plain.0 -r -- ./test-instr.plain > /dev/null 2>&1
20*08b48e0bSAndroid Build Coastguard Worker    AFL_QUIET=1 ../afl-showmap -m ${MEM_LIMIT} -o test-instr.plain.1 -r -- ./test-instr.plain < /dev/null > /dev/null 2>&1
21*08b48e0bSAndroid Build Coastguard Worker    test -e test-instr.plain.0 -a -e test-instr.plain.1 && {
22*08b48e0bSAndroid Build Coastguard Worker      diff -q test-instr.plain.0 test-instr.plain.1 > /dev/null 2>&1 && {
23*08b48e0bSAndroid Build Coastguard Worker        $ECHO "$RED[!] llvm_mode LTO instrumentation should be different on different input but is not"
24*08b48e0bSAndroid Build Coastguard Worker        CODE=1
25*08b48e0bSAndroid Build Coastguard Worker      } || {
26*08b48e0bSAndroid Build Coastguard Worker        $ECHO "$GREEN[+] llvm_mode LTO instrumentation present and working correctly"
27*08b48e0bSAndroid Build Coastguard Worker        TUPLES=`echo 0|AFL_QUIET=1 ../afl-showmap -m ${MEM_LIMIT} -o /dev/null -- ./test-instr.plain 2>&1 | grep Captur | awk '{print$3}'`
28*08b48e0bSAndroid Build Coastguard Worker        test "$TUPLES" -gt 2 -a "$TUPLES" -lt 7 && {
29*08b48e0bSAndroid Build Coastguard Worker          $ECHO "$GREEN[+] llvm_mode LTO run reported $TUPLES instrumented locations which is fine"
30*08b48e0bSAndroid Build Coastguard Worker        } || {
31*08b48e0bSAndroid Build Coastguard Worker          $ECHO "$RED[!] llvm_mode LTO instrumentation produces weird numbers: $TUPLES"
32*08b48e0bSAndroid Build Coastguard Worker          CODE=1
33*08b48e0bSAndroid Build Coastguard Worker        }
34*08b48e0bSAndroid Build Coastguard Worker      }
35*08b48e0bSAndroid Build Coastguard Worker    } || {
36*08b48e0bSAndroid Build Coastguard Worker      $ECHO "$RED[!] llvm_mode LTO instrumentation failed"
37*08b48e0bSAndroid Build Coastguard Worker      CODE=1
38*08b48e0bSAndroid Build Coastguard Worker    }
39*08b48e0bSAndroid Build Coastguard Worker    rm -f test-instr.plain.0 test-instr.plain.1
40*08b48e0bSAndroid Build Coastguard Worker  } || {
41*08b48e0bSAndroid Build Coastguard Worker    $ECHO "$RED[!] LTO llvm_mode failed"
42*08b48e0bSAndroid Build Coastguard Worker    CODE=1
43*08b48e0bSAndroid Build Coastguard Worker  }
44*08b48e0bSAndroid Build Coastguard Worker  rm -f test-instr.plain
45*08b48e0bSAndroid Build Coastguard Worker
46*08b48e0bSAndroid Build Coastguard Worker  echo foobar.c > instrumentlist.txt
47*08b48e0bSAndroid Build Coastguard Worker  AFL_DEBUG=1 AFL_LLVM_INSTRUMENT_FILE=instrumentlist.txt ../afl-clang-lto -o test-compcov test-compcov.c > test.out 2>&1
48*08b48e0bSAndroid Build Coastguard Worker  test -e test-compcov && {
49*08b48e0bSAndroid Build Coastguard Worker    grep -q "No instrumentation targets found" test.out && {
50*08b48e0bSAndroid Build Coastguard Worker      $ECHO "$GREEN[+] llvm_mode LTO instrumentlist feature works correctly"
51*08b48e0bSAndroid Build Coastguard Worker    } || {
52*08b48e0bSAndroid Build Coastguard Worker	echo CUT------------------------------------------------------------------CUT
53*08b48e0bSAndroid Build Coastguard Worker        cat test.out
54*08b48e0bSAndroid Build Coastguard Worker        echo CUT------------------------------------------------------------------CUT
55*08b48e0bSAndroid Build Coastguard Worker      $ECHO "$RED[!] llvm_mode LTO instrumentlist feature failed"
56*08b48e0bSAndroid Build Coastguard Worker      CODE=1
57*08b48e0bSAndroid Build Coastguard Worker    }
58*08b48e0bSAndroid Build Coastguard Worker  } || {
59*08b48e0bSAndroid Build Coastguard Worker    $ECHO "$RED[!] llvm_mode LTO instrumentlist feature compilation failed"
60*08b48e0bSAndroid Build Coastguard Worker    CODE=1
61*08b48e0bSAndroid Build Coastguard Worker  }
62*08b48e0bSAndroid Build Coastguard Worker  rm -f test-compcov test.out instrumentlist.txt
63*08b48e0bSAndroid Build Coastguard Worker  ../afl-clang-lto -o test-persistent ../utils/persistent_mode/persistent_demo.c > /dev/null 2>&1
64*08b48e0bSAndroid Build Coastguard Worker  test -e test-persistent && {
65*08b48e0bSAndroid Build Coastguard Worker    echo foo | AFL_QUIET=1 ../afl-showmap -m none -o /dev/null -q -r ./test-persistent && {
66*08b48e0bSAndroid Build Coastguard Worker      $ECHO "$GREEN[+] llvm_mode LTO persistent mode feature works correctly"
67*08b48e0bSAndroid Build Coastguard Worker    } || {
68*08b48e0bSAndroid Build Coastguard Worker      $ECHO "$RED[!] llvm_mode LTO persistent mode feature failed to work"
69*08b48e0bSAndroid Build Coastguard Worker      CODE=1
70*08b48e0bSAndroid Build Coastguard Worker    }
71*08b48e0bSAndroid Build Coastguard Worker  } || {
72*08b48e0bSAndroid Build Coastguard Worker    $ECHO "$RED[!] llvm_mode LTO persistent mode feature compilation failed"
73*08b48e0bSAndroid Build Coastguard Worker    CODE=1
74*08b48e0bSAndroid Build Coastguard Worker  }
75*08b48e0bSAndroid Build Coastguard Worker  rm -f test-persistent
76*08b48e0bSAndroid Build Coastguard Worker} || {
77*08b48e0bSAndroid Build Coastguard Worker  $ECHO "$YELLOW[-] LTO llvm_mode not compiled, cannot test"
78*08b48e0bSAndroid Build Coastguard Worker  INCOMPLETE=1
79*08b48e0bSAndroid Build Coastguard Worker}
80*08b48e0bSAndroid Build Coastguard Worker
81*08b48e0bSAndroid Build Coastguard Worker. ./test-post.sh
82