Skip to content

Commit c551c9c

Browse files
committed
[compiler-rt] Refactor memintrinsic interceptors
This moves memintrinsic interceptors (memcpy/memmove/memset) into a new file sanitizer_common_interceptors_memintrinsics.inc. This is in preparation of redefining builtins, however, we must be careful to not redefine builtins in TUs that define interceptors of the same name. In all cases except for MSan, memintrinsic interceptors were moved to a new TU $tool_interceptors_memintrinsics.cpp. In the case of MSan, it turns out this is not yet necessary (as shown by the later patch introducing memcpy tests). NFC. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D151552
1 parent 3ccb770 commit c551c9c

19 files changed

+451
-376
lines changed

compiler-rt/lib/asan/asan_interceptors.cpp

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,6 @@ using namespace __asan;
8787
DECLARE_REAL_AND_INTERCEPTOR(void *, malloc, uptr)
8888
DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
8989

90-
#define ASAN_INTERCEPTOR_ENTER(ctx, func) \
91-
AsanInterceptorContext _ctx = {#func}; \
92-
ctx = (void *)&_ctx; \
93-
(void) ctx; \
94-
95-
#define COMMON_INTERCEPT_FUNCTION(name) ASAN_INTERCEPT_FUNC(name)
9690
#define COMMON_INTERCEPT_FUNCTION_VER(name, ver) \
9791
ASAN_INTERCEPT_FUNC_VER(name, ver)
9892
#define COMMON_INTERCEPT_FUNCTION_VER_UNVERSIONED_FALLBACK(name, ver) \
@@ -152,24 +146,6 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
152146
*begin = *end = 0; \
153147
}
154148

155-
#define COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size) \
156-
do { \
157-
ASAN_INTERCEPTOR_ENTER(ctx, memmove); \
158-
ASAN_MEMMOVE_IMPL(ctx, to, from, size); \
159-
} while (false)
160-
161-
#define COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size) \
162-
do { \
163-
ASAN_INTERCEPTOR_ENTER(ctx, memcpy); \
164-
ASAN_MEMCPY_IMPL(ctx, to, from, size); \
165-
} while (false)
166-
167-
#define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size) \
168-
do { \
169-
ASAN_INTERCEPTOR_ENTER(ctx, memset); \
170-
ASAN_MEMSET_IMPL(ctx, block, c, size); \
171-
} while (false)
172-
173149
#if CAN_SANITIZE_LEAKS
174150
#define COMMON_INTERCEPTOR_STRERROR() \
175151
__lsan::ScopedInterceptorDisabler disabler

compiler-rt/lib/asan/asan_interceptors.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,10 @@ DECLARE_REAL(char*, strstr, const char *s1, const char *s2)
168168

169169
#endif // !SANITIZER_FUCHSIA
170170

171+
#define ASAN_INTERCEPTOR_ENTER(ctx, func) \
172+
AsanInterceptorContext _ctx = {#func}; \
173+
ctx = (void *)&_ctx; \
174+
(void) ctx;
175+
#define COMMON_INTERCEPT_FUNCTION(name) ASAN_INTERCEPT_FUNC(name)
176+
171177
#endif // ASAN_INTERCEPTORS_H

compiler-rt/lib/asan/asan_interceptors_memintrinsics.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,71 @@
1212
//===---------------------------------------------------------------------===//
1313

1414
#include "asan_interceptors_memintrinsics.h"
15+
16+
#include "asan_interceptors.h"
1517
#include "asan_report.h"
1618
#include "asan_stack.h"
1719
#include "asan_suppressions.h"
1820

1921
using namespace __asan;
2022

23+
// memcpy is called during __asan_init() from the internals of printf(...).
24+
// We do not treat memcpy with to==from as a bug.
25+
// See http://llvm.org/bugs/show_bug.cgi?id=11763.
26+
#define ASAN_MEMCPY_IMPL(ctx, to, from, size) \
27+
do { \
28+
if (LIKELY(replace_intrin_cached)) { \
29+
if (LIKELY(to != from)) { \
30+
CHECK_RANGES_OVERLAP("memcpy", to, size, from, size); \
31+
} \
32+
ASAN_READ_RANGE(ctx, from, size); \
33+
ASAN_WRITE_RANGE(ctx, to, size); \
34+
} else if (UNLIKELY(!asan_inited)) { \
35+
return internal_memcpy(to, from, size); \
36+
} \
37+
return REAL(memcpy)(to, from, size); \
38+
} while (0)
39+
40+
// memset is called inside Printf.
41+
#define ASAN_MEMSET_IMPL(ctx, block, c, size) \
42+
do { \
43+
if (LIKELY(replace_intrin_cached)) { \
44+
ASAN_WRITE_RANGE(ctx, block, size); \
45+
} else if (UNLIKELY(!asan_inited)) { \
46+
return internal_memset(block, c, size); \
47+
} \
48+
return REAL(memset)(block, c, size); \
49+
} while (0)
50+
51+
#define ASAN_MEMMOVE_IMPL(ctx, to, from, size) \
52+
do { \
53+
if (LIKELY(replace_intrin_cached)) { \
54+
ASAN_READ_RANGE(ctx, from, size); \
55+
ASAN_WRITE_RANGE(ctx, to, size); \
56+
} \
57+
return internal_memmove(to, from, size); \
58+
} while (0)
59+
60+
#define COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size) \
61+
do { \
62+
ASAN_INTERCEPTOR_ENTER(ctx, memmove); \
63+
ASAN_MEMMOVE_IMPL(ctx, to, from, size); \
64+
} while (false)
65+
66+
#define COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size) \
67+
do { \
68+
ASAN_INTERCEPTOR_ENTER(ctx, memcpy); \
69+
ASAN_MEMCPY_IMPL(ctx, to, from, size); \
70+
} while (false)
71+
72+
#define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size) \
73+
do { \
74+
ASAN_INTERCEPTOR_ENTER(ctx, memset); \
75+
ASAN_MEMSET_IMPL(ctx, block, c, size); \
76+
} while (false)
77+
78+
#include "sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc"
79+
2180
void *__asan_memcpy(void *to, const void *from, uptr size) {
2281
ASAN_MEMCPY_IMPL(nullptr, to, from, size);
2382
}

compiler-rt/lib/asan/asan_interceptors_memintrinsics.h

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -79,43 +79,6 @@ struct AsanInterceptorContext {
7979
} \
8080
} while (0)
8181

82-
// memcpy is called during __asan_init() from the internals of printf(...).
83-
// We do not treat memcpy with to==from as a bug.
84-
// See http://llvm.org/bugs/show_bug.cgi?id=11763.
85-
#define ASAN_MEMCPY_IMPL(ctx, to, from, size) \
86-
do { \
87-
if (LIKELY(replace_intrin_cached)) { \
88-
if (LIKELY(to != from)) { \
89-
CHECK_RANGES_OVERLAP("memcpy", to, size, from, size); \
90-
} \
91-
ASAN_READ_RANGE(ctx, from, size); \
92-
ASAN_WRITE_RANGE(ctx, to, size); \
93-
} else if (UNLIKELY(!asan_inited)) { \
94-
return internal_memcpy(to, from, size); \
95-
} \
96-
return REAL(memcpy)(to, from, size); \
97-
} while (0)
98-
99-
// memset is called inside Printf.
100-
#define ASAN_MEMSET_IMPL(ctx, block, c, size) \
101-
do { \
102-
if (LIKELY(replace_intrin_cached)) { \
103-
ASAN_WRITE_RANGE(ctx, block, size); \
104-
} else if (UNLIKELY(!asan_inited)) { \
105-
return internal_memset(block, c, size); \
106-
} \
107-
return REAL(memset)(block, c, size); \
108-
} while (0)
109-
110-
#define ASAN_MEMMOVE_IMPL(ctx, to, from, size) \
111-
do { \
112-
if (LIKELY(replace_intrin_cached)) { \
113-
ASAN_READ_RANGE(ctx, from, size); \
114-
ASAN_WRITE_RANGE(ctx, to, size); \
115-
} \
116-
return internal_memmove(to, from, size); \
117-
} while (0)
118-
11982
#define ASAN_READ_RANGE(ctx, offset, size) \
12083
ACCESS_MEMORY_RANGE(ctx, offset, size, false)
12184
#define ASAN_WRITE_RANGE(ctx, offset, size) \

compiler-rt/lib/hwasan/hwasan_interceptors.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ static void *mmap_interceptor(Mmap real_mmap, void *addr, SIZE_T length,
216216
return mmap_interceptor(REAL(mmap), addr, sz, prot, flags, fd, off); \
217217
} while (false)
218218

219+
# include "sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc"
219220
# include "sanitizer_common/sanitizer_common_interceptors.inc"
220221

221222
struct ThreadStartArg {

compiler-rt/lib/memprof/memprof_interceptors.cpp

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,6 @@ using namespace __memprof;
5252
DECLARE_REAL_AND_INTERCEPTOR(void *, malloc, uptr)
5353
DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
5454

55-
#define MEMPROF_INTERCEPTOR_ENTER(ctx, func) \
56-
ctx = 0; \
57-
(void)ctx;
58-
59-
#define COMMON_INTERCEPT_FUNCTION(name) MEMPROF_INTERCEPT_FUNC(name)
6055
#define COMMON_INTERCEPT_FUNCTION_VER(name, ver) \
6156
MEMPROF_INTERCEPT_FUNC_VER(name, ver)
6257
#define COMMON_INTERCEPT_FUNCTION_VER_UNVERSIONED_FALLBACK(name, ver) \
@@ -105,24 +100,6 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
105100
*begin = *end = 0; \
106101
}
107102

108-
#define COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size) \
109-
do { \
110-
MEMPROF_INTERCEPTOR_ENTER(ctx, memmove); \
111-
MEMPROF_MEMMOVE_IMPL(to, from, size); \
112-
} while (false)
113-
114-
#define COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size) \
115-
do { \
116-
MEMPROF_INTERCEPTOR_ENTER(ctx, memcpy); \
117-
MEMPROF_MEMCPY_IMPL(to, from, size); \
118-
} while (false)
119-
120-
#define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size) \
121-
do { \
122-
MEMPROF_INTERCEPTOR_ENTER(ctx, memset); \
123-
MEMPROF_MEMSET_IMPL(block, c, size); \
124-
} while (false)
125-
126103
#include "sanitizer_common/sanitizer_common_interceptors.inc"
127104

128105
#define COMMON_SYSCALL_PRE_READ_RANGE(p, s) MEMPROF_READ_RANGE(p, s)

compiler-rt/lib/memprof/memprof_interceptors.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,10 @@ DECLARE_REAL(char *, strstr, const char *s1, const char *s2)
5757
ver, #name); \
5858
} while (0)
5959

60+
#define MEMPROF_INTERCEPTOR_ENTER(ctx, func) \
61+
ctx = 0; \
62+
(void)ctx;
63+
64+
#define COMMON_INTERCEPT_FUNCTION(name) MEMPROF_INTERCEPT_FUNC(name)
65+
6066
#endif // MEMPROF_INTERCEPTORS_H

compiler-rt/lib/memprof/memprof_interceptors_memintrinsics.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,71 @@
1212
//===---------------------------------------------------------------------===//
1313

1414
#include "memprof_interceptors_memintrinsics.h"
15+
16+
#include "memprof_interceptors.h"
1517
#include "memprof_stack.h"
1618

1719
using namespace __memprof;
1820

21+
// memcpy is called during __memprof_init() from the internals of printf(...).
22+
// We do not treat memcpy with to==from as a bug.
23+
// See http://llvm.org/bugs/show_bug.cgi?id=11763.
24+
#define MEMPROF_MEMCPY_IMPL(to, from, size) \
25+
do { \
26+
if (UNLIKELY(!memprof_inited)) \
27+
return internal_memcpy(to, from, size); \
28+
if (memprof_init_is_running) { \
29+
return REAL(memcpy)(to, from, size); \
30+
} \
31+
ENSURE_MEMPROF_INITED(); \
32+
MEMPROF_READ_RANGE(from, size); \
33+
MEMPROF_WRITE_RANGE(to, size); \
34+
return REAL(memcpy)(to, from, size); \
35+
} while (0)
36+
37+
// memset is called inside Printf.
38+
#define MEMPROF_MEMSET_IMPL(block, c, size) \
39+
do { \
40+
if (UNLIKELY(!memprof_inited)) \
41+
return internal_memset(block, c, size); \
42+
if (memprof_init_is_running) { \
43+
return REAL(memset)(block, c, size); \
44+
} \
45+
ENSURE_MEMPROF_INITED(); \
46+
MEMPROF_WRITE_RANGE(block, size); \
47+
return REAL(memset)(block, c, size); \
48+
} while (0)
49+
50+
#define MEMPROF_MEMMOVE_IMPL(to, from, size) \
51+
do { \
52+
if (UNLIKELY(!memprof_inited)) \
53+
return internal_memmove(to, from, size); \
54+
ENSURE_MEMPROF_INITED(); \
55+
MEMPROF_READ_RANGE(from, size); \
56+
MEMPROF_WRITE_RANGE(to, size); \
57+
return internal_memmove(to, from, size); \
58+
} while (0)
59+
60+
#define COMMON_INTERCEPTOR_MEMMOVE_IMPL(ctx, to, from, size) \
61+
do { \
62+
MEMPROF_INTERCEPTOR_ENTER(ctx, memmove); \
63+
MEMPROF_MEMMOVE_IMPL(to, from, size); \
64+
} while (false)
65+
66+
#define COMMON_INTERCEPTOR_MEMCPY_IMPL(ctx, to, from, size) \
67+
do { \
68+
MEMPROF_INTERCEPTOR_ENTER(ctx, memcpy); \
69+
MEMPROF_MEMCPY_IMPL(to, from, size); \
70+
} while (false)
71+
72+
#define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size) \
73+
do { \
74+
MEMPROF_INTERCEPTOR_ENTER(ctx, memset); \
75+
MEMPROF_MEMSET_IMPL(block, c, size); \
76+
} while (false)
77+
78+
#include "sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc"
79+
1980
void *__memprof_memcpy(void *to, const void *from, uptr size) {
2081
MEMPROF_MEMCPY_IMPL(to, from, size);
2182
}

compiler-rt/lib/memprof/memprof_interceptors_memintrinsics.h

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -32,45 +32,6 @@ namespace __memprof {
3232
__memprof_record_access_range(offset, size); \
3333
} while (0)
3434

35-
// memcpy is called during __memprof_init() from the internals of printf(...).
36-
// We do not treat memcpy with to==from as a bug.
37-
// See http://llvm.org/bugs/show_bug.cgi?id=11763.
38-
#define MEMPROF_MEMCPY_IMPL(to, from, size) \
39-
do { \
40-
if (UNLIKELY(!memprof_inited)) \
41-
return internal_memcpy(to, from, size); \
42-
if (memprof_init_is_running) { \
43-
return REAL(memcpy)(to, from, size); \
44-
} \
45-
ENSURE_MEMPROF_INITED(); \
46-
MEMPROF_READ_RANGE(from, size); \
47-
MEMPROF_WRITE_RANGE(to, size); \
48-
return REAL(memcpy)(to, from, size); \
49-
} while (0)
50-
51-
// memset is called inside Printf.
52-
#define MEMPROF_MEMSET_IMPL(block, c, size) \
53-
do { \
54-
if (UNLIKELY(!memprof_inited)) \
55-
return internal_memset(block, c, size); \
56-
if (memprof_init_is_running) { \
57-
return REAL(memset)(block, c, size); \
58-
} \
59-
ENSURE_MEMPROF_INITED(); \
60-
MEMPROF_WRITE_RANGE(block, size); \
61-
return REAL(memset)(block, c, size); \
62-
} while (0)
63-
64-
#define MEMPROF_MEMMOVE_IMPL(to, from, size) \
65-
do { \
66-
if (UNLIKELY(!memprof_inited)) \
67-
return internal_memmove(to, from, size); \
68-
ENSURE_MEMPROF_INITED(); \
69-
MEMPROF_READ_RANGE(from, size); \
70-
MEMPROF_WRITE_RANGE(to, size); \
71-
return internal_memmove(to, from, size); \
72-
} while (0)
73-
7435
#define MEMPROF_READ_RANGE(offset, size) ACCESS_MEMORY_RANGE(offset, size)
7536
#define MEMPROF_WRITE_RANGE(offset, size) ACCESS_MEMORY_RANGE(offset, size)
7637

compiler-rt/lib/msan/msan_interceptors.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1421,6 +1421,7 @@ int OnExit() {
14211421
} while (false)
14221422

14231423
#include "sanitizer_common/sanitizer_platform_interceptors.h"
1424+
#include "sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc"
14241425
#include "sanitizer_common/sanitizer_common_interceptors.inc"
14251426

14261427
static uptr signal_impl(int signo, uptr cb);

compiler-rt/lib/sanitizer_common/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ set(SANITIZER_IMPL_HEADERS
127127
sanitizer_common_interceptors.inc
128128
sanitizer_common_interceptors_format.inc
129129
sanitizer_common_interceptors_ioctl.inc
130+
sanitizer_common_interceptors_memintrinsics.inc
130131
sanitizer_common_interface.inc
131132
sanitizer_common_interface_posix.inc
132133
sanitizer_common_syscalls.inc

0 commit comments

Comments
 (0)