9 #if NMODL_ENABLE_BACKWARD
10 #include <backward.hpp>
21 std::string
format()
const override {
26 #if NMODL_ENABLE_BACKWARD
27 size_t first_relevant_trace(backward::TraceResolver& tr,
const backward::StackTrace& st) {
28 std::vector<std::string> stop_at{
"printer/code_printer.cpp",
"printer/code_printer.hpp"};
29 int start_from = int(st.size()) - 2;
30 for (
int i = start_from; i >= 0; --i) {
31 backward::ResolvedTrace trace = tr.resolve(st[i]);
32 const std::string& filename = trace.source.filename;
34 for (
const auto& f: stop_at) {
41 throw std::runtime_error(
"Failed to determine relevant trace.");
44 class BackwardTracePrinter {
46 std::string format(
const backward::ResolvedTrace& trace,
const std::string& trace_label)
const {
47 const std::string& filename = trace.source.filename;
48 size_t linenumber = trace.source.line;
50 auto pad = std::string(trace_label.size(),
' ');
52 std::stringstream sout;
54 sout << fmt::format(
"{} Source: \"{}\", line {}, in {}\n",
58 trace.source.function);
60 if (std::filesystem::exists(trace.source.filename) && trace.source.line != 0) {
61 auto snippet = snippets.get_snippet(filename, linenumber, 3);
62 for (
auto line: snippet) {
63 sout << fmt::format(
"{} {}{:>5d}: {}\n",
65 linenumber == line.first ?
">" :
" ",
74 mutable backward::SnippetFactory snippets;
82 std::string
format()
const override {
83 backward::StackTrace st;
86 backward::TraceResolver tr;
88 size_t trace_id = first_relevant_trace(tr, st);
89 backward::ResolvedTrace trace = tr.resolve(st[trace_id]);
91 return trace_printer.format(trace,
"");
94 BackwardTracePrinter trace_printer;
103 std::string
format()
const override {
104 backward::StackTrace st;
107 backward::TraceResolver tr;
109 size_t first_trace_id = first_relevant_trace(tr, st);
111 std::string full_trace =
"\n\n --- Backtrace ----------------\n";
112 for (
int i = st.size() - 1; i >= first_trace_id; --i) {
113 backward::ResolvedTrace trace = tr.resolve(st[i]);
114 full_trace += trace_printer.format(trace,
std::to_string(i) +
":");
119 BackwardTracePrinter trace_printer;
130 return std::make_unique<ShortBlame>(blame_line);
132 return std::make_unique<DetailedBlame>(blame_line);
134 throw std::runtime_error(
"Unknown blame_level.");