Skip to content

Commit

Permalink
libunwind: Implement unw_backtrace
Browse files Browse the repository at this point in the history
Signed-off-by: Khem Raj <raj.khem@gmail.com>
  • Loading branch information
kraj committed Jun 8, 2021
1 parent c48de92 commit d45403b
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
From 79195637cf6cde28baa23e41e7b417e98b036913 Mon Sep 17 00:00:00 2001
From: Maksim Kita <maksim-kita@yandex-team.ru>
Date: Sun, 23 May 2021 10:27:29 +0000
Subject: [PATCH] libunwind: Added unw_backtrace method

Source: https://github.com/ClickHouse-Extras/libunwind/commit/52f0f7861926cbfaef7e6c97d8a6d7ba2a1f6747#diff-a82fc885e2e4facf4b92d26171c13aa4aa5db296f77e1158ba2f8664e3bd1f5c
Upstream-Status: Pending
Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
libunwind/include/libunwind.h | 1 +
libunwind/src/libunwind.cpp | 18 ++++++++++++++++++
2 files changed, 19 insertions(+)

diff --git a/libunwind/include/libunwind.h b/libunwind/include/libunwind.h
index 0feecd7bd6fc..670cfa3ed71d 100644
--- a/libunwind/include/libunwind.h
+++ b/libunwind/include/libunwind.h
@@ -127,6 +127,7 @@ extern int unw_is_fpreg(unw_cursor_t *, unw_regnum_t) LIBUNWIND_AVAIL;
extern int unw_is_signal_frame(unw_cursor_t *) LIBUNWIND_AVAIL;
extern int unw_get_proc_name(unw_cursor_t *, char *, size_t, unw_word_t *) LIBUNWIND_AVAIL;
//extern int unw_get_save_loc(unw_cursor_t*, int, unw_save_loc_t*);
+extern int unw_backtrace(void **, int) LIBUNWIND_AVAIL;

extern unw_addr_space_t unw_local_addr_space;

diff --git a/libunwind/src/libunwind.cpp b/libunwind/src/libunwind.cpp
index 9b3b92bdff09..986ef62f9231 100644
--- a/libunwind/src/libunwind.cpp
+++ b/libunwind/src/libunwind.cpp
@@ -289,7 +289,25 @@ void __unw_remove_dynamic_fde(unw_word_t fde) {
#endif // defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
#endif // !defined(__USING_SJLJ_EXCEPTIONS__)

+int unw_backtrace(void **buffer, int size) {
+ unw_context_t context;
+ unw_cursor_t cursor;
+ if (unw_getcontext(&context) || unw_init_local(&cursor, &context)) {
+ return 0;
+ }
+
+ unw_word_t ip;
+ int current = 0;
+ while (unw_step(&cursor) > 0) {
+ if (current >= size || unw_get_reg(&cursor, UNW_REG_IP, &ip)) {
+ break;
+ }

+ buffer[current++] = reinterpret_cast<void *>(static_cast<uintptr_t>(ip));
+ }
+
+ return current;
+}

// Add logging hooks in Debug builds only
#ifndef NDEBUG
1 change: 1 addition & 0 deletions recipes-devtools/clang/common.inc
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ SRC_URI = "\
file://0030-clang-Fix-x86-triple-for-non-debian-multiarch-linux-.patch \
file://0031-compiler-rt-Link-scudo-with-SANITIZER_CXX_ABI_LIBRAR.patch \
file://0032-compiler-rt-Link-scudo-standalone-with-libatomic-on-.patch \
file://0033-libunwind-Added-unw_backtrace-method.patch \
"
# Fallback to no-PIE if not set
GCCPIE ??= ""
Expand Down

0 comments on commit d45403b

Please sign in to comment.