blob: 8a284056902f2e16814c8d6a3188fe9ba6dcbf1d [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
39/* This needs to be big enough to accommodate the unwind state of any
40 architecture, while leaving some slack for future expansion.
41 Changing this value will require recompiling all users of this
42 library. */
43#define UNW_STATE_LEN 127
44
45/* Error codes. The unwind routines return the *negated* values of
46 these error codes on error and a non-negative value on success. */
47typedef enum
48 {
49 UNW_ESUCCESS = 0, /* no error */
50 UNW_EUNSPEC, /* unspecified (general) error */
51 UNW_ENOMEM, /* out of memory */
52 UNW_EBADREG, /* bad register number */
53 UNW_EREADONLYREG, /* attempt to write read-only register */
54 UNW_ESTOPUNWIND, /* stop unwinding */
55 UNW_EINVALIDIP, /* invalid IP */
56 UNW_EBADFRAME, /* bad frame */
mostang.com!davidm50d7a152002-12-03 08:19:58 +000057 UNW_EINVAL, /* unsupported operation or bad value */
hp.com!davidm76166fb2002-04-05 23:37:55 +000058 UNW_EBADVERSION, /* unwind info has unsupported version */
59 UNW_ENOINFO /* no unwind info found */
60 }
61unw_error_t;
62
63/* The following enum defines the indices for a couple of
64 (pseudo-)registers which have the same meaning across all
65 platforms. (RO) means read-only. (RW) means read-write. General
66 registers (aka "integer registers") are expected to start with
67 index 0. The number of such registers is architecture-dependent.
68 The remaining indices can be used as an architecture sees fit. The
69 last valid register index is given by UNW_REG_LAST. */
70typedef enum
71 {
72 UNW_REG_IP = UNW_TDEP_IP, /* (rw) instruction pointer (pc) */
73 UNW_REG_SP = UNW_TDEP_SP, /* (ro) stack pointer */
hp.com!davidm76166fb2002-04-05 23:37:55 +000074 UNW_REG_LAST = UNW_TDEP_LAST_REG
75 }
76unw_frame_regnum_t;
77
mostang.com!davidm16f21892002-11-09 07:59:02 +000078typedef enum
79 {
80 UNW_CACHE_NONE, /* no caching */
81 UNW_CACHE_GLOBAL, /* shared global cache */
82 UNW_CACHE_PER_THREAD /* per-thread caching */
83 }
84unw_caching_policy_t;
85
hp.com!davidm76166fb2002-04-05 23:37:55 +000086typedef int unw_regnum_t;
87
88/* The unwind cursor starts at the youngest (most deeply nested) frame
89 and is used to track the frame state as the unwinder steps from
90 frame to frame. It is safe to make (shallow) copies of variables
91 of this type. */
92typedef struct unw_cursor
93 {
94 unw_word_t opaque[UNW_STATE_LEN];
95 }
96unw_cursor_t;
97
98/* This type encapsulates the entire (preserved) machine-state. */
99typedef unw_tdep_context_t unw_context_t;
100
101/* unw_getcontext() fills the unw_context_t pointed to by UC with the
102 machine state as it exists at the call-site. For implementation
103 reasons, this needs to be a target-dependent macro. It's easiest
104 to think of unw_getcontext() as being identical to getcontext(). */
105#define unw_getcontext(uc) unw_tdep_getcontext(uc)
106
107/* We will assume that "long double" is sufficiently large and aligned
108 to hold the contents of a floating-point register. Note that the
109 fp register format is not usually the same format as a "long
110 double". Instead, the content of unw_fpreg_t should be manipulated
111 only through the "raw.bits" member. */
112typedef union
113 {
114 struct { unw_word_t bits[1]; } raw;
115 long double dummy; /* dummy to force 16-byte alignment */
116 }
117unw_fpreg_t;
118
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000119typedef struct unw_addr_space *unw_addr_space_t;
120
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000121typedef struct unw_proc_info
122 {
123 unw_word_t start_ip; /* first IP covered by this procedure */
124 unw_word_t end_ip; /* first IP NOT covered by this procedure */
125 unw_word_t lsda; /* address of lang.-spec. data area (if any) */
126 unw_word_t handler; /* optional personality routine */
127 unw_word_t gp; /* global-pointer value for this procedure */
128 unw_word_t flags; /* misc. flags */
129 const char *proc_name; /* optional name of procedure */
130
131 int format; /* unwind-info format (arch-specific) */
132 void *unwind_info; /* unwind-info (arch-specific) */
133 size_t unwind_info_size; /* size of the informat (if applicable) */
134 }
135unw_proc_info_t;
136
hp.com!davidm76166fb2002-04-05 23:37:55 +0000137/* These are backend callback routines that provide access to the
138 state of a "remote" process. This can be used, for example, to
139 unwind another process through the ptrace() interface. */
140typedef struct unw_accessors
141 {
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000142 /* Look up the unwind info associated with instruction-pointer IP.
143 On success, the routine fills in the PROC_INFO structure. */
144 int (*find_proc_info) (unw_addr_space_t as, unw_word_t ip,
145 unw_proc_info_t *proc_info, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000146
147 /* Access aligned word at address ADDR. */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000148 int (*access_mem) (unw_addr_space_t as, unw_word_t addr,
149 unw_word_t *val, int write, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000150
151 /* Access register number REG at address ADDR. */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000152 int (*access_reg) (unw_addr_space_t as, unw_regnum_t reg,
153 unw_word_t *val, int write, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000154
155 /* Access register number REG at address ADDR. */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000156 int (*access_fpreg) (unw_addr_space_t as, unw_regnum_t reg,
157 unw_fpreg_t *val, int write, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000158
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000159 int (*resume) (unw_addr_space_t as, unw_cursor_t *c, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000160 }
161unw_accessors_t;
162
163typedef enum unw_save_loc_type
164 {
165 UNW_SLT_NONE, /* register is not saved ("not an l-value") */
166 UNW_SLT_MEMORY, /* register has been saved in memory */
167 UNW_SLT_REG /* register has been saved in (another) register */
168 }
169unw_save_loc_type_t;
170
171typedef struct unw_save_loc
172 {
173 unw_save_loc_type_t type;
174 union
175 {
176 unw_word_t addr; /* valid if type==UNW_SLT_MEMORY */
177 unw_regnum_t regnum; /* valid if type==UNW_SLT_REG */
178 }
179 u;
180 unw_tdep_save_loc_t extra; /* target-dependent additional information */
181 }
182unw_save_loc_t;
183
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000184#include <libunwind-dynamic.h>
185
hp.com!davidm76166fb2002-04-05 23:37:55 +0000186/* These routines work both for local and remote unwinding. */
187
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000188extern unw_addr_space_t UNW_OBJ(local_addr_space);
189
190extern unw_addr_space_t UNW_OBJ(create_addr_space) (unw_accessors_t *a);
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000191extern unw_accessors_t *UNW_OBJ(get_accessors) (unw_addr_space_t as);
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000192extern void UNW_OBJ(destroy_addr_space) (unw_addr_space_t as);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000193extern int UNW_OBJ(init_local) (unw_cursor_t *c, ucontext_t *u);
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000194extern int UNW_OBJ(init_remote) (unw_cursor_t *c, unw_addr_space_t as,
195 void *as_arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000196extern int UNW_OBJ(step) (unw_cursor_t *c);
197extern int UNW_OBJ(resume) (unw_cursor_t *c);
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000198extern int UNW_OBJ(get_proc_info) (unw_cursor_t *c, unw_proc_info_t *pi);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000199extern int UNW_OBJ(get_reg) (unw_cursor_t *c, int regnum, unw_word_t *valp);
200extern int UNW_OBJ(set_reg) (unw_cursor_t *c, int regnum, unw_word_t val);
201extern int UNW_OBJ(get_fpreg) (unw_cursor_t *c, int regnum, unw_fpreg_t *val);
202extern int UNW_OBJ(set_fpreg) (unw_cursor_t *c, int regnum, unw_fpreg_t val);
203extern int UNW_OBJ(get_save_loc) (unw_cursor_t *c, int regnum,
204 unw_save_loc_t *loc);
205extern int UNW_OBJ(is_signal_frame) (unw_cursor_t *c);
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000206extern const char *UNW_ARCH_OBJ(regname) (int regnum);
207extern int UNW_OBJ(find_dynamic_proc_info) (unw_addr_space_t as, unw_word_t ip,
208 unw_proc_info_t *pi, void *arg);
hp.com!davidm76166fb2002-04-05 23:37:55 +0000209
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000210#define unw_local_addr_space UNW_OBJ(local_addr_space)
211
212/* Create a new address space (in addition to the default
213 local_addr_space).
214 This routine is NOT signal-safe. */
215#define unw_create_addr_space(a) UNW_OBJ(create_addr_space)(a)
216
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000217/* Retrieve a pointer to the accessors structure associated with
218 address space AS.
219 This routine is signal-safe. */
220#define unw_get_accessors(as) UNW_OBJ(get_accessors)(as)
221
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000222/* Destroy an address space.
223 This routine is NOT signal-safe. */
224#define unw_destroy_addr_space(as) UNW_OBJ(destroy_addr_space)(as)
225
hp.com!davidm76166fb2002-04-05 23:37:55 +0000226/* Initialize cursor C such that unwinding starts at the point
227 represented by the context U. Returns zero on success, negative
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000228 value on failure.
229 This routine is signal-safe. */
hp.com!davidm76166fb2002-04-05 23:37:55 +0000230#define unw_init_local(c,u) UNW_OBJ(init_local)(c, u)
231
232/* Initialize cursor C such that it accesses the unwind target through
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000233 accessors A.
234 This routine is signal-safe. */
235#define unw_init_remote(c,a,arg) UNW_OBJ(init_remote)(c, a, arg)
hp.com!davidm76166fb2002-04-05 23:37:55 +0000236
237/* Move cursor up by one step (up meaning toward earlier, less deeply
238 nested frames). Returns positive number if there are more frames
239 to unwind, 0 if last frame has been reached, negative number in
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000240 case of an error.
241 This routine is signal-safe. */
hp.com!davidm76166fb2002-04-05 23:37:55 +0000242#define unw_step(c) UNW_OBJ(step)(c)
243
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000244/* Resume execution at the point identified by the cursor.
245 This routine is signal-safe. */
hp.com!davidm76166fb2002-04-05 23:37:55 +0000246#define unw_resume(c) UNW_OBJ(resume)(c)
247
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000248/* Return the proc-info associated with the cursor.
249 This routine is signal-safe. */
250#define unw_get_proc_info(c,p) UNW_OBJ(get_proc_info)(c,p)
251
hp.com!davidm76166fb2002-04-05 23:37:55 +0000252/* Register accessor routines. Return zero on success, negative value
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000253 on failure.
254 These routines are signal-safe. */
hp.com!davidm76166fb2002-04-05 23:37:55 +0000255#define unw_get_reg(c,r,v) UNW_OBJ(get_reg)(c,r,v)
256#define unw_set_reg(c,r,v) UNW_OBJ(set_reg)(c,r,v)
257
258/* Floating-point accessor routines. Return zero on success, negative
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000259 value on failure.
260 These routines are signal-safe. */
hp.com!davidm76166fb2002-04-05 23:37:55 +0000261#define unw_get_fpreg(c,r,v) UNW_OBJ(get_fpreg)(c,r,v)
262#define unw_set_fpreg(c,r,v) UNW_OBJ(set_fpreg)(c,r,v)
263
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000264/* Get the save-location of register R.
265 This routine is signal-safe. */
hp.com!davidm76166fb2002-04-05 23:37:55 +0000266#define unw_get_save_loc(c,r,l) UNW_OBJ(get_save_loc)(c,r,l)
267
268/* Return 1 if register number R is a floating-point register, zero
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000269 otherwise.
270 This routine is signal-safe. */
hp.com!davidm76166fb2002-04-05 23:37:55 +0000271#define unw_is_fpreg(r) unw_tdep_is_fpreg(r)
272
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000273/* Returns non-zero value if the cursor points to a signal frame.
274 This routine is signal-safe. */
hp.com!davidm76166fb2002-04-05 23:37:55 +0000275#define unw_is_signal_frame(c) UNW_OBJ(is_signal_frame)(c)
mostang.com!davidm58142c02002-04-12 05:02:40 +0000276
277/* Returns the canonical register name of register R. R must be in
278 the range from 0 to UNW_REG_LAST. Like all other unwind routines,
279 this one is re-entrant (i.e., the returned string must be a string
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000280 constant.
281 This routine is signal-safe. */
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000282#define unw_regname(r) UNW_ARCH_OBJ(regname)(r)
mostang.com!davidm16f21892002-11-09 07:59:02 +0000283
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000284/* Sets the caching policy of address space AS. Caching can be
285 disabled completely by setting the policy to UNW_CACHE_NONE. With
286 UNW_CACHE_GLOBAL, there is a single cache that is shared across all
287 threads. With UNW_CACHE_PER_THREAD, each thread gets its own
288 cache, which can improve performance thanks to less locking and
289 better locality. By default, UNW_CACHE_GLOBAL is in effect.
290 This routine is NOT signal-safe. */
291#define unw_set_caching_policy(as, p) UNW_OBJ(set_caching_policy)(as, p)
mostang.com!davidm16f21892002-11-09 07:59:02 +0000292
293/* Flush all caches (global, per-thread, or any other caches that
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000294 might exist) in address-space AS of information at least relating
295 to the address-range LO to HI (non-inclusive). LO and HI are only
296 a performance hint and the function is allowed to over-flush (i.e.,
297 flush more than the requested address-range). Furthermore, if LO
298 and HI are both 0, the entire address-range is flushed. This
299 function must be called if any of unwind information might have
300 changed (e.g., because a library might have been removed via a call
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000301 to dlclose()).
302 This routine is signal-safe. */
mostang.com!davidm87bc2e32002-11-16 06:50:04 +0000303#define unw_flush_cache(as,lo,hi) UNW_OBJ(flush_cache)(as, lo, hi)
mostang.com!davidm50d7a152002-12-03 08:19:58 +0000304
305/* Locate the procedure info for instruction pointer IP, assuming
306 the procedure was registered dynamically (at runtime).
307 This routine is signal-safe. */
308#define unw_find_dynamic_proc_info(as,ip,pi,arg) \
309 UNW_OBJ(find_dynamic_proc_info)(as, ip, pi, arg)