From 31b7a9c3127560ea0c488b88e93077e08600652f Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 14 Feb 2020 12:21:16 +0100 Subject: Add expect option to logger command --- kernel/driver.cc | 4 +++- kernel/log.cc | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- kernel/log.h | 17 ++++++++++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) (limited to 'kernel') diff --git a/kernel/driver.cc b/kernel/driver.cc index 9040408bc..1802e8aac 100644 --- a/kernel/driver.cc +++ b/kernel/driver.cc @@ -664,13 +664,15 @@ int main(int argc, char **argv) } #endif + log_check_expected(); + yosys_atexit(); memhasher_off(); if (call_abort) abort(); - log_flush(); + log_flush(); #if defined(_MSC_VER) _exit(0); #elif defined(_WIN32) diff --git a/kernel/log.cc b/kernel/log.cc index f5d6c488e..997c39c64 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -42,6 +42,7 @@ std::vector log_files; std::vector log_streams; std::map> log_hdump; std::vector log_warn_regexes, log_nowarn_regexes, log_werror_regexes; +std::vector> log_expect_log, log_expect_warning, log_expect_error; std::set log_warnings, log_experimentals, log_experimentals_ignored; int log_warnings_count = 0; bool log_hdump_all = false; @@ -68,6 +69,7 @@ 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 void log_id_cache_clear() { @@ -162,7 +164,7 @@ void logv(const char *format, va_list ap) { log_warn_regex_recusion_guard = true; - if (log_warn_regexes.empty()) + if (log_warn_regexes.empty() && log_expect_log.empty()) { linebuffer.clear(); } @@ -174,6 +176,11 @@ void logv(const char *format, va_list ap) for (auto &re : log_warn_regexes) if (std::regex_search(linebuffer, re)) log_warning("Found log message matching -W regex:\n%s", str.c_str()); + + for (auto &item : log_expect_log) + if (std::regex_search(linebuffer, item.first)) + item.second.current_count++; + linebuffer.clear(); } } @@ -244,6 +251,10 @@ static void logv_warning_with_prefix(const char *prefix, if (std::regex_search(message, re)) log_error("%s", message.c_str()); + for (auto &item : log_expect_warning) + if (std::regex_search(message, item.first)) + item.second.current_count++; + if (log_warnings.count(message)) { log("%s%s", prefix, message.c_str()); @@ -328,6 +339,12 @@ static void logv_error_with_prefix(const char *prefix, if (log_error_atexit) log_error_atexit(); + for (auto &item : log_expect_error) + if (std::regex_search(log_last_error, item.first)) + item.second.current_count++; + + if (check_expected_logs) + log_check_expected(); #ifdef EMSCRIPTEN log_files = backup_log_files; throw 0; @@ -636,6 +653,46 @@ void log_wire(RTLIL::Wire *wire, std::string indent) 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 != item.second.expected_count) { + log_error("Expected warning pattern '%s' not found !\n", item.second.pattern.c_str()); + } + if (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.second.pattern.c_str(), item.second.current_count, item.second.expected_count); + } + } + + for (auto &item : log_expect_log) { + if (item.second.current_count == 0) { + log_error("Expected log pattern '%s' not found !\n", item.second.pattern.c_str()); + } + if (item.second.current_count != item.second.expected_count) { + 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); + } + } + + for (auto &item : log_expect_error) + if (item.second.current_count == item.second.expected_count) { + log("Expected error pattern '%s' found !!!\n", item.second.pattern.c_str()); + #ifdef EMSCRIPTEN + log_files = backup_log_files; + throw 0; + #elif defined(_MSC_VER) + _exit(0); + #else + _Exit(0); + #endif + } else { + log_error("Expected error pattern '%s' not found !\n", item.second.pattern.c_str()); + } +} + // --------------------------------------------------- // This is the magic behind the code coverage counters // --------------------------------------------------- diff --git a/kernel/log.h b/kernel/log.h index 9db8efaa5..0f912fccb 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -135,6 +135,23 @@ void log_backtrace(const char *prefix, int levels); void log_reset_stack(); void log_flush(); +struct LogExpectedItem +{ + LogExpectedItem(std::string pattern, int expected) : + expected_count(expected), + current_count(0), + pattern(pattern) + { + } + + int expected_count; + int current_count; + std::string pattern; +}; + +extern std::vector> log_expect_log, log_expect_warning, log_expect_error; +void log_check_expected(); + const char *log_signal(const RTLIL::SigSpec &sig, bool autoint = true); const char *log_const(const RTLIL::Const &value, bool autoint = true); const char *log_id(RTLIL::IdString id); -- cgit v1.2.3 From 6b396e64556ad556eb3260db714c1f824ee4f458 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 14 Feb 2020 13:12:05 +0100 Subject: remove whitespace --- kernel/driver.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'kernel') diff --git a/kernel/driver.cc b/kernel/driver.cc index 1802e8aac..2917586ea 100644 --- a/kernel/driver.cc +++ b/kernel/driver.cc @@ -672,7 +672,7 @@ int main(int argc, char **argv) if (call_abort) abort(); - log_flush(); + log_flush(); #if defined(_MSC_VER) _exit(0); #elif defined(_WIN32) -- cgit v1.2.3 From be977cf7eb76e10866555543aef4809264b393de Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 17 Feb 2020 12:54:36 +0100 Subject: No new error if already failing --- kernel/log.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'kernel') diff --git a/kernel/log.cc b/kernel/log.cc index 997c39c64..89a403e63 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -331,7 +331,8 @@ static void logv_error_with_prefix(const char *prefix, f = stderr; log_last_error = vstringf(format, ap); - log("%s%s", prefix, log_last_error.c_str()); + if (check_expected_logs) + log("%s%s", prefix, log_last_error.c_str()); log_flush(); log_make_debug = bak_log_make_debug; -- cgit v1.2.3 From 5641b0248fe0781ee62fa3bc903f8db95e80b0c4 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 17 Feb 2020 15:36:06 +0100 Subject: Option to expect no warnings --- kernel/driver.cc | 3 +++ kernel/log.cc | 1 + kernel/log.h | 1 + 3 files changed, 5 insertions(+) (limited to 'kernel') diff --git a/kernel/driver.cc b/kernel/driver.cc index 2917586ea..74f53901e 100644 --- a/kernel/driver.cc +++ b/kernel/driver.cc @@ -558,6 +558,9 @@ int main(int argc, char **argv) fprintf(f, "\n"); } + if (log_expect_no_warnings && log_warnings_count) + log_error("Warnings: %d unique messages, %d total\n", GetSize(log_warnings), log_warnings_count); + if (print_stats) { std::string hash = log_hasher->final().substr(0, 10); diff --git a/kernel/log.cc b/kernel/log.cc index 89a403e63..1575b4fed 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -45,6 +45,7 @@ std::vector log_warn_regexes, log_nowarn_regexes, log_werror_regexes std::vector> log_expect_log, log_expect_warning, log_expect_error; std::set log_warnings, log_experimentals, log_experimentals_ignored; int log_warnings_count = 0; +bool log_expect_no_warnings = false; bool log_hdump_all = false; FILE *log_errfile = NULL; SHA1 *log_hasher = NULL; diff --git a/kernel/log.h b/kernel/log.h index 0f912fccb..79de1a20a 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -52,6 +52,7 @@ extern std::map> log_hdump; extern std::vector log_warn_regexes, log_nowarn_regexes, log_werror_regexes; extern std::set log_warnings, log_experimentals, log_experimentals_ignored; extern int log_warnings_count; +extern bool log_expect_no_warnings; extern bool log_hdump_all; extern FILE *log_errfile; extern SHA1 *log_hasher; -- cgit v1.2.3 From 70db8e92003fab959ec5d14b51ac2a9209d16b30 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 17 Feb 2020 16:46:34 +0100 Subject: Prevent double error message --- kernel/log.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'kernel') diff --git a/kernel/log.cc b/kernel/log.cc index 1575b4fed..9e103855f 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -71,6 +71,7 @@ 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() { @@ -332,7 +333,7 @@ static void logv_error_with_prefix(const char *prefix, f = stderr; log_last_error = vstringf(format, ap); - if (check_expected_logs) + if (display_error_log_msg) log("%s%s", prefix, log_last_error.c_str()); log_flush(); @@ -691,6 +692,7 @@ void log_check_expected() _Exit(0); #endif } else { + display_error_log_msg = false; log_error("Expected error pattern '%s' not found !\n", item.second.pattern.c_str()); } } -- cgit v1.2.3 From d079ab9d19b7d18134f5b6f30da9a6666f30ad97 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 22 Feb 2020 10:52:46 +0100 Subject: Handle expect no warnings together with expected --- kernel/driver.cc | 5 +++-- kernel/log.cc | 10 ++++++++-- kernel/log.h | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) (limited to 'kernel') diff --git a/kernel/driver.cc b/kernel/driver.cc index 74f53901e..398c89e03 100644 --- a/kernel/driver.cc +++ b/kernel/driver.cc @@ -558,8 +558,9 @@ int main(int argc, char **argv) fprintf(f, "\n"); } - if (log_expect_no_warnings && log_warnings_count) - log_error("Warnings: %d unique messages, %d total\n", GetSize(log_warnings), log_warnings_count); + if (log_expect_no_warnings && log_warnings_count_noexpect) + log_error("Unexpected warnings found: %d unique messages, %d total, %d expected\n", GetSize(log_warnings), + log_warnings_count, log_warnings_count - log_warnings_count_noexpect); if (print_stats) { diff --git a/kernel/log.cc b/kernel/log.cc index 9e103855f..1785809e4 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -45,6 +45,7 @@ std::vector log_warn_regexes, log_nowarn_regexes, log_werror_regexes std::vector> log_expect_log, log_expect_warning, log_expect_error; std::set log_warnings, log_experimentals, log_experimentals_ignored; int log_warnings_count = 0; +int log_warnings_count_noexpect = 0; bool log_expect_no_warnings = false; bool log_hdump_all = false; FILE *log_errfile = NULL; @@ -253,9 +254,12 @@ static void logv_warning_with_prefix(const char *prefix, if (std::regex_search(message, re)) log_error("%s", message.c_str()); + bool warning_match = false; for (auto &item : log_expect_warning) - if (std::regex_search(message, item.first)) + if (std::regex_search(message, item.first)) { item.second.current_count++; + warning_match = true; + } if (log_warnings.count(message)) { @@ -276,6 +280,8 @@ static void logv_warning_with_prefix(const char *prefix, log_warnings.insert(message); } + if (!warning_match) + log_warnings_count_noexpect++; log_warnings_count++; log_make_debug = bak_log_make_debug; } @@ -661,7 +667,7 @@ void log_check_expected() check_expected_logs = false; for (auto &item : log_expect_warning) { - if (item.second.current_count != item.second.expected_count) { + if (item.second.current_count == 0) { log_error("Expected warning pattern '%s' not found !\n", item.second.pattern.c_str()); } if (item.second.current_count != item.second.expected_count) { diff --git a/kernel/log.h b/kernel/log.h index 79de1a20a..603938f4c 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -52,6 +52,7 @@ extern std::map> log_hdump; extern std::vector log_warn_regexes, log_nowarn_regexes, log_werror_regexes; extern std::set log_warnings, log_experimentals, log_experimentals_ignored; extern int log_warnings_count; +extern int log_warnings_count_noexpect; extern bool log_expect_no_warnings; extern bool log_hdump_all; extern FILE *log_errfile; -- cgit v1.2.3 From 1c569fe06aba3850e557eb44895a522cc4167de2 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 23 Feb 2020 10:56:27 +0100 Subject: Remove duplicate warning detection --- kernel/log.cc | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'kernel') diff --git a/kernel/log.cc b/kernel/log.cc index 1785809e4..72181ebe8 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -668,9 +668,11 @@ void log_check_expected() 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()); } 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); } @@ -678,9 +680,11 @@ void log_check_expected() 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()); } 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); } @@ -688,6 +692,7 @@ void log_check_expected() 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()); #ifdef EMSCRIPTEN log_files = backup_log_files; @@ -699,6 +704,7 @@ void log_check_expected() #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()); } } -- cgit v1.2.3