1 // Tests __hwasan_print_memory_usage.
2 // RUN: %clang_hwasan %s -o %t
3 // RUN: ulimit -s 1000
4 // RUN: %run %t 2>&1 | FileCheck %s
5 // REQUIRES: stable-runtime
6 
7 #include <pthread.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <string.h>
11 
12 #include <sanitizer/hwasan_interface.h>
13 
14 int state;
15 __thread volatile char *sink;
16 
17 __attribute__((noinline))
malloc_and_use(int size)18 void *malloc_and_use(int size) {
19   char *x = (char*)malloc(size);
20   for (int i = 0; i < size; i++)
21     x[i] = 42;  // make this memory used.
22   return x;
23 }
24 
T1(void * arg)25 void *T1(void *arg) {
26 
27   for (int i = 1; i <= (1 << 20); i *= 2)
28     sink = malloc_and_use(i);
29 
30   __sync_fetch_and_add(&state, 1);
31   while (__sync_fetch_and_add(&state, 0) != 4) {}
32   return NULL;
33 }
34 
T4(void * arg)35 void *T4(void *arg) { return NULL; }
36 
main()37 int main() {
38   __hwasan_enable_allocator_tagging();
39   sink = malloc_and_use(10);
40 
41   __hwasan_print_memory_usage();
42   // CHECK: HWASAN pid: [[PID:[0-9]*]] rss: {{.*}} threads: 1 stacks: [[STACKS:[0-9]*]] thr_aux: {{.*}} stack_depot: {{.*}} uniq_stacks: [[UNIQ_STACKS:[0-9]*]] heap: [[HEAP:[0-9]*]]
43 
44   void *one_meg = malloc_and_use(1 << 20);
45 
46   __hwasan_print_memory_usage();
47   // CHECK: HWASAN pid: [[PID]] rss: {{.*}} threads: 1 stacks: [[STACKS]] thr_aux: {{.*}} stack_depot: {{.*}}
48 
49   free(one_meg);
50 
51   __hwasan_print_memory_usage();
52   // CHECK: HWASAN pid: [[PID]] rss: {{.*}} threads: 1 stacks: [[STACKS]] thr_aux: {{.*}} stack_depot: {{.*}} uniq_stacks: {{.*}} heap: [[HEAP]]
53 
54   pthread_t t1, t2, t3, t4;
55 
56   pthread_create(&t1, NULL, T1, NULL);
57   pthread_create(&t2, NULL, T1, NULL);
58   pthread_create(&t3, NULL, T1, NULL);
59   pthread_create(&t4, NULL, T4, NULL);
60   while (__sync_fetch_and_add(&state, 0) != 3) {}
61   pthread_join(t4, NULL);
62 
63   __hwasan_print_memory_usage();
64   // CHECK: HWASAN pid: [[PID]] rss: {{.*}} threads: 4 stacks:
65 
66   __sync_fetch_and_add(&state, 1);
67   pthread_join(t1, NULL);
68   pthread_join(t2, NULL);
69   pthread_join(t3, NULL);
70   __hwasan_print_memory_usage();
71   // CHECK: HWASAN pid: [[PID]] rss: {{.*}} threads: 1 stacks: [[STACKS]]
72 }
73