| // 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 <limits> | |
| #include "src/base/compiler-specific.h" | |
| #include "src/compiler/node-aux-data.h" | |
| #include "src/globals.h" | |
| #include "src/source-position.h" | |
| namespace v8 { | |
| namespace internal { | |
| namespace compiler { | |
| class NodeOrigin { | |
| public: | |
| typedef enum { kWasmBytecode, kGraphNode } OriginKind; | |
| 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) = 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<int64_t>::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<NodeOrigin, NodeOrigin::Unknown> table_; | |
| DISALLOW_COPY_AND_ASSIGN(NodeOriginTable); | |
| }; | |
| } // namespace compiler | |
| } // namespace internal | |
| } // namespace v8 | |
| #endif // V8_COMPILER_NODE_ORIGIN_TABLE_H_ |