12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Test for direct coverage writing with dlopen.
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -mllvm -asan-coverage=1 -DSHARED %s -shared -o %T/libcoverage_direct_test_1.so -fPIC
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -mllvm -asan-coverage=1 -DSO_DIR=\"%T\" %s -o %t
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: rm -rf %T/coverage-direct
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
75d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: mkdir -p %T/coverage-direct/normal
85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: ASAN_OPTIONS=coverage=1:coverage_direct=0:coverage_dir=%T/coverage-direct/normal:verbosity=1 %run %t
95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %sancov print %T/coverage-direct/normal/*.sancov >%T/coverage-direct/normal/out.txt
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: mkdir -p %T/coverage-direct/direct
125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: ASAN_OPTIONS=coverage=1:coverage_direct=1:coverage_dir=%T/coverage-direct/direct:verbosity=1 %run %t
135d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: cd %T/coverage-direct/direct
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %sancov rawunpack *.sancov.raw
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %sancov print *.sancov >out.txt
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: cd ../..
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: diff -u coverage-direct/normal/out.txt coverage-direct/direct/out.txt
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// XFAIL: android
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <assert.h>
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <dlfcn.h>
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h>
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <unistd.h>
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef SHARED
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" {
292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid bar() { printf("bar\n"); }
302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else
322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(int argc, char **argv) {
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fprintf(stderr, "PID: %d\n", getpid());
352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void *handle1 =
362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      dlopen(SO_DIR "/libcoverage_direct_test_1.so", RTLD_LAZY);
372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  assert(handle1);
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void (*bar1)() = (void (*)())dlsym(handle1, "bar");
392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  assert(bar1);
402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  bar1();
412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return 0;
432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
45