annotate libunwind/src/UnwindLevel1-gcc-ext.c @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--------------------- UnwindLevel1-gcc-ext.c -------------------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //
anatofuz
parents:
diff changeset
8 // Implements gcc extensions to the C++ ABI Exception Handling Level 1.
anatofuz
parents:
diff changeset
9 //
anatofuz
parents:
diff changeset
10 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 #include <inttypes.h>
anatofuz
parents:
diff changeset
13 #include <stdbool.h>
anatofuz
parents:
diff changeset
14 #include <stdint.h>
anatofuz
parents:
diff changeset
15 #include <stdio.h>
anatofuz
parents:
diff changeset
16 #include <stdlib.h>
anatofuz
parents:
diff changeset
17 #include <string.h>
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 #include "config.h"
anatofuz
parents:
diff changeset
20 #include "libunwind_ext.h"
anatofuz
parents:
diff changeset
21 #include "libunwind.h"
anatofuz
parents:
diff changeset
22 #include "Unwind-EHABI.h"
anatofuz
parents:
diff changeset
23 #include "unwind.h"
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 #if defined(_LIBUNWIND_BUILD_ZERO_COST_APIS)
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 #if defined(_LIBUNWIND_SUPPORT_SEH_UNWIND)
anatofuz
parents:
diff changeset
28 #define private_1 private_[0]
anatofuz
parents:
diff changeset
29 #endif
anatofuz
parents:
diff changeset
30
anatofuz
parents:
diff changeset
31 /// Called by __cxa_rethrow().
anatofuz
parents:
diff changeset
32 _LIBUNWIND_EXPORT _Unwind_Reason_Code
anatofuz
parents:
diff changeset
33 _Unwind_Resume_or_Rethrow(_Unwind_Exception *exception_object) {
anatofuz
parents:
diff changeset
34 #if defined(_LIBUNWIND_ARM_EHABI)
anatofuz
parents:
diff changeset
35 _LIBUNWIND_TRACE_API("_Unwind_Resume_or_Rethrow(ex_obj=%p), private_1=%ld",
anatofuz
parents:
diff changeset
36 (void *)exception_object,
anatofuz
parents:
diff changeset
37 (long)exception_object->unwinder_cache.reserved1);
anatofuz
parents:
diff changeset
38 #else
anatofuz
parents:
diff changeset
39 _LIBUNWIND_TRACE_API("_Unwind_Resume_or_Rethrow(ex_obj=%p), private_1=%" PRIdPTR,
anatofuz
parents:
diff changeset
40 (void *)exception_object,
anatofuz
parents:
diff changeset
41 (intptr_t)exception_object->private_1);
anatofuz
parents:
diff changeset
42 #endif
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 #if defined(_LIBUNWIND_ARM_EHABI)
anatofuz
parents:
diff changeset
45 // _Unwind_RaiseException on EHABI will always set the reserved1 field to 0,
anatofuz
parents:
diff changeset
46 // which is in the same position as private_1 below.
anatofuz
parents:
diff changeset
47 return _Unwind_RaiseException(exception_object);
anatofuz
parents:
diff changeset
48 #else
anatofuz
parents:
diff changeset
49 // If this is non-forced and a stopping place was found, then this is a
anatofuz
parents:
diff changeset
50 // re-throw.
anatofuz
parents:
diff changeset
51 // Call _Unwind_RaiseException() as if this was a new exception
anatofuz
parents:
diff changeset
52 if (exception_object->private_1 == 0) {
anatofuz
parents:
diff changeset
53 return _Unwind_RaiseException(exception_object);
anatofuz
parents:
diff changeset
54 // Will return if there is no catch clause, so that __cxa_rethrow can call
anatofuz
parents:
diff changeset
55 // std::terminate().
anatofuz
parents:
diff changeset
56 }
anatofuz
parents:
diff changeset
57
anatofuz
parents:
diff changeset
58 // Call through to _Unwind_Resume() which distiguishes between forced and
anatofuz
parents:
diff changeset
59 // regular exceptions.
anatofuz
parents:
diff changeset
60 _Unwind_Resume(exception_object);
anatofuz
parents:
diff changeset
61 _LIBUNWIND_ABORT("_Unwind_Resume_or_Rethrow() called _Unwind_RaiseException()"
anatofuz
parents:
diff changeset
62 " which unexpectedly returned");
anatofuz
parents:
diff changeset
63 #endif
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 /// Called by personality handler during phase 2 to get base address for data
anatofuz
parents:
diff changeset
68 /// relative encodings.
anatofuz
parents:
diff changeset
69 _LIBUNWIND_EXPORT uintptr_t
anatofuz
parents:
diff changeset
70 _Unwind_GetDataRelBase(struct _Unwind_Context *context) {
anatofuz
parents:
diff changeset
71 (void)context;
anatofuz
parents:
diff changeset
72 _LIBUNWIND_TRACE_API("_Unwind_GetDataRelBase(context=%p)", (void *)context);
anatofuz
parents:
diff changeset
73 _LIBUNWIND_ABORT("_Unwind_GetDataRelBase() not implemented");
anatofuz
parents:
diff changeset
74 }
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 /// Called by personality handler during phase 2 to get base address for text
anatofuz
parents:
diff changeset
78 /// relative encodings.
anatofuz
parents:
diff changeset
79 _LIBUNWIND_EXPORT uintptr_t
anatofuz
parents:
diff changeset
80 _Unwind_GetTextRelBase(struct _Unwind_Context *context) {
anatofuz
parents:
diff changeset
81 (void)context;
anatofuz
parents:
diff changeset
82 _LIBUNWIND_TRACE_API("_Unwind_GetTextRelBase(context=%p)", (void *)context);
anatofuz
parents:
diff changeset
83 _LIBUNWIND_ABORT("_Unwind_GetTextRelBase() not implemented");
anatofuz
parents:
diff changeset
84 }
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87 /// Scans unwind information to find the function that contains the
anatofuz
parents:
diff changeset
88 /// specified code address "pc".
anatofuz
parents:
diff changeset
89 _LIBUNWIND_EXPORT void *_Unwind_FindEnclosingFunction(void *pc) {
anatofuz
parents:
diff changeset
90 _LIBUNWIND_TRACE_API("_Unwind_FindEnclosingFunction(pc=%p)", pc);
anatofuz
parents:
diff changeset
91 // This is slow, but works.
anatofuz
parents:
diff changeset
92 // We create an unwind cursor then alter the IP to be pc
anatofuz
parents:
diff changeset
93 unw_cursor_t cursor;
anatofuz
parents:
diff changeset
94 unw_context_t uc;
anatofuz
parents:
diff changeset
95 unw_proc_info_t info;
anatofuz
parents:
diff changeset
96 __unw_getcontext(&uc);
anatofuz
parents:
diff changeset
97 __unw_init_local(&cursor, &uc);
anatofuz
parents:
diff changeset
98 __unw_set_reg(&cursor, UNW_REG_IP, (unw_word_t)(intptr_t)pc);
anatofuz
parents:
diff changeset
99 if (__unw_get_proc_info(&cursor, &info) == UNW_ESUCCESS)
anatofuz
parents:
diff changeset
100 return (void *)(intptr_t) info.start_ip;
anatofuz
parents:
diff changeset
101 else
anatofuz
parents:
diff changeset
102 return NULL;
anatofuz
parents:
diff changeset
103 }
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 /// Walk every frame and call trace function at each one. If trace function
anatofuz
parents:
diff changeset
106 /// returns anything other than _URC_NO_REASON, then walk is terminated.
anatofuz
parents:
diff changeset
107 _LIBUNWIND_EXPORT _Unwind_Reason_Code
anatofuz
parents:
diff changeset
108 _Unwind_Backtrace(_Unwind_Trace_Fn callback, void *ref) {
anatofuz
parents:
diff changeset
109 unw_cursor_t cursor;
anatofuz
parents:
diff changeset
110 unw_context_t uc;
anatofuz
parents:
diff changeset
111 __unw_getcontext(&uc);
anatofuz
parents:
diff changeset
112 __unw_init_local(&cursor, &uc);
anatofuz
parents:
diff changeset
113
anatofuz
parents:
diff changeset
114 _LIBUNWIND_TRACE_API("_Unwind_Backtrace(callback=%p)",
anatofuz
parents:
diff changeset
115 (void *)(uintptr_t)callback);
anatofuz
parents:
diff changeset
116
anatofuz
parents:
diff changeset
117 #if defined(_LIBUNWIND_ARM_EHABI)
anatofuz
parents:
diff changeset
118 // Create a mock exception object for force unwinding.
anatofuz
parents:
diff changeset
119 _Unwind_Exception ex;
anatofuz
parents:
diff changeset
120 memset(&ex, '\0', sizeof(ex));
anatofuz
parents:
diff changeset
121 ex.exception_class = 0x434C4E47554E5700; // CLNGUNW\0
anatofuz
parents:
diff changeset
122 #endif
anatofuz
parents:
diff changeset
123
anatofuz
parents:
diff changeset
124 // walk each frame
anatofuz
parents:
diff changeset
125 while (true) {
anatofuz
parents:
diff changeset
126 _Unwind_Reason_Code result;
anatofuz
parents:
diff changeset
127
anatofuz
parents:
diff changeset
128 #if !defined(_LIBUNWIND_ARM_EHABI)
anatofuz
parents:
diff changeset
129 // ask libunwind to get next frame (skip over first frame which is
anatofuz
parents:
diff changeset
130 // _Unwind_Backtrace())
anatofuz
parents:
diff changeset
131 if (__unw_step(&cursor) <= 0) {
anatofuz
parents:
diff changeset
132 _LIBUNWIND_TRACE_UNWINDING(" _backtrace: ended because cursor reached "
anatofuz
parents:
diff changeset
133 "bottom of stack, returning %d",
anatofuz
parents:
diff changeset
134 _URC_END_OF_STACK);
anatofuz
parents:
diff changeset
135 return _URC_END_OF_STACK;
anatofuz
parents:
diff changeset
136 }
anatofuz
parents:
diff changeset
137 #else
anatofuz
parents:
diff changeset
138 // Get the information for this frame.
anatofuz
parents:
diff changeset
139 unw_proc_info_t frameInfo;
anatofuz
parents:
diff changeset
140 if (__unw_get_proc_info(&cursor, &frameInfo) != UNW_ESUCCESS) {
anatofuz
parents:
diff changeset
141 return _URC_END_OF_STACK;
anatofuz
parents:
diff changeset
142 }
anatofuz
parents:
diff changeset
143
anatofuz
parents:
diff changeset
144 // Update the pr_cache in the mock exception object.
anatofuz
parents:
diff changeset
145 const uint32_t* unwindInfo = (uint32_t *) frameInfo.unwind_info;
anatofuz
parents:
diff changeset
146 ex.pr_cache.fnstart = frameInfo.start_ip;
anatofuz
parents:
diff changeset
147 ex.pr_cache.ehtp = (_Unwind_EHT_Header *) unwindInfo;
anatofuz
parents:
diff changeset
148 ex.pr_cache.additional= frameInfo.flags;
anatofuz
parents:
diff changeset
149
anatofuz
parents:
diff changeset
150 struct _Unwind_Context *context = (struct _Unwind_Context *)&cursor;
anatofuz
parents:
diff changeset
151 // Get and call the personality function to unwind the frame.
anatofuz
parents:
diff changeset
152 _Unwind_Personality_Fn handler = (_Unwind_Personality_Fn)frameInfo.handler;
anatofuz
parents:
diff changeset
153 if (handler == NULL) {
anatofuz
parents:
diff changeset
154 return _URC_END_OF_STACK;
anatofuz
parents:
diff changeset
155 }
anatofuz
parents:
diff changeset
156 if (handler(_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND, &ex, context) !=
anatofuz
parents:
diff changeset
157 _URC_CONTINUE_UNWIND) {
anatofuz
parents:
diff changeset
158 return _URC_END_OF_STACK;
anatofuz
parents:
diff changeset
159 }
anatofuz
parents:
diff changeset
160 #endif // defined(_LIBUNWIND_ARM_EHABI)
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 // debugging
anatofuz
parents:
diff changeset
163 if (_LIBUNWIND_TRACING_UNWINDING) {
anatofuz
parents:
diff changeset
164 char functionName[512];
anatofuz
parents:
diff changeset
165 unw_proc_info_t frame;
anatofuz
parents:
diff changeset
166 unw_word_t offset;
anatofuz
parents:
diff changeset
167 __unw_get_proc_name(&cursor, functionName, 512, &offset);
anatofuz
parents:
diff changeset
168 __unw_get_proc_info(&cursor, &frame);
anatofuz
parents:
diff changeset
169 _LIBUNWIND_TRACE_UNWINDING(
anatofuz
parents:
diff changeset
170 " _backtrace: start_ip=0x%" PRIxPTR ", func=%s, lsda=0x%" PRIxPTR ", context=%p",
anatofuz
parents:
diff changeset
171 frame.start_ip, functionName, frame.lsda,
anatofuz
parents:
diff changeset
172 (void *)&cursor);
anatofuz
parents:
diff changeset
173 }
anatofuz
parents:
diff changeset
174
anatofuz
parents:
diff changeset
175 // call trace function with this frame
anatofuz
parents:
diff changeset
176 result = (*callback)((struct _Unwind_Context *)(&cursor), ref);
anatofuz
parents:
diff changeset
177 if (result != _URC_NO_REASON) {
anatofuz
parents:
diff changeset
178 _LIBUNWIND_TRACE_UNWINDING(
anatofuz
parents:
diff changeset
179 " _backtrace: ended because callback returned %d", result);
anatofuz
parents:
diff changeset
180 return result;
anatofuz
parents:
diff changeset
181 }
anatofuz
parents:
diff changeset
182 }
anatofuz
parents:
diff changeset
183 }
anatofuz
parents:
diff changeset
184
anatofuz
parents:
diff changeset
185
anatofuz
parents:
diff changeset
186 /// Find DWARF unwind info for an address 'pc' in some function.
anatofuz
parents:
diff changeset
187 _LIBUNWIND_EXPORT const void *_Unwind_Find_FDE(const void *pc,
anatofuz
parents:
diff changeset
188 struct dwarf_eh_bases *bases) {
anatofuz
parents:
diff changeset
189 // This is slow, but works.
anatofuz
parents:
diff changeset
190 // We create an unwind cursor then alter the IP to be pc
anatofuz
parents:
diff changeset
191 unw_cursor_t cursor;
anatofuz
parents:
diff changeset
192 unw_context_t uc;
anatofuz
parents:
diff changeset
193 unw_proc_info_t info;
anatofuz
parents:
diff changeset
194 __unw_getcontext(&uc);
anatofuz
parents:
diff changeset
195 __unw_init_local(&cursor, &uc);
anatofuz
parents:
diff changeset
196 __unw_set_reg(&cursor, UNW_REG_IP, (unw_word_t)(intptr_t)pc);
anatofuz
parents:
diff changeset
197 __unw_get_proc_info(&cursor, &info);
anatofuz
parents:
diff changeset
198 bases->tbase = (uintptr_t)info.extra;
anatofuz
parents:
diff changeset
199 bases->dbase = 0; // dbase not used on Mac OS X
anatofuz
parents:
diff changeset
200 bases->func = (uintptr_t)info.start_ip;
anatofuz
parents:
diff changeset
201 _LIBUNWIND_TRACE_API("_Unwind_Find_FDE(pc=%p) => %p", pc,
anatofuz
parents:
diff changeset
202 (void *)(intptr_t) info.unwind_info);
anatofuz
parents:
diff changeset
203 return (void *)(intptr_t) info.unwind_info;
anatofuz
parents:
diff changeset
204 }
anatofuz
parents:
diff changeset
205
anatofuz
parents:
diff changeset
206 /// Returns the CFA (call frame area, or stack pointer at start of function)
anatofuz
parents:
diff changeset
207 /// for the current context.
anatofuz
parents:
diff changeset
208 _LIBUNWIND_EXPORT uintptr_t _Unwind_GetCFA(struct _Unwind_Context *context) {
anatofuz
parents:
diff changeset
209 unw_cursor_t *cursor = (unw_cursor_t *)context;
anatofuz
parents:
diff changeset
210 unw_word_t result;
anatofuz
parents:
diff changeset
211 __unw_get_reg(cursor, UNW_REG_SP, &result);
anatofuz
parents:
diff changeset
212 _LIBUNWIND_TRACE_API("_Unwind_GetCFA(context=%p) => 0x%" PRIxPTR,
anatofuz
parents:
diff changeset
213 (void *)context, result);
anatofuz
parents:
diff changeset
214 return (uintptr_t)result;
anatofuz
parents:
diff changeset
215 }
anatofuz
parents:
diff changeset
216
anatofuz
parents:
diff changeset
217
anatofuz
parents:
diff changeset
218 /// Called by personality handler during phase 2 to get instruction pointer.
anatofuz
parents:
diff changeset
219 /// ipBefore is a boolean that says if IP is already adjusted to be the call
anatofuz
parents:
diff changeset
220 /// site address. Normally IP is the return address.
anatofuz
parents:
diff changeset
221 _LIBUNWIND_EXPORT uintptr_t _Unwind_GetIPInfo(struct _Unwind_Context *context,
anatofuz
parents:
diff changeset
222 int *ipBefore) {
anatofuz
parents:
diff changeset
223 _LIBUNWIND_TRACE_API("_Unwind_GetIPInfo(context=%p)", (void *)context);
anatofuz
parents:
diff changeset
224 int isSignalFrame = __unw_is_signal_frame((unw_cursor_t *)context);
anatofuz
parents:
diff changeset
225 // Negative means some kind of error (probably UNW_ENOINFO), but we have no
anatofuz
parents:
diff changeset
226 // good way to report that, and this maintains backward compatibility with the
anatofuz
parents:
diff changeset
227 // implementation that hard-coded zero in every case, even signal frames.
anatofuz
parents:
diff changeset
228 if (isSignalFrame <= 0)
anatofuz
parents:
diff changeset
229 *ipBefore = 0;
anatofuz
parents:
diff changeset
230 else
anatofuz
parents:
diff changeset
231 *ipBefore = 1;
anatofuz
parents:
diff changeset
232 return _Unwind_GetIP(context);
anatofuz
parents:
diff changeset
233 }
anatofuz
parents:
diff changeset
234
anatofuz
parents:
diff changeset
235 #if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
anatofuz
parents:
diff changeset
236
anatofuz
parents:
diff changeset
237 /// Called by programs with dynamic code generators that want
anatofuz
parents:
diff changeset
238 /// to register a dynamically generated FDE.
anatofuz
parents:
diff changeset
239 /// This function has existed on Mac OS X since 10.4, but
anatofuz
parents:
diff changeset
240 /// was broken until 10.6.
anatofuz
parents:
diff changeset
241 _LIBUNWIND_EXPORT void __register_frame(const void *fde) {
anatofuz
parents:
diff changeset
242 _LIBUNWIND_TRACE_API("__register_frame(%p)", fde);
anatofuz
parents:
diff changeset
243 __unw_add_dynamic_fde((unw_word_t)(uintptr_t)fde);
anatofuz
parents:
diff changeset
244 }
anatofuz
parents:
diff changeset
245
anatofuz
parents:
diff changeset
246
anatofuz
parents:
diff changeset
247 /// Called by programs with dynamic code generators that want
anatofuz
parents:
diff changeset
248 /// to unregister a dynamically generated FDE.
anatofuz
parents:
diff changeset
249 /// This function has existed on Mac OS X since 10.4, but
anatofuz
parents:
diff changeset
250 /// was broken until 10.6.
anatofuz
parents:
diff changeset
251 _LIBUNWIND_EXPORT void __deregister_frame(const void *fde) {
anatofuz
parents:
diff changeset
252 _LIBUNWIND_TRACE_API("__deregister_frame(%p)", fde);
anatofuz
parents:
diff changeset
253 __unw_remove_dynamic_fde((unw_word_t)(uintptr_t)fde);
anatofuz
parents:
diff changeset
254 }
anatofuz
parents:
diff changeset
255
anatofuz
parents:
diff changeset
256
anatofuz
parents:
diff changeset
257 // The following register/deregister functions are gcc extensions.
anatofuz
parents:
diff changeset
258 // They have existed on Mac OS X, but have never worked because Mac OS X
anatofuz
parents:
diff changeset
259 // before 10.6 used keymgr to track known FDEs, but these functions
anatofuz
parents:
diff changeset
260 // never got updated to use keymgr.
anatofuz
parents:
diff changeset
261 // For now, we implement these as do-nothing functions to keep any existing
anatofuz
parents:
diff changeset
262 // applications working. We also add the not in 10.6 symbol so that nwe
anatofuz
parents:
diff changeset
263 // application won't be able to use them.
anatofuz
parents:
diff changeset
264
anatofuz
parents:
diff changeset
265 #if defined(_LIBUNWIND_SUPPORT_FRAME_APIS)
anatofuz
parents:
diff changeset
266 _LIBUNWIND_EXPORT void __register_frame_info_bases(const void *fde, void *ob,
anatofuz
parents:
diff changeset
267 void *tb, void *db) {
anatofuz
parents:
diff changeset
268 (void)fde;
anatofuz
parents:
diff changeset
269 (void)ob;
anatofuz
parents:
diff changeset
270 (void)tb;
anatofuz
parents:
diff changeset
271 (void)db;
anatofuz
parents:
diff changeset
272 _LIBUNWIND_TRACE_API("__register_frame_info_bases(%p,%p, %p, %p)",
anatofuz
parents:
diff changeset
273 fde, ob, tb, db);
anatofuz
parents:
diff changeset
274 // do nothing, this function never worked in Mac OS X
anatofuz
parents:
diff changeset
275 }
anatofuz
parents:
diff changeset
276
anatofuz
parents:
diff changeset
277 _LIBUNWIND_EXPORT void __register_frame_info(const void *fde, void *ob) {
anatofuz
parents:
diff changeset
278 (void)fde;
anatofuz
parents:
diff changeset
279 (void)ob;
anatofuz
parents:
diff changeset
280 _LIBUNWIND_TRACE_API("__register_frame_info(%p, %p)", fde, ob);
anatofuz
parents:
diff changeset
281 // do nothing, this function never worked in Mac OS X
anatofuz
parents:
diff changeset
282 }
anatofuz
parents:
diff changeset
283
anatofuz
parents:
diff changeset
284 _LIBUNWIND_EXPORT void __register_frame_info_table_bases(const void *fde,
anatofuz
parents:
diff changeset
285 void *ob, void *tb,
anatofuz
parents:
diff changeset
286 void *db) {
anatofuz
parents:
diff changeset
287 (void)fde;
anatofuz
parents:
diff changeset
288 (void)ob;
anatofuz
parents:
diff changeset
289 (void)tb;
anatofuz
parents:
diff changeset
290 (void)db;
anatofuz
parents:
diff changeset
291 _LIBUNWIND_TRACE_API("__register_frame_info_table_bases"
anatofuz
parents:
diff changeset
292 "(%p,%p, %p, %p)", fde, ob, tb, db);
anatofuz
parents:
diff changeset
293 // do nothing, this function never worked in Mac OS X
anatofuz
parents:
diff changeset
294 }
anatofuz
parents:
diff changeset
295
anatofuz
parents:
diff changeset
296 _LIBUNWIND_EXPORT void __register_frame_info_table(const void *fde, void *ob) {
anatofuz
parents:
diff changeset
297 (void)fde;
anatofuz
parents:
diff changeset
298 (void)ob;
anatofuz
parents:
diff changeset
299 _LIBUNWIND_TRACE_API("__register_frame_info_table(%p, %p)", fde, ob);
anatofuz
parents:
diff changeset
300 // do nothing, this function never worked in Mac OS X
anatofuz
parents:
diff changeset
301 }
anatofuz
parents:
diff changeset
302
anatofuz
parents:
diff changeset
303 _LIBUNWIND_EXPORT void __register_frame_table(const void *fde) {
anatofuz
parents:
diff changeset
304 (void)fde;
anatofuz
parents:
diff changeset
305 _LIBUNWIND_TRACE_API("__register_frame_table(%p)", fde);
anatofuz
parents:
diff changeset
306 // do nothing, this function never worked in Mac OS X
anatofuz
parents:
diff changeset
307 }
anatofuz
parents:
diff changeset
308
anatofuz
parents:
diff changeset
309 _LIBUNWIND_EXPORT void *__deregister_frame_info(const void *fde) {
anatofuz
parents:
diff changeset
310 (void)fde;
anatofuz
parents:
diff changeset
311 _LIBUNWIND_TRACE_API("__deregister_frame_info(%p)", fde);
anatofuz
parents:
diff changeset
312 // do nothing, this function never worked in Mac OS X
anatofuz
parents:
diff changeset
313 return NULL;
anatofuz
parents:
diff changeset
314 }
anatofuz
parents:
diff changeset
315
anatofuz
parents:
diff changeset
316 _LIBUNWIND_EXPORT void *__deregister_frame_info_bases(const void *fde) {
anatofuz
parents:
diff changeset
317 (void)fde;
anatofuz
parents:
diff changeset
318 _LIBUNWIND_TRACE_API("__deregister_frame_info_bases(%p)", fde);
anatofuz
parents:
diff changeset
319 // do nothing, this function never worked in Mac OS X
anatofuz
parents:
diff changeset
320 return NULL;
anatofuz
parents:
diff changeset
321 }
anatofuz
parents:
diff changeset
322 #endif // defined(_LIBUNWIND_SUPPORT_FRAME_APIS)
anatofuz
parents:
diff changeset
323
anatofuz
parents:
diff changeset
324 #endif // defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
anatofuz
parents:
diff changeset
325
anatofuz
parents:
diff changeset
326 #endif // defined(_LIBUNWIND_BUILD_ZERO_COST_APIS)