1c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev// Test that registers of running threads are included in the root set. 2b3b46dad13a2111a51fb1a67f36c8b633410e9b7Sergey Matveev// RUN: LSAN_BASE="report_objects=1:use_stacks=0" 3c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev// RUN: %clangxx_lsan -pthread %s -o %t 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: LSAN_OPTIONS=$LSAN_BASE:"use_registers=0" not %run %t 2>&1 | FileCheck %s 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: LSAN_OPTIONS=$LSAN_BASE:"use_registers=1" %run %t 2>&1 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: LSAN_OPTIONS="" %run %t 2>&1 7c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev 8c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev#include <assert.h> 9c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev#include <pthread.h> 10c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev#include <stdio.h> 11c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev#include <stdlib.h> 12c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev 13c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveevextern "C" 14c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveevvoid *registers_thread_func(void *arg) { 15c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev int *sync = reinterpret_cast<int *>(arg); 16c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev void *p = malloc(1337); 17c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev // To store the pointer, choose a register which is unlikely to be reused by 18c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev // a function call. 19c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev#if defined(__i386__) 20c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev asm ( "mov %0, %%esi" 21c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev : 22c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev : "r" (p) 23c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev ); 24c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev#elif defined(__x86_64__) 25c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev asm ( "mov %0, %%r15" 26c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev : 27c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev : "r" (p) 28c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev ); 29c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev#else 30c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev#error "Test is not supported on this architecture." 31c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev#endif 32c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev fprintf(stderr, "Test alloc: %p.\n", p); 33c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev fflush(stderr); 34c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev __sync_fetch_and_xor(sync, 1); 35c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev while (true) 36c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev pthread_yield(); 37c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev} 38c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev 39c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveevint main() { 40c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev int sync = 0; 41c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev pthread_t thread_id; 42c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev int res = pthread_create(&thread_id, 0, registers_thread_func, &sync); 43c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev assert(res == 0); 44c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev while (!__sync_fetch_and_xor(&sync, 0)) 45c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev pthread_yield(); 46c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev return 0; 47c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev} 48c91a93897a14fcd68bdd835ad6c6a4d12d2f78e6Sergey Matveev// CHECK: Test alloc: [[ADDR:.*]]. 49c085fe807836b566b4fce7ccdfb307bb025693c5Sergey Matveev// CHECK: LeakSanitizer: detected memory leaks 502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: [[ADDR]] (1337 bytes) 512fb08720b11b4c339e191b90d85477c6a2dd74dbAlexey Samsonov// CHECK: SUMMARY: {{(Leak|Address)}}Sanitizer: 52