From 19b7b93da9f3e6489d1a6df81377a32b6ac7db49 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Sun, 28 May 2023 23:01:45 -0700 Subject: [PATCH] [lsan] Iterate MemoryMappingLayout once Iterating many time can be very expensive. --- compiler-rt/lib/lsan/lsan_common.cpp | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/compiler-rt/lib/lsan/lsan_common.cpp b/compiler-rt/lib/lsan/lsan_common.cpp index bf40fb584f1f..11207d3c754d 100644 --- a/compiler-rt/lib/lsan/lsan_common.cpp +++ b/compiler-rt/lib/lsan/lsan_common.cpp @@ -243,10 +243,6 @@ static LeakSuppressionContext *GetSuppressionContext() { static InternalMmapVectorNoCtor root_regions; -InternalMmapVectorNoCtor const *GetRootRegions() { - return &root_regions; -} - void InitCommonLsan() { if (common_flags()->detect_leaks) { // Initialization which can fail or print warnings should only be done if @@ -555,21 +551,17 @@ void ScanRootRegions(Frontier *frontier, ScanRootRegion(frontier, r, m.begin, m.end, true); } -static void ProcessRootRegion(Frontier *frontier, const Region &root_region) { - MemoryMappingLayout proc_maps(/*cache_enabled*/ true); - MemoryMappedSegment segment; - while (proc_maps.Next(&segment)) { - ScanRootRegion(frontier, root_region, segment.start, segment.end, - segment.IsReadable()); - } -} - // Scans root regions for heap pointers. static void ProcessRootRegions(Frontier *frontier) { - if (!flags()->use_root_regions) + if (!flags()->use_root_regions || !HasRootRegions()) return; - for (uptr i = 0; i < root_regions.size(); i++) - ProcessRootRegion(frontier, root_regions[i]); + MemoryMappingLayout proc_maps(/*cache_enabled*/ true); + MemoryMappedSegment segment; + InternalMmapVectorNoCtor mapped_regions; + while (proc_maps.Next(&segment)) + if (segment.IsReadable()) + mapped_regions.push_back({segment.start, segment.end}); + ScanRootRegions(frontier, mapped_regions); } static void FloodFillTag(Frontier *frontier, ChunkTag tag) {