xref: /aosp_15_r20/external/compiler-rt/lib/sanitizer_common/sanitizer_stackdepot.h (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot //===-- sanitizer_stackdepot.h ----------------------------------*- C++ -*-===//
2*7c3d14c8STreehugger Robot //
3*7c3d14c8STreehugger Robot //                     The LLVM Compiler Infrastructure
4*7c3d14c8STreehugger Robot //
5*7c3d14c8STreehugger Robot // This file is distributed under the University of Illinois Open Source
6*7c3d14c8STreehugger Robot // License. See LICENSE.TXT for details.
7*7c3d14c8STreehugger Robot //
8*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
9*7c3d14c8STreehugger Robot //
10*7c3d14c8STreehugger Robot // This file is shared between AddressSanitizer and ThreadSanitizer
11*7c3d14c8STreehugger Robot // run-time libraries.
12*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
13*7c3d14c8STreehugger Robot 
14*7c3d14c8STreehugger Robot #ifndef SANITIZER_STACKDEPOT_H
15*7c3d14c8STreehugger Robot #define SANITIZER_STACKDEPOT_H
16*7c3d14c8STreehugger Robot 
17*7c3d14c8STreehugger Robot #include "sanitizer_common.h"
18*7c3d14c8STreehugger Robot #include "sanitizer_internal_defs.h"
19*7c3d14c8STreehugger Robot #include "sanitizer_stacktrace.h"
20*7c3d14c8STreehugger Robot 
21*7c3d14c8STreehugger Robot namespace __sanitizer {
22*7c3d14c8STreehugger Robot 
23*7c3d14c8STreehugger Robot // StackDepot efficiently stores huge amounts of stack traces.
24*7c3d14c8STreehugger Robot struct StackDepotNode;
25*7c3d14c8STreehugger Robot struct StackDepotHandle {
26*7c3d14c8STreehugger Robot   StackDepotNode *node_;
StackDepotHandleStackDepotHandle27*7c3d14c8STreehugger Robot   StackDepotHandle() : node_(nullptr) {}
StackDepotHandleStackDepotHandle28*7c3d14c8STreehugger Robot   explicit StackDepotHandle(StackDepotNode *node) : node_(node) {}
validStackDepotHandle29*7c3d14c8STreehugger Robot   bool valid() { return node_; }
30*7c3d14c8STreehugger Robot   u32 id();
31*7c3d14c8STreehugger Robot   int use_count();
32*7c3d14c8STreehugger Robot   void inc_use_count_unsafe();
33*7c3d14c8STreehugger Robot };
34*7c3d14c8STreehugger Robot 
35*7c3d14c8STreehugger Robot const int kStackDepotMaxUseCount = 1U << 20;
36*7c3d14c8STreehugger Robot 
37*7c3d14c8STreehugger Robot StackDepotStats *StackDepotGetStats();
38*7c3d14c8STreehugger Robot u32 StackDepotPut(StackTrace stack);
39*7c3d14c8STreehugger Robot StackDepotHandle StackDepotPut_WithHandle(StackTrace stack);
40*7c3d14c8STreehugger Robot // Retrieves a stored stack trace by the id.
41*7c3d14c8STreehugger Robot StackTrace StackDepotGet(u32 id);
42*7c3d14c8STreehugger Robot 
43*7c3d14c8STreehugger Robot void StackDepotLockAll();
44*7c3d14c8STreehugger Robot void StackDepotUnlockAll();
45*7c3d14c8STreehugger Robot 
46*7c3d14c8STreehugger Robot // Instantiating this class creates a snapshot of StackDepot which can be
47*7c3d14c8STreehugger Robot // efficiently queried with StackDepotGet(). You can use it concurrently with
48*7c3d14c8STreehugger Robot // StackDepot, but the snapshot is only guaranteed to contain those stack traces
49*7c3d14c8STreehugger Robot // which were stored before it was instantiated.
50*7c3d14c8STreehugger Robot class StackDepotReverseMap {
51*7c3d14c8STreehugger Robot  public:
52*7c3d14c8STreehugger Robot   StackDepotReverseMap();
53*7c3d14c8STreehugger Robot   StackTrace Get(u32 id);
54*7c3d14c8STreehugger Robot 
55*7c3d14c8STreehugger Robot  private:
56*7c3d14c8STreehugger Robot   struct IdDescPair {
57*7c3d14c8STreehugger Robot     u32 id;
58*7c3d14c8STreehugger Robot     StackDepotNode *desc;
59*7c3d14c8STreehugger Robot 
60*7c3d14c8STreehugger Robot     static bool IdComparator(const IdDescPair &a, const IdDescPair &b);
61*7c3d14c8STreehugger Robot   };
62*7c3d14c8STreehugger Robot 
63*7c3d14c8STreehugger Robot   InternalMmapVector<IdDescPair> map_;
64*7c3d14c8STreehugger Robot 
65*7c3d14c8STreehugger Robot   // Disallow evil constructors.
66*7c3d14c8STreehugger Robot   StackDepotReverseMap(const StackDepotReverseMap&);
67*7c3d14c8STreehugger Robot   void operator=(const StackDepotReverseMap&);
68*7c3d14c8STreehugger Robot };
69*7c3d14c8STreehugger Robot 
70*7c3d14c8STreehugger Robot } // namespace __sanitizer
71*7c3d14c8STreehugger Robot 
72*7c3d14c8STreehugger Robot #endif // SANITIZER_STACKDEPOT_H
73