15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Test for direct coverage writing with dlopen.
25d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
35d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Test normal exit.
45d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_asan -mllvm -asan-coverage=1 -DSHARED %s -shared -o %T/libcoverage_android_test_1.so -fPIC
55d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_asan -mllvm -asan-coverage=1 -DSO_DIR=\"%device\" %s -o %t
65d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
75d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: adb shell rm -rf %device/coverage-android
85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: rm -rf %T/coverage-android
95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: adb shell mkdir -p %device/coverage-android/direct
115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: mkdir -p %T/coverage-android/direct
125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: ASAN_OPTIONS=coverage=1:coverage_direct=1:coverage_dir=%device/coverage-android/direct:verbosity=1 %run %t
135d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: adb pull %device/coverage-android/direct %T/coverage-android/direct
145d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: ls; pwd
155d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: cd %T/coverage-android/direct
165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %sancov rawunpack *.sancov.raw
175d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %sancov print *.sancov |& FileCheck %s
185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
195d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
205d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Test sudden death.
215d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_asan -mllvm -asan-coverage=1 -DSHARED -DKILL %s -shared -o %T/libcoverage_android_test_1.so -fPIC
225d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_asan -mllvm -asan-coverage=1 -DSO_DIR=\"%device\" %s -o %t
235d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
245d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: adb shell rm -rf %device/coverage-android-kill
255d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: rm -rf %T/coverage-android-kill
265d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
275d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: adb shell mkdir -p %device/coverage-android-kill/direct
285d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: mkdir -p %T/coverage-android-kill/direct
295d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: ASAN_OPTIONS=coverage=1:coverage_direct=1:coverage_dir=%device/coverage-android-kill/direct:verbosity=1 not %run %t
305d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: adb pull %device/coverage-android-kill/direct %T/coverage-android-kill/direct
315d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: ls; pwd
325d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: cd %T/coverage-android-kill/direct
335d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %sancov rawunpack *.sancov.raw
345d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %sancov print *.sancov |& FileCheck %s
355d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
365d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <assert.h>
375d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <dlfcn.h>
385d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <stdio.h>
395d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <unistd.h>
405d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <sys/types.h>
415d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <signal.h>
425d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
435d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#ifdef SHARED
445d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesextern "C" {
455d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid bar() {
465d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  printf("bar\n");
475d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#ifdef KILL
485d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  kill(getpid(), SIGKILL);
495d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#endif
505d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
515d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
525d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#else
535d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
545d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesint main(int argc, char **argv) {
555d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  fprintf(stderr, "PID: %d\n", getpid());
565d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  void *handle1 =
575d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines      dlopen(SO_DIR "/libcoverage_android_test_1.so", RTLD_LAZY);
585d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  assert(handle1);
595d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  void (*bar1)() = (void (*)())dlsym(handle1, "bar");
605d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  assert(bar1);
615d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  bar1();
625d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
635d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  return 0;
645d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
655d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#endif
665d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
675d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: 2 PCs total
68