Skip to content

Commit 759e797

Browse files
committed
[DFSan][NFC] Refactor Origin Address Alignment code.
Reviewed By: stephan.yichao.zhao Differential Revision: https://reviews.llvm.org/D104565
1 parent 8c68eb8 commit 759e797

File tree

1 file changed

+34
-35
lines changed

1 file changed

+34
-35
lines changed

compiler-rt/lib/dfsan/dfsan.cpp

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,15 @@ dfsan_union(dfsan_label l1, dfsan_label l2) {
146146
return l1 | l2;
147147
}
148148

149+
static const uptr kOriginAlign = sizeof(dfsan_origin);
150+
static const uptr kOriginAlignMask = ~(kOriginAlign - 1UL);
151+
152+
static uptr OriginAlignUp(uptr u) {
153+
return (u + kOriginAlign - 1) & kOriginAlignMask;
154+
}
155+
156+
static uptr OriginAlignDown(uptr u) { return u & kOriginAlignMask; }
157+
149158
// Return the origin of the first taint byte in the size bytes from the address
150159
// addr.
151160
static dfsan_origin GetOriginIfTainted(uptr addr, uptr size) {
@@ -205,15 +214,6 @@ static u32 ChainOrigin(u32 id, StackTrace *stack, bool from_init = false) {
205214
return chained.raw_id();
206215
}
207216

208-
static const uptr kOriginAlign = sizeof(dfsan_origin);
209-
static const uptr kOriginAlignMask = ~(kOriginAlign - 1UL);
210-
211-
static uptr AlignUp(uptr u) {
212-
return (u + kOriginAlign - 1) & kOriginAlignMask;
213-
}
214-
215-
static uptr AlignDown(uptr u) { return u & kOriginAlignMask; }
216-
217217
static void ChainAndWriteOriginIfTainted(uptr src, uptr size, uptr dst,
218218
StackTrace *stack) {
219219
dfsan_origin o = GetOriginIfTainted(src, size);
@@ -231,14 +231,14 @@ static void ChainAndWriteOriginIfTainted(uptr src, uptr size, uptr dst,
231231
static void CopyOrigin(const void *dst, const void *src, uptr size,
232232
StackTrace *stack) {
233233
uptr d = (uptr)dst;
234-
uptr beg = AlignDown(d);
234+
uptr beg = OriginAlignDown(d);
235235
// Copy left unaligned origin if that memory is tainted.
236236
if (beg < d) {
237237
ChainAndWriteOriginIfTainted((uptr)src, beg + kOriginAlign - d, beg, stack);
238238
beg += kOriginAlign;
239239
}
240240

241-
uptr end = AlignDown(d + size);
241+
uptr end = OriginAlignDown(d + size);
242242
// If both ends fall into the same 4-byte slot, we are done.
243243
if (end < beg)
244244
return;
@@ -252,11 +252,11 @@ static void CopyOrigin(const void *dst, const void *src, uptr size,
252252
return;
253253

254254
// Align src up.
255-
uptr s = AlignUp((uptr)src);
256-
dfsan_origin *src_o = (dfsan_origin *)origin_for((void *)s);
257-
u32 *src_s = (u32 *)shadow_for((void *)s);
258-
dfsan_origin *src_end = (dfsan_origin *)origin_for((void *)(s + (end - beg)));
259-
dfsan_origin *dst_o = (dfsan_origin *)origin_for((void *)beg);
255+
uptr src_a = OriginAlignUp((uptr)src);
256+
dfsan_origin *src_o = origin_for((void *)src_a);
257+
u32 *src_s = (u32 *)shadow_for((void *)src_a);
258+
dfsan_origin *src_end = origin_for((void *)(src_a + (end - beg)));
259+
dfsan_origin *dst_o = origin_for((void *)beg);
260260
dfsan_origin last_src_o = 0;
261261
dfsan_origin last_dst_o = 0;
262262
for (; src_o < src_end; ++src_o, ++src_s, ++dst_o) {
@@ -276,34 +276,33 @@ static void CopyOrigin(const void *dst, const void *src, uptr size,
276276
static void ReverseCopyOrigin(const void *dst, const void *src, uptr size,
277277
StackTrace *stack) {
278278
uptr d = (uptr)dst;
279-
uptr end = AlignDown(d + size);
279+
uptr end = OriginAlignDown(d + size);
280280

281281
// Copy right unaligned origin if that memory is tainted.
282282
if (end < d + size)
283283
ChainAndWriteOriginIfTainted((uptr)src + (end - d), (d + size) - end, end,
284284
stack);
285285

286-
uptr beg = AlignDown(d);
286+
uptr beg = OriginAlignDown(d);
287287

288288
if (beg + kOriginAlign < end) {
289289
// Align src up.
290-
uptr s = AlignUp((uptr)src);
291-
dfsan_origin *src =
292-
(dfsan_origin *)origin_for((void *)(s + end - beg - kOriginAlign));
293-
u32 *src_s = (u32 *)shadow_for((void *)(s + end - beg - kOriginAlign));
294-
dfsan_origin *src_begin = (dfsan_origin *)origin_for((void *)s);
295-
dfsan_origin *dst =
296-
(dfsan_origin *)origin_for((void *)(end - kOriginAlign));
297-
dfsan_origin src_o = 0;
298-
dfsan_origin dst_o = 0;
299-
for (; src >= src_begin; --src, --src_s, --dst) {
300-
if (!*src_s)
290+
uptr src_a = OriginAlignUp((uptr)src);
291+
void *src_end = (void *)(src_a + end - beg - kOriginAlign);
292+
dfsan_origin *src_end_o = origin_for(src_end);
293+
u32 *src_end_s = (u32 *)shadow_for(src_end);
294+
dfsan_origin *src_begin_o = origin_for((void *)src_a);
295+
dfsan_origin *dst = origin_for((void *)(end - kOriginAlign));
296+
dfsan_origin last_src_o = 0;
297+
dfsan_origin last_dst_o = 0;
298+
for (; src_end_o >= src_begin_o; --src_end_o, --src_end_s, --dst) {
299+
if (!*src_end_s)
301300
continue;
302-
if (*src != src_o) {
303-
src_o = *src;
304-
dst_o = ChainOrigin(src_o, stack);
301+
if (*src_end_o != last_src_o) {
302+
last_src_o = *src_end_o;
303+
last_dst_o = ChainOrigin(last_src_o, stack);
305304
}
306-
*dst = dst_o;
305+
*dst = last_dst_o;
307306
}
308307
}
309308

@@ -345,8 +344,8 @@ static void SetOrigin(const void *dst, uptr size, u32 origin) {
345344
// Here we extend the range such that its left and right bounds are both
346345
// 4 byte aligned.
347346
uptr x = unaligned_origin_for((uptr)dst);
348-
uptr beg = AlignDown(x);
349-
uptr end = AlignUp(x + size); // align up.
347+
uptr beg = OriginAlignDown(x);
348+
uptr end = OriginAlignUp(x + size); // align up.
350349
u64 origin64 = ((u64)origin << 32) | origin;
351350
// This is like memset, but the value is 32-bit. We unroll by 2 to write
352351
// 64 bits at once. May want to unroll further to get 128-bit stores.

0 commit comments

Comments
 (0)