diff --git a/kernel/log.cc b/kernel/log.cc index 01107143913..74fede69f45 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -39,7 +39,7 @@ YOSYS_NAMESPACE_BEGIN std::vector log_files; -std::vector log_streams; +std::vector log_streams, log_warning_streams; std::vector log_scratchpads; std::map> log_hdump; std::vector log_warn_regexes, log_nowarn_regexes, log_werror_regexes; @@ -102,7 +102,7 @@ int gettimeofday(struct timeval *tv, struct timezone *tz) } #endif -void logv(const char *format, va_list ap) +void logv(LogSeverity severity, const char *format, va_list ap) { while (format[0] == '\n' && format[1] != 0) { log("\n"); @@ -159,6 +159,10 @@ void logv(const char *format, va_list ap) for (auto f : log_streams) *f << time_str; + + if (severity >= LogSeverity::LOG_WARNING) + for (auto f : log_warning_streams) + *f << time_str; } for (auto f : log_files) @@ -167,6 +171,12 @@ void logv(const char *format, va_list ap) for (auto f : log_streams) *f << str; + if (severity >= LogSeverity::LOG_WARNING) + for (auto f : log_warning_streams) { + *f << str; + f->flush(); + } + RTLIL::Design *design = yosys_get_design(); if (design != nullptr) for (auto &scratchpad : log_scratchpads) @@ -223,7 +233,7 @@ void logv_header(RTLIL::Design *design, const char *format, va_list ap) header_id += stringf("%s%d", header_id.empty() ? "" : ".", c); log("%s. ", header_id.c_str()); - logv(format, ap); + logv(LogSeverity::LOG_INFO, format, ap); log_flush(); if (log_hdump_all) @@ -289,7 +299,7 @@ static void logv_warning_with_prefix(const char *prefix, if (log_errfile != NULL && !log_quiet_warnings) log_files.push_back(log_errfile); - log("%s%s", prefix, message.c_str()); + log(LogSeverity::LOG_WARNING, "%s%s", prefix, message.c_str()); log_flush(); if (log_errfile != NULL && !log_quiet_warnings) @@ -333,7 +343,7 @@ void log_file_info(const std::string &filename, int lineno, va_start(ap, format); std::string fmt = stringf("%s:%d: Info: %s", filename.c_str(), lineno, format); - logv(fmt.c_str(), ap); + logv(LogSeverity::LOG_INFO, fmt.c_str(), ap); va_end(ap); } @@ -357,7 +367,7 @@ 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()); + log(LogSeverity::LOG_ERROR, "%s%s", prefix, log_last_error.c_str()); log_flush(); log_make_debug = bak_log_make_debug; @@ -415,10 +425,18 @@ void log(const char *format, ...) { va_list ap; va_start(ap, format); - logv(format, ap); + logv(LogSeverity::LOG_INFO, format, ap); va_end(ap); } +void log(LogSeverity severity, const char *format, ...) +{ + va_list ap; + va_start(ap, format); + logv(severity, format, ap); + va_end(ap); +} + void log_header(RTLIL::Design *design, const char *format, ...) { va_list ap; @@ -479,7 +497,7 @@ void log_cmd_error(const char *format, ...) pop_errfile = true; } - log("ERROR: %s", log_last_error.c_str()); + log(LogSeverity::LOG_ERROR, "ERROR: %s", log_last_error.c_str()); log_flush(); if (pop_errfile) diff --git a/kernel/log.h b/kernel/log.h index 48997d2506c..b2ee2f470ac 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -94,8 +94,15 @@ YOSYS_NAMESPACE_BEGIN struct log_cmd_error_exception { }; +enum LogSeverity { + LOG_INFO, + LOG_WARNING, + LOG_ERROR +}; + extern std::vector log_files; extern std::vector log_streams; +extern std::vector log_warning_streams; extern std::vector log_scratchpads; extern std::map> log_hdump; extern std::vector log_warn_regexes, log_nowarn_regexes, log_werror_regexes; @@ -119,7 +126,7 @@ extern int log_make_debug; extern int log_force_debug; extern int log_debug_suppressed; -void logv(const char *format, va_list ap); +void logv(LogSeverity severity, const char *format, va_list ap); void logv_header(RTLIL::Design *design, const char *format, va_list ap); void logv_warning(const char *format, va_list ap); void logv_warning_noprefix(const char *format, va_list ap); @@ -127,6 +134,7 @@ void logv_warning_noprefix(const char *format, va_list ap); [[noreturn]] void logv_file_error(const string &filename, int lineno, const char *format, va_list ap); void log(const char *format, ...) YS_ATTRIBUTE(format(printf, 1, 2)); +void log(LogSeverity severity, const char *format, ...) YS_ATTRIBUTE(format(printf, 2, 3)); void log_header(RTLIL::Design *design, const char *format, ...) YS_ATTRIBUTE(format(printf, 2, 3)); void log_warning(const char *format, ...) YS_ATTRIBUTE(format(printf, 1, 2)); void log_experimental(const char *format, ...) YS_ATTRIBUTE(format(printf, 1, 2));