[msan] Extract SetAllocaOrigin

This commit is contained in:
Vitaly Buka 2022-08-10 20:53:02 -07:00
parent d1040c455f
commit af77e5e4c0
1 changed files with 32 additions and 24 deletions
compiler-rt/lib/msan

View File

@ -303,6 +303,31 @@ u32 ChainOrigin(u32 id, StackTrace *stack) {
return chained.raw_id();
}
// 'descr' is created at compile time and contains '----' in the beginning.
// When we see descr for the first time we replace '----' with a uniq id
// and set the origin to (id | (31-th bit)).
static inline void SetAllocaOrigin(void *a, uptr size, char *descr, uptr pc) {
static const u32 dash = '-';
static const u32 first_timer =
dash + (dash << 8) + (dash << 16) + (dash << 24);
u32 *id_ptr = (u32 *)descr;
bool print = false; // internal_strstr(descr + 4, "AllocaTOTest") != 0;
u32 id = *id_ptr;
if (id == first_timer) {
u32 idx = atomic_fetch_add(&NumStackOriginDescrs, 1, memory_order_relaxed);
CHECK_LT(idx, kNumStackOriginDescrs);
StackOriginDescr[idx] = descr + 4;
StackOriginPC[idx] = pc;
id = Origin::CreateStackOrigin(idx).raw_id();
*id_ptr = id;
if (print)
Printf("First time: idx=%d id=%d %s 0x%zx \n", idx, id, descr + 4, pc);
}
if (print)
Printf("__msan_set_alloca_origin: descr=%s id=%x\n", descr + 4, id);
__msan_set_origin(a, size, id);
}
} // namespace __msan
void __sanitizer::BufferedStackTrace::UnwindImpl(
@ -581,34 +606,17 @@ void __msan_set_origin(const void *a, uptr size, u32 origin) {
if (__msan_get_track_origins()) SetOrigin(a, size, origin);
}
// 'descr' is created at compile time and contains '----' in the beginning.
// When we see descr for the first time we replace '----' with a uniq id
// and set the origin to (id | (31-th bit)).
void __msan_set_alloca_origin(void *a, uptr size, char *descr) {
__msan_set_alloca_origin4(
a, size, descr, StackTrace::GetPreviousInstructionPc(GET_CALLER_PC()));
SetAllocaOrigin(a, size, descr,
StackTrace::GetPreviousInstructionPc(GET_CALLER_PC()));
}
void __msan_set_alloca_origin4(void *a, uptr size, char *descr, uptr pc) {
static const u32 dash = '-';
static const u32 first_timer =
dash + (dash << 8) + (dash << 16) + (dash << 24);
u32 *id_ptr = (u32*)descr;
bool print = false; // internal_strstr(descr + 4, "AllocaTOTest") != 0;
u32 id = *id_ptr;
if (id == first_timer) {
u32 idx = atomic_fetch_add(&NumStackOriginDescrs, 1, memory_order_relaxed);
CHECK_LT(idx, kNumStackOriginDescrs);
StackOriginDescr[idx] = descr + 4;
StackOriginPC[idx] = pc;
id = Origin::CreateStackOrigin(idx).raw_id();
*id_ptr = id;
if (print)
Printf("First time: idx=%d id=%d %s 0x%zx \n", idx, id, descr + 4, pc);
}
if (print)
Printf("__msan_set_alloca_origin: descr=%s id=%x\n", descr + 4, id);
__msan_set_origin(a, size, id);
// Intentionally ignore pc and use return address. This function is here for
// compatibility, in case program is linked with library instrumented by
// older clang.
SetAllocaOrigin(a, size, descr,
StackTrace::GetPreviousInstructionPc(GET_CALLER_PC()));
}
u32 __msan_chain_origin(u32 id) {