blob: 9d8a9b1f41568ee50c89c5cc3bbc014fb2b0e934 [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
hp.com!davidm76166fb2002-04-05 23:37:55 +000037/* Error codes. The unwind routines return the *negated* values of
38 these error codes on error and a non-negative value on success. */
39typedef enum
40 {
41 UNW_ESUCCESS = 0, /* no error */
42 UNW_EUNSPEC, /* unspecified (general) error */
43 UNW_ENOMEM, /* out of memory */
44 UNW_EBADREG, /* bad register number */
45 UNW_EREADONLYREG, /* attempt to write read-only register */
46 UNW_ESTOPUNWIND, /* stop unwinding */
47 UNW_EINVALIDIP, /* invalid IP */
48 UNW_EBADFRAME, /* bad frame */
mostang.com!davidm50d7a152002-12-03 08:19:58 +000049 UNW_EINVAL, /* unsupported operation or bad value */
hp.com!davidm76166fb2002-04-05 23:37:55 +000050 UNW_EBADVERSION, /* unwind info has unsupported version */
51 UNW_ENOINFO /* no unwind info found */
52 }
53unw_error_t;
54
55/* The following enum defines the indices for a couple of
56 (pseudo-)registers which have the same meaning across all
57 platforms. (RO) means read-only. (RW) means read-write. General
58 registers (aka "integer registers") are expected to start with
59 index 0. The number of such registers is architecture-dependent.
60 The remaining indices can be used as an architecture sees fit. The
61 last valid register index is given by UNW_REG_LAST. */
62typedef enum
63 {
64 UNW_REG_IP = UNW_TDEP_IP, /* (rw) instruction pointer (pc) */
65 UNW_REG_SP = UNW_TDEP_SP, /* (ro) stack pointer */
mostang.com!davidmc670abb2003-03-06 06:14:36 +000066 UNW_REG_EH = UNW_TDEP_EH, /* (rw) exception-handling reg base */
hp.com!davidm76166fb2002-04-05 23:37:55 +000067 UNW_REG_LAST = UNW_TDEP_LAST_REG
68 }
69unw_frame_regnum_t;
70
mostang.com!davidmc670abb2003-03-06 06:14:36 +000071/* Number of exception-handler argument registers: */
72#define UNW_NUM_EH_REGS UNW_TDEP_NUM_EH_REGS
73
mostang.com!davidm16f21892002-11-09 07:59:02 +000074typedef enum
75 {
76 UNW_CACHE_NONE, /* no caching */
77 UNW_CACHE_GLOBAL, /* shared global cache */
78 UNW_CACHE_PER_THREAD /* per-thread caching */
79 }
80unw_caching_policy_t;
81
hp.com!davidm76166fb2002-04-05 23:37:55 +000082typedef int unw_regnum_t;
83
84/* The unwind cursor starts at the youngest (most deeply nested) frame
85 and is used to track the frame state as the unwinder steps from
86 frame to frame. It is safe to make (shallow) copies of variables
87 of this type. */
88typedef struct unw_cursor
89 {
mostang.com!davidma4bea2c2003-01-21 08:08:32 +000090 unw_word_t opaque[UNW_TDEP_CURSOR_LEN];
hp.com!davidm76166fb2002-04-05 23:37:55 +000091 }
92unw_cursor_t;
93
94/* This type encapsulates the entire (preserved) machine-state. */
95typedef unw_tdep_context_t unw_context_t;
96
97/* unw_getcontext() fills the unw_context_t pointed to by UC with the
98 machine state as it exists at the call-site. For implementation
99 reasons, this needs to be a target-dependent macro. It's easiest
100 to think of unw_getcontext() as being identical to getcontext(). */
101#define unw_getcontext(uc) unw_tdep_getcontext(uc)
102
mostang.com!davidm981c8cc2003-02-08 10:10:59 +0000103typedef unw_tdep_fpreg_t unw_fpreg_t;
hp.com!davidm76166fb2002-04-05 23:37:55 +0000104
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000105typedef struct unw_addr_space *unw_addr_space_t;
106
mostang.com!davidmd5db6012003-12-21 05:53:57 +0000107/* Each target may define it's own set of flags, but bits 0-15 are
108 reserved for general libunwind-use. */
mostang.com!davidma4bea2c2003-01-21 08:08:32 +0000109#define UNW_PI_FLAG_FIRST_TDEP_BIT 16
110
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000111typedef struct unw_proc_info
112 {
113 unw_word_t start_ip; /* first IP covered by this procedure */
114 unw_word_t end_ip; /* first IP NOT covered by this procedure */
115 unw_word_t lsda; /* address of lang.-spec. data area (if any) */
116 unw_word_t handler; /* optional personality routine */
117 unw_word_t gp; /* global-pointer value for this procedure */
118 unw_word_t flags; /* misc. flags */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000119
120 int format; /* unwind-info format (arch-specific) */
hp.com!davidmfbe40e52003-12-20 11:20:42 +0000121 int unwind_info_size; /* size of the information (if applicable) */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000122 void *unwind_info; /* unwind-info (arch-specific) */
hp.com!davidmfbe40e52003-12-20 11:20:42 +0000123 unw_tdep_proc_info_t extra; /* target-dependent auxiliary proc-info */
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
199/* These routines work both for local and remote unwinding. */
200
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000201extern unw_addr_space_t UNW_OBJ(local_addr_space);
202
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000203extern unw_addr_space_t UNW_OBJ(create_addr_space) (unw_accessors_t *a,
204 int byte_order);
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000205extern void UNW_OBJ(destroy_addr_space) (unw_addr_space_t as);
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000206extern unw_accessors_t *UNW_ARCH_OBJ(get_accessors) (unw_addr_space_t as);
207extern void UNW_ARCH_OBJ(flush_cache)(unw_addr_space_t as,
208 unw_word_t lo, unw_word_t hi);
209extern int UNW_ARCH_OBJ(set_caching_policy)(unw_addr_space_t as,
210 unw_caching_policy_t policy);
mostang.com!davidmd5ad49b2003-03-13 02:15:01 +0000211extern const char *UNW_ARCH_OBJ(regname) (unw_regnum_t regnum);
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000212
mostang.com!davidma38baad2003-01-17 07:48:52 +0000213extern int UNW_OBJ(init_local) (unw_cursor_t *c, unw_context_t *u);
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000214extern int UNW_OBJ(init_remote) (unw_cursor_t *c, unw_addr_space_t as,
215 void *as_arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000216extern int UNW_OBJ(step) (unw_cursor_t *c);
217extern int UNW_OBJ(resume) (unw_cursor_t *c);
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000218extern int UNW_OBJ(get_proc_info) (unw_cursor_t *c, unw_proc_info_t *pi);
hp.com!davidm75496742003-12-04 07:34:21 +0000219extern int UNW_OBJ(get_proc_info_by_ip) (unw_addr_space_t as, unw_word_t ip,
220 unw_proc_info_t *pi, void *as_arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000221extern int UNW_OBJ(get_reg) (unw_cursor_t *c, int regnum, unw_word_t *valp);
222extern int UNW_OBJ(set_reg) (unw_cursor_t *c, int regnum, unw_word_t val);
223extern int UNW_OBJ(get_fpreg) (unw_cursor_t *c, int regnum, unw_fpreg_t *val);
224extern int UNW_OBJ(set_fpreg) (unw_cursor_t *c, int regnum, unw_fpreg_t val);
225extern int UNW_OBJ(get_save_loc) (unw_cursor_t *c, int regnum,
226 unw_save_loc_t *loc);
227extern int UNW_OBJ(is_signal_frame) (unw_cursor_t *c);
mostang.com!davidm981c8cc2003-02-08 10:10:59 +0000228extern int UNW_OBJ(get_proc_name) (unw_cursor_t *c, char *buf, size_t buf_len,
229 unw_word_t *offsetp);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000230
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000231#define unw_local_addr_space UNW_OBJ(local_addr_space)
232
233/* Create a new address space (in addition to the default
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000234 local_addr_space). BYTE_ORDER can be 0 to select the default
235 byte-order or one of the byte-order values defined by <endian.h>
mostang.com!davidma4bea2c2003-01-21 08:08:32 +0000236 (e.g., __LITTLE_ENDIAN or __BIG_ENDIAN). The default byte-order is
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000237 either implied by the target architecture (e.g., x86 is always
238 little-endian) or is select based on the byte-order of the host.
239
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000240 This routine is NOT signal-safe. */
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000241#define unw_create_addr_space(a,b) UNW_OBJ(create_addr_space)(a,b)
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000242
243/* Destroy an address space.
244 This routine is NOT signal-safe. */
245#define unw_destroy_addr_space(as) UNW_OBJ(destroy_addr_space)(as)
246
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000247/* Retrieve a pointer to the accessors structure associated with
248 address space AS.
249 This routine is signal-safe. */
250#define unw_get_accessors(as) UNW_ARCH_OBJ(get_accessors)(as)
251
hp.com!davidm76166fb2002-04-05 23:37:55 +0000252/* Initialize cursor C such that unwinding starts at the point
253 represented by the context U. Returns zero on success, negative
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000254 value on failure.
255 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000256#define unw_init_local(c,u) UNW_OBJ(init_local)(c, u)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000257
258/* Initialize cursor C such that it accesses the unwind target through
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000259 accessors A.
260 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000261#define unw_init_remote(c,a,arg) UNW_OBJ(init_remote)(c, a, arg)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000262
263/* Move cursor up by one step (up meaning toward earlier, less deeply
264 nested frames). Returns positive number if there are more frames
265 to unwind, 0 if last frame has been reached, negative number in
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000266 case of an error.
267 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000268#define unw_step(c) UNW_OBJ(step)(c)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000269
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000270/* Resume execution at the point identified by the cursor.
271 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000272#define unw_resume(c) UNW_OBJ(resume)(c)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000273
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000274/* Return the proc-info associated with the cursor.
275 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000276#define unw_get_proc_info(c,p) UNW_OBJ(get_proc_info)(c,p)
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000277
hp.com!davidm75496742003-12-04 07:34:21 +0000278/* Return the proc-info associated instruction pointer IP or an
279 error-code if no such info can be found. Argument AS is the
280 address-space in which the instruction-pointer IP should be looked
281 up and PI is a pointer to the unw_proc_info_t structure that should
282 be used to return the info. ARG is an address-space-specific
283 argument and serves the same purpose as argument ARG for
284 unw_init_remote(). When AS is unw_local_addr_space, 0 must be
285 passed for this argument.
286
287 This routine is signal-safe. */
288#define unw_get_proc_info_by_ip(as,ip,pi,arg) \
289 UNW_OBJ(get_proc_info_by_ip)(as,ip,pi,arg)
290
hp.com!davidm76166fb2002-04-05 23:37:55 +0000291/* Register accessor routines. Return zero on success, negative value
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000292 on failure.
293 These routines are signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000294#define unw_get_reg(c,r,v) UNW_OBJ(get_reg)(c,r,v)
295#define unw_set_reg(c,r,v) UNW_OBJ(set_reg)(c,r,v)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000296
297/* Floating-point accessor routines. Return zero on success, negative
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000298 value on failure.
299 These routines are signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000300#define unw_get_fpreg(c,r,v) UNW_OBJ(get_fpreg)(c,r,v)
301#define unw_set_fpreg(c,r,v) UNW_OBJ(set_fpreg)(c,r,v)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000302
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000303/* Get the save-location of register R.
304 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000305#define unw_get_save_loc(c,r,l) UNW_OBJ(get_save_loc)(c,r,l)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000306
307/* Return 1 if register number R is a floating-point register, zero
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000308 otherwise.
309 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000310#define unw_is_fpreg(r) unw_tdep_is_fpreg(r)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000311
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000312/* Returns non-zero value if the cursor points to a signal frame.
313 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000314#define unw_is_signal_frame(c) UNW_OBJ(is_signal_frame)(c)
mostang.com!davidm58142c02002-04-12 05:02:40 +0000315
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000316/* Return the name of the procedure that created the frame identified
317 by the cursor. The returned string is ASCII NUL terminated. If the
318 string buffer is too small to store the entire name, the first
319 portion of the string that can fit is stored in the buffer (along
320 with a terminating NUL character) and -UNW_ENOMEM is returned. If
mostang.com!davidm981c8cc2003-02-08 10:10:59 +0000321 no name can be determined, -UNW_ENOINFO is returned.
322 This routine is NOT signal-safe. */
323#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 +0000324
mostang.com!davidm58142c02002-04-12 05:02:40 +0000325/* Returns the canonical register name of register R. R must be in
326 the range from 0 to UNW_REG_LAST. Like all other unwind routines,
327 this one is re-entrant (i.e., the returned string must be a string
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000328 constant.
329 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000330#define unw_regname(r) UNW_ARCH_OBJ(regname)(r)
mostang.com!davidm16f21892002-11-09 07:59:02 +0000331
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000332/* Sets the caching policy of address space AS. Caching can be
333 disabled completely by setting the policy to UNW_CACHE_NONE. With
334 UNW_CACHE_GLOBAL, there is a single cache that is shared across all
335 threads. With UNW_CACHE_PER_THREAD, each thread gets its own
336 cache, which can improve performance thanks to less locking and
337 better locality. By default, UNW_CACHE_GLOBAL is in effect.
338 This routine is NOT signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000339#define unw_set_caching_policy(as, p) UNW_ARCH_OBJ(set_caching_policy)(as, p)
mostang.com!davidm16f21892002-11-09 07:59:02 +0000340
341/* Flush all caches (global, per-thread, or any other caches that
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000342 might exist) in address-space AS of information at least relating
343 to the address-range LO to HI (non-inclusive). LO and HI are only
344 a performance hint and the function is allowed to over-flush (i.e.,
345 flush more than the requested address-range). Furthermore, if LO
346 and HI are both 0, the entire address-range is flushed. This
347 function must be called if any of unwind information might have
348 changed (e.g., because a library might have been removed via a call
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000349 to dlclose()).
350 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000351#define unw_flush_cache(as,lo,hi) UNW_ARCH_OBJ(flush_cache)(as, lo, hi)
hp.com!davidm68bdac32003-01-28 03:40:06 +0000352
353/* Helper routines which make it easy to use libunwind via ptrace().
354 They're available only if UNW_REMOTE is _not_ defined and they
355 aren't really part of the libunwind API. They are simple enough
356 not to warrant creating a separate library for them. */
357
358extern void *_UPT_create (pid_t);
359extern void _UPT_destroy (void *upt);
360extern int _UPT_find_proc_info (unw_addr_space_t as, unw_word_t ip,
361 unw_proc_info_t *pi, int need_unwind_info,
362 void *arg);
363extern void _UPT_put_unwind_info (unw_addr_space_t as, unw_proc_info_t *pi,
364 void *arg);
365extern int _UPT_get_dyn_info_list_addr (unw_addr_space_t as,
366 unw_word_t *dil_addr, void *arg);
367extern int _UPT_access_mem (unw_addr_space_t as, unw_word_t addr,
368 unw_word_t *val, int write, void *arg);
369extern int _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg,
370 unw_word_t *val, int write, void *arg);
371extern int _UPT_access_fpreg (unw_addr_space_t as, unw_regnum_t reg,
372 unw_fpreg_t *val, int write, void *arg);
mostang.com!davidm73438412003-02-27 09:58:57 +0000373extern int _UPT_get_proc_name (unw_addr_space_t as, unw_word_t addr,
374 char *buf, size_t len, unw_word_t *offp,
375 void *arg);
mostang.com!davidmc670abb2003-03-06 06:14:36 +0000376extern int _UPT_resume (unw_addr_space_t as, unw_cursor_t *c, void *arg);
hp.com!davidm68bdac32003-01-28 03:40:06 +0000377extern unw_accessors_t _UPT_accessors;