Skip to content

Commit 8377f90

Browse files
authored
[MemProf] Add sanitizer interface decls for histogram funcs. (#151398)
Add the necessary sanitizer interface decls required when the memprof runtime is built in dynamic mode. This was a latent issue since we didn't add tests for the histogram feature in compiler-rt. These tests are run with `ninja check-memprof-dynamic`. I discovered this after the CI failures for #147854.
1 parent cd4360a commit 8377f90

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

compiler-rt/lib/memprof/memprof_interface_internal.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,15 @@ SANITIZER_INTERFACE_ATTRIBUTE void __memprof_version_mismatch_check_v1();
3535
SANITIZER_INTERFACE_ATTRIBUTE
3636
void __memprof_record_access(void const volatile *addr);
3737

38+
SANITIZER_INTERFACE_ATTRIBUTE
39+
void __memprof_record_access_hist(void const volatile *addr);
40+
3841
SANITIZER_INTERFACE_ATTRIBUTE
3942
void __memprof_record_access_range(void const volatile *addr, uptr size);
4043

44+
SANITIZER_INTERFACE_ATTRIBUTE
45+
void __memprof_record_access_range_hist(void const volatile *addr, uptr size);
46+
4147
SANITIZER_INTERFACE_ATTRIBUTE void __memprof_print_accumulated_stats();
4248

4349
SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE extern char
@@ -51,6 +57,10 @@ extern uptr __memprof_shadow_memory_dynamic_address;
5157

5258
SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE extern char
5359
__memprof_profile_filename[1];
60+
61+
SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE extern bool
62+
__memprof_histogram;
63+
5464
SANITIZER_INTERFACE_ATTRIBUTE int __memprof_profile_dump();
5565
SANITIZER_INTERFACE_ATTRIBUTE void __memprof_profile_reset();
5666

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Test the histogram support in memprof using the text format output.
2+
// Shadow memory counters per object are limited to 8b. In memory counters
3+
// aggregating counts across multiple objects are 64b.
4+
5+
// RUN: %clangxx_memprof -O0 -mllvm -memprof-histogram -mllvm -memprof-use-callbacks=true %s -o %t
6+
// RUN: %env_memprof_opts=print_text=1:histogram=1:log_path=stdout %run %t 2>&1 | FileCheck %s
7+
8+
#include <stdio.h>
9+
#include <stdlib.h>
10+
11+
int main() {
12+
// Allocate memory that will create a histogram
13+
char *buffer = (char *)malloc(1024);
14+
if (!buffer)
15+
return 1;
16+
17+
for (int i = 0; i < 10; ++i) {
18+
// Access every 8th byte (since shadow granularity is 8b.
19+
buffer[i * 8] = 'A';
20+
}
21+
22+
for (int j = 0; j < 200; ++j) {
23+
buffer[8] = 'B'; // Count = previous count + 200
24+
}
25+
26+
for (int j = 0; j < 400; ++j) {
27+
buffer[16] = 'B'; // Count is saturated at 255
28+
}
29+
30+
// Free the memory to trigger MIB creation with histogram
31+
free(buffer);
32+
33+
printf("Test completed successfully\n");
34+
return 0;
35+
}
36+
37+
// CHECK: AccessCountHistogram[128]: 1 201 255 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
38+
// CHECK: Test completed successfully

0 commit comments

Comments
 (0)