[PATCH] D44493: [libunwind] Add a cmake option for disabling the use of the dynamic linker
Martin Storsjö via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 14 13:34:45 PDT 2018
mstorsjo created this revision.
mstorsjo added reviewers: rnk, compnerd.
Herald added a subscriber: mgorny.
On windows, the psapi function for querying the dynamic linker for loaded modules (EnumProcessModules) are unavailable when targeting the UWP/"Windows Store" api subsets.
Such a build relies on the static frame registration functions for finding exception handlers.
Repository:
rUNW libunwind
https://reviews.llvm.org/D44493
Files:
CMakeLists.txt
src/AddressSpace.hpp
Index: src/AddressSpace.hpp
===================================================================
--- src/AddressSpace.hpp
+++ src/AddressSpace.hpp
@@ -377,19 +377,7 @@
inline bool LocalAddressSpace::findUnwindSections(pint_t targetAddr,
UnwindInfoSections &info) {
-#ifdef __APPLE__
- dyld_unwind_sections dyldInfo;
- if (_dyld_find_unwind_sections((void *)targetAddr, &dyldInfo)) {
- info.dso_base = (uintptr_t)dyldInfo.mh;
- #if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
- info.dwarf_section = (uintptr_t)dyldInfo.dwarf_section;
- info.dwarf_section_length = dyldInfo.dwarf_section_length;
- #endif
- info.compact_unwind_section = (uintptr_t)dyldInfo.compact_unwind_section;
- info.compact_unwind_section_length = dyldInfo.compact_unwind_section_length;
- return true;
- }
-#elif defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND) && defined(_LIBUNWIND_IS_BAREMETAL)
+#if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND) && defined(_LIBUNWIND_IS_BAREMETAL)
// Bare metal is statically linked, so no need to ask the dynamic loader
info.dwarf_section_length = (uintptr_t)(&__eh_frame_end - &__eh_frame_start);
info.dwarf_section = (uintptr_t)(&__eh_frame_start);
@@ -411,6 +399,19 @@
(void *)info.arm_section, (void *)info.arm_section_length);
if (info.arm_section && info.arm_section_length)
return true;
+#elif !defined(_LIBUNWIND_DISABLE_DYNAMIC_LINKER)
+#ifdef __APPLE__
+ dyld_unwind_sections dyldInfo;
+ if (_dyld_find_unwind_sections((void *)targetAddr, &dyldInfo)) {
+ info.dso_base = (uintptr_t)dyldInfo.mh;
+ #if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
+ info.dwarf_section = (uintptr_t)dyldInfo.dwarf_section;
+ info.dwarf_section_length = dyldInfo.dwarf_section_length;
+ #endif
+ info.compact_unwind_section = (uintptr_t)dyldInfo.compact_unwind_section;
+ info.compact_unwind_section_length = dyldInfo.compact_unwind_section_length;
+ return true;
+ }
#elif defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND) && defined(_WIN32)
HMODULE mods[1024];
HANDLE process = GetCurrentProcess();
@@ -557,6 +558,7 @@
&cb_data);
return static_cast<bool>(found);
#endif
+#endif // !_LIBUNWIND_DISABLE_DYNAMIC_LINKER
return false;
}
Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt
+++ CMakeLists.txt
@@ -47,6 +47,7 @@
option(LIBUNWIND_ENABLE_THREADS "Build libunwind with threading support." ON)
option(LIBUNWIND_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
option(LIBUNWIND_INCLUDE_DOCS "Build the libunwind documentation." ${LLVM_INCLUDE_DOCS})
+option(LIBUNWIND_ENABLE_DYNAMIC_LINKER "Query the dynamic linker for finding exception frames." ON)
set(LIBUNWIND_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING
"Define suffix of library directory name (32/64)")
@@ -226,6 +227,11 @@
list(APPEND LIBUNWIND_COMPILE_FLAGS -D__ARM_WMMX)
endif()
+# Ability to disable the use of the dynamic linker
+if (NOT LIBUNWIND_ENABLE_DYNAMIC_LINKER)
+ list(APPEND LIBUNWIND_COMPILE_FLAGS -D_LIBUNWIND_DISABLE_DYNAMIC_LINKER)
+endif()
+
# This is the _ONLY_ place where add_definitions is called.
if (MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D44493.138447.patch
Type: text/x-patch
Size: 3382 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180314/a610e090/attachment-0001.bin>
More information about the cfe-commits
mailing list