/** * Copyright 2019 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MINDSPORE_CCSRC_IR_INFO_H_ #define MINDSPORE_CCSRC_IR_INFO_H_ #include #include #include #include #include #include #include "ir/base.h" #include "debug/trace_info.h" namespace mindspore { // namespace to support intermediate representation definition enum SourceLineTip { kSourceLineTipDiscard = 0, kSourceLineTipNextLine = 1, kSourceLineTipInLine = 2 }; // Location class record the location in source code. class Location { public: Location(const std::string &file_name, int line, int column, int line_end, int column_end) : file_name_(file_name), line_(line), column_(column), line_end_(line_end), column_end_(column_end) {} Location(const Location &loc) : file_name_(loc.file_name_), line_(loc.line_), column_(loc.column_), line_end_(loc.line_end_), column_end_(loc.column_end_) {} std::string ToString(SourceLineTip tip = kSourceLineTipNextLine); std::string file_name() { return file_name_; } int line() const { return line_; } void set_line(int line) { line_ = line; } int line_end() const { return line_end_; } void set_line_end(int line) { line_end_ = line; } int column() const { return column_; } void set_column(int column) { column_ = column; } int column_end() const { return column_end_; } void set_column_end(int column) { column_end_ = column; } ~Location() = default; private: std::string file_name_; int line_; int column_; int line_end_; int column_end_; }; class TraceContext; using TraceContextPtr = std::shared_ptr; class FuncGraph; using FuncGraphPtr = std::shared_ptr; using FuncGraphWeakPtr = std::weak_ptr; class AnfNode; using AnfNodeWeakPtr = std::weak_ptr; class TraceManager { public: TraceManager() = default; ~TraceManager() = default; static TraceContextPtr CurrentContextInfo(); static void DebugTrace(const std::string &func_name, const LocationPtr &location); static void DebugTrace(const LocationPtr &location); static void DebugTrace(const TraceInfoPtr &trace_info); // debug trace with a cloned trace info with debug_info static void DebugTrace(const DebugInfoPtr &debug_info, const TraceInfoPtr &trace_info); static void EndTrace(); static std::stack trace_context_stack_; }; class TraceGuard { public: explicit TraceGuard(const std::string func_name, const LocationPtr &location) { TraceManager::DebugTrace(func_name, location); } explicit TraceGuard(const LocationPtr &location) { TraceManager::DebugTrace(location); } ~TraceGuard() { TraceManager::EndTrace(); } }; class TraceContext { public: LocationPtr location_; TraceInfoPtr trace_info_; std::string func_name_; protected: void ProcessAttributeFromContext(); public: ~TraceContext() = default; explicit TraceContext(const LocationPtr &loc) { ProcessAttributeFromContext(); location_ = loc; } explicit TraceContext(const std::string &func_name) { ProcessAttributeFromContext(); func_name_ = func_name; } explicit TraceContext(const TraceInfoPtr &trace_info) { ProcessAttributeFromContext(); trace_info_ = trace_info; } void set_location(const LocationPtr &loc) { location_ = loc; } LocationPtr location() { return location_; } void set_trace_info(const TraceInfoPtr &trace_info) { trace_info_ = trace_info; } TraceInfoPtr trace_info() const { return trace_info_; } void set_func_name(const std::string &func_name) { func_name_ = func_name; } std::string func_name() { return func_name_; } }; class DebugInfo : public Base { public: DebugInfo(); explicit DebugInfo(const std::string &name); explicit DebugInfo(const LocationPtr &loc); ~DebugInfo() override = default; MS_DECLARE_PARENT(DebugInfo, Base); int64_t debug_id(); int64_t unique_id() const { return unique_id_; } int64_t unique_id_through_copy() const; std::string get_id() { return std::to_string(debug_id()); } void set_trace_info(const TraceInfoPtr &trace_info) { trace_info_ = trace_info; } TraceInfoPtr trace_info() const { return trace_info_; } void set_location(const LocationPtr &loc) { location_ = loc; } virtual LocationPtr location() { return location_; } std::string name() { return name_; } void set_name(const std::string &name) { name_ = name; } virtual std::string debug_name(); virtual std::string get_python_func_belonged() { return ""; } protected: template std::shared_ptr shared_from_base() { return std::static_pointer_cast(shared_from_this()); } private: void InitValueFromContext() { if (TraceManager::CurrentContextInfo() != nullptr) { auto context_info = TraceManager::CurrentContextInfo(); trace_info_ = context_info->trace_info(); location_ = context_info->location(); } } static int64_t gen_unique_id() { static int64_t cur_unique_id = 0; return cur_unique_id++; } protected: int64_t unique_id_; int64_t debug_id_; TraceInfoPtr trace_info_; LocationPtr location_; std::string name_; }; class NodeDebugInfo : public DebugInfo { public: NodeDebugInfo() { if (TraceManager::CurrentContextInfo() != nullptr) { auto context_info = TraceManager::CurrentContextInfo(); py_func_belonged_ = context_info->func_name(); } } explicit NodeDebugInfo(const std::string &name) : DebugInfo(name) { if (TraceManager::CurrentContextInfo() != nullptr) { auto context_info = TraceManager::CurrentContextInfo(); py_func_belonged_ = context_info->func_name(); } } ~NodeDebugInfo() override = default; std::string debug_name() override; void set_node(const std::shared_ptr &node) { node_ = AnfNodeWeakPtr(node); } std::shared_ptr get_node() const { return node_.lock(); } void set_py_func_belonged(const std::string &name) { py_func_belonged_ = name; } std::string get_python_func_belonged() override { return py_func_belonged_; } AnfNodeWeakPtr node_; std::string py_func_belonged_; }; using NodeDebugInfoPtr = std::shared_ptr; class GraphDebugInfo : public DebugInfo { public: GraphDebugInfo() { if (TraceManager::CurrentContextInfo() != nullptr) { auto context_info = TraceManager::CurrentContextInfo(); py_func_name_ = context_info->func_name(); deco_loc_ = nullptr; } } explicit GraphDebugInfo(const std::string &name) : DebugInfo(name) { if (TraceManager::CurrentContextInfo() != nullptr) { auto context_info = TraceManager::CurrentContextInfo(); py_func_name_ = context_info->func_name(); deco_loc_ = nullptr; } } ~GraphDebugInfo() override = default; std::string debug_name() override; LocationPtr location() override; LocationPtr deco_location() { return deco_loc_; } void set_graph(const FuncGraphPtr &func_graph) { func_graph_ = FuncGraphWeakPtr(func_graph); } FuncGraphPtr get_graph() const { return func_graph_.lock(); } void set_full_name(const std::string &name) { full_name_ = name; } std::string get_full_name() { return full_name_; } void set_deco_location(const LocationPtr &deco_list_loc); std::string get_python_func_belonged() override { return py_func_name_; } FuncGraphWeakPtr func_graph_; LocationPtr deco_loc_; std::string py_func_name_; std::string full_name_; }; using GraphDebugInfoPtr = std::shared_ptr; } // namespace mindspore #endif // MINDSPORE_CCSRC_IR_INFO_H_