// Copyright 2014 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_COMPILER_NODE_ORIGIN_TABLE_H_ #define V8_COMPILER_NODE_ORIGIN_TABLE_H_ #include #include "src/base/compiler-specific.h" #include "src/codegen/source-position.h" #include "src/common/globals.h" #include "src/compiler/node-aux-data.h" namespace v8 { namespace internal { namespace compiler { class NodeOrigin { public: enum OriginKind { kWasmBytecode, kGraphNode }; NodeOrigin(const char* phase_name, const char* reducer_name, NodeId created_from) : phase_name_(phase_name), reducer_name_(reducer_name), origin_kind_(kGraphNode), created_from_(created_from) {} NodeOrigin(const char* phase_name, const char* reducer_name, OriginKind origin_kind, uint64_t created_from) : phase_name_(phase_name), reducer_name_(reducer_name), origin_kind_(origin_kind), created_from_(created_from) {} NodeOrigin(const NodeOrigin& other) V8_NOEXCEPT = default; static NodeOrigin Unknown() { return NodeOrigin(); } bool IsKnown() { return created_from_ >= 0; } int64_t created_from() const { return created_from_; } const char* reducer_name() const { return reducer_name_; } const char* phase_name() const { return phase_name_; } OriginKind origin_kind() const { return origin_kind_; } bool operator==(const NodeOrigin& o) const { return reducer_name_ == o.reducer_name_ && created_from_ == o.created_from_; } void PrintJson(std::ostream& out) const; private: NodeOrigin() : phase_name_(""), reducer_name_(""), created_from_(std::numeric_limits::min()) {} const char* phase_name_; const char* reducer_name_; OriginKind origin_kind_; int64_t created_from_; }; inline bool operator!=(const NodeOrigin& lhs, const NodeOrigin& rhs) { return !(lhs == rhs); } class V8_EXPORT_PRIVATE NodeOriginTable final : public NON_EXPORTED_BASE(ZoneObject) { public: class Scope final { public: Scope(NodeOriginTable* origins, const char* reducer_name, Node* node) : origins_(origins), prev_origin_(NodeOrigin::Unknown()) { if (origins) { prev_origin_ = origins->current_origin_; origins->current_origin_ = NodeOrigin(origins->current_phase_name_, reducer_name, node->id()); } } ~Scope() { if (origins_) origins_->current_origin_ = prev_origin_; } private: NodeOriginTable* const origins_; NodeOrigin prev_origin_; DISALLOW_COPY_AND_ASSIGN(Scope); }; class PhaseScope final { public: PhaseScope(NodeOriginTable* origins, const char* phase_name) : origins_(origins) { if (origins != nullptr) { prev_phase_name_ = origins->current_phase_name_; origins->current_phase_name_ = phase_name == nullptr ? "unnamed" : phase_name; } } ~PhaseScope() { if (origins_) origins_->current_phase_name_ = prev_phase_name_; } private: NodeOriginTable* const origins_; const char* prev_phase_name_; DISALLOW_COPY_AND_ASSIGN(PhaseScope); }; explicit NodeOriginTable(Graph* graph); void AddDecorator(); void RemoveDecorator(); NodeOrigin GetNodeOrigin(Node* node) const; void SetNodeOrigin(Node* node, const NodeOrigin& no); void SetCurrentPosition(const NodeOrigin& no) { current_origin_ = no; } void PrintJson(std::ostream& os) const; private: class Decorator; Graph* const graph_; Decorator* decorator_; NodeOrigin current_origin_; const char* current_phase_name_; NodeAuxData table_; DISALLOW_COPY_AND_ASSIGN(NodeOriginTable); }; } // namespace compiler } // namespace internal } // namespace v8 #endif // V8_COMPILER_NODE_ORIGIN_TABLE_H_