LCOV - code coverage report
Current view: top level - src/compiler - node-origin-table.h (source / functions) Hit Total Coverage
Test: app.info Lines: 16 16 100.0 %
Date: 2019-04-17 Functions: 0 0 -

          Line data    Source code
       1             : // Copyright 2014 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_COMPILER_NODE_ORIGIN_TABLE_H_
       6             : #define V8_COMPILER_NODE_ORIGIN_TABLE_H_
       7             : 
       8             : #include <limits>
       9             : 
      10             : #include "src/base/compiler-specific.h"
      11             : #include "src/compiler/node-aux-data.h"
      12             : #include "src/globals.h"
      13             : #include "src/source-position.h"
      14             : 
      15             : namespace v8 {
      16             : namespace internal {
      17             : namespace compiler {
      18             : 
      19             : class NodeOrigin {
      20             :  public:
      21             :   enum OriginKind { kWasmBytecode, kGraphNode };
      22             :   NodeOrigin(const char* phase_name, const char* reducer_name,
      23             :              NodeId created_from)
      24             :       : phase_name_(phase_name),
      25             :         reducer_name_(reducer_name),
      26             :         origin_kind_(kGraphNode),
      27        1501 :         created_from_(created_from) {}
      28             : 
      29             :   NodeOrigin(const char* phase_name, const char* reducer_name,
      30             :              OriginKind origin_kind, uint64_t created_from)
      31             :       : phase_name_(phase_name),
      32             :         reducer_name_(reducer_name),
      33             :         origin_kind_(origin_kind),
      34          96 :         created_from_(created_from) {}
      35             : 
      36             :   NodeOrigin(const NodeOrigin& other) V8_NOEXCEPT = default;
      37             :   static NodeOrigin Unknown() { return NodeOrigin(); }
      38             : 
      39             :   bool IsKnown() { return created_from_ >= 0; }
      40             :   int64_t created_from() const { return created_from_; }
      41             :   const char* reducer_name() const { return reducer_name_; }
      42             :   const char* phase_name() const { return phase_name_; }
      43             : 
      44             :   OriginKind origin_kind() const { return origin_kind_; }
      45             : 
      46             :   bool operator==(const NodeOrigin& o) const {
      47         174 :     return reducer_name_ == o.reducer_name_ && created_from_ == o.created_from_;
      48             :   }
      49             : 
      50             :   void PrintJson(std::ostream& out) const;
      51             : 
      52             :  private:
      53             :   NodeOrigin()
      54             :       : phase_name_(""),
      55             :         reducer_name_(""),
      56     1503004 :         created_from_(std::numeric_limits<int64_t>::min()) {}
      57             :   const char* phase_name_;
      58             :   const char* reducer_name_;
      59             :   OriginKind origin_kind_;
      60             :   int64_t created_from_;
      61             : };
      62             : 
      63             : inline bool operator!=(const NodeOrigin& lhs, const NodeOrigin& rhs) {
      64         174 :   return !(lhs == rhs);
      65             : }
      66             : 
      67       67880 : class V8_EXPORT_PRIVATE NodeOriginTable final
      68             :     : public NON_EXPORTED_BASE(ZoneObject) {
      69             :  public:
      70             :   class Scope final {
      71             :    public:
      72             :     Scope(NodeOriginTable* origins, const char* reducer_name, Node* node)
      73             :         : origins_(origins), prev_origin_(NodeOrigin::Unknown()) {
      74    68728238 :       if (origins) {
      75        1501 :         prev_origin_ = origins->current_origin_;
      76             :         origins->current_origin_ =
      77        3002 :             NodeOrigin(origins->current_phase_name_, reducer_name, node->id());
      78             :       }
      79             :     }
      80             : 
      81             :     ~Scope() {
      82    68728397 :       if (origins_) origins_->current_origin_ = prev_origin_;
      83             :     }
      84             : 
      85             :    private:
      86             :     NodeOriginTable* const origins_;
      87             :     NodeOrigin prev_origin_;
      88             :     DISALLOW_COPY_AND_ASSIGN(Scope);
      89             :   };
      90             : 
      91             :   class PhaseScope final {
      92             :    public:
      93             :     PhaseScope(NodeOriginTable* origins, const char* phase_name)
      94    66501441 :         : origins_(origins) {
      95    66501441 :       if (origins != nullptr) {
      96     4402965 :         prev_phase_name_ = origins->current_phase_name_;
      97             :         origins->current_phase_name_ =
      98     4402965 :             phase_name == nullptr ? "unnamed" : phase_name;
      99             :       }
     100             :     }
     101             : 
     102    66501111 :     ~PhaseScope() {
     103    66501111 :       if (origins_) origins_->current_phase_name_ = prev_phase_name_;
     104             :     }
     105             : 
     106             :    private:
     107             :     NodeOriginTable* const origins_;
     108             :     const char* prev_phase_name_;
     109             :     DISALLOW_COPY_AND_ASSIGN(PhaseScope);
     110             :   };
     111             : 
     112             :   explicit NodeOriginTable(Graph* graph);
     113             : 
     114             :   void AddDecorator();
     115             :   void RemoveDecorator();
     116             : 
     117             :   NodeOrigin GetNodeOrigin(Node* node) const;
     118             :   void SetNodeOrigin(Node* node, const NodeOrigin& no);
     119             : 
     120             :   void SetCurrentPosition(const NodeOrigin& no) { current_origin_ = no; }
     121             : 
     122             :   void PrintJson(std::ostream& os) const;
     123             : 
     124             :  private:
     125             :   class Decorator;
     126             : 
     127             :   Graph* const graph_;
     128             :   Decorator* decorator_;
     129             :   NodeOrigin current_origin_;
     130             : 
     131             :   const char* current_phase_name_;
     132             :   NodeAuxData<NodeOrigin, NodeOrigin::Unknown> table_;
     133             : 
     134             :   DISALLOW_COPY_AND_ASSIGN(NodeOriginTable);
     135             : };
     136             : 
     137             : }  // namespace compiler
     138             : }  // namespace internal
     139             : }  // namespace v8
     140             : 
     141             : #endif  // V8_COMPILER_NODE_ORIGIN_TABLE_H_

Generated by: LCOV version 1.10