Browse Source
This patch adds a --log argument to spike. If not given, the behaviour is unchanged: messages logging execution of instructions and (if commit logging is enabled) commits go to stderr. If --log=P is given, Spike now writes these messages to a log file at the path P. This is nice, because they are no longer tangled up with other errors and warnings. The code is mostly plumbing: passing a FILE* object through to the functions that were using stderr. I've written a simple "log_file_t" class, which opens a log file if necessary and yields it or stderr.pull/436/head
committed by
GitHub
8 changed files with 152 additions and 83 deletions
@ -0,0 +1,37 @@ |
|||
// See LICENSE for license details.
|
|||
#ifndef _RISCV_LOGFILE_H |
|||
#define _RISCV_LOGFILE_H |
|||
|
|||
#include <stdio.h> |
|||
#include <memory> |
|||
#include <sstream> |
|||
#include <stdexcept> |
|||
|
|||
// Header-only class wrapping a log file. When constructed with an
|
|||
// actual path, it opens the named file for writing. When constructed
|
|||
// with the null path, it wraps stderr.
|
|||
class log_file_t |
|||
{ |
|||
public: |
|||
log_file_t(const char *path) |
|||
: wrapped_file (nullptr, &fclose) |
|||
{ |
|||
if (!path) |
|||
return; |
|||
|
|||
wrapped_file.reset(fopen(path, "w")); |
|||
if (! wrapped_file) { |
|||
std::ostringstream oss; |
|||
oss << "Failed to open log file at `" << path << "': " |
|||
<< strerror (errno); |
|||
throw std::runtime_error(oss.str()); |
|||
} |
|||
} |
|||
|
|||
FILE *get() { return wrapped_file ? wrapped_file.get() : stderr; } |
|||
|
|||
private: |
|||
std::unique_ptr<FILE, decltype(&fclose)> wrapped_file; |
|||
}; |
|||
|
|||
#endif |
|||
Loading…
Reference in new issue