Home | History | Annotate | Download | only in src
      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__
     51