From 7679000673f7a5c07037dfd3373162cbbcdb0624 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Thu, 24 Jul 2014 15:05:05 +0200 Subject: Now using a dedicated ELF section for all coverage counters --- kernel/log.h | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) (limited to 'kernel/log.h') diff --git a/kernel/log.h b/kernel/log.h index 517808061..804175909 100644 --- a/kernel/log.h +++ b/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_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 # define cover(_id) do { \ - static CoverAgent _cover_agent(__FILE__, __LINE__, __FUNCTION__, _id); \ - _cover_agent.ticks++; \ + static CoverData __d __attribute__((section("yosys_cover_list"), aligned(1))) = { __FILE__, __FUNCTION__, _id, __LINE__, 0 }; \ + __d.counter++; \ } while (0) #else # define cover(_id) do { } while (0) #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 -- cgit v1.2.3