Merge pull request #2932 from YosysHQ/mwk/logger-check-expected
[yosys.git] / kernel / log.cc
index d84a4381eccb9a297e26e41bbdcf26ce8750d448..e7ce4cc466c0a81450bd523ae98bc4e73000c81b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  yosys -- Yosys Open SYnthesis Suite
  *
- *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at>
+ *  Copyright (C) 2012  Claire Xenia Wolf <claire@yosyshq.com>
  *
  *  Permission to use, copy, modify, and/or distribute this software for any
  *  purpose with or without fee is hereby granted, provided that the above
@@ -19,7 +19,7 @@
 
 #include "kernel/yosys.h"
 #include "libs/sha1/sha1.h"
-#include "backends/ilang/ilang_backend.h"
+#include "backends/rtlil/rtlil_backend.h"
 
 #if !defined(_WIN32) || defined(__MINGW32__)
 #  include <sys/time.h>
@@ -42,7 +42,7 @@ std::vector<FILE*> log_files;
 std::vector<std::ostream*> log_streams;
 std::map<std::string, std::set<std::string>> log_hdump;
 std::vector<YS_REGEX_TYPE> log_warn_regexes, log_nowarn_regexes, log_werror_regexes;
-std::vector<std::pair<YS_REGEX_TYPE,LogExpectedItem>> log_expect_log, log_expect_warning, log_expect_error;
+dict<std::string, LogExpectedItem> log_expect_log, log_expect_warning, log_expect_error;
 std::set<std::string> log_warnings, log_experimentals, log_experimentals_ignored;
 int log_warnings_count = 0;
 int log_warnings_count_noexpect = 0;
@@ -71,7 +71,6 @@ int string_buf_index = -1;
 static struct timeval initial_tv = { 0, 0 };
 static bool next_print_log = false;
 static int log_newline_count = 0;
-static bool check_expected_logs = true;
 static bool display_error_log_msg = true;
 
 static void log_id_cache_clear()
@@ -181,7 +180,7 @@ void logv(const char *format, va_list ap)
                                                log_warning("Found log message matching -W regex:\n%s", str.c_str());
 
                                for (auto &item : log_expect_log)
-                                       if (YS_REGEX_NS::regex_search(linebuffer, item.first))
+                                       if (YS_REGEX_NS::regex_search(linebuffer, item.second.pattern))
                                                item.second.current_count++;
 
                                linebuffer.clear();
@@ -256,7 +255,7 @@ static void logv_warning_with_prefix(const char *prefix,
 
                bool warning_match = false;
                for (auto &item : log_expect_warning)
-                       if (YS_REGEX_NS::regex_search(message, item.first)) {
+                       if (YS_REGEX_NS::regex_search(message, item.second.pattern)) {
                                item.second.current_count++;
                                warning_match = true;
                        }
@@ -319,7 +318,7 @@ void log_file_info(const std::string &filename, int lineno,
        va_end(ap);
 }
 
-YS_ATTRIBUTE(noreturn)
+[[noreturn]]
 static void logv_error_with_prefix(const char *prefix,
                                    const char *format, va_list ap)
 {
@@ -345,15 +344,17 @@ static void logv_error_with_prefix(const char *prefix,
 
        log_make_debug = bak_log_make_debug;
 
+       for (auto &item : log_expect_error)
+               if (YS_REGEX_NS::regex_search(log_last_error, item.second.pattern))
+                       item.second.current_count++;
+
+       log_check_expected();
+
        if (log_error_atexit)
                log_error_atexit();
 
-       for (auto &item : log_expect_error)
-               if (YS_REGEX_NS::regex_search(log_last_error, item.first))
-                       item.second.current_count++;
+       YS_DEBUGTRAP_IF_DEBUGGING;
 
-       if (check_expected_logs)
-               log_check_expected();
 #ifdef EMSCRIPTEN
        log_files = backup_log_files;
        throw 0;
@@ -597,7 +598,7 @@ void log_dump_val_worker(RTLIL::State v) {
 const char *log_signal(const RTLIL::SigSpec &sig, bool autoint)
 {
        std::stringstream buf;
-       ILANG_BACKEND::dump_sigspec(buf, sig, autoint);
+       RTLIL_BACKEND::dump_sigspec(buf, sig, autoint);
 
        if (string_buf.size() < 100) {
                string_buf.push_back(buf.str());
@@ -644,68 +645,70 @@ const char *log_id(RTLIL::IdString str)
 void log_module(RTLIL::Module *module, std::string indent)
 {
        std::stringstream buf;
-       ILANG_BACKEND::dump_module(buf, indent, module, module->design, false);
+       RTLIL_BACKEND::dump_module(buf, indent, module, module->design, false);
        log("%s", buf.str().c_str());
 }
 
 void log_cell(RTLIL::Cell *cell, std::string indent)
 {
        std::stringstream buf;
-       ILANG_BACKEND::dump_cell(buf, indent, cell);
+       RTLIL_BACKEND::dump_cell(buf, indent, cell);
        log("%s", buf.str().c_str());
 }
 
 void log_wire(RTLIL::Wire *wire, std::string indent)
 {
        std::stringstream buf;
-       ILANG_BACKEND::dump_wire(buf, indent, wire);
+       RTLIL_BACKEND::dump_wire(buf, indent, wire);
        log("%s", buf.str().c_str());
 }
 
 void log_check_expected()
 {
-       check_expected_logs = false;
-
        for (auto &item : log_expect_warning) {
                if (item.second.current_count == 0) {
                        log_warn_regexes.clear();
-                       log_error("Expected warning pattern '%s' not found !\n", item.second.pattern.c_str());
+                       log_error("Expected warning pattern '%s' not found !\n", item.first.c_str());
                }
                if (item.second.current_count != item.second.expected_count) {
                        log_warn_regexes.clear();
-                       log_error("Expected warning pattern '%s' found %d time(s), instead of %d time(s) !\n", 
-                               item.second.pattern.c_str(), item.second.current_count, item.second.expected_count);
+                       log_error("Expected warning pattern '%s' found %d time(s), instead of %d time(s) !\n",
+                               item.first.c_str(), item.second.current_count, item.second.expected_count);
                }
        }
 
        for (auto &item : log_expect_log) {
                if (item.second.current_count == 0) {
                        log_warn_regexes.clear();
-                       log_error("Expected log pattern '%s' not found !\n", item.second.pattern.c_str());
+                       log_error("Expected log pattern '%s' not found !\n", item.first.c_str());
                }
                if (item.second.current_count != item.second.expected_count) {
                        log_warn_regexes.clear();
                        log_error("Expected log pattern '%s' found %d time(s), instead of %d time(s) !\n",
-                               item.second.pattern.c_str(), item.second.current_count, item.second.expected_count);
+                               item.first.c_str(), item.second.current_count, item.second.expected_count);
                }
        }
 
        for (auto &item : log_expect_error)
                if (item.second.current_count == item.second.expected_count) {
                        log_warn_regexes.clear();
-                       log("Expected error pattern '%s' found !!!\n", item.second.pattern.c_str());
+                       log("Expected error pattern '%s' found !!!\n", item.first.c_str());
                        #ifdef EMSCRIPTEN
                                throw 0;
                        #elif defined(_MSC_VER)
                                _exit(0);
                        #else
                                _Exit(0);
-                       #endif                  
+                       #endif
                } else {
                        display_error_log_msg = false;
                        log_warn_regexes.clear();
-                       log_error("Expected error pattern '%s' not found !\n", item.second.pattern.c_str());
+                       log_error("Expected error pattern '%s' not found !\n", item.first.c_str());
                }
+
+       log_expect_warning.clear();
+       log_expect_log.clear();
+       log_expect_error.clear();
 }
 
 // ---------------------------------------------------