Unwind_AppleExtras.cpp revision 288149
1263363Semaste//===--------------------- Unwind_AppleExtras.cpp -------------------------===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is dual licensed under the MIT and the University of Illinois Open
6254721Semaste// Source Licenses. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//
9254721Semaste//===----------------------------------------------------------------------===//
10254721Semaste
11254721Semaste#include "config.h"
12254721Semaste#include "DwarfParser.hpp"
13263363Semaste#include "unwind_ext.h"
14263363Semaste
15263363Semaste
16263363Semaste// private keymgr stuff
17263363Semaste#define KEYMGR_GCC3_DW2_OBJ_LIST 302
18263363Semasteextern "C" {
19263363Semaste extern void _keymgr_set_and_unlock_processwide_ptr(int key, void *ptr);
20263363Semaste extern void *_keymgr_get_and_lock_processwide_ptr(int key);
21263363Semaste}
22263363Semaste
23263363Semaste// undocumented libgcc "struct object"
24263363Semastestruct libgcc_object {
25263363Semaste  void          *start;
26263363Semaste  void          *unused1;
27263363Semaste  void          *unused2;
28263363Semaste  void          *fde;
29254721Semaste  unsigned long  encoding;
30254721Semaste  void          *fde_end;
31263363Semaste  libgcc_object *next;
32263363Semaste};
33263363Semaste
34263363Semaste// undocumented libgcc "struct km_object_info" referenced by
35263363Semaste// KEYMGR_GCC3_DW2_OBJ_LIST
36263363Semastestruct libgcc_object_info {
37263363Semaste  libgcc_object   *seen_objects;
38263363Semaste  libgcc_object   *unseen_objects;
39263363Semaste  unsigned         spare[2];
40263363Semaste};
41263363Semaste
42263363Semaste
43263363Semaste// static linker symbols to prevent wrong two level namespace for _Unwind symbols
44263363Semaste#if defined(__arm__)
45263363Semaste   #define NOT_HERE_BEFORE_5_0(sym)     \
46263363Semaste       extern const char sym##_tmp30 __asm("$ld$hide$os3.0$_" #sym ); \
47263363Semaste       __attribute__((visibility("default"))) const char sym##_tmp30 = 0; \
48263363Semaste       extern const char sym##_tmp31 __asm("$ld$hide$os3.1$_" #sym ); \
49263363Semaste          __attribute__((visibility("default"))) const char sym##_tmp31 = 0; \
50263363Semaste       extern const char sym##_tmp32 __asm("$ld$hide$os3.2$_" #sym );\
51263363Semaste           __attribute__((visibility("default"))) const char sym##_tmp32 = 0; \
52263363Semaste       extern const char sym##_tmp40 __asm("$ld$hide$os4.0$_" #sym ); \
53263363Semaste          __attribute__((visibility("default"))) const char sym##_tmp40 = 0; \
54263363Semaste       extern const char sym##_tmp41 __asm("$ld$hide$os4.1$_" #sym ); \
55263363Semaste          __attribute__((visibility("default"))) const char sym##_tmp41 = 0; \
56263363Semaste       extern const char sym##_tmp42 __asm("$ld$hide$os4.2$_" #sym ); \
57263363Semaste          __attribute__((visibility("default"))) const char sym##_tmp42 = 0; \
58263363Semaste       extern const char sym##_tmp43 __asm("$ld$hide$os4.3$_" #sym ); \
59263363Semaste          __attribute__((visibility("default"))) const char sym##_tmp43 = 0;
60263363Semaste#elif defined(__arm64__)
61263363Semaste  #define NOT_HERE_BEFORE_10_6(sym)
62263363Semaste  #define NEVER_HERE(sym)
63263363Semaste#else
64263363Semaste  #define NOT_HERE_BEFORE_10_6(sym) \
65263363Semaste    extern const char sym##_tmp4 __asm("$ld$hide$os10.4$_" #sym ); \
66263363Semaste          __attribute__((visibility("default"))) const char sym##_tmp4 = 0; \
67254721Semaste    extern const char sym##_tmp5 __asm("$ld$hide$os10.5$_" #sym ); \
68254721Semaste          __attribute__((visibility("default"))) const char sym##_tmp5 = 0;
69263363Semaste  #define NEVER_HERE(sym) \
70263363Semaste    extern const char sym##_tmp4 __asm("$ld$hide$os10.4$_" #sym ); \
71254721Semaste          __attribute__((visibility("default"))) const char sym##_tmp4 = 0; \
72254721Semaste    extern const char sym##_tmp5 __asm("$ld$hide$os10.5$_" #sym ); \
73263363Semaste          __attribute__((visibility("default"))) const char sym##_tmp5 = 0; \
74263363Semaste    extern const char sym##_tmp6 __asm("$ld$hide$os10.6$_" #sym ); \
75263363Semaste          __attribute__((visibility("default"))) const char sym##_tmp6 = 0;
76263363Semaste#endif
77263363Semaste
78263363Semaste
79263363Semaste#if _LIBUNWIND_BUILD_ZERO_COST_APIS
80263363Semaste
81263363Semaste//
82263363Semaste// symbols in libSystem.dylib in 10.6 and later, but are in libgcc_s.dylib in
83263363Semaste// earlier versions
84263363Semaste//
85263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_DeleteException)
86263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_Find_FDE)
87263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_ForcedUnwind)
88263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_GetGR)
89263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_GetIP)
90263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_GetLanguageSpecificData)
91263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_GetRegionStart)
92263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_RaiseException)
93263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_Resume)
94263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_SetGR)
95263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_SetIP)
96263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_Backtrace)
97263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_FindEnclosingFunction)
98263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_GetCFA)
99263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_GetDataRelBase)
100263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_GetTextRelBase)
101263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_Resume_or_Rethrow)
102263363SemasteNOT_HERE_BEFORE_10_6(_Unwind_GetIPInfo)
103263363SemasteNOT_HERE_BEFORE_10_6(__register_frame)
104263363SemasteNOT_HERE_BEFORE_10_6(__deregister_frame)
105263363Semaste
106263363Semaste//
107263363Semaste// symbols in libSystem.dylib for compatibility, but we don't want any new code
108263363Semaste// using them
109263363Semaste//
110263363SemasteNEVER_HERE(__register_frame_info_bases)
111263363SemasteNEVER_HERE(__register_frame_info)
112263363SemasteNEVER_HERE(__register_frame_info_table_bases)
113263363SemasteNEVER_HERE(__register_frame_info_table)
114263363SemasteNEVER_HERE(__register_frame_table)
115263363SemasteNEVER_HERE(__deregister_frame_info)
116263363SemasteNEVER_HERE(__deregister_frame_info_bases)
117263363Semaste
118263363Semaste#endif // _LIBUNWIND_BUILD_ZERO_COST_APIS
119263363Semaste
120263363Semaste
121263363Semaste
122263363Semaste
123254721Semaste#if _LIBUNWIND_BUILD_SJLJ_APIS
124254721Semaste//
125263363Semaste// symbols in libSystem.dylib in iOS 5.0 and later, but are in libgcc_s.dylib in
126263363Semaste// earlier versions
127263363Semaste//
128254721SemasteNOT_HERE_BEFORE_5_0(_Unwind_GetLanguageSpecificData)
129254721SemasteNOT_HERE_BEFORE_5_0(_Unwind_GetRegionStart)
130263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_GetIP)
131263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_SetGR)
132263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_SetIP)
133263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_DeleteException)
134263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_SjLj_Register)
135263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_GetGR)
136263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_GetIPInfo)
137263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_GetCFA)
138263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_SjLj_Resume)
139263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_SjLj_RaiseException)
140263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_SjLj_Resume_or_Rethrow)
141263363SemasteNOT_HERE_BEFORE_5_0(_Unwind_SjLj_Unregister)
142263363Semaste
143263363Semaste#endif // _LIBUNWIND_BUILD_SJLJ_APIS
144263363Semaste
145263363Semaste
146263363Semastenamespace libunwind {
147263363Semaste
148263363Semaste_LIBUNWIND_HIDDEN
149263363Semastebool checkKeyMgrRegisteredFDEs(uintptr_t pc, void *&fde) {
150263363Semaste#if __MAC_OS_X_VERSION_MIN_REQUIRED
151263363Semaste  // lastly check for old style keymgr registration of dynamically generated
152263363Semaste  // FDEs acquire exclusive access to libgcc_object_info
153263363Semaste  libgcc_object_info *head = (libgcc_object_info *)
154263363Semaste                _keymgr_get_and_lock_processwide_ptr(KEYMGR_GCC3_DW2_OBJ_LIST);
155263363Semaste  if (head != NULL) {
156263363Semaste    // look at each FDE in keymgr
157263363Semaste    for (libgcc_object *ob = head->unseen_objects; ob != NULL; ob = ob->next) {
158263363Semaste      CFI_Parser<LocalAddressSpace>::FDE_Info fdeInfo;
159263363Semaste      CFI_Parser<LocalAddressSpace>::CIE_Info cieInfo;
160263363Semaste      const char *msg = CFI_Parser<LocalAddressSpace>::decodeFDE(
161263363Semaste                                      LocalAddressSpace::sThisAddressSpace,
162263363Semaste                                      (uintptr_t)ob->fde, &fdeInfo, &cieInfo);
163263363Semaste      if (msg == NULL) {
164263363Semaste        // Check if this FDE is for a function that includes the pc
165263363Semaste        if ((fdeInfo.pcStart <= pc) && (pc < fdeInfo.pcEnd)) {
166263363Semaste          fde = (void*)fdeInfo.pcStart;
167263363Semaste          _keymgr_set_and_unlock_processwide_ptr(KEYMGR_GCC3_DW2_OBJ_LIST,
168263363Semaste                                                 head);
169263363Semaste          return true;
170263363Semaste        }
171263363Semaste      }
172263363Semaste    }
173263363Semaste  }
174263363Semaste  // release libgcc_object_info
175263363Semaste  _keymgr_set_and_unlock_processwide_ptr(KEYMGR_GCC3_DW2_OBJ_LIST, head);
176263363Semaste#else
177263363Semaste  (void)pc;
178263363Semaste  (void)fde;
179263363Semaste#endif
180263363Semaste  return false;
181263363Semaste}
182263363Semaste
183263363Semaste}
184263363Semaste
185263363Semaste
186263363Semaste#if !defined(FOR_DYLD) && _LIBUNWIND_BUILD_SJLJ_APIS
187254721Semaste
188254721Semaste#include <System/pthread_machdep.h>
189263363Semaste
190263363Semaste// Accessors to get get/set linked list of frames for sjlj based execeptions.
191263363Semaste_LIBUNWIND_HIDDEN
192263363Semastestruct _Unwind_FunctionContext *__Unwind_SjLj_GetTopOfFunctionStack() {
193263363Semaste  return (struct _Unwind_FunctionContext *)
194263363Semaste    _pthread_getspecific_direct(__PTK_LIBC_DYLD_Unwind_SjLj_Key);
195263363Semaste}
196263363Semaste
197263363Semaste_LIBUNWIND_HIDDEN
198263363Semastevoid __Unwind_SjLj_SetTopOfFunctionStack(struct _Unwind_FunctionContext *fc) {
199263363Semaste  _pthread_setspecific_direct(__PTK_LIBC_DYLD_Unwind_SjLj_Key, fc);
200263363Semaste}
201263363Semaste#endif
202263363Semaste
203263363Semaste
204263363Semaste
205263363Semaste
206263363Semaste