Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 26 additions & 8 deletions kernel/log.cc
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
YOSYS_NAMESPACE_BEGIN

std::vector<FILE*> log_files;
std::vector<std::ostream*> log_streams;
std::vector<std::ostream*> log_streams, log_warning_streams;
std::vector<std::string> log_scratchpads;
std::map<std::string, std::set<std::string>> log_hdump;
std::vector<std::regex> log_warn_regexes, log_nowarn_regexes, log_werror_regexes;
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
}

Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down
10 changes: 9 additions & 1 deletion kernel/log.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,15 @@

struct log_cmd_error_exception { };

enum LogSeverity {
LOG_INFO,
LOG_WARNING,
LOG_ERROR
};

extern std::vector<FILE*> log_files;
extern std::vector<std::ostream*> log_streams;
extern std::vector<std::ostream*> log_warning_streams;
extern std::vector<std::string> log_scratchpads;
extern std::map<std::string, std::set<std::string>> log_hdump;
extern std::vector<std::regex> log_warn_regexes, log_nowarn_regexes, log_werror_regexes;
Expand All @@ -119,14 +126,15 @@
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);
[[noreturn]] void logv_error(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));
Expand Down Expand Up @@ -224,7 +232,7 @@
static inline void log_assert_worker(bool cond, const char *expr, const char *file, int line) {
if (!cond) log_error("Assert `%s' failed in %s:%d.\n", expr, file, line);
}
# define log_assert(_assert_expr_) YOSYS_NAMESPACE_PREFIX log_assert_worker(_assert_expr_, #_assert_expr_, __FILE__, __LINE__)

Check warning on line 235 in kernel/log.h

View workflow job for this annotation

GitHub Actions / test-compile (ubuntu-latest, gcc-13)

this statement may fall through [-Wimplicit-fallthrough=]

Check warning on line 235 in kernel/log.h

View workflow job for this annotation

GitHub Actions / test-compile (ubuntu-latest, gcc-13)

this statement may fall through [-Wimplicit-fallthrough=]
#else
# define log_assert(_assert_expr_) do { if (0) { (void)(_assert_expr_); } } while(0)
#endif
Expand Down
Loading