blob: 0cc3fae8da00a4e71968e032f2c8f37fc7e5ea10 [file] [log] [blame]
hp.com!davidm76166fb2002-04-05 23:37:55 +00001/* libunwind - a platform-independent unwind library
mostang.com!davidm73438412003-02-27 09:58:57 +00002 Copyright (C) 2001-2003 Hewlett-Packard Co
hp.com!davidm76166fb2002-04-05 23:37:55 +00003 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!davidmc670abb2003-03-06 06:14:36 +000068 UNW_REG_EH = UNW_TDEP_EH, /* (rw) exception-handling reg base */
hp.com!davidm76166fb2002-04-05 23:37:55 +000069 UNW_REG_LAST = UNW_TDEP_LAST_REG
70 }
71unw_frame_regnum_t;
72
mostang.com!davidmc670abb2003-03-06 06:14:36 +000073/* Number of exception-handler argument registers: */
74#define UNW_NUM_EH_REGS UNW_TDEP_NUM_EH_REGS
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);
mostang.com!davidm73438412003-02-27 09:58:57 +0000167
168 /* Optional call back to obtain the name of a (static) procedure.
169 Dynamically generated procedures are handled automatically by
170 libunwind. This callback is optional and may be set to
171 NULL. */
172 int (*get_proc_name) (unw_addr_space_t as, unw_word_t addr,
173 char *buf, size_t buf_len, unw_word_t *offp,
174 void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000175 }
176unw_accessors_t;
177
178typedef enum unw_save_loc_type
179 {
180 UNW_SLT_NONE, /* register is not saved ("not an l-value") */
181 UNW_SLT_MEMORY, /* register has been saved in memory */
182 UNW_SLT_REG /* register has been saved in (another) register */
183 }
184unw_save_loc_type_t;
185
186typedef struct unw_save_loc
187 {
188 unw_save_loc_type_t type;
189 union
190 {
191 unw_word_t addr; /* valid if type==UNW_SLT_MEMORY */
192 unw_regnum_t regnum; /* valid if type==UNW_SLT_REG */
193 }
194 u;
195 unw_tdep_save_loc_t extra; /* target-dependent additional information */
196 }
197unw_save_loc_t;
198
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000199#include <libunwind-dynamic.h>
200
hp.com!davidm76166fb2002-04-05 23:37:55 +0000201/* These routines work both for local and remote unwinding. */
202
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000203extern unw_addr_space_t UNW_OBJ(local_addr_space);
204
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000205extern unw_addr_space_t UNW_OBJ(create_addr_space) (unw_accessors_t *a,
206 int byte_order);
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000207extern void UNW_OBJ(destroy_addr_space) (unw_addr_space_t as);
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000208extern unw_accessors_t *UNW_ARCH_OBJ(get_accessors) (unw_addr_space_t as);
209extern void UNW_ARCH_OBJ(flush_cache)(unw_addr_space_t as,
210 unw_word_t lo, unw_word_t hi);
211extern int UNW_ARCH_OBJ(set_caching_policy)(unw_addr_space_t as,
212 unw_caching_policy_t policy);
mostang.com!davidmd5ad49b2003-03-13 02:15:01 +0000213extern const char *UNW_ARCH_OBJ(regname) (unw_regnum_t regnum);
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000214
mostang.com!davidma38baad2003-01-17 07:48:52 +0000215extern int UNW_OBJ(init_local) (unw_cursor_t *c, unw_context_t *u);
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000216extern int UNW_OBJ(init_remote) (unw_cursor_t *c, unw_addr_space_t as,
217 void *as_arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000218extern int UNW_OBJ(step) (unw_cursor_t *c);
219extern int UNW_OBJ(resume) (unw_cursor_t *c);
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000220extern int UNW_OBJ(get_proc_info) (unw_cursor_t *c, unw_proc_info_t *pi);
hp.com!davidm75496742003-12-04 07:34:21 +0000221extern int UNW_OBJ(get_proc_info_by_ip) (unw_addr_space_t as, unw_word_t ip,
222 unw_proc_info_t *pi, void *as_arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000223extern int UNW_OBJ(get_reg) (unw_cursor_t *c, int regnum, unw_word_t *valp);
224extern int UNW_OBJ(set_reg) (unw_cursor_t *c, int regnum, unw_word_t val);
225extern int UNW_OBJ(get_fpreg) (unw_cursor_t *c, int regnum, unw_fpreg_t *val);
226extern int UNW_OBJ(set_fpreg) (unw_cursor_t *c, int regnum, unw_fpreg_t val);
227extern int UNW_OBJ(get_save_loc) (unw_cursor_t *c, int regnum,
228 unw_save_loc_t *loc);
229extern int UNW_OBJ(is_signal_frame) (unw_cursor_t *c);
mostang.com!davidm981c8cc2003-02-08 10:10:59 +0000230extern int UNW_OBJ(get_proc_name) (unw_cursor_t *c, char *buf, size_t buf_len,
231 unw_word_t *offsetp);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000232
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000233#define unw_local_addr_space UNW_OBJ(local_addr_space)
234
235/* Create a new address space (in addition to the default
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000236 local_addr_space). BYTE_ORDER can be 0 to select the default
237 byte-order or one of the byte-order values defined by <endian.h>
mostang.com!davidma4bea2c2003-01-21 08:08:32 +0000238 (e.g., __LITTLE_ENDIAN or __BIG_ENDIAN). The default byte-order is
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000239 either implied by the target architecture (e.g., x86 is always
240 little-endian) or is select based on the byte-order of the host.
241
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000242 This routine is NOT signal-safe. */
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000243#define unw_create_addr_space(a,b) UNW_OBJ(create_addr_space)(a,b)
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000244
245/* Destroy an address space.
246 This routine is NOT signal-safe. */
247#define unw_destroy_addr_space(as) UNW_OBJ(destroy_addr_space)(as)
248
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000249/* Retrieve a pointer to the accessors structure associated with
250 address space AS.
251 This routine is signal-safe. */
252#define unw_get_accessors(as) UNW_ARCH_OBJ(get_accessors)(as)
253
hp.com!davidm76166fb2002-04-05 23:37:55 +0000254/* Initialize cursor C such that unwinding starts at the point
255 represented by the context U. Returns zero on success, negative
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000256 value on failure.
257 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000258#define unw_init_local(c,u) UNW_OBJ(init_local)(c, u)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000259
260/* Initialize cursor C such that it accesses the unwind target through
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000261 accessors A.
262 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000263#define unw_init_remote(c,a,arg) UNW_OBJ(init_remote)(c, a, arg)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000264
265/* Move cursor up by one step (up meaning toward earlier, less deeply
266 nested frames). Returns positive number if there are more frames
267 to unwind, 0 if last frame has been reached, negative number in
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000268 case of an error.
269 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000270#define unw_step(c) UNW_OBJ(step)(c)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000271
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000272/* Resume execution at the point identified by the cursor.
273 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000274#define unw_resume(c) UNW_OBJ(resume)(c)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000275
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000276/* Return the proc-info associated with the cursor.
277 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000278#define unw_get_proc_info(c,p) UNW_OBJ(get_proc_info)(c,p)
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000279
hp.com!davidm75496742003-12-04 07:34:21 +0000280/* Return the proc-info associated instruction pointer IP or an
281 error-code if no such info can be found. Argument AS is the
282 address-space in which the instruction-pointer IP should be looked
283 up and PI is a pointer to the unw_proc_info_t structure that should
284 be used to return the info. ARG is an address-space-specific
285 argument and serves the same purpose as argument ARG for
286 unw_init_remote(). When AS is unw_local_addr_space, 0 must be
287 passed for this argument.
288
289 This routine is signal-safe. */
290#define unw_get_proc_info_by_ip(as,ip,pi,arg) \
291 UNW_OBJ(get_proc_info_by_ip)(as,ip,pi,arg)
292
hp.com!davidm76166fb2002-04-05 23:37:55 +0000293/* Register accessor routines. Return zero on success, negative value
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000294 on failure.
295 These routines are signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000296#define unw_get_reg(c,r,v) UNW_OBJ(get_reg)(c,r,v)
297#define unw_set_reg(c,r,v) UNW_OBJ(set_reg)(c,r,v)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000298
299/* Floating-point accessor routines. Return zero on success, negative
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000300 value on failure.
301 These routines are signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000302#define unw_get_fpreg(c,r,v) UNW_OBJ(get_fpreg)(c,r,v)
303#define unw_set_fpreg(c,r,v) UNW_OBJ(set_fpreg)(c,r,v)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000304
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000305/* Get the save-location of register R.
306 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000307#define unw_get_save_loc(c,r,l) UNW_OBJ(get_save_loc)(c,r,l)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000308
309/* Return 1 if register number R is a floating-point register, zero
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000310 otherwise.
311 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000312#define unw_is_fpreg(r) unw_tdep_is_fpreg(r)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000313
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000314/* Returns non-zero value if the cursor points to a signal frame.
315 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000316#define unw_is_signal_frame(c) UNW_OBJ(is_signal_frame)(c)
mostang.com!davidm58142c02002-04-12 05:02:40 +0000317
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000318/* Return the name of the procedure that created the frame identified
319 by the cursor. The returned string is ASCII NUL terminated. If the
320 string buffer is too small to store the entire name, the first
321 portion of the string that can fit is stored in the buffer (along
322 with a terminating NUL character) and -UNW_ENOMEM is returned. If
mostang.com!davidm981c8cc2003-02-08 10:10:59 +0000323 no name can be determined, -UNW_ENOINFO is returned.
324 This routine is NOT signal-safe. */
325#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 +0000326
mostang.com!davidm58142c02002-04-12 05:02:40 +0000327/* Returns the canonical register name of register R. R must be in
328 the range from 0 to UNW_REG_LAST. Like all other unwind routines,
329 this one is re-entrant (i.e., the returned string must be a string
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000330 constant.
331 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000332#define unw_regname(r) UNW_ARCH_OBJ(regname)(r)
mostang.com!davidm16f21892002-11-09 07:59:02 +0000333
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000334/* Sets the caching policy of address space AS. Caching can be
335 disabled completely by setting the policy to UNW_CACHE_NONE. With
336 UNW_CACHE_GLOBAL, there is a single cache that is shared across all
337 threads. With UNW_CACHE_PER_THREAD, each thread gets its own
338 cache, which can improve performance thanks to less locking and
339 better locality. By default, UNW_CACHE_GLOBAL is in effect.
340 This routine is NOT signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000341#define unw_set_caching_policy(as, p) UNW_ARCH_OBJ(set_caching_policy)(as, p)
mostang.com!davidm16f21892002-11-09 07:59:02 +0000342
343/* Flush all caches (global, per-thread, or any other caches that
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000344 might exist) in address-space AS of information at least relating
345 to the address-range LO to HI (non-inclusive). LO and HI are only
346 a performance hint and the function is allowed to over-flush (i.e.,
347 flush more than the requested address-range). Furthermore, if LO
348 and HI are both 0, the entire address-range is flushed. This
349 function must be called if any of unwind information might have
350 changed (e.g., because a library might have been removed via a call
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000351 to dlclose()).
352 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000353#define unw_flush_cache(as,lo,hi) UNW_ARCH_OBJ(flush_cache)(as, lo, hi)
hp.com!davidm68bdac32003-01-28 03:40:06 +0000354
355/* Helper routines which make it easy to use libunwind via ptrace().
356 They're available only if UNW_REMOTE is _not_ defined and they
357 aren't really part of the libunwind API. They are simple enough
358 not to warrant creating a separate library for them. */
359
360extern void *_UPT_create (pid_t);
361extern void _UPT_destroy (void *upt);
362extern int _UPT_find_proc_info (unw_addr_space_t as, unw_word_t ip,
363 unw_proc_info_t *pi, int need_unwind_info,
364 void *arg);
365extern void _UPT_put_unwind_info (unw_addr_space_t as, unw_proc_info_t *pi,
366 void *arg);
367extern int _UPT_get_dyn_info_list_addr (unw_addr_space_t as,
368 unw_word_t *dil_addr, void *arg);
369extern int _UPT_access_mem (unw_addr_space_t as, unw_word_t addr,
370 unw_word_t *val, int write, void *arg);
371extern int _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg,
372 unw_word_t *val, int write, void *arg);
373extern int _UPT_access_fpreg (unw_addr_space_t as, unw_regnum_t reg,
374 unw_fpreg_t *val, int write, void *arg);
mostang.com!davidm73438412003-02-27 09:58:57 +0000375extern int _UPT_get_proc_name (unw_addr_space_t as, unw_word_t addr,
376 char *buf, size_t len, unw_word_t *offp,
377 void *arg);
mostang.com!davidmc670abb2003-03-06 06:14:36 +0000378extern int _UPT_resume (unw_addr_space_t as, unw_cursor_t *c, void *arg);
hp.com!davidm68bdac32003-01-28 03:40:06 +0000379extern unw_accessors_t _UPT_accessors;