blob: 111c9118f373a605e3eb1543bca3a0220a0ec129 [file] [log] [blame]
hp.com!davidm76166fb2002-04-05 23:37:55 +00001/* libunwind - a platform-independent unwind library
2 Copyright (C) 2001-2002 Hewlett-Packard Co
3 Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
4
5This file is part of libunwind.
6
mostang.com!davidmaca38432002-11-16 03:25:36 +00007Permission is hereby granted, free of charge, to any person obtaining
8a copy of this software and associated documentation files (the
9"Software"), to deal in the Software without restriction, including
10without limitation the rights to use, copy, modify, merge, publish,
11distribute, sublicense, and/or sell copies of the Software, and to
12permit persons to whom the Software is furnished to do so, subject to
13the following conditions:
hp.com!davidm76166fb2002-04-05 23:37:55 +000014
mostang.com!davidmaca38432002-11-16 03:25:36 +000015The above copyright notice and this permission notice shall be
16included in all copies or substantial portions of the Software.
hp.com!davidm76166fb2002-04-05 23:37:55 +000017
mostang.com!davidmaca38432002-11-16 03:25:36 +000018THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
hp.com!davidm76166fb2002-04-05 23:37:55 +000025
26#define UNW_PASTE2(x,y) x##y
27#define UNW_PASTE(x,y) UNW_PASTE2(x,y)
28#define UNW_OBJ(fn) UNW_PASTE(UNW_PREFIX, fn)
mostang.com!davidm50d7a152002-12-03 08:19:58 +000029#define UNW_ARCH_OBJ(fn) UNW_PASTE(UNW_PASTE(UNW_PASTE(_U,UNW_TARGET),_), fn)
hp.com!davidm76166fb2002-04-05 23:37:55 +000030
31#ifdef UNW_LOCAL_ONLY
32# define UNW_PREFIX UNW_PASTE(UNW_PASTE(_UL,UNW_TARGET),_)
33#else /* !UNW_LOCAL_ONLY */
34# define UNW_PREFIX UNW_PASTE(UNW_PASTE(_U,UNW_TARGET),_)
35#endif /* !UNW_LOCAL_ONLY */
36
37typedef unw_tdep_word_t unw_word_t;
38
hp.com!davidm76166fb2002-04-05 23:37:55 +000039/* Error codes. The unwind routines return the *negated* values of
40 these error codes on error and a non-negative value on success. */
41typedef enum
42 {
43 UNW_ESUCCESS = 0, /* no error */
44 UNW_EUNSPEC, /* unspecified (general) error */
45 UNW_ENOMEM, /* out of memory */
46 UNW_EBADREG, /* bad register number */
47 UNW_EREADONLYREG, /* attempt to write read-only register */
48 UNW_ESTOPUNWIND, /* stop unwinding */
49 UNW_EINVALIDIP, /* invalid IP */
50 UNW_EBADFRAME, /* bad frame */
mostang.com!davidm50d7a152002-12-03 08:19:58 +000051 UNW_EINVAL, /* unsupported operation or bad value */
hp.com!davidm76166fb2002-04-05 23:37:55 +000052 UNW_EBADVERSION, /* unwind info has unsupported version */
53 UNW_ENOINFO /* no unwind info found */
54 }
55unw_error_t;
56
57/* The following enum defines the indices for a couple of
58 (pseudo-)registers which have the same meaning across all
59 platforms. (RO) means read-only. (RW) means read-write. General
60 registers (aka "integer registers") are expected to start with
61 index 0. The number of such registers is architecture-dependent.
62 The remaining indices can be used as an architecture sees fit. The
63 last valid register index is given by UNW_REG_LAST. */
64typedef enum
65 {
66 UNW_REG_IP = UNW_TDEP_IP, /* (rw) instruction pointer (pc) */
67 UNW_REG_SP = UNW_TDEP_SP, /* (ro) stack pointer */
mostang.com!davidm981c8cc2003-02-08 10:10:59 +000068 UNW_REG_EH_ARG0 = UNW_TDEP_EH_ARG0, /* (rw) exception-handling arg 0 */
69 UNW_REG_EH_ARG1 = UNW_TDEP_EH_ARG1, /* (rw) exception-handling arg 1 */
70 UNW_REG_EH_ARG2 = UNW_TDEP_EH_ARG2, /* (rw) exception-handling arg 2 */
71 UNW_REG_EH_ARG3 = UNW_TDEP_EH_ARG3, /* (rw) exception-handling arg 3 */
hp.com!davidm76166fb2002-04-05 23:37:55 +000072 UNW_REG_LAST = UNW_TDEP_LAST_REG
73 }
74unw_frame_regnum_t;
75
mostang.com!davidm16f21892002-11-09 07:59:02 +000076typedef enum
77 {
78 UNW_CACHE_NONE, /* no caching */
79 UNW_CACHE_GLOBAL, /* shared global cache */
80 UNW_CACHE_PER_THREAD /* per-thread caching */
81 }
82unw_caching_policy_t;
83
hp.com!davidm76166fb2002-04-05 23:37:55 +000084typedef int unw_regnum_t;
85
86/* The unwind cursor starts at the youngest (most deeply nested) frame
87 and is used to track the frame state as the unwinder steps from
88 frame to frame. It is safe to make (shallow) copies of variables
89 of this type. */
90typedef struct unw_cursor
91 {
mostang.com!davidma4bea2c2003-01-21 08:08:32 +000092 unw_word_t opaque[UNW_TDEP_CURSOR_LEN];
hp.com!davidm76166fb2002-04-05 23:37:55 +000093 }
94unw_cursor_t;
95
96/* This type encapsulates the entire (preserved) machine-state. */
97typedef unw_tdep_context_t unw_context_t;
98
99/* unw_getcontext() fills the unw_context_t pointed to by UC with the
100 machine state as it exists at the call-site. For implementation
101 reasons, this needs to be a target-dependent macro. It's easiest
102 to think of unw_getcontext() as being identical to getcontext(). */
103#define unw_getcontext(uc) unw_tdep_getcontext(uc)
104
mostang.com!davidm981c8cc2003-02-08 10:10:59 +0000105typedef unw_tdep_fpreg_t unw_fpreg_t;
hp.com!davidm76166fb2002-04-05 23:37:55 +0000106
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000107typedef struct unw_addr_space *unw_addr_space_t;
108
mostang.com!davidma4bea2c2003-01-21 08:08:32 +0000109/* This bit is set to indicate */
110#define UNW_PI_FLAG_FIRST_TDEP_BIT 16
111
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000112typedef struct unw_proc_info
113 {
114 unw_word_t start_ip; /* first IP covered by this procedure */
115 unw_word_t end_ip; /* first IP NOT covered by this procedure */
116 unw_word_t lsda; /* address of lang.-spec. data area (if any) */
117 unw_word_t handler; /* optional personality routine */
118 unw_word_t gp; /* global-pointer value for this procedure */
119 unw_word_t flags; /* misc. flags */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000120
121 int format; /* unwind-info format (arch-specific) */
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000122 int unwind_info_size; /* size of the informat (if applicable) */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000123 void *unwind_info; /* unwind-info (arch-specific) */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000124 }
125unw_proc_info_t;
126
hp.com!davidm76166fb2002-04-05 23:37:55 +0000127/* These are backend callback routines that provide access to the
128 state of a "remote" process. This can be used, for example, to
129 unwind another process through the ptrace() interface. */
130typedef struct unw_accessors
131 {
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000132 /* Look up the unwind info associated with instruction-pointer IP.
133 On success, the routine fills in the PROC_INFO structure. */
134 int (*find_proc_info) (unw_addr_space_t as, unw_word_t ip,
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000135 unw_proc_info_t *proc_info,
136 int need_unwind_info,
137 void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000138
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000139 /* Release any resources (e.g., memory) that were allocated for
140 the unwind info returned in by a previous call to
141 find_proc_info() with NEED_UNWIND_INFO set to 1. */
142 void (*put_unwind_info) (unw_addr_space_t as, unw_proc_info_t *proc_info,
143 void *arg);
144
145 /* Return the list-head of the dynamically registered unwind
146 info. */
147 int (*get_dyn_info_list_addr) (unw_addr_space_t as,
148 unw_word_t *dyn_info_list_addr,
149 void *arg);
150
151 /* Access aligned word at address ADDR. The value is returned
152 according to the endianness of the host (e.g., if the host is
153 little-endian and the target is big-endian, access_mem() needs
154 to byte-swap the value before returning it). */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000155 int (*access_mem) (unw_addr_space_t as, unw_word_t addr,
156 unw_word_t *val, int write, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000157
158 /* Access register number REG at address ADDR. */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000159 int (*access_reg) (unw_addr_space_t as, unw_regnum_t reg,
160 unw_word_t *val, int write, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000161
162 /* Access register number REG at address ADDR. */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000163 int (*access_fpreg) (unw_addr_space_t as, unw_regnum_t reg,
164 unw_fpreg_t *val, int write, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000165
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000166 int (*resume) (unw_addr_space_t as, unw_cursor_t *c, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000167 }
168unw_accessors_t;
169
170typedef enum unw_save_loc_type
171 {
172 UNW_SLT_NONE, /* register is not saved ("not an l-value") */
173 UNW_SLT_MEMORY, /* register has been saved in memory */
174 UNW_SLT_REG /* register has been saved in (another) register */
175 }
176unw_save_loc_type_t;
177
178typedef struct unw_save_loc
179 {
180 unw_save_loc_type_t type;
181 union
182 {
183 unw_word_t addr; /* valid if type==UNW_SLT_MEMORY */
184 unw_regnum_t regnum; /* valid if type==UNW_SLT_REG */
185 }
186 u;
187 unw_tdep_save_loc_t extra; /* target-dependent additional information */
188 }
189unw_save_loc_t;
190
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000191#include <libunwind-dynamic.h>
192
hp.com!davidm76166fb2002-04-05 23:37:55 +0000193/* These routines work both for local and remote unwinding. */
194
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000195extern unw_addr_space_t UNW_OBJ(local_addr_space);
196
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000197extern unw_addr_space_t UNW_OBJ(create_addr_space) (unw_accessors_t *a,
198 int byte_order);
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000199extern void UNW_OBJ(destroy_addr_space) (unw_addr_space_t as);
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000200extern unw_accessors_t *UNW_ARCH_OBJ(get_accessors) (unw_addr_space_t as);
201extern void UNW_ARCH_OBJ(flush_cache)(unw_addr_space_t as,
202 unw_word_t lo, unw_word_t hi);
203extern int UNW_ARCH_OBJ(set_caching_policy)(unw_addr_space_t as,
204 unw_caching_policy_t policy);
205extern const char *UNW_ARCH_OBJ(regname) (int regnum);
206
mostang.com!davidma38baad2003-01-17 07:48:52 +0000207extern int UNW_OBJ(init_local) (unw_cursor_t *c, unw_context_t *u);
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000208extern int UNW_OBJ(init_remote) (unw_cursor_t *c, unw_addr_space_t as,
209 void *as_arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000210extern int UNW_OBJ(step) (unw_cursor_t *c);
211extern int UNW_OBJ(resume) (unw_cursor_t *c);
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000212extern int UNW_OBJ(get_proc_info) (unw_cursor_t *c, unw_proc_info_t *pi);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000213extern int UNW_OBJ(get_reg) (unw_cursor_t *c, int regnum, unw_word_t *valp);
214extern int UNW_OBJ(set_reg) (unw_cursor_t *c, int regnum, unw_word_t val);
215extern int UNW_OBJ(get_fpreg) (unw_cursor_t *c, int regnum, unw_fpreg_t *val);
216extern int UNW_OBJ(set_fpreg) (unw_cursor_t *c, int regnum, unw_fpreg_t val);
217extern int UNW_OBJ(get_save_loc) (unw_cursor_t *c, int regnum,
218 unw_save_loc_t *loc);
219extern int UNW_OBJ(is_signal_frame) (unw_cursor_t *c);
mostang.com!davidm981c8cc2003-02-08 10:10:59 +0000220extern int UNW_OBJ(get_proc_name) (unw_cursor_t *c, char *buf, size_t buf_len,
221 unw_word_t *offsetp);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000222
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000223#define unw_local_addr_space UNW_OBJ(local_addr_space)
224
225/* Create a new address space (in addition to the default
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000226 local_addr_space). BYTE_ORDER can be 0 to select the default
227 byte-order or one of the byte-order values defined by <endian.h>
mostang.com!davidma4bea2c2003-01-21 08:08:32 +0000228 (e.g., __LITTLE_ENDIAN or __BIG_ENDIAN). The default byte-order is
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000229 either implied by the target architecture (e.g., x86 is always
230 little-endian) or is select based on the byte-order of the host.
231
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000232 This routine is NOT signal-safe. */
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000233#define unw_create_addr_space(a,b) UNW_OBJ(create_addr_space)(a,b)
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000234
235/* Destroy an address space.
236 This routine is NOT signal-safe. */
237#define unw_destroy_addr_space(as) UNW_OBJ(destroy_addr_space)(as)
238
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000239/* Retrieve a pointer to the accessors structure associated with
240 address space AS.
241 This routine is signal-safe. */
242#define unw_get_accessors(as) UNW_ARCH_OBJ(get_accessors)(as)
243
hp.com!davidm76166fb2002-04-05 23:37:55 +0000244/* Initialize cursor C such that unwinding starts at the point
245 represented by the context U. Returns zero on success, negative
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000246 value on failure.
247 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000248#define unw_init_local(c,u) UNW_OBJ(init_local)(c, u)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000249
250/* Initialize cursor C such that it accesses the unwind target through
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000251 accessors A.
252 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000253#define unw_init_remote(c,a,arg) UNW_OBJ(init_remote)(c, a, arg)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000254
255/* Move cursor up by one step (up meaning toward earlier, less deeply
256 nested frames). Returns positive number if there are more frames
257 to unwind, 0 if last frame has been reached, negative number in
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000258 case of an error.
259 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000260#define unw_step(c) UNW_OBJ(step)(c)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000261
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000262/* Resume execution at the point identified by the cursor.
263 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000264#define unw_resume(c) UNW_OBJ(resume)(c)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000265
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000266/* Return the proc-info associated with the cursor.
267 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000268#define unw_get_proc_info(c,p) UNW_OBJ(get_proc_info)(c,p)
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000269
hp.com!davidm76166fb2002-04-05 23:37:55 +0000270/* Register accessor routines. Return zero on success, negative value
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000271 on failure.
272 These routines are signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000273#define unw_get_reg(c,r,v) UNW_OBJ(get_reg)(c,r,v)
274#define unw_set_reg(c,r,v) UNW_OBJ(set_reg)(c,r,v)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000275
276/* Floating-point accessor routines. Return zero on success, negative
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000277 value on failure.
278 These routines are signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000279#define unw_get_fpreg(c,r,v) UNW_OBJ(get_fpreg)(c,r,v)
280#define unw_set_fpreg(c,r,v) UNW_OBJ(set_fpreg)(c,r,v)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000281
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000282/* Get the save-location of register R.
283 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000284#define unw_get_save_loc(c,r,l) UNW_OBJ(get_save_loc)(c,r,l)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000285
286/* Return 1 if register number R is a floating-point register, zero
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000287 otherwise.
288 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000289#define unw_is_fpreg(r) unw_tdep_is_fpreg(r)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000290
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000291/* Returns non-zero value if the cursor points to a signal frame.
292 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000293#define unw_is_signal_frame(c) UNW_OBJ(is_signal_frame)(c)
mostang.com!davidm58142c02002-04-12 05:02:40 +0000294
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000295/* Return the name of the procedure that created the frame identified
296 by the cursor. The returned string is ASCII NUL terminated. If the
297 string buffer is too small to store the entire name, the first
298 portion of the string that can fit is stored in the buffer (along
299 with a terminating NUL character) and -UNW_ENOMEM is returned. If
mostang.com!davidm981c8cc2003-02-08 10:10:59 +0000300 no name can be determined, -UNW_ENOINFO is returned.
301 This routine is NOT signal-safe. */
302#define unw_get_proc_name(c,s,l,o) UNW_OBJ(get_proc_name)(c, s, l, o)
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000303
mostang.com!davidm58142c02002-04-12 05:02:40 +0000304/* Returns the canonical register name of register R. R must be in
305 the range from 0 to UNW_REG_LAST. Like all other unwind routines,
306 this one is re-entrant (i.e., the returned string must be a string
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000307 constant.
308 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000309#define unw_regname(r) UNW_ARCH_OBJ(regname)(r)
mostang.com!davidm16f21892002-11-09 07:59:02 +0000310
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000311/* Sets the caching policy of address space AS. Caching can be
312 disabled completely by setting the policy to UNW_CACHE_NONE. With
313 UNW_CACHE_GLOBAL, there is a single cache that is shared across all
314 threads. With UNW_CACHE_PER_THREAD, each thread gets its own
315 cache, which can improve performance thanks to less locking and
316 better locality. By default, UNW_CACHE_GLOBAL is in effect.
317 This routine is NOT signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000318#define unw_set_caching_policy(as, p) UNW_ARCH_OBJ(set_caching_policy)(as, p)
mostang.com!davidm16f21892002-11-09 07:59:02 +0000319
320/* Flush all caches (global, per-thread, or any other caches that
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000321 might exist) in address-space AS of information at least relating
322 to the address-range LO to HI (non-inclusive). LO and HI are only
323 a performance hint and the function is allowed to over-flush (i.e.,
324 flush more than the requested address-range). Furthermore, if LO
325 and HI are both 0, the entire address-range is flushed. This
326 function must be called if any of unwind information might have
327 changed (e.g., because a library might have been removed via a call
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000328 to dlclose()).
329 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000330#define unw_flush_cache(as,lo,hi) UNW_ARCH_OBJ(flush_cache)(as, lo, hi)
hp.com!davidm68bdac32003-01-28 03:40:06 +0000331
332/* Helper routines which make it easy to use libunwind via ptrace().
333 They're available only if UNW_REMOTE is _not_ defined and they
334 aren't really part of the libunwind API. They are simple enough
335 not to warrant creating a separate library for them. */
336
337extern void *_UPT_create (pid_t);
338extern void _UPT_destroy (void *upt);
339extern int _UPT_find_proc_info (unw_addr_space_t as, unw_word_t ip,
340 unw_proc_info_t *pi, int need_unwind_info,
341 void *arg);
342extern void _UPT_put_unwind_info (unw_addr_space_t as, unw_proc_info_t *pi,
343 void *arg);
344extern int _UPT_get_dyn_info_list_addr (unw_addr_space_t as,
345 unw_word_t *dil_addr, void *arg);
346extern int _UPT_access_mem (unw_addr_space_t as, unw_word_t addr,
347 unw_word_t *val, int write, void *arg);
348extern int _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg,
349 unw_word_t *val, int write, void *arg);
350extern int _UPT_access_fpreg (unw_addr_space_t as, unw_regnum_t reg,
351 unw_fpreg_t *val, int write, void *arg);
352extern unw_accessors_t _UPT_accessors;