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