mirror of https://github.com/YosysHQ/yosys.git
Now using a dedicated ELF section for all coverage counters
This commit is contained in:
parent
22ede43b3f
commit
7679000673
|
@ -760,7 +760,7 @@ int main(int argc, char **argv)
|
||||||
f = fdopen(mkstemps(filename_buffer, 4), "w");
|
f = fdopen(mkstemps(filename_buffer, 4), "w");
|
||||||
} else {
|
} else {
|
||||||
snprintf(filename_buffer, 4096, "%s", getenv("YOSYS_COVER_FILE"));
|
snprintf(filename_buffer, 4096, "%s", getenv("YOSYS_COVER_FILE"));
|
||||||
f = fopen(filename_buffer, "w");
|
f = fopen(filename_buffer, "a+");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
|
@ -769,11 +769,11 @@ int main(int argc, char **argv)
|
||||||
log("<writing coverage file \"%s\">\n", filename_buffer);
|
log("<writing coverage file \"%s\">\n", filename_buffer);
|
||||||
|
|
||||||
std::map<std::string, std::pair<std::string, int>> coverage_data;
|
std::map<std::string, std::pair<std::string, int>> coverage_data;
|
||||||
for (CoverAgent *p = CoverAgent::first_cover_agent; p; p = p->next_cover_agent) {
|
for (CoverData *p = __start_yosys_cover_list; p != __stop_yosys_cover_list; p++) {
|
||||||
if (coverage_data.count(p->id))
|
if (coverage_data.count(p->id))
|
||||||
log("WARNING: found duplicate coverage id \"%s\".\n", p->id);
|
log("WARNING: found duplicate coverage id \"%s\".\n", p->id);
|
||||||
coverage_data[p->id].first = stringf("%s:%d:%s", p->file, p->line, p->func);
|
coverage_data[p->id].first = stringf("%s:%d:%s", p->file, p->line, p->func);
|
||||||
coverage_data[p->id].second += p->ticks;
|
coverage_data[p->id].second += p->counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto &it : coverage_data)
|
for (auto &it : coverage_data)
|
||||||
|
|
|
@ -29,8 +29,6 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
CoverAgent *CoverAgent::first_cover_agent = NULL;
|
|
||||||
|
|
||||||
std::vector<FILE*> log_files;
|
std::vector<FILE*> log_files;
|
||||||
FILE *log_errfile = NULL;
|
FILE *log_errfile = NULL;
|
||||||
bool log_time = false;
|
bool log_time = false;
|
||||||
|
|
39
kernel/log.h
39
kernel/log.h
|
@ -63,34 +63,31 @@ void log_cell(RTLIL::Cell *cell, std::string indent = "");
|
||||||
#define log_assert(_assert_expr_) do { if (_assert_expr_) break; log_error("Assert `%s' failed in %s:%d.\n", #_assert_expr_, __FILE__, __LINE__); } while (0)
|
#define log_assert(_assert_expr_) do { if (_assert_expr_) break; log_error("Assert `%s' failed in %s:%d.\n", #_assert_expr_, __FILE__, __LINE__); } while (0)
|
||||||
#define log_ping() log("-- %s:%d %s --\n", __FILE__, __LINE__, __PRETTY_FUNCTION__)
|
#define log_ping() log("-- %s:%d %s --\n", __FILE__, __LINE__, __PRETTY_FUNCTION__)
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------
|
||||||
|
// This is the magic behind the code coverage counters
|
||||||
|
// ---------------------------------------------------
|
||||||
|
|
||||||
|
struct CoverData {
|
||||||
|
const char *file, *func, *id;
|
||||||
|
int line, counter;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
// this two symbols are created by the linker for the "yosys_cover_list" ELF section
|
||||||
|
#ifndef NDEBUG
|
||||||
|
extern "C" struct CoverData __start_yosys_cover_list[];
|
||||||
|
extern "C" struct CoverData __stop_yosys_cover_list[];
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
# define cover(_id) do { \
|
# define cover(_id) do { \
|
||||||
static CoverAgent _cover_agent(__FILE__, __LINE__, __FUNCTION__, _id); \
|
static CoverData __d __attribute__((section("yosys_cover_list"), aligned(1))) = { __FILE__, __FUNCTION__, _id, __LINE__, 0 }; \
|
||||||
_cover_agent.ticks++; \
|
__d.counter++; \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
# define cover(_id) do { } while (0)
|
# define cover(_id) do { } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct CoverAgent
|
|
||||||
{
|
|
||||||
static struct CoverAgent *first_cover_agent;
|
|
||||||
struct CoverAgent *next_cover_agent;
|
|
||||||
|
|
||||||
const char *file;
|
|
||||||
int line;
|
|
||||||
const char *func;
|
|
||||||
const char *id;
|
|
||||||
int ticks;
|
|
||||||
|
|
||||||
CoverAgent(const char *file, int line, const char *func, const char *id) :
|
|
||||||
file(file), line(line), func(func), id(id), ticks(0)
|
|
||||||
{
|
|
||||||
next_cover_agent = first_cover_agent;
|
|
||||||
first_cover_agent = this;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
// everything below this line are utilities for troubleshooting
|
// everything below this line are utilities for troubleshooting
|
||||||
|
|
Loading…
Reference in New Issue