Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,17 @@ endif()

add_subdirectory(contrib/liburing-cmake)
add_subdirectory(contrib/librseq-cmake)
add_subdirectory(contrib/libbacktrace-cmake)
add_subdirectory(contrib/googletest-cmake)
add_subdirectory(contrib/benchmark-cmake)
add_subdirectory(contrib/systemtap-sdt)
add_subdirectory(contrib/libbpf-cmake)
add_subdirectory(contrib/bpftool-cmake)

option(BUILD_LIBBACKTRACE "Build libbacktrace (used to symbolize stack traces on SILK_ASSERT failure and by the profiler)" ON)
if(BUILD_LIBBACKTRACE)
add_subdirectory(contrib/libbacktrace-cmake)
endif()

option(BUILD_POCO "Build Poco library (required by http-perf)" OFF)
if(BUILD_POCO)
add_subdirectory(contrib/poco-cmake)
Expand Down Expand Up @@ -135,5 +139,8 @@ if(NOT SANITIZER STREQUAL "memory")
# Boost::context (used by silk) is assembly-level and has no std::string
# in its ABI, so it works with libc++ despite being a system library.
add_subdirectory(src/perf)
add_subdirectory(src/profiler)
if(BUILD_LIBBACKTRACE)
# symbolizer.cpp depends directly on <backtrace.h>.
add_subdirectory(src/profiler)
endif()
endif()
18 changes: 17 additions & 1 deletion include/silk/util/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,23 @@
#include <time.h>
#include <unistd.h>

#include <sys/rseq.h>
/**
* On older sysroots we fall back to a minimal in-tree `struct rseq` matching
* the kernel UAPI layout (cpu_id_start at offset 0, cpu_id at offset 4) and
* alias `__rseq_offset` to librseq's `rseq_offset`, which librseq populates.
*/
#if __has_include(<sys/rseq.h>)
# include <sys/rseq.h>
#else
# include <stddef.h>
struct rseq
{
uint32_t cpu_id_start;
uint32_t cpu_id;
};
extern "C" ptrdiff_t rseq_offset;
# define __rseq_offset rseq_offset
#endif

/** Suppress unused-variable warnings. */
#define SILK_UNUSED(x) (void)(x)
Expand Down
10 changes: 9 additions & 1 deletion src/util/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
file(GLOB UTIL_SOURCES CONFIGURE_DEPENDS *.cpp)

add_library(silk-util ${UTIL_SOURCES})
target_link_libraries(silk-util PRIVATE Libbacktrace::Libbacktrace Librseq::Librseq)
target_link_libraries(silk-util
PUBLIC Boost::headers
PRIVATE Librseq::Librseq
)

if(BUILD_LIBBACKTRACE)
target_compile_definitions(silk-util PRIVATE SILK_USE_LIBBACKTRACE)
target_link_libraries(silk-util PRIVATE Libbacktrace::Libbacktrace)
endif()

add_subdirectory(tests)
add_subdirectory(benchmarks)
20 changes: 15 additions & 5 deletions src/util/assert.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@

#include <silk/util/platform.h>

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <format>
#include <sstream>
#include <string_view>

#include <backtrace.h>
#include <cxxabi.h>
#if defined(SILK_USE_LIBBACKTRACE)
# include <cstring>
# include <format>
# include <string_view>

# include <backtrace.h>
# include <cxxabi.h>
#endif // SILK_USE_LIBBACKTRACE

namespace silk
{
Expand All @@ -19,6 +23,8 @@ static constexpr const char * COLOR_RED = "\033[1;31m";
static constexpr const char * COLOR_YELLOW = "\033[0;33m";
static constexpr const char * COLOR_GREEN = "\033[0;32m";

#if defined(SILK_USE_LIBBACKTRACE)

static void btCreateErrorCallback(void * data, const char * msg, int err) noexcept
{
SILK_UNUSED(data);
Expand Down Expand Up @@ -74,6 +80,8 @@ static void btErrorCallback(void * data, const char * msg, int err) noexcept
(*ctx->out) << " backtrace error " << err << ": " << msg << "\n";
}

#endif // SILK_USE_LIBBACKTRACE

void assertFail(const char * message, const char * file, int line, const char * details) noexcept
{
std::ostringstream out;
Expand All @@ -84,8 +92,10 @@ void assertFail(const char * message, const char * file, int line, const char *
}
out << COLOR_RESET << "\n";

#if defined(SILK_USE_LIBBACKTRACE)
Context ctx{&out, 0};
backtrace_full(btState, 0, btCallback, btErrorCallback, &ctx);
#endif

std::fputs(out.str().c_str(), stderr);
std::fflush(stderr);
Expand Down
Loading