Add "#ifdef __FreeBSD__"

This commit is contained in:
Johnny Sorocil 2018-05-05 13:02:44 +02:00 committed by Clifford Wolf
parent 145c685de0
commit e3575a86c5
5 changed files with 52 additions and 9 deletions

View File

@ -34,12 +34,17 @@
#include <limits.h> #include <limits.h>
#include <errno.h> #include <errno.h>
#ifdef __linux__ #if defined (__linux__) || defined(__FreeBSD__)
# include <sys/resource.h> # include <sys/resource.h>
# include <sys/types.h> # include <sys/types.h>
# include <unistd.h> # include <unistd.h>
#endif #endif
#ifdef __FreeBSD__
# include <sys/sysctl.h>
# include <sys/user.h>
#endif
#if !defined(_WIN32) || defined(__MINGW32__) #if !defined(_WIN32) || defined(__MINGW32__)
# include <unistd.h> # include <unistd.h>
#else #else
@ -510,7 +515,7 @@ int main(int argc, char **argv)
#else #else
std::string meminfo; std::string meminfo;
std::string stats_divider = ", "; std::string stats_divider = ", ";
# ifdef __linux__ # if defined(__linux__)
std::ifstream statm; std::ifstream statm;
statm.open(stringf("/proc/%lld/statm", (long long)getpid())); statm.open(stringf("/proc/%lld/statm", (long long)getpid()));
if (statm.is_open()) { if (statm.is_open()) {
@ -521,6 +526,19 @@ int main(int argc, char **argv)
sz_resident * (getpagesize() / 1024.0 / 1024.0)); sz_resident * (getpagesize() / 1024.0 / 1024.0));
stats_divider = "\n"; stats_divider = "\n";
} }
# elif defined(__FreeBSD__)
pid_t pid = getpid();
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, (int)pid};
struct kinfo_proc kip;
size_t kip_len = sizeof(kip);
if (sysctl(mib, 4, &kip, &kip_len, NULL, 0) == 0) {
vm_size_t sz_total = kip.ki_size;
segsz_t sz_resident = kip.ki_rssize;
meminfo = stringf(", MEM: %.2f MB total, %.2f MB resident",
(int)sz_total / 1024.0 / 1024.0,
(int)sz_resident * (getpagesize() / 1024.0 / 1024.0));
stats_divider = "\n";
}
# endif # endif
struct rusage ru_buffer; struct rusage ru_buffer;
@ -564,7 +582,7 @@ int main(int argc, char **argv)
} }
} }
#if defined(YOSYS_ENABLE_COVER) && defined(__linux__) #if defined(YOSYS_ENABLE_COVER) && (defined(__linux__) || defined(__FreeBSD__))
if (getenv("YOSYS_COVER_DIR") || getenv("YOSYS_COVER_FILE")) if (getenv("YOSYS_COVER_DIR") || getenv("YOSYS_COVER_FILE"))
{ {
string filename; string filename;

View File

@ -25,7 +25,7 @@
# include <sys/time.h> # include <sys/time.h>
#endif #endif
#ifdef __linux__ #if defined(__linux__) || defined(__FreeBSD__)
# include <dlfcn.h> # include <dlfcn.h>
#endif #endif
@ -392,7 +392,7 @@ void log_pop()
log_flush(); log_flush();
} }
#if defined(__linux__) && defined(YOSYS_ENABLE_PLUGINS) #if (defined(__linux__) || defined(__FreeBSD__)) && defined(YOSYS_ENABLE_PLUGINS)
void log_backtrace(const char *prefix, int levels) void log_backtrace(const char *prefix, int levels)
{ {
if (levels <= 0) return; if (levels <= 0) return;
@ -587,7 +587,7 @@ void log_wire(RTLIL::Wire *wire, std::string indent)
// --------------------------------------------------- // ---------------------------------------------------
// This is the magic behind the code coverage counters // This is the magic behind the code coverage counters
// --------------------------------------------------- // ---------------------------------------------------
#if defined(YOSYS_ENABLE_COVER) && defined(__linux__) #if defined(YOSYS_ENABLE_COVER) && (defined(__linux__) || defined(__FreeBSD__))
dict<std::string, std::pair<std::string, int>> extra_coverage_data; dict<std::string, std::pair<std::string, int>> extra_coverage_data;

View File

@ -114,7 +114,7 @@ static inline void log_assert_worker(bool cond, const char *expr, const char *fi
// This is the magic behind the code coverage counters // This is the magic behind the code coverage counters
// --------------------------------------------------- // ---------------------------------------------------
#if defined(YOSYS_ENABLE_COVER) && defined(__linux__) #if defined(YOSYS_ENABLE_COVER) && (defined(__linux__) || defined(__FreeBSD__))
#define cover(_id) do { \ #define cover(_id) do { \
static CoverData __d __attribute__((section("yosys_cover_list"), aligned(1), used)) = { __FILE__, __FUNCTION__, _id, __LINE__, 0 }; \ static CoverData __d __attribute__((section("yosys_cover_list"), aligned(1), used)) = { __FILE__, __FUNCTION__, _id, __LINE__, 0 }; \

View File

@ -46,10 +46,15 @@
# include <unistd.h> # include <unistd.h>
# include <dirent.h> # include <dirent.h>
# include <sys/types.h> # include <sys/types.h>
# include <sys/wait.h>
# include <sys/stat.h> # include <sys/stat.h>
# include <glob.h> # include <glob.h>
#endif #endif
#ifdef __FreeBSD__
# include <sys/sysctl.h>
#endif
#include <limits.h> #include <limits.h>
#include <errno.h> #include <errno.h>
@ -72,7 +77,7 @@ std::vector<void*> memhasher_store;
void memhasher_on() void memhasher_on()
{ {
#ifdef __linux__ #if defined(__linux__) || defined(__FreeBSD__)
memhasher_rng += time(NULL) << 16 ^ getpid(); memhasher_rng += time(NULL) << 16 ^ getpid();
#endif #endif
memhasher_store.resize(0x10000); memhasher_store.resize(0x10000);
@ -667,6 +672,26 @@ std::string proc_self_dirname()
buflen--; buflen--;
return std::string(path, buflen); return std::string(path, buflen);
} }
#elif defined(__FreeBSD__)
std::string proc_self_dirname()
{
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
size_t buflen;
char *buffer;
std::string path;
if (sysctl(mib, 4, NULL, &buflen, NULL, 0) != 0)
log_error("sysctl failed: %s\n", strerror(errno));
buffer = (char*)malloc(buflen);
if (buffer == NULL)
log_error("malloc failed: %s\n", strerror(errno));
if (sysctl(mib, 4, buffer, &buflen, NULL, 0) != 0)
log_error("sysctl failed: %s\n", strerror(errno));
while (buflen > 0 && buffer[buflen-1] != '/')
buflen--;
path.assign(buffer, buflen);
free(buffer);
return path;
}
#elif defined(__APPLE__) #elif defined(__APPLE__)
std::string proc_self_dirname() std::string proc_self_dirname()
{ {

View File

@ -128,7 +128,7 @@ struct CoverPass : public Pass {
log("\n"); log("\n");
} }
#if defined(YOSYS_ENABLE_COVER) && defined(__linux__) #if defined(YOSYS_ENABLE_COVER) && (defined(__linux__) || defined(__FreeBSD__))
for (auto &it : get_coverage_data()) { for (auto &it : get_coverage_data()) {
if (!patterns.empty()) { if (!patterns.empty()) {
for (auto &p : patterns) for (auto &p : patterns)