diff --git a/Makefile b/Makefile index c622d3bd7..0f1630e37 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,7 @@ DISABLE_VERIFIC_VHDL := 0 ENABLE_COVER := 1 ENABLE_LIBYOSYS := 0 ENABLE_ZLIB := 1 +ENABLE_BACKTRACE := 0 # python wrappers ENABLE_PYOSYS := 0 @@ -68,6 +69,8 @@ ifeq ($(ENABLE_PYOSYS),1) ENABLE_LIBYOSYS := 1 endif + + BINDIR := $(PREFIX)/bin LIBDIR := $(PREFIX)/lib/$(PROGRAM_PREFIX)yosys DATDIR := $(PREFIX)/share/$(PROGRAM_PREFIX)yosys @@ -125,6 +128,11 @@ PKG_CONFIG_PATH := $(BREW_PREFIX)/libffi/lib/pkgconfig:$(PKG_CONFIG_PATH) PKG_CONFIG_PATH := $(BREW_PREFIX)/tcl-tk/lib/pkgconfig:$(PKG_CONFIG_PATH) export PATH := $(BREW_PREFIX)/bison/bin:$(BREW_PREFIX)/gettext/bin:$(BREW_PREFIX)/flex/bin:$(PATH) +ifeq ($(ENABLE_BACKTRACE),1) +CXXFLAGS += -DYOSYS_BACKTRACE +endif + + # macports search paths else ifneq ($(shell :; command -v port),) PORT_PREFIX := $(patsubst %/bin/port,%,$(shell :; command -v port)) diff --git a/kernel/driver.cc b/kernel/driver.cc index ef8e77924..c9e48177d 100644 --- a/kernel/driver.cc +++ b/kernel/driver.cc @@ -83,6 +83,32 @@ int getopt(int argc, char **argv, const char *optstring) } #endif +#if !defined(_WIN32) || defined(__MINGW32__) || defined(YOSYS_BACKTRACE) +#include +void yosys_print_trace (void) +{ + void *array[32] = {0,}; + char **strings; + + int size = backtrace (array, 32); + strings = backtrace_symbols (array, size); + if (strings != NULL && size > 6) + { + + fprintf (stderr,"Obtained %d stack frames.\n", size); + for (int i = 0; i < size; i++) + fprintf(stderr,"%d | %s\n", i+1, strings[i]); + free (strings); + } + +} +#else +void yosys_print_trace() +{ + fprintf(stderr,"Backtrace not available on this platform,\n"); +} +#endif + USING_YOSYS_NAMESPACE @@ -174,6 +200,8 @@ extern "C" { void yosys_atexit() { + + yosys_print_trace(); #if defined(YOSYS_ENABLE_READLINE) || defined(YOSYS_ENABLE_EDITLINE) if (!yosys_history_file.empty()) { #if defined(YOSYS_ENABLE_READLINE) diff --git a/kernel/log.h b/kernel/log.h index dfcbc1137..26053a540 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -43,6 +43,7 @@ # endif #endif + #if defined(_MSC_VER) // At least this is not in MSVC++ 2013. # define __PRETTY_FUNCTION__ __FUNCTION__