1 //===---------------------------- libunwind.h -----------------------------===//
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
8 // Compatible with libunwind API documented at:
9 // http://www.nongnu.org/libunwind/man/libunwind(3).html
11 //===----------------------------------------------------------------------===//
16 #include <__libunwind_config.h>
23 #if __has_include(<Availability.h>)
24 #include <Availability.h>
26 #elif __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
27 #include <Availability.h>
31 #define LIBUNWIND_AVAIL __attribute__((unavailable))
32 #elif defined(__OSX_AVAILABLE_STARTING)
33 #define LIBUNWIND_AVAIL __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_5_0)
35 #include <AvailabilityMacros.h>
36 #ifdef AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
37 #define LIBUNWIND_AVAIL AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
39 #define LIBUNWIND_AVAIL __attribute__((unavailable))
43 #define LIBUNWIND_AVAIL
46 #if defined(_WIN32) && defined(__SEH__)
47 #define LIBUNWIND_CURSOR_ALIGNMENT_ATTR __attribute__((__aligned__(16)))
49 #define LIBUNWIND_CURSOR_ALIGNMENT_ATTR
54 UNW_ESUCCESS
= 0, /* no error */
55 UNW_EUNSPEC
= -6540, /* unspecified (general) error */
56 UNW_ENOMEM
= -6541, /* out of memory */
57 UNW_EBADREG
= -6542, /* bad register number */
58 UNW_EREADONLYREG
= -6543, /* attempt to write read-only register */
59 UNW_ESTOPUNWIND
= -6544, /* stop unwinding */
60 UNW_EINVALIDIP
= -6545, /* invalid IP */
61 UNW_EBADFRAME
= -6546, /* bad frame */
62 UNW_EINVAL
= -6547, /* unsupported operation or bad value */
63 UNW_EBADVERSION
= -6548, /* unwind info has unsupported version */
64 UNW_ENOINFO
= -6549 /* no unwind info found */
65 #if defined(_LIBUNWIND_TARGET_AARCH64) && !defined(_LIBUNWIND_IS_NATIVE_ONLY)
66 , UNW_ECROSSRASIGNING
= -6550 /* cross unwind with return address signing */
70 struct unw_context_t
{
71 uint64_t data
[_LIBUNWIND_CONTEXT_SIZE
];
73 typedef struct unw_context_t unw_context_t
;
76 uint64_t data
[_LIBUNWIND_CURSOR_SIZE
];
77 } LIBUNWIND_CURSOR_ALIGNMENT_ATTR
;
78 typedef struct unw_cursor_t unw_cursor_t
;
80 typedef struct unw_addr_space
*unw_addr_space_t
;
82 typedef int unw_regnum_t
;
83 typedef uintptr_t unw_word_t
;
84 #if defined(__arm__) && !defined(__ARM_DWARF_EH__)
85 typedef uint64_t unw_fpreg_t
;
87 typedef double unw_fpreg_t
;
90 struct unw_proc_info_t
{
91 unw_word_t start_ip
; /* start address of function */
92 unw_word_t end_ip
; /* address after end of function */
93 unw_word_t lsda
; /* address of language specific data area, */
94 /* or zero if not used */
95 unw_word_t handler
; /* personality routine, or zero if not used */
96 unw_word_t gp
; /* not used */
97 unw_word_t flags
; /* not used */
98 uint32_t format
; /* compact unwind encoding, or zero if none */
99 uint32_t unwind_info_size
; /* size of DWARF unwind info, or zero if none */
100 unw_word_t unwind_info
; /* address of DWARF unwind info, or zero */
101 unw_word_t extra
; /* mach_header of mach-o image containing func */
103 typedef struct unw_proc_info_t unw_proc_info_t
;
109 extern int unw_getcontext(unw_context_t
*) LIBUNWIND_AVAIL
;
110 extern int unw_init_local(unw_cursor_t
*, unw_context_t
*) LIBUNWIND_AVAIL
;
111 extern int unw_step(unw_cursor_t
*) LIBUNWIND_AVAIL
;
112 extern int unw_get_reg(unw_cursor_t
*, unw_regnum_t
, unw_word_t
*) LIBUNWIND_AVAIL
;
113 extern int unw_get_fpreg(unw_cursor_t
*, unw_regnum_t
, unw_fpreg_t
*) LIBUNWIND_AVAIL
;
114 extern int unw_set_reg(unw_cursor_t
*, unw_regnum_t
, unw_word_t
) LIBUNWIND_AVAIL
;
115 extern int unw_set_fpreg(unw_cursor_t
*, unw_regnum_t
, unw_fpreg_t
) LIBUNWIND_AVAIL
;
116 extern int unw_resume(unw_cursor_t
*) LIBUNWIND_AVAIL
;
119 /* Save VFP registers in FSTMX format (instead of FSTMD). */
120 extern void unw_save_vfp_as_X(unw_cursor_t
*) LIBUNWIND_AVAIL
;
124 extern const char *unw_regname(unw_cursor_t
*, unw_regnum_t
) LIBUNWIND_AVAIL
;
125 extern int unw_get_proc_info(unw_cursor_t
*, unw_proc_info_t
*) LIBUNWIND_AVAIL
;
126 extern int unw_is_fpreg(unw_cursor_t
*, unw_regnum_t
) LIBUNWIND_AVAIL
;
127 extern int unw_is_signal_frame(unw_cursor_t
*) LIBUNWIND_AVAIL
;
128 extern int unw_get_proc_name(unw_cursor_t
*, char *, size_t, unw_word_t
*) LIBUNWIND_AVAIL
;
129 //extern int unw_get_save_loc(unw_cursor_t*, int, unw_save_loc_t*);
131 extern unw_addr_space_t unw_local_addr_space
;
137 // architecture independent register numbers
139 UNW_REG_IP
= -1, // instruction pointer
140 UNW_REG_SP
= -2, // stack pointer
143 // 32-bit x86 registers
155 // 64-bit x86_64 registers
174 UNW_X86_64_XMM0
= 17,
175 UNW_X86_64_XMM1
= 18,
176 UNW_X86_64_XMM2
= 19,
177 UNW_X86_64_XMM3
= 20,
178 UNW_X86_64_XMM4
= 21,
179 UNW_X86_64_XMM5
= 22,
180 UNW_X86_64_XMM6
= 23,
181 UNW_X86_64_XMM7
= 24,
182 UNW_X86_64_XMM8
= 25,
183 UNW_X86_64_XMM9
= 26,
184 UNW_X86_64_XMM10
= 27,
185 UNW_X86_64_XMM11
= 28,
186 UNW_X86_64_XMM12
= 29,
187 UNW_X86_64_XMM13
= 30,
188 UNW_X86_64_XMM14
= 31,
189 UNW_X86_64_XMM15
= 32,
193 // 32-bit ppc register numbers
304 UNW_PPC_VRSAVE
= 109,
306 UNW_PPC_SPE_ACC
= 111,
307 UNW_PPC_SPEFSCR
= 112
310 // 64-bit ppc register numbers
421 // 109, 111-113: OpenPOWER ELF V2 ABI: reserved
422 // Borrowing VRSAVE number from PPC32.
423 UNW_PPC64_VRSAVE
= 109,
424 UNW_PPC64_VSCR
= 110,
425 UNW_PPC64_TFHAR
= 114,
426 UNW_PPC64_TFIAR
= 115,
427 UNW_PPC64_TEXASR
= 116,
428 UNW_PPC64_VS0
= UNW_PPC64_F0
,
429 UNW_PPC64_VS1
= UNW_PPC64_F1
,
430 UNW_PPC64_VS2
= UNW_PPC64_F2
,
431 UNW_PPC64_VS3
= UNW_PPC64_F3
,
432 UNW_PPC64_VS4
= UNW_PPC64_F4
,
433 UNW_PPC64_VS5
= UNW_PPC64_F5
,
434 UNW_PPC64_VS6
= UNW_PPC64_F6
,
435 UNW_PPC64_VS7
= UNW_PPC64_F7
,
436 UNW_PPC64_VS8
= UNW_PPC64_F8
,
437 UNW_PPC64_VS9
= UNW_PPC64_F9
,
438 UNW_PPC64_VS10
= UNW_PPC64_F10
,
439 UNW_PPC64_VS11
= UNW_PPC64_F11
,
440 UNW_PPC64_VS12
= UNW_PPC64_F12
,
441 UNW_PPC64_VS13
= UNW_PPC64_F13
,
442 UNW_PPC64_VS14
= UNW_PPC64_F14
,
443 UNW_PPC64_VS15
= UNW_PPC64_F15
,
444 UNW_PPC64_VS16
= UNW_PPC64_F16
,
445 UNW_PPC64_VS17
= UNW_PPC64_F17
,
446 UNW_PPC64_VS18
= UNW_PPC64_F18
,
447 UNW_PPC64_VS19
= UNW_PPC64_F19
,
448 UNW_PPC64_VS20
= UNW_PPC64_F20
,
449 UNW_PPC64_VS21
= UNW_PPC64_F21
,
450 UNW_PPC64_VS22
= UNW_PPC64_F22
,
451 UNW_PPC64_VS23
= UNW_PPC64_F23
,
452 UNW_PPC64_VS24
= UNW_PPC64_F24
,
453 UNW_PPC64_VS25
= UNW_PPC64_F25
,
454 UNW_PPC64_VS26
= UNW_PPC64_F26
,
455 UNW_PPC64_VS27
= UNW_PPC64_F27
,
456 UNW_PPC64_VS28
= UNW_PPC64_F28
,
457 UNW_PPC64_VS29
= UNW_PPC64_F29
,
458 UNW_PPC64_VS30
= UNW_PPC64_F30
,
459 UNW_PPC64_VS31
= UNW_PPC64_F31
,
460 UNW_PPC64_VS32
= UNW_PPC64_V0
,
461 UNW_PPC64_VS33
= UNW_PPC64_V1
,
462 UNW_PPC64_VS34
= UNW_PPC64_V2
,
463 UNW_PPC64_VS35
= UNW_PPC64_V3
,
464 UNW_PPC64_VS36
= UNW_PPC64_V4
,
465 UNW_PPC64_VS37
= UNW_PPC64_V5
,
466 UNW_PPC64_VS38
= UNW_PPC64_V6
,
467 UNW_PPC64_VS39
= UNW_PPC64_V7
,
468 UNW_PPC64_VS40
= UNW_PPC64_V8
,
469 UNW_PPC64_VS41
= UNW_PPC64_V9
,
470 UNW_PPC64_VS42
= UNW_PPC64_V10
,
471 UNW_PPC64_VS43
= UNW_PPC64_V11
,
472 UNW_PPC64_VS44
= UNW_PPC64_V12
,
473 UNW_PPC64_VS45
= UNW_PPC64_V13
,
474 UNW_PPC64_VS46
= UNW_PPC64_V14
,
475 UNW_PPC64_VS47
= UNW_PPC64_V15
,
476 UNW_PPC64_VS48
= UNW_PPC64_V16
,
477 UNW_PPC64_VS49
= UNW_PPC64_V17
,
478 UNW_PPC64_VS50
= UNW_PPC64_V18
,
479 UNW_PPC64_VS51
= UNW_PPC64_V19
,
480 UNW_PPC64_VS52
= UNW_PPC64_V20
,
481 UNW_PPC64_VS53
= UNW_PPC64_V21
,
482 UNW_PPC64_VS54
= UNW_PPC64_V22
,
483 UNW_PPC64_VS55
= UNW_PPC64_V23
,
484 UNW_PPC64_VS56
= UNW_PPC64_V24
,
485 UNW_PPC64_VS57
= UNW_PPC64_V25
,
486 UNW_PPC64_VS58
= UNW_PPC64_V26
,
487 UNW_PPC64_VS59
= UNW_PPC64_V27
,
488 UNW_PPC64_VS60
= UNW_PPC64_V28
,
489 UNW_PPC64_VS61
= UNW_PPC64_V29
,
490 UNW_PPC64_VS62
= UNW_PPC64_V30
,
491 UNW_PPC64_VS63
= UNW_PPC64_V31
494 // 64-bit ARM64 registers
532 UNW_ARM64_RA_SIGN_STATE
= 34,
568 // 32-bit ARM registers. Numbers match DWARF for ARM spec #3.1 Table 1.
569 // Naming scheme uses recommendations given in Note 4 for VFP-v2 and VFP-v3.
570 // In this scheme, even though the 64-bit floating point registers D0-D31
571 // overlap physically with the 32-bit floating pointer registers S0-S31,
572 // they are given a non-overlapping range of register numbers.
574 // Commented out ranges are not preserved during unwinding.
589 UNW_ARM_SP
= 13, // Logical alias for UNW_REG_SP
593 UNW_ARM_IP
= 15, // Logical alias for UNW_REG_IP
595 // 16-63 -- OBSOLETE. Used in VFP1 to represent both S0-S31 and D0-D31.
628 // 96-103 -- OBSOLETE. F0-F7. Used by the FPA system. Superseded by VFP.
629 // 104-111 -- wCGR0-wCGR7, ACC0-ACC7 (Intel wireless MMX)
646 // 128-133 -- SPSR, SPSR_{FIQ|IRQ|ABT|UND|SVC}
647 // 134-143 -- Reserved
648 // 144-150 -- R8_USR-R14_USR
649 // 151-157 -- R8_FIQ-R14_FIQ
650 // 158-159 -- R13_IRQ-R14_IRQ
651 // 160-161 -- R13_ABT-R14_ABT
652 // 162-163 -- R13_UND-R14_UND
653 // 164-165 -- R13_SVC-R14_SVC
654 // 166-191 -- Reserved
659 // 196-199 -- wC4-wC7 (Intel wireless MMX control)
660 // 200-255 -- Reserved
693 // 288-319 -- Reserved for VFP/Neon
694 // 320-8191 -- Reserved
695 // 8192-16383 -- Unspecified vendor co-processor register.
698 // OpenRISC1000 register numbers
841 // Hexagon register numbers
879 // RISC-V registers. These match the DWARF register numbers defined by section
880 // 4 of the RISC-V ELF psABI specification, which can be found at:
882 // https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md