Skip to content

Commit

Permalink
Add a stacktrace printing functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
certik committed Jul 30, 2020
1 parent 9f54d0a commit 6ec609f
Show file tree
Hide file tree
Showing 9 changed files with 574 additions and 0 deletions.
25 changes: 25 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,29 @@ if (WITH_JSON)
find_package(RapidJSON REQUIRED)
endif()

set(HAVE_LFORTRAN_DEMANGLE yes
CACHE BOOL "Build with C++ name demangling support (cxxabi.h)")

if (MSVC)
# MSVC doesn't have cxxabi.h
set(HAVE_LFORTRAN_DEMANGLE no)
endif()

# Stacktrace
set(WITH_STACKTRACE no
CACHE BOOL "Build with stacktrace support (requires binutils-dev)")

if (WITH_STACKTRACE)
find_package(BFD REQUIRED)
find_package(LINK REQUIRED)
find_package(EXECINFO REQUIRED)
set(HAVE_LFORTRAN_BFD yes)
set(HAVE_LFORTRAN_LINK yes)
set(HAVE_LFORTRAN_EXECINFO yes)
set(HAVE_LFORTRAN_STACKTRACE yes)
endif()


# Python
set(WITH_PYTHON no CACHE BOOL "Build with Python wrappers")
if (WITH_PYTHON)
Expand Down Expand Up @@ -124,6 +147,8 @@ endif ()
message("Installation prefix: ${CMAKE_INSTALL_PREFIX}")
message("WITH_LFORTRAN_ASSERT: ${WITH_LFORTRAN_ASSERT}")
message("LFORTRAN_STATIC_BIN: ${LFORTRAN_STATIC_BIN}")
message("WITH_STACKTRACE: ${WITH_STACKTRACE}")
message("HAVE_LFORTRAN_DEMANGLE: ${HAVE_LFORTRAN_DEMANGLE}")
message("WITH_LLVM: ${WITH_LLVM}")
message("WITH_JSON: ${WITH_JSON}")
message("WITH_PYTHON: ${WITH_PYTHON}")
Expand Down
14 changes: 14 additions & 0 deletions cmake/FindBFD.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
find_path(BFD_INCLUDE_DIR bfd.h)
find_library(BFD_LIBRARY bfd)
#find_library(IBERTY_LIBRARY iberty)
#find_library(Z_LIBRARY z)
#find_library(DL_LIBRARY dl)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(BFD DEFAULT_MSG BFD_INCLUDE_DIR BFD_LIBRARY)

add_library(p::bfd INTERFACE IMPORTED)
set_property(TARGET p::bfd PROPERTY INTERFACE_INCLUDE_DIRECTORIES
${BFD_INCLUDE_DIR})
set_property(TARGET p::bfd PROPERTY INTERFACE_LINK_LIBRARIES
${BFD_LIBRARY})
19 changes: 19 additions & 0 deletions cmake/FindEXECINFO.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
find_path(EXECINFO_INCLUDE_DIR execinfo.h)

include(FindPackageHandleStandardArgs)
if (CMAKE_SYSTEM_NAME MATCHES "BSD")
find_library(EXECINFO_LIBRARY execinfo)
find_package_handle_standard_args(EXECINFO DEFAULT_MSG
EXECINFO_LIBRARY EXECINFO_INCLUDE_DIR)
else ()
find_package_handle_standard_args(EXECINFO DEFAULT_MSG
EXECINFO_INCLUDE_DIR)
endif ()

add_library(p::execinfo INTERFACE IMPORTED)
set_property(TARGET p::execinfo PROPERTY INTERFACE_INCLUDE_DIRECTORIES
${EXECINFO_INCLUDE_DIR})
if (CMAKE_SYSTEM_NAME MATCHES "BSD")
set_property(TARGET p::execinfo PROPERTY INTERFACE_LINK_LIBRARIES
${EXECINFO_LIBRARY})
endif ()
8 changes: 8 additions & 0 deletions cmake/FindLINK.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
find_path(LINK_INCLUDE_DIR link.h)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LINKH DEFAULT_MSG LINK_INCLUDE_DIR)

add_library(p::link INTERFACE IMPORTED)
set_property(TARGET p::link PROPERTY INTERFACE_INCLUDE_DIRECTORIES
${LINK_INCLUDE_DIR})
4 changes: 4 additions & 0 deletions src/bin/lfortran.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include <bin/CLI11.hpp>

#include <lfortran/stacktrace.h>
#include <lfortran/parser/parser.h>
#include <lfortran/pickle.h>
#include <lfortran/semantics/ast_to_asr.h>
Expand Down Expand Up @@ -255,6 +256,9 @@ int emit_llvm(const std::string &infile)

int main(int argc, char *argv[])
{
#if defined(HAVE_LFORTRAN_STACKTRACE)
LFortran::print_stack_on_segfault();
#endif
bool arg_S = false;
bool arg_c = false;
bool arg_v = false;
Expand Down
8 changes: 8 additions & 0 deletions src/lfortran/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ if (WITH_JSON)
ast_to_json.cpp
)
endif()
if (WITH_STACKTRACE)
set(SRC ${SRC}
stacktrace.cpp
)
endif()
if (WITH_LLVM)
set(SRC ${SRC}
codegen/evaluator.cpp
Expand All @@ -28,6 +33,9 @@ target_include_directories(lfortran_lib BEFORE PUBLIC ${lfortran_BINARY_DIR}/src
if (WITH_JSON)
target_link_libraries(lfortran_lib p::rapidjson)
endif()
if (WITH_STACKTRACE)
target_link_libraries(lfortran_lib p::bfd p::link p::execinfo)
endif()
if (WITH_LLVM)
target_link_libraries(lfortran_lib p::llvm)
endif()
Expand Down
9 changes: 9 additions & 0 deletions src/lfortran/config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,13 @@
/* Define if LLVM is enabled */
#cmakedefine HAVE_LFORTRAN_LLVM

/* Define if stacktrace is enabled */
#cmakedefine HAVE_LFORTRAN_STACKTRACE
#cmakedefine HAVE_LFORTRAN_BFD
#cmakedefine HAVE_LFORTRAN_LINK
#cmakedefine HAVE_LFORTRAN_EXECINFO

/* Define if cxxabi.h is present */
#cmakedefine HAVE_LFORTRAN_DEMANGLE

#endif // LFORTRAN_CONFIG_H
Loading

0 comments on commit 6ec609f

Please sign in to comment.