Skip to content

Commit

Permalink
add support for llvm libunwind (pingcap#3683)
Browse files Browse the repository at this point in the history
  • Loading branch information
SchrodingerZhu authored Jan 4, 2022
1 parent 0c9b631 commit 1a05883
Show file tree
Hide file tree
Showing 13 changed files with 2,426 additions and 69 deletions.
31 changes: 23 additions & 8 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -208,22 +208,37 @@ if (ARCH_LINUX AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GLIBC_COMPATIBILITY_LINK_FLAGS} ${CXX11_ABI_FLAGS}")

option (USE_LIBCXX "Use libc++ and libc++abi instead of libstdc++ (only make sense on Linux with Clang)" ${HAVE_LIBCXX})
set (LIBCXX_PATH "" CACHE STRING "Use custom path for libc++. It should be used for MSan.")
option (USE_LLVM_LIBUNWIND "Use libunwind from LLVM" ON)
option (USE_LLVM_COMPILER_RT "Use compiler-rt from LLVM" ON)


set (LIBCXX_PATH "" CACHE STRING "Use custom path for libc++. It should be used for MSan.")
set (TIFLASH_LLVM_LINKAGE_FLAGS "")
if (USE_LIBCXX)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") # Ok for clang6, for older can cause 'not used option' warning
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_LIBCPP_DEBUG=0") # More checks in debug build.
if (MAKE_STATIC_LIBRARIES)
link_libraries (-Wl,-Bstatic -stdlib=libc++ c++ c++abi -Wl,-Bdynamic)
else ()
link_libraries (-stdlib=libc++ c++ c++abi)
endif ()

list (APPEND TIFLASH_LLVM_LINKAGE_FLAGS -stdlib=libc++ c++ c++abi)
if (LIBCXX_PATH)
# include_directories (BEFORE SYSTEM "${LIBCXX_PATH}/include" "${LIBCXX_PATH}/include/c++/v1")
link_directories ("${LIBCXX_PATH}/lib")
link_directories ("${LIBCXX_PATH}/lib")
endif ()
endif ()

if (USE_LLVM_LIBUNWIND)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -unwindlib=libunwind")
list (APPEND TIFLASH_LLVM_LINKAGE_FLAGS -unwindlib=libunwind unwind)
endif ()

if (USE_LLVM_COMPILER_RT)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rtlib=compiler-rt")
list (APPEND TIFLASH_LLVM_LINKAGE_FLAGS -rtlib=compiler-rt)
endif ()

if (MAKE_STATIC_LIBRARIES)
link_libraries (-Wl,-Bstatic ${TIFLASH_LLVM_LINKAGE_FLAGS} -Wl,-Bdynamic)
else ()
link_libraries (${TIFLASH_LLVM_LINKAGE_FLAGS})
endif ()
endif ()

if (USE_STATIC_LIBRARIES AND HAVE_NO_PIE)
Expand Down
175 changes: 175 additions & 0 deletions contrib/libunwind-llvm/__libunwind_config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
//===------------------------- __libunwind_config.h -----------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef ____LIBUNWIND_CONFIG_H__
#define ____LIBUNWIND_CONFIG_H__

#if defined(__arm__) && !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__ARM_DWARF_EH__)
#define _LIBUNWIND_ARM_EHABI
#endif

#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_X86 8
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_X86_64 32
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_PPC 112
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_PPC64 116
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_ARM64 95
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_ARM 287
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_OR1K 32
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_MIPS 65
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_SPARC 31
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_HEXAGON 34
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_RISCV 64
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_VE 143

#if defined(_LIBUNWIND_IS_NATIVE_ONLY)
#if defined(__linux__)
#define _LIBUNWIND_TARGET_LINUX 1
#endif
#if defined(__i386__)
#define _LIBUNWIND_TARGET_I386
#define _LIBUNWIND_CONTEXT_SIZE 8
#define _LIBUNWIND_CURSOR_SIZE 15
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_X86
#elif defined(__x86_64__)
#define _LIBUNWIND_TARGET_X86_64 1
#if defined(_WIN64)
#define _LIBUNWIND_CONTEXT_SIZE 54
#ifdef __SEH__
#define _LIBUNWIND_CURSOR_SIZE 204
#else
#define _LIBUNWIND_CURSOR_SIZE 66
#endif
#else
#define _LIBUNWIND_CONTEXT_SIZE 21
#define _LIBUNWIND_CURSOR_SIZE 33
#endif
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_X86_64
#elif defined(__powerpc64__)
#define _LIBUNWIND_TARGET_PPC64 1
#define _LIBUNWIND_CONTEXT_SIZE 167
#define _LIBUNWIND_CURSOR_SIZE 179
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_PPC64
#elif defined(__ppc__)
#define _LIBUNWIND_TARGET_PPC 1
#define _LIBUNWIND_CONTEXT_SIZE 117
#define _LIBUNWIND_CURSOR_SIZE 124
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_PPC
#elif defined(__aarch64__)
#define _LIBUNWIND_TARGET_AARCH64 1
#define _LIBUNWIND_CONTEXT_SIZE 66
#if defined(__SEH__)
#define _LIBUNWIND_CURSOR_SIZE 164
#else
#define _LIBUNWIND_CURSOR_SIZE 78
#endif
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_ARM64
#elif defined(__arm__)
#define _LIBUNWIND_TARGET_ARM 1
#if defined(__SEH__)
#define _LIBUNWIND_CONTEXT_SIZE 42
#define _LIBUNWIND_CURSOR_SIZE 80
#elif defined(__ARM_WMMX)
#define _LIBUNWIND_CONTEXT_SIZE 61
#define _LIBUNWIND_CURSOR_SIZE 68
#else
#define _LIBUNWIND_CONTEXT_SIZE 42
#define _LIBUNWIND_CURSOR_SIZE 49
#endif
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_ARM
#elif defined(__or1k__)
#define _LIBUNWIND_TARGET_OR1K 1
#define _LIBUNWIND_CONTEXT_SIZE 16
#define _LIBUNWIND_CURSOR_SIZE 24
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_OR1K
#elif defined(__hexagon__)
#define _LIBUNWIND_TARGET_HEXAGON 1
// Values here change when : Registers.hpp - hexagon_thread_state_t change
#define _LIBUNWIND_CONTEXT_SIZE 18
#define _LIBUNWIND_CURSOR_SIZE 24
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_HEXAGON
#elif defined(__mips__)
#if defined(_ABIO32) && _MIPS_SIM == _ABIO32
#define _LIBUNWIND_TARGET_MIPS_O32 1
#if defined(__mips_hard_float)
#define _LIBUNWIND_CONTEXT_SIZE 50
#define _LIBUNWIND_CURSOR_SIZE 57
#else
#define _LIBUNWIND_CONTEXT_SIZE 18
#define _LIBUNWIND_CURSOR_SIZE 24
#endif
#elif defined(_ABIN32) && _MIPS_SIM == _ABIN32
#define _LIBUNWIND_TARGET_MIPS_NEWABI 1
#if defined(__mips_hard_float)
#define _LIBUNWIND_CONTEXT_SIZE 67
#define _LIBUNWIND_CURSOR_SIZE 74
#else
#define _LIBUNWIND_CONTEXT_SIZE 35
#define _LIBUNWIND_CURSOR_SIZE 42
#endif
#elif defined(_ABI64) && _MIPS_SIM == _ABI64
#define _LIBUNWIND_TARGET_MIPS_NEWABI 1
#if defined(__mips_hard_float)
#define _LIBUNWIND_CONTEXT_SIZE 67
#define _LIBUNWIND_CURSOR_SIZE 79
#else
#define _LIBUNWIND_CONTEXT_SIZE 35
#define _LIBUNWIND_CURSOR_SIZE 47
#endif
#else
#error "Unsupported MIPS ABI and/or environment"
#endif
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_MIPS
#elif defined(__sparc__)
#define _LIBUNWIND_TARGET_SPARC 1
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_SPARC
#define _LIBUNWIND_CONTEXT_SIZE 16
#define _LIBUNWIND_CURSOR_SIZE 23
#elif defined(__riscv)
#define _LIBUNWIND_TARGET_RISCV 1
#if defined(__riscv_flen)
#define RISCV_FLEN __riscv_flen
#else
#define RISCV_FLEN 0
#endif
#define _LIBUNWIND_CONTEXT_SIZE (32 * (__riscv_xlen + RISCV_FLEN) / 64)
#if __riscv_xlen == 32
#define _LIBUNWIND_CURSOR_SIZE (_LIBUNWIND_CONTEXT_SIZE + 7)
#elif __riscv_xlen == 64
#define _LIBUNWIND_CURSOR_SIZE (_LIBUNWIND_CONTEXT_SIZE + 12)
#else
#error "Unsupported RISC-V ABI"
#endif
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_RISCV
#elif defined(__ve__)
#define _LIBUNWIND_TARGET_VE 1
#define _LIBUNWIND_CONTEXT_SIZE 67
#define _LIBUNWIND_CURSOR_SIZE 79
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_VE
#else
#error "Unsupported architecture."
#endif
#else // !_LIBUNWIND_IS_NATIVE_ONLY
#define _LIBUNWIND_TARGET_I386
#define _LIBUNWIND_TARGET_X86_64 1
#define _LIBUNWIND_TARGET_PPC 1
#define _LIBUNWIND_TARGET_PPC64 1
#define _LIBUNWIND_TARGET_AARCH64 1
#define _LIBUNWIND_TARGET_ARM 1
#define _LIBUNWIND_TARGET_OR1K 1
#define _LIBUNWIND_TARGET_MIPS_O32 1
#define _LIBUNWIND_TARGET_MIPS_NEWABI 1
#define _LIBUNWIND_TARGET_SPARC 1
#define _LIBUNWIND_TARGET_HEXAGON 1
#define _LIBUNWIND_TARGET_RISCV 1
#define _LIBUNWIND_TARGET_VE 1
#define _LIBUNWIND_CONTEXT_SIZE 167
#define _LIBUNWIND_CURSOR_SIZE 179
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER 287
#endif // _LIBUNWIND_IS_NATIVE_ONLY

#endif // ____LIBUNWIND_CONFIG_H__
Loading

0 comments on commit 1a05883

Please sign in to comment.