From dd5a56128a6f2a2e468d36af70280d05955572c0 Mon Sep 17 00:00:00 2001 From: Muthu Annamalai Date: Tue, 9 May 2023 05:30:16 +0000 Subject: [PATCH] [YOSYS][Issue 3594] Print backtrace on abort/assert #3594 ERROR: No such command: prox (type help for a command overview) Error while executing script: Running script on file demo.ys --------------------------------- 1 read_verilog ./tests/lut/map_not.v 2 opt 3 proc_clean -->4 prox --------------------------------- --- kernel/log.cc | 15 +++++++++++++++ kernel/log.h | 1 + kernel/yosys.cc | 13 ++++++++++--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/kernel/log.cc b/kernel/log.cc index 75a1ffb45..bf1795517 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -354,6 +354,21 @@ static void logv_error_with_prefix(const char *prefix, log_check_expected(); + int lineno = 1; + if ( !log_line_number.empty() ) { + log("Error while executing script:\n\t"); + log( log_line_number.begin()->c_str() ); + log("\n"); + log_line_number.erase(log_line_number.begin()); + log("---------------------------------\n"); + for(const std::string& script_line : log_line_number) { + const char* pfx = (lineno == log_line_number.size()) ? "-->" : " "; + log("%s%d %s\n",pfx,lineno++,script_line.c_str()); + } + log("---------------------------------\n"); + } + + if (log_error_atexit) log_error_atexit(); diff --git a/kernel/log.h b/kernel/log.h index 3a6ec8758..dfcbc1137 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -95,6 +95,7 @@ YOSYS_NAMESPACE_BEGIN struct log_cmd_error_exception { }; extern std::vector log_files; +extern std::vector log_line_number; extern std::vector log_streams; extern std::vector log_scratchpads; extern std::map> log_hdump; diff --git a/kernel/yosys.cc b/kernel/yosys.cc index bd8dded4b..46d341645 100644 --- a/kernel/yosys.cc +++ b/kernel/yosys.cc @@ -359,7 +359,7 @@ int run_command(const std::string &command, std::function log_line_number; bool run_frontend(std::string filename, std::string command, RTLIL::Design *design, std::string *from_to_label) { + log_line_number.clear(); if (design == nullptr) design = yosys_design; @@ -1150,7 +1152,6 @@ bool run_frontend(std::string filename, std::string command, RTLIL::Design *desi { std::string run_from, run_to; bool from_to_active = true; - if (from_to_label != NULL) { size_t pos = from_to_label->find(':'); if (pos == std::string::npos) { @@ -1175,13 +1176,19 @@ bool run_frontend(std::string filename, std::string command, RTLIL::Design *desi if (f == NULL) log_error("Can't open script file `%s' for reading: %s\n", filename.c_str(), strerror(errno)); + { + std::stringstream ss; + ss << "Running " << command << " on file '" << filename << "'"; + log_line_number.push_back(ss.str()); + } FILE *backup_script_file = Frontend::current_script_file; Frontend::current_script_file = f; try { std::string command; while (fgetline(f, command)) { - while (!command.empty() && command[command.size()-1] == '\\') { + log_line_number.push_back(command); + while (!command.empty() && command[command.size()-1] == '\\') { std::string next_line; if (!fgetline(f, next_line)) break;