summaryrefslogtreecommitdiff
path: root/lib/lsan/lsan_common_linux.cc
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2013-09-30 10:57:56 +0000
committerAlexey Samsonov <samsonov@google.com>2013-09-30 10:57:56 +0000
commit2946f13d6ca0cfc46d74c12e97dc40a17a7d232f (patch)
treec80e59cec2c8c29cc628b91da1d16281c9a79122 /lib/lsan/lsan_common_linux.cc
parent4430fdb4b04ae28d22cc6b24eab762afdb2fa0b7 (diff)
downloadcompiler-rt-2946f13d6ca0cfc46d74c12e97dc40a17a7d232f.tar.gz
[LSan] Rework r191522 - treat allocations with short stack traces as live
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@191662 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/lsan/lsan_common_linux.cc')
-rw-r--r--lib/lsan/lsan_common_linux.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/lsan/lsan_common_linux.cc b/lib/lsan/lsan_common_linux.cc
index 6517cf148..ef8857fe8 100644
--- a/lib/lsan/lsan_common_linux.cc
+++ b/lib/lsan/lsan_common_linux.cc
@@ -115,8 +115,12 @@ static void ProcessPlatformSpecificAllocationsCb(uptr chunk, void *arg) {
LsanMetadata m(chunk);
if (m.allocated() && m.tag() != kReachable) {
u32 stack_id = m.stack_trace_id();
- if (!stack_id || linker->containsAddress(GetCallerPC(
- stack_id, param->stack_depot_reverse_map))) {
+ uptr caller_pc = 0;
+ if (stack_id > 0)
+ caller_pc = GetCallerPC(stack_id, param->stack_depot_reverse_map);
+ // If caller_pc is unknown, this chunk may be allocated in a coroutine. Mark
+ // it as reachable, as we can't properly report its allocation stack anyway.
+ if (caller_pc == 0 || linker->containsAddress(caller_pc)) {
m.set_tag(kReachable);
param->frontier->push_back(chunk);
}