[NFC][sanitizer] Lazy init in StackDepotReverseMap
authorVitaly Buka <vitalybuka@google.com>
Fri, 1 Oct 2021 02:10:20 +0000 (19:10 -0700)
committerVitaly Buka <vitalybuka@google.com>
Fri, 1 Oct 2021 02:26:34 +0000 (19:26 -0700)
compiler-rt/lib/sanitizer_common/sanitizer_stackdepot.cpp
compiler-rt/lib/sanitizer_common/sanitizer_stackdepot.h

index 9215867..c71b0a1 100644 (file)
@@ -125,7 +125,9 @@ bool StackDepotReverseMap::IdDescPair::IdComparator(
   return a.id < b.id;
 }
 
-StackDepotReverseMap::StackDepotReverseMap() {
+void StackDepotReverseMap::Init() const {
+  if (LIKELY(map_.capacity()))
+    return;
   map_.reserve(StackDepotGetStats().n_uniq_ids + 100);
   for (int idx = 0; idx < StackDepot::kTabSize; idx++) {
     atomic_uintptr_t *p = &theDepot.tab[idx];
@@ -140,6 +142,7 @@ StackDepotReverseMap::StackDepotReverseMap() {
 }
 
 StackTrace StackDepotReverseMap::Get(u32 id) const {
+  Init();
   if (!map_.size())
     return StackTrace();
   IdDescPair pair = {id, nullptr};
index d4c2ee3..6f79fff 100644 (file)
@@ -49,7 +49,7 @@ void StackDepotPrintAll();
 // which were stored before it was instantiated.
 class StackDepotReverseMap {
  public:
-  StackDepotReverseMap();
+  StackDepotReverseMap() = default;
   StackTrace Get(u32 id) const;
 
  private:
@@ -60,7 +60,9 @@ class StackDepotReverseMap {
     static bool IdComparator(const IdDescPair &a, const IdDescPair &b);
   };
 
-  InternalMmapVector<IdDescPair> map_;
+  void Init() const;
+
+  mutable InternalMmapVector<IdDescPair> map_;
 
   // Disallow evil constructors.
   StackDepotReverseMap(const StackDepotReverseMap&);