#pragma once
#include <torch/csrc/jit/runtime/interpreter.h>
#include <torch/csrc/profiler/combined_traceback.h>
#include "torch_npu/csrc/core/npu/NPUMacros.h"
#include "unwind/unwind.h"
using torch::SymbolizedTracebacks;
namespace torch_npu {
struct TORCH_NPU_API CapturedTraceback : public c10::GatheredContext {
struct PyFrame {
void* code;
int lasti;
};
static std::shared_ptr<CapturedTraceback> gather(bool python, bool script, bool cpp);
CapturedTraceback() = default;
CapturedTraceback(const CapturedTraceback&) = delete;
CapturedTraceback& operator=(const CapturedTraceback&) = delete;
CapturedTraceback(CapturedTraceback&&) noexcept = default;
CapturedTraceback& operator=(CapturedTraceback&&) noexcept = delete;
~CapturedTraceback() override;
using visitproc = int (*)(void* self, void* arg);
struct Python {
virtual std::vector<PyFrame> gather() = 0;
virtual void release(std::vector<PyFrame>& frames) = 0;
virtual void appendSymbolized(const std::vector<PyFrame>& to_symbolize, SymbolizedTracebacks& st) = 0;
virtual int traverse(std::vector<PyFrame>& frames, visitproc visit, void* arg) = 0;
virtual int clear(std::vector<PyFrame>& frames) = 0;
virtual ~Python() = default;
Python* next_ = nullptr;
};
static void addPythonUnwinder(Python* p);
int traversePython(visitproc visit, void* arg);
int clearPython();
private:
std::vector<PyFrame> frames_;
std::vector<void*> cpp_frames_;
std::vector<torch::jit::StackEntry> script_frames_;
friend TORCH_NPU_API SymbolizedTracebacks symbolize(const std::vector<CapturedTraceback*>& to_symbolize);
Python* python_ = nullptr;
};
TORCH_NPU_API SymbolizedTracebacks symbolize(const std::vector<CapturedTraceback*>& to_symbolize);
}