Files
clang-p2996/compiler-rt/test/tsan/java_symbolization_legacy.cc
Dmitry Vyukov f5675e7e2a tsan: support inlined frames in external symbolization
New API passes a callback function to the external symbolizer,
allowing it to add multiple frames to the traceback. Note that
the old interface API will be still supported until the clients
migrate to the new one.

Author: asmundak (Alexander Smundak)
Reviewed in: https://reviews.llvm.org/D44714

llvm-svn: 328079
2018-03-21 08:44:14 +00:00

45 lines
1.3 KiB
C++

// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
#include "java.h"
#include <memory.h>
extern "C" bool __tsan_symbolize_external(jptr pc,
char *func_buf, jptr func_siz,
char *file_buf, jptr file_siz,
int *line, int *col) {
if (pc == (1234 | kExternalPCBit)) {
memcpy(func_buf, "MyFunc", sizeof("MyFunc"));
memcpy(file_buf, "MyFile.java", sizeof("MyFile.java"));
*line = 1234;
*col = 56;
return true;
}
return false;
}
void *Thread(void *p) {
barrier_wait(&barrier);
__tsan_write1_pc((jptr)p, 1234 | kExternalPCBit);
return 0;
}
int main() {
barrier_init(&barrier, 2);
int const kHeapSize = 1024 * 1024;
jptr jheap = (jptr)malloc(kHeapSize + 8) + 8;
__tsan_java_init(jheap, kHeapSize);
const int kBlockSize = 16;
__tsan_java_alloc(jheap, kBlockSize);
pthread_t th;
pthread_create(&th, 0, Thread, (void*)jheap);
__tsan_write1_pc((jptr)jheap, 1234 | kExternalPCBit);
barrier_wait(&barrier);
pthread_join(th, 0);
__tsan_java_free(jheap, kBlockSize);
fprintf(stderr, "DONE\n");
return __tsan_java_fini();
}
// CHECK: WARNING: ThreadSanitizer: data race
// CHECK: #0 MyFunc MyFile.java:1234:56
// CHECK: DONE