forked from OSchip/llvm-project
[libunwind] unw_* alias fixes for ELF and Mach-O
Rename the CMake option, LIBUNWIND_HERMETIC_STATIC_LIBRARY, to LIBUNWIND_HIDE_SYMBOLS. Rename the C macro define, _LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS, to _LIBUNWIND_HIDE_SYMBOLS, because now the macro adds a .hidden directive rather than merely suppress visibility annotations. For ELF, when LIBUNWIND_HIDE_SYMBOLS is enabled, mark unw_getcontext as hidden. This symbol is the only one defined using src/assembly.h's WEAK_ALIAS macro. Other unw_* weak aliases are defined in C++ and are already hidden. Mach-O doesn't support weak aliases, so remove .weak_reference and weak_import. When LIBUNWIND_HIDE_SYMBOLS is enabled, output .private_extern for the unw_* aliases. In assembly.h, add missing SYMBOL_NAME macro invocations, which are used to prefix symbol names with '_' on some targets. Fixes PR46709. Reviewed By: #libunwind, phosek, compnerd, steven_wu Differential Revision: https://reviews.llvm.org/D93003
This commit is contained in:
parent
0df59f234b
commit
729899f7b6
|
@ -179,7 +179,7 @@ if(FUCHSIA_SDK)
|
|||
set(RUNTIMES_${target}-unknown-fuchsia_CMAKE_SYSROOT ${FUCHSIA_${target}_SYSROOT} CACHE PATH "")
|
||||
set(RUNTIMES_${target}-unknown-fuchsia_COMPILER_RT_USE_BUILTINS_LIBRARY ON CACHE BOOL "")
|
||||
set(RUNTIMES_${target}-unknown-fuchsia_LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "")
|
||||
set(RUNTIMES_${target}-unknown-fuchsia_LIBUNWIND_HERMETIC_STATIC_LIBRARY ON CACHE BOOL "")
|
||||
set(RUNTIMES_${target}-unknown-fuchsia_LIBUNWIND_HIDE_SYMBOLS ON CACHE BOOL "")
|
||||
set(RUNTIMES_${target}-unknown-fuchsia_LIBUNWIND_INSTALL_STATIC_LIBRARY OFF CACHE BOOL "")
|
||||
set(RUNTIMES_${target}-unknown-fuchsia_LIBCXXABI_USE_COMPILER_RT ON CACHE BOOL "")
|
||||
set(RUNTIMES_${target}-unknown-fuchsia_LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "")
|
||||
|
|
|
@ -102,7 +102,7 @@ elseif(LIBUNWIND_BUILD_32_BITS)
|
|||
message(FATAL_ERROR "LIBUNWIND_BUILD_32_BITS=ON is not supported on this platform.")
|
||||
endif()
|
||||
|
||||
option(LIBUNWIND_HERMETIC_STATIC_LIBRARY
|
||||
option(LIBUNWIND_HIDE_SYMBOLS
|
||||
"Do not export any symbols from the static library." OFF)
|
||||
|
||||
#===============================================================================
|
||||
|
@ -321,7 +321,7 @@ endif()
|
|||
|
||||
# Disable DLL annotations on Windows for static builds.
|
||||
if (WIN32 AND LIBUNWIND_ENABLE_STATIC AND NOT LIBUNWIND_ENABLE_SHARED)
|
||||
add_definitions(-D_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS)
|
||||
add_definitions(-D_LIBUNWIND_HIDE_SYMBOLS)
|
||||
endif()
|
||||
|
||||
if (LIBUNWIND_HAS_COMMENT_LIB_PRAGMA)
|
||||
|
|
|
@ -164,11 +164,11 @@ if (LIBUNWIND_ENABLE_STATIC)
|
|||
LINKER_LANGUAGE C
|
||||
OUTPUT_NAME "unwind")
|
||||
|
||||
if(LIBUNWIND_HERMETIC_STATIC_LIBRARY)
|
||||
if(LIBUNWIND_HIDE_SYMBOLS)
|
||||
append_flags_if_supported(UNWIND_STATIC_LIBRARY_FLAGS -fvisibility=hidden)
|
||||
append_flags_if_supported(UNWIND_STATIC_LIBRARY_FLAGS -fvisibility-global-new-delete-hidden)
|
||||
target_compile_options(unwind_static PRIVATE ${UNWIND_STATIC_LIBRARY_FLAGS})
|
||||
target_compile_definitions(unwind_static PRIVATE _LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS)
|
||||
target_compile_definitions(unwind_static PRIVATE _LIBUNWIND_HIDE_SYMBOLS)
|
||||
endif()
|
||||
|
||||
list(APPEND LIBUNWIND_BUILD_TARGETS "unwind_static")
|
||||
|
|
|
@ -70,12 +70,15 @@
|
|||
#if defined(__APPLE__)
|
||||
|
||||
#define SYMBOL_IS_FUNC(name)
|
||||
#define EXPORT_SYMBOL(name)
|
||||
#define HIDDEN_SYMBOL(name) .private_extern name
|
||||
#define WEAK_SYMBOL(name) .weak_reference name
|
||||
#if defined(_LIBUNWIND_HIDE_SYMBOLS)
|
||||
#define EXPORT_SYMBOL(name) HIDDEN_SYMBOL(name)
|
||||
#else
|
||||
#define EXPORT_SYMBOL(name)
|
||||
#endif
|
||||
#define WEAK_ALIAS(name, aliasname) \
|
||||
.globl SYMBOL_NAME(aliasname) SEPARATOR \
|
||||
WEAK_SYMBOL(aliasname) SEPARATOR \
|
||||
EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
|
||||
SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
|
||||
|
||||
#define NO_EXEC_STACK_DIRECTIVE
|
||||
|
@ -87,17 +90,23 @@
|
|||
#else
|
||||
#define SYMBOL_IS_FUNC(name) .type name,@function
|
||||
#endif
|
||||
#define EXPORT_SYMBOL(name)
|
||||
#define HIDDEN_SYMBOL(name) .hidden name
|
||||
#if defined(_LIBUNWIND_HIDE_SYMBOLS)
|
||||
#define EXPORT_SYMBOL(name) HIDDEN_SYMBOL(name)
|
||||
#else
|
||||
#define EXPORT_SYMBOL(name)
|
||||
#endif
|
||||
#define WEAK_SYMBOL(name) .weak name
|
||||
|
||||
#if defined(__hexagon__)
|
||||
#define WEAK_ALIAS(name, aliasname) \
|
||||
WEAK_SYMBOL(aliasname) SEPARATOR \
|
||||
#define WEAK_ALIAS(name, aliasname) \
|
||||
EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
|
||||
WEAK_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
|
||||
.equiv SYMBOL_NAME(aliasname), SYMBOL_NAME(name)
|
||||
#else
|
||||
#define WEAK_ALIAS(name, aliasname) \
|
||||
WEAK_SYMBOL(aliasname) SEPARATOR \
|
||||
EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
|
||||
WEAK_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
|
||||
SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
|
||||
#endif
|
||||
|
||||
|
@ -119,7 +128,7 @@
|
|||
.section .drectve,"yn" SEPARATOR \
|
||||
.ascii "-export:", #name, "\0" SEPARATOR \
|
||||
.text
|
||||
#if defined(_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS)
|
||||
#if defined(_LIBUNWIND_HIDE_SYMBOLS)
|
||||
#define EXPORT_SYMBOL(name)
|
||||
#else
|
||||
#define EXPORT_SYMBOL(name) EXPORT_SYMBOL2(name)
|
||||
|
|
|
@ -52,7 +52,8 @@
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS)
|
||||
#if defined(_LIBUNWIND_HIDE_SYMBOLS)
|
||||
// The CMake file passes -fvisibility=hidden to control ELF/Mach-O visibility.
|
||||
#define _LIBUNWIND_EXPORT
|
||||
#define _LIBUNWIND_HIDDEN
|
||||
#else
|
||||
|
@ -70,11 +71,15 @@
|
|||
#define SYMBOL_NAME(name) XSTR(__USER_LABEL_PREFIX__) #name
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#if defined(_LIBUNWIND_HIDE_SYMBOLS)
|
||||
#define _LIBUNWIND_ALIAS_VISIBILITY(name) __asm__(".private_extern " name)
|
||||
#else
|
||||
#define _LIBUNWIND_ALIAS_VISIBILITY(name)
|
||||
#endif
|
||||
#define _LIBUNWIND_WEAK_ALIAS(name, aliasname) \
|
||||
__asm__(".globl " SYMBOL_NAME(aliasname)); \
|
||||
__asm__(SYMBOL_NAME(aliasname) " = " SYMBOL_NAME(name)); \
|
||||
extern "C" _LIBUNWIND_EXPORT __typeof(name) aliasname \
|
||||
__attribute__((weak_import));
|
||||
_LIBUNWIND_ALIAS_VISIBILITY(SYMBOL_NAME(aliasname));
|
||||
#elif defined(__ELF__)
|
||||
#define _LIBUNWIND_WEAK_ALIAS(name, aliasname) \
|
||||
extern "C" _LIBUNWIND_EXPORT __typeof(name) aliasname \
|
||||
|
|
|
@ -111,7 +111,7 @@ if (libunwind_enable_static) {
|
|||
if (!invoker.export) {
|
||||
cflags = [ "-fvisibility=hidden" ]
|
||||
cflags_cc = [ "-fvisibility-global-new-delete-hidden" ]
|
||||
defines = [ "_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS" ]
|
||||
defines = [ "_LIBUNWIND_HIDE_SYMBOLS" ]
|
||||
}
|
||||
deps = [ "//compiler-rt/lib/builtins" ]
|
||||
configs += [ ":unwind_config" ]
|
||||
|
|
Loading…
Reference in New Issue