LCOV - code coverage report
Current view: top level - src/profiler - allocation-tracker.h (source / functions) Hit Total Coverage
Test: app.info Lines: 6 6 100.0 %
Date: 2019-04-19 Functions: 0 0 -

          Line data    Source code
       1             : // Copyright 2013 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_PROFILER_ALLOCATION_TRACKER_H_
       6             : #define V8_PROFILER_ALLOCATION_TRACKER_H_
       7             : 
       8             : #include <map>
       9             : #include <vector>
      10             : 
      11             : #include "include/v8-profiler.h"
      12             : #include "src/base/hashmap.h"
      13             : #include "src/handles.h"
      14             : #include "src/vector.h"
      15             : 
      16             : namespace v8 {
      17             : namespace internal {
      18             : 
      19             : // Forward declarations.
      20             : class AllocationTraceTree;
      21             : class AllocationTracker;
      22             : class HeapObjectsMap;
      23             : class SharedFunctionInfo;
      24             : class StringsStorage;
      25             : 
      26             : class AllocationTraceNode {
      27             :  public:
      28             :   AllocationTraceNode(AllocationTraceTree* tree,
      29             :                       unsigned function_info_index);
      30             :   ~AllocationTraceNode();
      31             :   AllocationTraceNode* FindChild(unsigned function_info_index);
      32             :   AllocationTraceNode* FindOrAddChild(unsigned function_info_index);
      33             :   void AddAllocation(unsigned size);
      34             : 
      35             :   unsigned function_info_index() const { return function_info_index_; }
      36             :   unsigned allocation_size() const { return total_size_; }
      37             :   unsigned allocation_count() const { return allocation_count_; }
      38             :   unsigned id() const { return id_; }
      39             :   const std::vector<AllocationTraceNode*>& children() const {
      40             :     return children_;
      41             :   }
      42             : 
      43             :   void Print(int indent, AllocationTracker* tracker);
      44             : 
      45             :  private:
      46             :   AllocationTraceTree* tree_;
      47             :   unsigned function_info_index_;
      48             :   unsigned total_size_;
      49             :   unsigned allocation_count_;
      50             :   unsigned id_;
      51             :   std::vector<AllocationTraceNode*> children_;
      52             : 
      53             :   DISALLOW_COPY_AND_ASSIGN(AllocationTraceNode);
      54             : };
      55             : 
      56             : 
      57             : class AllocationTraceTree {
      58             :  public:
      59             :   AllocationTraceTree();
      60          35 :   ~AllocationTraceTree() = default;
      61             :   AllocationTraceNode* AddPathFromEnd(const Vector<unsigned>& path);
      62      115650 :   AllocationTraceNode* root() { return &root_; }
      63         300 :   unsigned next_node_id() { return next_node_id_++; }
      64             :   V8_EXPORT_PRIVATE void Print(AllocationTracker* tracker);
      65             : 
      66             :  private:
      67             :   unsigned next_node_id_;
      68             :   AllocationTraceNode root_;
      69             : 
      70             :   DISALLOW_COPY_AND_ASSIGN(AllocationTraceTree);
      71             : };
      72             : 
      73          40 : class V8_EXPORT_PRIVATE AddressToTraceMap {
      74             :  public:
      75             :   void AddRange(Address addr, int size, unsigned node_id);
      76             :   unsigned GetTraceNodeId(Address addr);
      77             :   void MoveObject(Address from, Address to, int size);
      78             :   void Clear();
      79             :   size_t size() { return ranges_.size(); }
      80             :   void Print();
      81             : 
      82             :  private:
      83             :   struct RangeStack {
      84             :     RangeStack(Address start, unsigned node_id)
      85             :         : start(start), trace_node_id(node_id) {}
      86             :     Address start;
      87             :     unsigned trace_node_id;
      88             :   };
      89             :   // [start, end) -> trace
      90             :   typedef std::map<Address, RangeStack> RangeMap;
      91             : 
      92             :   void RemoveRange(Address start, Address end);
      93             : 
      94             :   RangeMap ranges_;
      95             : };
      96             : 
      97             : class AllocationTracker {
      98             :  public:
      99             :   struct FunctionInfo {
     100             :     FunctionInfo();
     101             :     const char* name;
     102             :     SnapshotObjectId function_id;
     103             :     const char* script_name;
     104             :     int script_id;
     105             :     int line;
     106             :     int column;
     107             :   };
     108             : 
     109             :   AllocationTracker(HeapObjectsMap* ids, StringsStorage* names);
     110             :   ~AllocationTracker();
     111             : 
     112             :   V8_EXPORT_PRIVATE void PrepareForSerialization();
     113             :   void AllocationEvent(Address addr, int size);
     114             : 
     115          30 :   AllocationTraceTree* trace_tree() { return &trace_tree_; }
     116             :   const std::vector<FunctionInfo*>& function_info_list() const {
     117             :     return function_info_list_;
     118             :   }
     119       67793 :   AddressToTraceMap* address_to_trace() { return &address_to_trace_; }
     120             : 
     121             :  private:
     122             :   unsigned AddFunctionInfo(SharedFunctionInfo info, SnapshotObjectId id);
     123             :   unsigned functionInfoIndexForVMState(StateTag state);
     124             : 
     125             :   class UnresolvedLocation {
     126             :    public:
     127             :     UnresolvedLocation(Script script, int start, FunctionInfo* info);
     128             :     ~UnresolvedLocation();
     129             :     void Resolve();
     130             : 
     131             :    private:
     132             :     static void HandleWeakScript(const v8::WeakCallbackInfo<void>& data);
     133             : 
     134             :     Handle<Script> script_;
     135             :     int start_position_;
     136             :     FunctionInfo* info_;
     137             :   };
     138             : 
     139             :   static const int kMaxAllocationTraceLength = 64;
     140             :   HeapObjectsMap* ids_;
     141             :   StringsStorage* names_;
     142             :   AllocationTraceTree trace_tree_;
     143             :   unsigned allocation_trace_buffer_[kMaxAllocationTraceLength];
     144             :   std::vector<FunctionInfo*> function_info_list_;
     145             :   base::HashMap id_to_function_info_index_;
     146             :   std::vector<UnresolvedLocation*> unresolved_locations_;
     147             :   unsigned info_index_for_other_state_;
     148             :   AddressToTraceMap address_to_trace_;
     149             : 
     150             :   DISALLOW_COPY_AND_ASSIGN(AllocationTracker);
     151             : };
     152             : 
     153             : }  // namespace internal
     154             : }  // namespace v8
     155             : 
     156             : #endif  // V8_PROFILER_ALLOCATION_TRACKER_H_

Generated by: LCOV version 1.10