Skip to content

Commit

Permalink
Replace libosxunwind wth LLVM libunwind (JuliaLang#39127)
Browse files Browse the repository at this point in the history
  • Loading branch information
omus committed Feb 19, 2021
1 parent 62d47af commit d524f21
Show file tree
Hide file tree
Showing 20 changed files with 498 additions and 91 deletions.
4 changes: 2 additions & 2 deletions Make.inc
Original file line number Diff line number Diff line change
Expand Up @@ -1002,8 +1002,8 @@ JCPPFLAGS+=-DSYSTEM_LIBUNWIND
endif
else
ifeq ($(OS),Darwin)
LIBUNWIND:=-losxunwind
JCPPFLAGS+=-DLIBOSXUNWIND
LIBUNWIND:=-lunwind
JCPPFLAGS+=-DLLVMLIBUNWIND
else
LIBUNWIND:=-lunwind
endif
Expand Down
4 changes: 0 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -190,11 +190,7 @@ endif
ifeq ($(USE_LLVM_SHLIB),1)
JL_PRIVATE_LIBS-$(USE_SYSTEM_LLVM) += libLLVM libLLVM-11jl
endif
ifeq ($(OS),Darwin)
JL_PRIVATE_LIBS-$(USE_SYSTEM_LIBUNWIND) += libosxunwind
else
JL_PRIVATE_LIBS-$(USE_SYSTEM_LIBUNWIND) += libunwind
endif

ifeq ($(USE_SYSTEM_LIBM),0)
JL_PRIVATE_LIBS-$(USE_SYSTEM_OPENLIBM) += libopenlibm
Expand Down
2 changes: 1 addition & 1 deletion contrib/refresh_checksums.mk
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ CLANG_TRIPLETS=$(filter %-darwin %-freebsd,$(TRIPLETS))
NON_CLANG_TRIPLETS=$(filter-out %-darwin %-freebsd,$(TRIPLETS))

# These are the projects currently using BinaryBuilder; both GCC-expanded and non-GCC-expanded:
BB_PROJECTS=mbedtls libssh2 nghttp2 mpfr curl libgit2 pcre libuv unwind osxunwind dsfmt objconv p7zip zlib suitesparse openlibm
BB_PROJECTS=mbedtls libssh2 nghttp2 mpfr curl libgit2 pcre libuv unwind llvmunwind dsfmt objconv p7zip zlib suitesparse openlibm
BB_GCC_EXPANDED_PROJECTS=openblas csl
BB_CXX_EXPANDED_PROJECTS=gmp llvm clang llvm-tools
# These are non-BB source-only deps
Expand Down
19 changes: 8 additions & 11 deletions deps/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ BUILDDIR := $(BUILDDIR)$(MAYBE_HOST)
# if you are adding a new target, it can help to copy an similar, existing target
#
# autoconf configure-driven scripts: pcre unwind gmp mpfr patchelf libuv curl
# custom Makefile rules: openlibm dsfmt suitesparse-wrapper suitesparse lapack openblas utf8proc objconv osxunwind libwhich
# CMake libs: llvm libgit2 libssh2 mbedtls
# custom Makefile rules: openlibm dsfmt suitesparse-wrapper suitesparse lapack openblas utf8proc objconv libwhich
# CMake libs: llvm llvmunwind libgit2 libssh2 mbedtls
#
# downloadable via git: llvm-svn, libuv, libopenlibm, utf8proc, libgit2, libssh2
#
Expand Down Expand Up @@ -58,7 +58,7 @@ DEP_LIBS += unwind
else ifeq ($(OS), FreeBSD)
DEP_LIBS += unwind
else ifeq ($(OS), Darwin)
DEP_LIBS += osxunwind
DEP_LIBS += llvmunwind
endif
endif
endif
Expand Down Expand Up @@ -168,9 +168,6 @@ DEP_LIBS_STAGED := $(DEP_LIBS)
DEP_LIBS_STAGED := $(filter-out csl,$(DEP_LIBS_STAGED))
DEP_LIBS_STAGED := $(filter-out suitesparse,$(DEP_LIBS_STAGED))
DEP_LIBS_STAGED := $(filter-out suitesparse-wrapper,$(DEP_LIBS_STAGED))
ifneq ($(USE_BINARYBUILDER_LIBUNWIND),1)
DEP_LIBS_STAGED := $(filter-out osxunwind,$(DEP_LIBS_STAGED))
endif


## Common build target prefixes
Expand All @@ -189,14 +186,14 @@ distcleanall: $(addprefix distclean-, $(DEP_LIBS))
rm -rf $(build_prefix)
getall: get-llvm get-libuv get-pcre get-openlibm get-dsfmt get-openblas get-lapack get-suitesparse get-unwind get-gmp get-mpfr get-patchelf get-utf8proc get-objconv get-mbedtls get-libssh2 get-nghttp2 get-curl get-libgit2 get-libwhich get-zlib get-p7zip get-csl

# If we're building for MacOS, no matter what, `getall` should include `osxunwind`
# If we're building for MacOS, no matter what, `getall` should include `llvmunwind`
ifeq ($(OS),Darwin)
getall: get-osxunwind
getall: get-llvmunwind
endif

# Same if we're building a purely-source archive, always include `osxunwind`
ifeq ($(USE_BINARYBUILDER_OSXUNWIND),0)
getall: get-osxunwind
# Same if we're building a purely-source archive, always include `llvmunwind`
ifeq ($(USE_BINARYBUILDER_LLVMUNWIND),0)
getall: get-llvmunwind
endif

include $(SRCDIR)/csl.mk
Expand Down
9 changes: 4 additions & 5 deletions deps/Versions.make
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ LLVM_JLL_NAME := libLLVM
LLVM_TOOLS_JLL_NAME := LLVM
LLVM_TOOLS_JLL_VER := 11.0.1+2

# LLVM libunwind
LLVMUNWIND_VER := 11.0.1
LLVMUNWIND_JLL_NAME := LLVMLibUnwind

# MbedTLS
MBEDTLS_VER := 2.24.0
MBEDTLS_JLL_NAME := MbedTLS
Expand All @@ -78,11 +82,6 @@ OPENBLAS_JLL_NAME := OpenBLAS
OPENLIBM_VER := 0.7.3
OPENLIBM_JLL_NAME := OpenLibm

# OSXUnwind (we statically link this, so no need for a fake JLL; therefore we specify the JLL_VER here)
OSXUNWIND_VER := 0.0.6
OSXUNWIND_JLL_NAME := LibOSXUnwind
OSXUNWIND_JLL_VER := 0.0.6+1

# Patchelf (we don't ship this or even use a JLL, we just always build it)
PATCHELF_VER := 0.9

Expand Down
34 changes: 34 additions & 0 deletions deps/checksums/llvmunwind
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
LLVMLibUnwind.v11.0.1+1.aarch64-apple-darwin.tar.gz/md5/aceea9c7eca53a8da86c6d0b713a8c99
LLVMLibUnwind.v11.0.1+1.aarch64-apple-darwin.tar.gz/sha512/621b6c23b852332039bcd856ff330cc6109f5f18e646a7863900dd5ae9115a1f8a2f5da3fd50de2589da1af5e2326634259dec505972e2033f0772b7c38c5944
LLVMLibUnwind.v11.0.1+1.aarch64-linux-gnu.tar.gz/md5/53999245ae1b82eb15baa9aaad078365
LLVMLibUnwind.v11.0.1+1.aarch64-linux-gnu.tar.gz/sha512/a6a49da09b476eb87fab7e472a45d8417a701693ea928aa1c753722e430eb17a4b4ce3b8711de0238705eac3436391b806b8eff9b0ee922db095ed4a87ded67e
LLVMLibUnwind.v11.0.1+1.aarch64-linux-musl.tar.gz/md5/d900059ad3eb62827b1efc19343fe288
LLVMLibUnwind.v11.0.1+1.aarch64-linux-musl.tar.gz/sha512/14cc60ff4ddfe4ed8568457069614d463d9d8ecd89633c05986da97374a6c1317c363c80654fe61731b574638e1ee62d38c399c850ffa4c0245d5046cc091b75
LLVMLibUnwind.v11.0.1+1.armv6l-linux-gnueabihf.tar.gz/md5/5c1f9945de5d3537aff8623551eeb92e
LLVMLibUnwind.v11.0.1+1.armv6l-linux-gnueabihf.tar.gz/sha512/a9d1b6973f2cd681572d86ef5c0d26fce3c7a8eb3a40e3c0344c3356da71d0b9feb05ae33cfc9d28c722054925eb8b7918eaf9edb47536b55497815002852cb1
LLVMLibUnwind.v11.0.1+1.armv6l-linux-musleabihf.tar.gz/md5/77292837c1947f211a161e26ffddb71d
LLVMLibUnwind.v11.0.1+1.armv6l-linux-musleabihf.tar.gz/sha512/522a2942796c165e9c060dca9507ec86adb3110b524b856c5e5f364a0540b9f3842fb5d9c8ffdb1af06bdd6d6b1d4de6ae45d9fa274b1e45af0ce7e84785f9ee
LLVMLibUnwind.v11.0.1+1.armv7l-linux-gnueabihf.tar.gz/md5/4e40751ed7a622970c81c29a28280341
LLVMLibUnwind.v11.0.1+1.armv7l-linux-gnueabihf.tar.gz/sha512/11c33018723fe2f96e61a7e6126ccef09cfc8504d93e01c8ab4b74acd71230bec2d5be4a3bd65a582cdd582ef81a00095668ab0068c4084ceed6ee8653472090
LLVMLibUnwind.v11.0.1+1.armv7l-linux-musleabihf.tar.gz/md5/c5d5b263a9291433c222d5812d8ee232
LLVMLibUnwind.v11.0.1+1.armv7l-linux-musleabihf.tar.gz/sha512/b9e3abea035aafd4cebc00d63d30a15aedd702125d1b1e8988f3563d5adf495fcce86200fad95ab1db0721a533dc0af7c61fd678f17203d629525bc283f74632
LLVMLibUnwind.v11.0.1+1.i686-linux-gnu.tar.gz/md5/bd3186039f77f656838c73cf6ebcb0ff
LLVMLibUnwind.v11.0.1+1.i686-linux-gnu.tar.gz/sha512/01b4a99d25a69b367b540b363bcc71fa10d6cd34e53ceeeba7f81f372873bb1cf3bde66fa280bbb60b65b679639479f46acd76823d79418c641d3354cc1e0c01
LLVMLibUnwind.v11.0.1+1.i686-linux-musl.tar.gz/md5/58bec4c7eef0b79d3878b465f3f52d6d
LLVMLibUnwind.v11.0.1+1.i686-linux-musl.tar.gz/sha512/b5467a4f25abbc6097d83f414ace31ac58429ce4ee5d8ca7cc0a77612a237e3e8050578b2c90bc8f30e7c346c3eb64a939c854614e1d51dad0133d52905dbce8
LLVMLibUnwind.v11.0.1+1.i686-w64-mingw32.tar.gz/md5/40ead04fdf8afc1cd96fe6da98bb7095
LLVMLibUnwind.v11.0.1+1.i686-w64-mingw32.tar.gz/sha512/269fe9159714819dae63afa1fca28fea885eb4d855715c5c38e7ab63f9ff87b7a5c717228b73c8957404a025a8439e711edb15e1df5c70180dc642fbdeab8264
LLVMLibUnwind.v11.0.1+1.powerpc64le-linux-gnu.tar.gz/md5/cf1fcc8d88040c7c55ff198201b9b22f
LLVMLibUnwind.v11.0.1+1.powerpc64le-linux-gnu.tar.gz/sha512/ec417cf4d55f471bea1ed3adfe0ce2686f61f34011c6006289bcad923ba1a53d98271decf43fcbaf6fecb0cffe7c8d771200d6fd4783fc26894044da69c3a04d
LLVMLibUnwind.v11.0.1+1.x86_64-apple-darwin.tar.gz/md5/0bca573e5476ae37191d8ae3a75721de
LLVMLibUnwind.v11.0.1+1.x86_64-apple-darwin.tar.gz/sha512/90287c998f0d141703a2388d2ff2a496d4f7b57cb89b658f26ea0447edcc095a6342dd4a02d152638c4466dadf2527ad374e3f5ef905cc7ced7c16b5b1ea4d54
LLVMLibUnwind.v11.0.1+1.x86_64-linux-gnu.tar.gz/md5/88d17930d6e1b95da3d9a0f07a43fa49
LLVMLibUnwind.v11.0.1+1.x86_64-linux-gnu.tar.gz/sha512/c6969c1380ca02be47010ef3882cde815e27a4e23bdbefcb94aa1af76889519ff8e43d83d3156df21be5c909ab5ca7a2199ec742f9711f11d49a743c8a5cac10
LLVMLibUnwind.v11.0.1+1.x86_64-linux-musl.tar.gz/md5/6033356ddd94624e785d3820ab091eab
LLVMLibUnwind.v11.0.1+1.x86_64-linux-musl.tar.gz/sha512/da7d45efb4b53033031b4656a8877250520b905c4103d0e49079f1c0d80360f258694515bbeb8f687bbe0cf931e357855dea0602b7ef5b50b25f7ccd4ea92829
LLVMLibUnwind.v11.0.1+1.x86_64-unknown-freebsd.tar.gz/md5/bed33a2f926ae888a97f87e68919eb95
LLVMLibUnwind.v11.0.1+1.x86_64-unknown-freebsd.tar.gz/sha512/a043e01e2e18c4c7b907cc37a7af2231ca3895edaf69ba0df62f5d615e594d2d75193c03d902beb4c39a06cbcb9f394959de527ce7144374b22371f4c47b9b43
LLVMLibUnwind.v11.0.1+1.x86_64-w64-mingw32.tar.gz/md5/c9f98a3a63137d4a5ad3c81f24d8e3cb
LLVMLibUnwind.v11.0.1+1.x86_64-w64-mingw32.tar.gz/sha512/4b27d33dc31511e3a7913f360dee4e0ff7f3bf9f6256f4e71473e3b3fafbedf27fbe87d6a96ed4bba57be8c2150f9e42ee2627a48c6d3d87e466c274cd5949cb
llvmunwind-11.0.1.tar.xz/md5/b030a6d5807d797e505e4fbd32a36c2a
llvmunwind-11.0.1.tar.xz/sha512/9cfa1eae720a99ac10d05aa4d1e1b205da5c78841aafd6022a87d1272c821a43402309dfa42d8863bc6dea330ab2c0917d62284b572abb56641aa80e56a9be69
Empty file removed deps/checksums/osxunwind
Empty file.
2 changes: 1 addition & 1 deletion deps/llvm.mk
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ endif
# These libraries require unwind.h from the libunwind dependency
ifeq ($(USE_SYSTEM_LIBUNWIND),0)
ifeq ($(OS),Darwin)
BUILT_UNWIND := $(build_prefix)/manifest/osxunwind
BUILT_UNWIND := $(build_prefix)/manifest/llvmunwind
else
BUILT_UNWIND := $(build_prefix)/manifest/unwind
endif # Darwin
Expand Down
181 changes: 181 additions & 0 deletions deps/patches/llvm-libunwind-force-dwarf.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
An updated version of this libosxunwind commit:

Author: Keno Fischer <[email protected]>
Date: Tue Aug 27 15:01:22 2013 -0400

Add option to step with DWARF

---
diff --git a/libunwind/include/libunwind.h b/libunwind/include/libunwind.h
index 23ef47f4ac83..ea6c5cb86438 100644
--- a/libunwind/include/libunwind.h
+++ b/libunwind/include/libunwind.h
@@ -102,6 +102,7 @@ extern "C" {

extern int unw_getcontext(unw_context_t *) LIBUNWIND_AVAIL;
extern int unw_init_local(unw_cursor_t *, unw_context_t *) LIBUNWIND_AVAIL;
+extern int unw_init_local_dwarf(unw_cursor_t *, unw_context_t *) LIBUNWIND_AVAIL;
extern int unw_step(unw_cursor_t *) LIBUNWIND_AVAIL;
extern int unw_get_reg(unw_cursor_t *, unw_regnum_t, unw_word_t *) LIBUNWIND_AVAIL;
extern int unw_get_fpreg(unw_cursor_t *, unw_regnum_t, unw_fpreg_t *) LIBUNWIND_AVAIL;
diff --git a/libunwind/src/UnwindCursor.hpp b/libunwind/src/UnwindCursor.hpp
index f346c720d22c..e44f22a91513 100644
--- a/libunwind/src/UnwindCursor.hpp
+++ b/libunwind/src/UnwindCursor.hpp
@@ -436,6 +436,9 @@ public:
virtual bool isSignalFrame() {
_LIBUNWIND_ABORT("isSignalFrame not implemented");
}
+ virtual void setForceDWARF(bool) {
+ _LIBUNWIND_ABORT("setForceDWARF not implemented");
+ }
virtual bool getFunctionName(char *, size_t, unw_word_t *) {
_LIBUNWIND_ABORT("getFunctionName not implemented");
}
@@ -891,6 +894,7 @@ public:
virtual void getInfo(unw_proc_info_t *);
virtual void jumpto();
virtual bool isSignalFrame();
+ virtual void setForceDWARF(bool force);
virtual bool getFunctionName(char *buf, size_t len, unw_word_t *off);
virtual void setInfoBasedOnIPRegister(bool isReturnAddress = false);
virtual const char *getRegisterName(int num);
@@ -938,7 +942,7 @@ private:
const UnwindInfoSections &sects);
int stepWithCompactEncoding() {
#if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
- if ( compactSaysUseDwarf() )
+ if ( _forceDwarf || compactSaysUseDwarf() )
return stepWithDwarfFDE();
#endif
R dummy;
@@ -1173,13 +1177,14 @@ private:
unw_proc_info_t _info;
bool _unwindInfoMissing;
bool _isSignalFrame;
+ bool _forceDwarf;
};


template <typename A, typename R>
UnwindCursor<A, R>::UnwindCursor(unw_context_t *context, A &as)
: _addressSpace(as), _registers(context), _unwindInfoMissing(false),
- _isSignalFrame(false) {
+ _isSignalFrame(false), _forceDwarf(false) {
static_assert((check_fit<UnwindCursor<A, R>, unw_cursor_t>::does_fit),
"UnwindCursor<> does not fit in unw_cursor_t");
memset(&_info, 0, sizeof(_info));
@@ -1187,7 +1192,8 @@ UnwindCursor<A, R>::UnwindCursor(unw_context_t *context, A &as)

template <typename A, typename R>
UnwindCursor<A, R>::UnwindCursor(A &as, void *)
- : _addressSpace(as), _unwindInfoMissing(false), _isSignalFrame(false) {
+ : _addressSpace(as), _unwindInfoMissing(false), _isSignalFrame(false),
+ _forceDwarf(false) {
memset(&_info, 0, sizeof(_info));
// FIXME
// fill in _registers from thread arg
@@ -1243,6 +1249,10 @@ template <typename A, typename R> bool UnwindCursor<A, R>::isSignalFrame() {
return _isSignalFrame;
}

+template <typename A, typename R> void UnwindCursor<A, R>::setForceDWARF(bool force) {
+ _forceDwarf = force;
+}
+
#endif // defined(_LIBUNWIND_SUPPORT_SEH_UNWIND)

#if defined(_LIBUNWIND_ARM_EHABI)
@@ -1895,7 +1905,13 @@ void UnwindCursor<A, R>::setInfoBasedOnIPRegister(bool isReturnAddress) {
// record that we have no unwind info.
if (_info.format == 0)
_unwindInfoMissing = true;
+ #if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
+ if (!(_forceDwarf || compactSaysUseDwarf(&dwarfOffset)))
+ return;
+ #else
return;
+ #endif
+
}
}
#endif // defined(_LIBUNWIND_SUPPORT_COMPACT_UNWIND)
diff --git a/libunwind/src/libunwind.cpp b/libunwind/src/libunwind.cpp
index fd079da30895..206afcbbaf78 100644
--- a/libunwind/src/libunwind.cpp
+++ b/libunwind/src/libunwind.cpp
@@ -69,6 +69,7 @@ _LIBUNWIND_HIDDEN int __unw_init_local(unw_cursor_t *cursor,
new (reinterpret_cast<UnwindCursor<LocalAddressSpace, REGISTER_KIND> *>(cursor))
UnwindCursor<LocalAddressSpace, REGISTER_KIND>(
context, LocalAddressSpace::sThisAddressSpace);
+ static_assert(sizeof(unw_cursor_t) >= sizeof(UnwindCursor<LocalAddressSpace,REGISTER_KIND>), "libunwind header outdated");
#undef REGISTER_KIND
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
co->setInfoBasedOnIPRegister();
@@ -77,6 +78,54 @@ _LIBUNWIND_HIDDEN int __unw_init_local(unw_cursor_t *cursor,
}
_LIBUNWIND_WEAK_ALIAS(__unw_init_local, unw_init_local)

+_LIBUNWIND_HIDDEN int __unw_init_local_dwarf(unw_cursor_t *cursor,
+ unw_context_t *context) {
+ _LIBUNWIND_TRACE_API("__unw_init_local_dwarf(cursor=%p, context=%p)",
+ static_cast<void *>(cursor),
+ static_cast<void *>(context));
+#if defined(__i386__)
+# define REGISTER_KIND Registers_x86
+#elif defined(__x86_64__)
+# define REGISTER_KIND Registers_x86_64
+#elif defined(__powerpc64__)
+# define REGISTER_KIND Registers_ppc64
+#elif defined(__ppc__)
+# define REGISTER_KIND Registers_ppc
+#elif defined(__aarch64__)
+# define REGISTER_KIND Registers_arm64
+#elif defined(__arm__)
+# define REGISTER_KIND Registers_arm
+#elif defined(__or1k__)
+# define REGISTER_KIND Registers_or1k
+#elif defined(__hexagon__)
+# define REGISTER_KIND Registers_hexagon
+#elif defined(__mips__) && defined(_ABIO32) && _MIPS_SIM == _ABIO32
+# define REGISTER_KIND Registers_mips_o32
+#elif defined(__mips64)
+# define REGISTER_KIND Registers_mips_newabi
+#elif defined(__mips__)
+# warning The MIPS architecture is not supported with this ABI and environment!
+#elif defined(__sparc__)
+# define REGISTER_KIND Registers_sparc
+#elif defined(__riscv) && __riscv_xlen == 64
+# define REGISTER_KIND Registers_riscv
+#else
+# error Architecture not supported
+#endif
+ // Use "placement new" to allocate UnwindCursor in the cursor buffer.
+ new (reinterpret_cast<UnwindCursor<LocalAddressSpace, REGISTER_KIND> *>(cursor))
+ UnwindCursor<LocalAddressSpace, REGISTER_KIND>(
+ context, LocalAddressSpace::sThisAddressSpace);
+ static_assert(sizeof(unw_cursor_t) >= sizeof(UnwindCursor<LocalAddressSpace,REGISTER_KIND>), "libunwind header outdated");
+#undef REGISTER_KIND
+ AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
+ co->setForceDWARF(true);
+ co->setInfoBasedOnIPRegister();
+
+ return UNW_ESUCCESS;
+}
+_LIBUNWIND_WEAK_ALIAS(__unw_init_local_dwarf, unw_init_local_dwarf)
+
/// Get value of specified register at cursor position in stack frame.
_LIBUNWIND_HIDDEN int __unw_get_reg(unw_cursor_t *cursor, unw_regnum_t regNum,
unw_word_t *value) {
diff --git a/libunwind/src/libunwind_ext.h b/libunwind/src/libunwind_ext.h
index 316dee298246..5b9f7e2f56cd 100644
--- a/libunwind/src/libunwind_ext.h
+++ b/libunwind/src/libunwind_ext.h
@@ -25,6 +25,7 @@ extern "C" {

extern int __unw_getcontext(unw_context_t *);
extern int __unw_init_local(unw_cursor_t *, unw_context_t *);
+extern int __unw_init_local_dwarf(unw_cursor_t *, unw_context_t *);
extern int __unw_step(unw_cursor_t *);
extern int __unw_get_reg(unw_cursor_t *, unw_regnum_t, unw_word_t *);
extern int __unw_get_fpreg(unw_cursor_t *, unw_regnum_t, unw_fpreg_t *);
Loading

0 comments on commit d524f21

Please sign in to comment.