diff --git a/compiler-rt/lib/asan/asan_allocator.cpp b/compiler-rt/lib/asan/asan_allocator.cpp --- a/compiler-rt/lib/asan/asan_allocator.cpp +++ b/compiler-rt/lib/asan/asan_allocator.cpp @@ -1190,6 +1190,16 @@ m->lsan_tag = __lsan::kIgnored; return kIgnoreObjectSuccess; } + +IgnoreObjectResult UnIgnoreObjectLocked(const void *p) { + __asan::AsanChunk *m = LookUpValidChunk(p); + if (!m) + return kIgnoreObjectInvalid; + if (m->lsan_tag != kIgnored) + return kIgnoreObjectNotAlreadyIgnored; + m->lsan_tag = __lsan::kDirectlyLeaked; + return kIgnoreObjectSuccess; +} } // namespace __lsan // ---------------------- Interface ---------------- {{{1 diff --git a/compiler-rt/lib/lsan/lsan_allocator.cpp b/compiler-rt/lib/lsan/lsan_allocator.cpp --- a/compiler-rt/lib/lsan/lsan_allocator.cpp +++ b/compiler-rt/lib/lsan/lsan_allocator.cpp @@ -316,6 +316,16 @@ m->tag = kIgnored; return kIgnoreObjectSuccess; } + +IgnoreObjectResult UnIgnoreObjectLocked(const void *p) { + ChunkMetadata *m = LookUpValidChunk(p); + if (!m) + return kIgnoreObjectInvalid; + if (m->tag != kIgnored) + return kIgnoreObjectNotAlreadyIgnored; + m->tag = kDirectlyLeaked; + return kIgnoreObjectSuccess; +} } // namespace __lsan using namespace __lsan; diff --git a/compiler-rt/lib/lsan/lsan_common.h b/compiler-rt/lib/lsan/lsan_common.h --- a/compiler-rt/lib/lsan/lsan_common.h +++ b/compiler-rt/lib/lsan/lsan_common.h @@ -155,6 +155,7 @@ enum IgnoreObjectResult { kIgnoreObjectSuccess, kIgnoreObjectAlreadyIgnored, + kIgnoreObjectNotAlreadyIgnored, kIgnoreObjectInvalid }; @@ -242,6 +243,7 @@ uptr GetUserBegin(uptr chunk); // Helper for __lsan_ignore_object(). IgnoreObjectResult IgnoreObjectLocked(const void *p); +IgnoreObjectResult UnIgnoreObjectLocked(const void *p); // Return the linker module, if valid for the platform. LoadedModule *GetLinker();