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