]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/libunwind/src/Unwind-EHABI.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / libunwind / src / Unwind-EHABI.h
1 //===------------------------- Unwind-EHABI.hpp ---------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef __UNWIND_EHABI_H__
11 #define __UNWIND_EHABI_H__
12
13 #include <__libunwind_config.h>
14
15 #if defined(_LIBUNWIND_ARM_EHABI)
16
17 #include <stdint.h>
18 #include <unwind.h>
19
20 // Unable to unwind in the ARM index table (section 5 EHABI).
21 #define UNW_EXIDX_CANTUNWIND 0x1
22
23 static inline uint32_t signExtendPrel31(uint32_t data) {
24   return data | ((data & 0x40000000u) << 1);
25 }
26
27 static inline uint32_t readPrel31(const uint32_t *data) {
28   return (((uint32_t)(uintptr_t)data) + signExtendPrel31(*data));
29 }
30
31 #if defined(__cplusplus)
32 extern "C" {
33 #endif
34
35 extern _Unwind_Reason_Code __aeabi_unwind_cpp_pr0(
36     _Unwind_State state, _Unwind_Control_Block *ucbp, _Unwind_Context *context);
37
38 extern _Unwind_Reason_Code __aeabi_unwind_cpp_pr1(
39     _Unwind_State state, _Unwind_Control_Block *ucbp, _Unwind_Context *context);
40
41 extern _Unwind_Reason_Code __aeabi_unwind_cpp_pr2(
42     _Unwind_State state, _Unwind_Control_Block *ucbp, _Unwind_Context *context);
43
44 #if defined(__cplusplus)
45 } // extern "C"
46 #endif
47
48 #endif // defined(_LIBUNWIND_ARM_EHABI)
49
50 #endif  // __UNWIND_EHABI_H__