blob: 17823a6b7ca2f81c5713bd5e52c4cc7f7e1ccd7e [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
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +000031
hp.com!davidm76166fb2002-04-05 23:37:55 +000032#ifdef UNW_LOCAL_ONLY
33# define UNW_PREFIX UNW_PASTE(UNW_PASTE(_UL,UNW_TARGET),_)
34#else /* !UNW_LOCAL_ONLY */
35# define UNW_PREFIX UNW_PASTE(UNW_PASTE(_U,UNW_TARGET),_)
36#endif /* !UNW_LOCAL_ONLY */
37
38typedef unw_tdep_word_t unw_word_t;
39
hp.com!davidm76166fb2002-04-05 23:37:55 +000040/* Error codes. The unwind routines return the *negated* values of
41 these error codes on error and a non-negative value on success. */
42typedef enum
43 {
44 UNW_ESUCCESS = 0, /* no error */
45 UNW_EUNSPEC, /* unspecified (general) error */
46 UNW_ENOMEM, /* out of memory */
47 UNW_EBADREG, /* bad register number */
48 UNW_EREADONLYREG, /* attempt to write read-only register */
49 UNW_ESTOPUNWIND, /* stop unwinding */
50 UNW_EINVALIDIP, /* invalid IP */
51 UNW_EBADFRAME, /* bad frame */
mostang.com!davidm50d7a152002-12-03 08:19:58 +000052 UNW_EINVAL, /* unsupported operation or bad value */
hp.com!davidm76166fb2002-04-05 23:37:55 +000053 UNW_EBADVERSION, /* unwind info has unsupported version */
54 UNW_ENOINFO /* no unwind info found */
55 }
56unw_error_t;
57
58/* The following enum defines the indices for a couple of
59 (pseudo-)registers which have the same meaning across all
60 platforms. (RO) means read-only. (RW) means read-write. General
61 registers (aka "integer registers") are expected to start with
62 index 0. The number of such registers is architecture-dependent.
63 The remaining indices can be used as an architecture sees fit. The
64 last valid register index is given by UNW_REG_LAST. */
65typedef enum
66 {
67 UNW_REG_IP = UNW_TDEP_IP, /* (rw) instruction pointer (pc) */
68 UNW_REG_SP = UNW_TDEP_SP, /* (ro) stack pointer */
hp.com!davidm76166fb2002-04-05 23:37:55 +000069 UNW_REG_LAST = UNW_TDEP_LAST_REG
70 }
71unw_frame_regnum_t;
72
mostang.com!davidm16f21892002-11-09 07:59:02 +000073typedef enum
74 {
75 UNW_CACHE_NONE, /* no caching */
76 UNW_CACHE_GLOBAL, /* shared global cache */
77 UNW_CACHE_PER_THREAD /* per-thread caching */
78 }
79unw_caching_policy_t;
80
hp.com!davidm76166fb2002-04-05 23:37:55 +000081typedef int unw_regnum_t;
82
83/* The unwind cursor starts at the youngest (most deeply nested) frame
84 and is used to track the frame state as the unwinder steps from
85 frame to frame. It is safe to make (shallow) copies of variables
86 of this type. */
87typedef struct unw_cursor
88 {
mostang.com!davidma4bea2c2003-01-21 08:08:32 +000089 unw_word_t opaque[UNW_TDEP_CURSOR_LEN];
hp.com!davidm76166fb2002-04-05 23:37:55 +000090 }
91unw_cursor_t;
92
93/* This type encapsulates the entire (preserved) machine-state. */
94typedef unw_tdep_context_t unw_context_t;
95
96/* unw_getcontext() fills the unw_context_t pointed to by UC with the
97 machine state as it exists at the call-site. For implementation
98 reasons, this needs to be a target-dependent macro. It's easiest
99 to think of unw_getcontext() as being identical to getcontext(). */
100#define unw_getcontext(uc) unw_tdep_getcontext(uc)
101
102/* We will assume that "long double" is sufficiently large and aligned
103 to hold the contents of a floating-point register. Note that the
104 fp register format is not usually the same format as a "long
105 double". Instead, the content of unw_fpreg_t should be manipulated
106 only through the "raw.bits" member. */
107typedef union
108 {
109 struct { unw_word_t bits[1]; } raw;
110 long double dummy; /* dummy to force 16-byte alignment */
111 }
112unw_fpreg_t;
113
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000114typedef struct unw_addr_space *unw_addr_space_t;
115
mostang.com!davidma4bea2c2003-01-21 08:08:32 +0000116/* This bit is set to indicate */
117#define UNW_PI_FLAG_FIRST_TDEP_BIT 16
118
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000119typedef struct unw_proc_info
120 {
121 unw_word_t start_ip; /* first IP covered by this procedure */
122 unw_word_t end_ip; /* first IP NOT covered by this procedure */
123 unw_word_t lsda; /* address of lang.-spec. data area (if any) */
124 unw_word_t handler; /* optional personality routine */
125 unw_word_t gp; /* global-pointer value for this procedure */
126 unw_word_t flags; /* misc. flags */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000127
128 int format; /* unwind-info format (arch-specific) */
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000129 int unwind_info_size; /* size of the informat (if applicable) */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000130 void *unwind_info; /* unwind-info (arch-specific) */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000131 }
132unw_proc_info_t;
133
hp.com!davidm76166fb2002-04-05 23:37:55 +0000134/* These are backend callback routines that provide access to the
135 state of a "remote" process. This can be used, for example, to
136 unwind another process through the ptrace() interface. */
137typedef struct unw_accessors
138 {
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000139 /* Look up the unwind info associated with instruction-pointer IP.
140 On success, the routine fills in the PROC_INFO structure. */
141 int (*find_proc_info) (unw_addr_space_t as, unw_word_t ip,
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000142 unw_proc_info_t *proc_info,
143 int need_unwind_info,
144 void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000145
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000146 /* Release any resources (e.g., memory) that were allocated for
147 the unwind info returned in by a previous call to
148 find_proc_info() with NEED_UNWIND_INFO set to 1. */
149 void (*put_unwind_info) (unw_addr_space_t as, unw_proc_info_t *proc_info,
150 void *arg);
151
152 /* Return the list-head of the dynamically registered unwind
153 info. */
154 int (*get_dyn_info_list_addr) (unw_addr_space_t as,
155 unw_word_t *dyn_info_list_addr,
156 void *arg);
157
158 /* Access aligned word at address ADDR. The value is returned
159 according to the endianness of the host (e.g., if the host is
160 little-endian and the target is big-endian, access_mem() needs
161 to byte-swap the value before returning it). */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000162 int (*access_mem) (unw_addr_space_t as, unw_word_t addr,
163 unw_word_t *val, int write, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000164
165 /* Access register number REG at address ADDR. */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000166 int (*access_reg) (unw_addr_space_t as, unw_regnum_t reg,
167 unw_word_t *val, int write, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000168
169 /* Access register number REG at address ADDR. */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000170 int (*access_fpreg) (unw_addr_space_t as, unw_regnum_t reg,
171 unw_fpreg_t *val, int write, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000172
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000173 int (*resume) (unw_addr_space_t as, unw_cursor_t *c, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000174 }
175unw_accessors_t;
176
177typedef enum unw_save_loc_type
178 {
179 UNW_SLT_NONE, /* register is not saved ("not an l-value") */
180 UNW_SLT_MEMORY, /* register has been saved in memory */
181 UNW_SLT_REG /* register has been saved in (another) register */
182 }
183unw_save_loc_type_t;
184
185typedef struct unw_save_loc
186 {
187 unw_save_loc_type_t type;
188 union
189 {
190 unw_word_t addr; /* valid if type==UNW_SLT_MEMORY */
191 unw_regnum_t regnum; /* valid if type==UNW_SLT_REG */
192 }
193 u;
194 unw_tdep_save_loc_t extra; /* target-dependent additional information */
195 }
196unw_save_loc_t;
197
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000198#include <libunwind-dynamic.h>
199
hp.com!davidm76166fb2002-04-05 23:37:55 +0000200/* These routines work both for local and remote unwinding. */
201
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000202extern unw_addr_space_t UNW_OBJ(local_addr_space);
203
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000204extern unw_addr_space_t UNW_OBJ(create_addr_space) (unw_accessors_t *a,
205 int byte_order);
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000206extern void UNW_OBJ(destroy_addr_space) (unw_addr_space_t as);
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000207extern unw_accessors_t *UNW_ARCH_OBJ(get_accessors) (unw_addr_space_t as);
208extern void UNW_ARCH_OBJ(flush_cache)(unw_addr_space_t as,
209 unw_word_t lo, unw_word_t hi);
210extern int UNW_ARCH_OBJ(set_caching_policy)(unw_addr_space_t as,
211 unw_caching_policy_t policy);
212extern const char *UNW_ARCH_OBJ(regname) (int regnum);
213
mostang.com!davidma38baad2003-01-17 07:48:52 +0000214extern int UNW_OBJ(init_local) (unw_cursor_t *c, unw_context_t *u);
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000215extern int UNW_OBJ(init_remote) (unw_cursor_t *c, unw_addr_space_t as,
216 void *as_arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000217extern int UNW_OBJ(step) (unw_cursor_t *c);
218extern int UNW_OBJ(resume) (unw_cursor_t *c);
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000219extern int UNW_OBJ(get_proc_info) (unw_cursor_t *c, unw_proc_info_t *pi);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000220extern int UNW_OBJ(get_reg) (unw_cursor_t *c, int regnum, unw_word_t *valp);
221extern int UNW_OBJ(set_reg) (unw_cursor_t *c, int regnum, unw_word_t val);
222extern int UNW_OBJ(get_fpreg) (unw_cursor_t *c, int regnum, unw_fpreg_t *val);
223extern int UNW_OBJ(set_fpreg) (unw_cursor_t *c, int regnum, unw_fpreg_t val);
224extern int UNW_OBJ(get_save_loc) (unw_cursor_t *c, int regnum,
225 unw_save_loc_t *loc);
226extern int UNW_OBJ(is_signal_frame) (unw_cursor_t *c);
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000227extern int UNW_OBJ(get_proc_name) (unw_cursor_t *c, char *buf, size_t buf_len);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000228
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000229#define unw_local_addr_space UNW_OBJ(local_addr_space)
230
231/* Create a new address space (in addition to the default
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000232 local_addr_space). BYTE_ORDER can be 0 to select the default
233 byte-order or one of the byte-order values defined by <endian.h>
mostang.com!davidma4bea2c2003-01-21 08:08:32 +0000234 (e.g., __LITTLE_ENDIAN or __BIG_ENDIAN). The default byte-order is
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000235 either implied by the target architecture (e.g., x86 is always
236 little-endian) or is select based on the byte-order of the host.
237
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000238 This routine is NOT signal-safe. */
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000239#define unw_create_addr_space(a,b) UNW_OBJ(create_addr_space)(a,b)
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000240
241/* Destroy an address space.
242 This routine is NOT signal-safe. */
243#define unw_destroy_addr_space(as) UNW_OBJ(destroy_addr_space)(as)
244
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000245/* Retrieve a pointer to the accessors structure associated with
246 address space AS.
247 This routine is signal-safe. */
248#define unw_get_accessors(as) UNW_ARCH_OBJ(get_accessors)(as)
249
hp.com!davidm76166fb2002-04-05 23:37:55 +0000250/* Initialize cursor C such that unwinding starts at the point
251 represented by the context U. Returns zero on success, negative
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000252 value on failure.
253 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000254#define unw_init_local(c,u) UNW_OBJ(init_local)(c, u)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000255
256/* Initialize cursor C such that it accesses the unwind target through
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000257 accessors A.
258 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000259#define unw_init_remote(c,a,arg) UNW_OBJ(init_remote)(c, a, arg)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000260
261/* Move cursor up by one step (up meaning toward earlier, less deeply
262 nested frames). Returns positive number if there are more frames
263 to unwind, 0 if last frame has been reached, negative number in
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000264 case of an error.
265 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000266#define unw_step(c) UNW_OBJ(step)(c)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000267
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000268/* Resume execution at the point identified by the cursor.
269 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000270#define unw_resume(c) UNW_OBJ(resume)(c)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000271
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000272/* Return the proc-info associated with the cursor.
273 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000274#define unw_get_proc_info(c,p) UNW_OBJ(get_proc_info)(c,p)
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000275
hp.com!davidm76166fb2002-04-05 23:37:55 +0000276/* Register accessor routines. Return zero on success, negative value
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000277 on failure.
278 These routines are signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000279#define unw_get_reg(c,r,v) UNW_OBJ(get_reg)(c,r,v)
280#define unw_set_reg(c,r,v) UNW_OBJ(set_reg)(c,r,v)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000281
282/* Floating-point accessor routines. Return zero on success, negative
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000283 value on failure.
284 These routines are signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000285#define unw_get_fpreg(c,r,v) UNW_OBJ(get_fpreg)(c,r,v)
286#define unw_set_fpreg(c,r,v) UNW_OBJ(set_fpreg)(c,r,v)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000287
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000288/* Get the save-location of register R.
289 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000290#define unw_get_save_loc(c,r,l) UNW_OBJ(get_save_loc)(c,r,l)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000291
292/* Return 1 if register number R is a floating-point register, zero
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000293 otherwise.
294 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000295#define unw_is_fpreg(r) unw_tdep_is_fpreg(r)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000296
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000297/* Returns non-zero value if the cursor points to a signal frame.
298 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000299#define unw_is_signal_frame(c) UNW_OBJ(is_signal_frame)(c)
mostang.com!davidm58142c02002-04-12 05:02:40 +0000300
mostang.com!davidmb6251b02002-12-12 09:17:41 +0000301/* Return the name of the procedure that created the frame identified
302 by the cursor. The returned string is ASCII NUL terminated. If the
303 string buffer is too small to store the entire name, the first
304 portion of the string that can fit is stored in the buffer (along
305 with a terminating NUL character) and -UNW_ENOMEM is returned. If
306 no name can be determined, -UNW_ENOINFO is returned. */
307#define unw_get_proc_name(c,s,l) UNW_OBJ(get_proc_name)(c, s, l)
308
mostang.com!davidm58142c02002-04-12 05:02:40 +0000309/* Returns the canonical register name of register R. R must be in
310 the range from 0 to UNW_REG_LAST. Like all other unwind routines,
311 this one is re-entrant (i.e., the returned string must be a string
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000312 constant.
313 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000314#define unw_regname(r) UNW_ARCH_OBJ(regname)(r)
mostang.com!davidm16f21892002-11-09 07:59:02 +0000315
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000316/* Sets the caching policy of address space AS. Caching can be
317 disabled completely by setting the policy to UNW_CACHE_NONE. With
318 UNW_CACHE_GLOBAL, there is a single cache that is shared across all
319 threads. With UNW_CACHE_PER_THREAD, each thread gets its own
320 cache, which can improve performance thanks to less locking and
321 better locality. By default, UNW_CACHE_GLOBAL is in effect.
322 This routine is NOT signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000323#define unw_set_caching_policy(as, p) UNW_ARCH_OBJ(set_caching_policy)(as, p)
mostang.com!davidm16f21892002-11-09 07:59:02 +0000324
325/* Flush all caches (global, per-thread, or any other caches that
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000326 might exist) in address-space AS of information at least relating
327 to the address-range LO to HI (non-inclusive). LO and HI are only
328 a performance hint and the function is allowed to over-flush (i.e.,
329 flush more than the requested address-range). Furthermore, if LO
330 and HI are both 0, the entire address-range is flushed. This
331 function must be called if any of unwind information might have
332 changed (e.g., because a library might have been removed via a call
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000333 to dlclose()).
334 This routine is signal-safe. */
mostang.com!davidm20a6c1a2002-12-19 07:16:50 +0000335#define unw_flush_cache(as,lo,hi) UNW_ARCH_OBJ(flush_cache)(as, lo, hi)
hp.com!davidm68bdac32003-01-28 03:40:06 +0000336
337/* Helper routines which make it easy to use libunwind via ptrace().
338 They're available only if UNW_REMOTE is _not_ defined and they
339 aren't really part of the libunwind API. They are simple enough
340 not to warrant creating a separate library for them. */
341
342extern void *_UPT_create (pid_t);
343extern void _UPT_destroy (void *upt);
344extern int _UPT_find_proc_info (unw_addr_space_t as, unw_word_t ip,
345 unw_proc_info_t *pi, int need_unwind_info,
346 void *arg);
347extern void _UPT_put_unwind_info (unw_addr_space_t as, unw_proc_info_t *pi,
348 void *arg);
349extern int _UPT_get_dyn_info_list_addr (unw_addr_space_t as,
350 unw_word_t *dil_addr, void *arg);
351extern int _UPT_access_mem (unw_addr_space_t as, unw_word_t addr,
352 unw_word_t *val, int write, void *arg);
353extern int _UPT_access_reg (unw_addr_space_t as, unw_regnum_t reg,
354 unw_word_t *val, int write, void *arg);
355extern int _UPT_access_fpreg (unw_addr_space_t as, unw_regnum_t reg,
356 unw_fpreg_t *val, int write, void *arg);
357extern unw_accessors_t _UPT_accessors;