[tsan] Add global symbolication support into DlAddrSymbolizer

`DlAddrSymbolizer` is used on OS X when we're running inside a sandbox that prevents us from spawning an external symbolizer. This patch adds support for symbolication of globals (implements `SymbolizeData`) for `DlAddrSymbolizer`.

Differential Revision: http://reviews.llvm.org/D14613

llvm-svn: 252899
This commit is contained in:
Kuba Brecka 2015-11-12 15:19:40 +00:00
parent 314b752513
commit af9525dfff
2 changed files with 37 additions and 2 deletions

View File

@ -37,8 +37,14 @@ bool DlAddrSymbolizer::SymbolizePC(uptr addr, SymbolizedStack *stack) {
return true;
}
bool DlAddrSymbolizer::SymbolizeData(uptr addr, DataInfo *info) {
return false;
bool DlAddrSymbolizer::SymbolizeData(uptr addr, DataInfo *datainfo) {
Dl_info info;
int result = dladdr((const void *)addr, &info);
if (!result) return false;
const char *demangled = DemangleCXXABI(info.dli_sname);
datainfo->name = internal_strdup(demangled);
datainfo->start = (uptr)info.dli_saddr;
return true;
}
class AtosSymbolizerProcess : public SymbolizerProcess {

View File

@ -0,0 +1,29 @@
// RUN: %clangxx_tsan %s -o %t
// RUN: TSAN_OPTIONS=$TSAN_OPTIONS:verbosity=2:external_symbolizer_path= %deflake %run %t | FileCheck %s
#include "../test.h"
int GlobalData[10];
void *Thread(void *a) {
barrier_wait(&barrier);
GlobalData[2] = 42;
return 0;
}
int main() {
barrier_init(&barrier, 2);
fprintf(stderr, "addr=");
print_address(GlobalData);
fprintf(stderr, "\n");
pthread_t t;
pthread_create(&t, 0, Thread, 0);
GlobalData[2] = 43;
barrier_wait(&barrier);
pthread_join(t, 0);
}
// CHECK: External symbolizer is explicitly disabled.
// CHECK: Using dladdr symbolizer.
// CHECK: addr=[[ADDR:0x[0-9,a-f]+]]
// CHECK: WARNING: ThreadSanitizer: data race
// CHECK: Location is global 'GlobalData' at [[ADDR]] ({{.*}}+0x{{[0-9,a-f]+}})