From 6f365cc753d8150ae694357281e4775ac6e365cf Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Wed, 21 May 2014 09:02:13 +0000 Subject: [msan] Chained origins re-design. Generalize StackDepot and create a new specialized instance of it to efficiently (i.e. without duplicating stack trace data) store the origin history tree. This reduces memory usage for chained origins roughly by an order of magnitude. Most importantly, this new design allows us to put two limits on stored history data (exposed in MSAN_OPTIONS) that help avoid exponential growth in used memory on certain workloads. See comments in lib/msan/msan_origin.h for more details. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@209284 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/msan/msan_allocator.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'lib/msan/msan_allocator.cc') diff --git a/lib/msan/msan_allocator.cc b/lib/msan/msan_allocator.cc index 90b9b31fb..e6da9c14b 100644 --- a/lib/msan/msan_allocator.cc +++ b/lib/msan/msan_allocator.cc @@ -16,6 +16,8 @@ #include "sanitizer_common/sanitizer_stackdepot.h" #include "msan.h" #include "msan_allocator.h" +#include "msan_chained_origin_depot.h" +#include "msan_origin.h" #include "msan_thread.h" namespace __msan { @@ -101,9 +103,9 @@ static void *MsanAllocate(StackTrace *stack, uptr size, uptr alignment, if (__msan_get_track_origins()) { u32 stack_id = StackDepotPut(stack->trace, stack->size); CHECK(stack_id); - CHECK_EQ((stack_id >> 31), - 0); // Higher bit is occupied by stack origins. - __msan_set_origin(allocated, size, stack_id); + u32 id; + ChainedOriginDepotPut(stack_id, Origin::kHeapRoot, &id); + __msan_set_origin(allocated, size, Origin(id, 1).raw_id()); } } MSAN_MALLOC_HOOK(allocated, size); @@ -124,9 +126,9 @@ void MsanDeallocate(StackTrace *stack, void *p) { if (__msan_get_track_origins()) { u32 stack_id = StackDepotPut(stack->trace, stack->size); CHECK(stack_id); - CHECK_EQ((stack_id >> 31), - 0); // Higher bit is occupied by stack origins. - __msan_set_origin(p, size, stack_id); + u32 id; + ChainedOriginDepotPut(stack_id, Origin::kHeapRoot, &id); + __msan_set_origin(p, size, Origin(id, 1).raw_id()); } } MsanThread *t = GetCurrentThread(); -- cgit v1.2.3