Skip to content

Commit

Permalink
[sanitizer] Add compress_stack_depot flag
Browse files Browse the repository at this point in the history
Depends on D114494.

Reviewed By: morehouse

Differential Revision: https://reviews.llvm.org/D114495
  • Loading branch information
vitalybuka committed Dec 1, 2021
1 parent d8f9eaa commit bf18253
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 2 deletions.
2 changes: 2 additions & 0 deletions compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,8 @@ COMMON_FLAG(const char *, stack_trace_format, "DEFAULT",
"Format string used to render stack frames. "
"See sanitizer_stacktrace_printer.h for the format description. "
"Use DEFAULT to get default format.")
COMMON_FLAG(int, compress_stack_depot, 0,
"Compress stack depot to save memory.")
COMMON_FLAG(bool, no_huge_pages_for_shadow, true,
"If true, the shadow is not allowed to use huge pages. ")
COMMON_FLAG(bool, strict_string_checks, false,
Expand Down
17 changes: 15 additions & 2 deletions compiler-rt/lib/sanitizer_common/sanitizer_stackdepot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,25 @@ uptr StackDepotNode::allocated() {
return stackStore.Allocated() + useCounts.MemoryUsage();
}

static void CompressStackStore() {
u64 start = MonotonicNanoTime();
uptr diff = stackStore.Pack(static_cast<StackStore::Compression>(
common_flags()->compress_stack_depot));
if (!diff)
return;
u64 finish = MonotonicNanoTime();
uptr total = stackStore.Allocated();
VPrintf(1, "%s: StackDepot released %zu KiB out of %zu KiB in %llu ms\n",
SanitizerToolName, diff >> 10, total >> 10,
(finish - start) / 1000000);
}

void StackDepotNode::store(u32 id, const args_type &args, hash_type hash) {
stack_hash = hash;
uptr pack = 0;
store_id = stackStore.Store(args, &pack);
if (pack)
stackStore.Pack(StackStore::Compression::None);
if (pack && common_flags()->compress_stack_depot)
CompressStackStore();
}

StackDepotNode::args_type StackDepotNode::load(u32 id) const {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// RUN: %clangxx %s -fsanitize-memory-track-origins=1 -o %t
// RUN: %env_tool_opts="compress_stack_depot=0:malloc_context_size=128:verbosity=1" %run %t 2>&1 | FileCheck %s --implicit-check-not="StackDepot released"
// RUN: %env_tool_opts="compress_stack_depot=1:malloc_context_size=128:verbosity=1" %run %t 2>&1 | FileCheck %s --check-prefixes=COMPRESS

// Ubsan does not store stacks.
// UNSUPPORTED: ubsan

#include <memory>

__attribute__((noinline)) void a(unsigned v);
__attribute__((noinline)) void b(unsigned v);

std::unique_ptr<int[]> p;

__attribute__((noinline)) void a(unsigned v) {
int x;
v >>= 1;
if (!v) {
p.reset(new int[100]);
p[1] = x;
return;
}
if (v & 1)
b(v);
else
a(v);
}

__attribute__((noinline)) void b(unsigned v) { return a(v); }

int main(int argc, char *argv[]) {
for (unsigned i = 0; i < 100000; ++i)
a(i + (i << 16));
return 0;
}

// COMPRESS: StackDepot released {{[0-9]+}}

0 comments on commit bf18253

Please sign in to comment.