1b725ae77Skettenis /* Frame unwinder for frames with DWARF Call Frame Information.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 2003, 2004 Free Software Foundation, Inc.
4b725ae77Skettenis
5b725ae77Skettenis Contributed by Mark Kettenis.
6b725ae77Skettenis
7b725ae77Skettenis This file is part of GDB.
8b725ae77Skettenis
9b725ae77Skettenis This program is free software; you can redistribute it and/or modify
10b725ae77Skettenis it under the terms of the GNU General Public License as published by
11b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
12b725ae77Skettenis (at your option) any later version.
13b725ae77Skettenis
14b725ae77Skettenis This program is distributed in the hope that it will be useful,
15b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
16b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17b725ae77Skettenis GNU General Public License for more details.
18b725ae77Skettenis
19b725ae77Skettenis You should have received a copy of the GNU General Public License
20b725ae77Skettenis along with this program; if not, write to the Free Software
21b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
22b725ae77Skettenis Boston, MA 02111-1307, USA. */
23b725ae77Skettenis
24b725ae77Skettenis #include "defs.h"
25b725ae77Skettenis #include "dwarf2expr.h"
26b725ae77Skettenis #include "elf/dwarf2.h"
27b725ae77Skettenis #include "frame.h"
28b725ae77Skettenis #include "frame-base.h"
29b725ae77Skettenis #include "frame-unwind.h"
30b725ae77Skettenis #include "gdbcore.h"
31b725ae77Skettenis #include "gdbtypes.h"
32b725ae77Skettenis #include "symtab.h"
33b725ae77Skettenis #include "objfiles.h"
34b725ae77Skettenis #include "regcache.h"
35b725ae77Skettenis
36b725ae77Skettenis #include "gdb_assert.h"
37b725ae77Skettenis #include "gdb_string.h"
38b725ae77Skettenis
39b725ae77Skettenis #include "complaints.h"
40b725ae77Skettenis #include "dwarf2-frame.h"
41b725ae77Skettenis
42b725ae77Skettenis /* Call Frame Information (CFI). */
43b725ae77Skettenis
44b725ae77Skettenis /* Common Information Entry (CIE). */
45b725ae77Skettenis
46b725ae77Skettenis struct dwarf2_cie
47b725ae77Skettenis {
48b725ae77Skettenis /* Offset into the .debug_frame section where this CIE was found.
49b725ae77Skettenis Used to identify this CIE. */
50b725ae77Skettenis ULONGEST cie_pointer;
51b725ae77Skettenis
52b725ae77Skettenis /* Constant that is factored out of all advance location
53b725ae77Skettenis instructions. */
54b725ae77Skettenis ULONGEST code_alignment_factor;
55b725ae77Skettenis
56b725ae77Skettenis /* Constants that is factored out of all offset instructions. */
57b725ae77Skettenis LONGEST data_alignment_factor;
58b725ae77Skettenis
59b725ae77Skettenis /* Return address column. */
60b725ae77Skettenis ULONGEST return_address_register;
61b725ae77Skettenis
62b725ae77Skettenis /* Instruction sequence to initialize a register set. */
63b725ae77Skettenis unsigned char *initial_instructions;
64b725ae77Skettenis unsigned char *end;
65b725ae77Skettenis
66b725ae77Skettenis /* Encoding of addresses. */
67b725ae77Skettenis unsigned char encoding;
68b725ae77Skettenis
69b725ae77Skettenis /* True if a 'z' augmentation existed. */
70b725ae77Skettenis unsigned char saw_z_augmentation;
71b725ae77Skettenis
72b725ae77Skettenis struct dwarf2_cie *next;
73b725ae77Skettenis };
74b725ae77Skettenis
75b725ae77Skettenis /* Frame Description Entry (FDE). */
76b725ae77Skettenis
77b725ae77Skettenis struct dwarf2_fde
78b725ae77Skettenis {
79b725ae77Skettenis /* CIE for this FDE. */
80b725ae77Skettenis struct dwarf2_cie *cie;
81b725ae77Skettenis
82b725ae77Skettenis /* First location associated with this FDE. */
83b725ae77Skettenis CORE_ADDR initial_location;
84b725ae77Skettenis
85b725ae77Skettenis /* Number of bytes of program instructions described by this FDE. */
86b725ae77Skettenis CORE_ADDR address_range;
87b725ae77Skettenis
88b725ae77Skettenis /* Instruction sequence. */
89b725ae77Skettenis unsigned char *instructions;
90b725ae77Skettenis unsigned char *end;
91b725ae77Skettenis
92b725ae77Skettenis struct dwarf2_fde *next;
93b725ae77Skettenis };
94b725ae77Skettenis
95b725ae77Skettenis static struct dwarf2_fde *dwarf2_frame_find_fde (CORE_ADDR *pc);
96b725ae77Skettenis
97b725ae77Skettenis
98b725ae77Skettenis /* Structure describing a frame state. */
99b725ae77Skettenis
100b725ae77Skettenis struct dwarf2_frame_state
101b725ae77Skettenis {
102b725ae77Skettenis /* Each register save state can be described in terms of a CFA slot,
103b725ae77Skettenis another register, or a location expression. */
104b725ae77Skettenis struct dwarf2_frame_state_reg_info
105b725ae77Skettenis {
106b725ae77Skettenis struct dwarf2_frame_state_reg *reg;
107b725ae77Skettenis int num_regs;
108b725ae77Skettenis
109b725ae77Skettenis /* Used to implement DW_CFA_remember_state. */
110b725ae77Skettenis struct dwarf2_frame_state_reg_info *prev;
111b725ae77Skettenis } regs;
112b725ae77Skettenis
113b725ae77Skettenis LONGEST cfa_offset;
114b725ae77Skettenis ULONGEST cfa_reg;
115b725ae77Skettenis unsigned char *cfa_exp;
116b725ae77Skettenis enum {
117b725ae77Skettenis CFA_UNSET,
118b725ae77Skettenis CFA_REG_OFFSET,
119b725ae77Skettenis CFA_EXP
120b725ae77Skettenis } cfa_how;
121b725ae77Skettenis
122b725ae77Skettenis /* The PC described by the current frame state. */
123b725ae77Skettenis CORE_ADDR pc;
124b725ae77Skettenis
125b725ae77Skettenis /* Initial register set from the CIE.
126b725ae77Skettenis Used to implement DW_CFA_restore. */
127b725ae77Skettenis struct dwarf2_frame_state_reg_info initial;
128b725ae77Skettenis
129b725ae77Skettenis /* The information we care about from the CIE. */
130b725ae77Skettenis LONGEST data_align;
131b725ae77Skettenis ULONGEST code_align;
132b725ae77Skettenis ULONGEST retaddr_column;
133b725ae77Skettenis };
134b725ae77Skettenis
135b725ae77Skettenis /* Store the length the expression for the CFA in the `cfa_reg' field,
136b725ae77Skettenis which is unused in that case. */
137b725ae77Skettenis #define cfa_exp_len cfa_reg
138b725ae77Skettenis
139b725ae77Skettenis /* Assert that the register set RS is large enough to store NUM_REGS
140b725ae77Skettenis columns. If necessary, enlarge the register set. */
141b725ae77Skettenis
142b725ae77Skettenis static void
dwarf2_frame_state_alloc_regs(struct dwarf2_frame_state_reg_info * rs,int num_regs)143b725ae77Skettenis dwarf2_frame_state_alloc_regs (struct dwarf2_frame_state_reg_info *rs,
144b725ae77Skettenis int num_regs)
145b725ae77Skettenis {
146b725ae77Skettenis size_t size = sizeof (struct dwarf2_frame_state_reg);
147b725ae77Skettenis
148b725ae77Skettenis if (num_regs <= rs->num_regs)
149b725ae77Skettenis return;
150b725ae77Skettenis
151b725ae77Skettenis rs->reg = (struct dwarf2_frame_state_reg *)
152b725ae77Skettenis xrealloc (rs->reg, num_regs * size);
153b725ae77Skettenis
154b725ae77Skettenis /* Initialize newly allocated registers. */
155b725ae77Skettenis memset (rs->reg + rs->num_regs, 0, (num_regs - rs->num_regs) * size);
156b725ae77Skettenis rs->num_regs = num_regs;
157b725ae77Skettenis }
158b725ae77Skettenis
159b725ae77Skettenis /* Copy the register columns in register set RS into newly allocated
160b725ae77Skettenis memory and return a pointer to this newly created copy. */
161b725ae77Skettenis
162b725ae77Skettenis static struct dwarf2_frame_state_reg *
dwarf2_frame_state_copy_regs(struct dwarf2_frame_state_reg_info * rs)163b725ae77Skettenis dwarf2_frame_state_copy_regs (struct dwarf2_frame_state_reg_info *rs)
164b725ae77Skettenis {
165b725ae77Skettenis size_t size = rs->num_regs * sizeof (struct dwarf2_frame_state_reg_info);
166b725ae77Skettenis struct dwarf2_frame_state_reg *reg;
167b725ae77Skettenis
168b725ae77Skettenis reg = (struct dwarf2_frame_state_reg *) xmalloc (size);
169b725ae77Skettenis memcpy (reg, rs->reg, size);
170b725ae77Skettenis
171b725ae77Skettenis return reg;
172b725ae77Skettenis }
173b725ae77Skettenis
174b725ae77Skettenis /* Release the memory allocated to register set RS. */
175b725ae77Skettenis
176b725ae77Skettenis static void
dwarf2_frame_state_free_regs(struct dwarf2_frame_state_reg_info * rs)177b725ae77Skettenis dwarf2_frame_state_free_regs (struct dwarf2_frame_state_reg_info *rs)
178b725ae77Skettenis {
179b725ae77Skettenis if (rs)
180b725ae77Skettenis {
181b725ae77Skettenis dwarf2_frame_state_free_regs (rs->prev);
182b725ae77Skettenis
183b725ae77Skettenis xfree (rs->reg);
184b725ae77Skettenis xfree (rs);
185b725ae77Skettenis }
186b725ae77Skettenis }
187b725ae77Skettenis
188b725ae77Skettenis /* Release the memory allocated to the frame state FS. */
189b725ae77Skettenis
190b725ae77Skettenis static void
dwarf2_frame_state_free(void * p)191b725ae77Skettenis dwarf2_frame_state_free (void *p)
192b725ae77Skettenis {
193b725ae77Skettenis struct dwarf2_frame_state *fs = p;
194b725ae77Skettenis
195b725ae77Skettenis dwarf2_frame_state_free_regs (fs->initial.prev);
196b725ae77Skettenis dwarf2_frame_state_free_regs (fs->regs.prev);
197b725ae77Skettenis xfree (fs->initial.reg);
198b725ae77Skettenis xfree (fs->regs.reg);
199b725ae77Skettenis xfree (fs);
200b725ae77Skettenis }
201b725ae77Skettenis
202b725ae77Skettenis
203b725ae77Skettenis /* Helper functions for execute_stack_op. */
204b725ae77Skettenis
205b725ae77Skettenis static CORE_ADDR
read_reg(void * baton,int reg)206b725ae77Skettenis read_reg (void *baton, int reg)
207b725ae77Skettenis {
208b725ae77Skettenis struct frame_info *next_frame = (struct frame_info *) baton;
209b725ae77Skettenis struct gdbarch *gdbarch = get_frame_arch (next_frame);
210b725ae77Skettenis int regnum;
211b725ae77Skettenis char *buf;
212b725ae77Skettenis
213b725ae77Skettenis regnum = DWARF2_REG_TO_REGNUM (reg);
214b725ae77Skettenis
215b725ae77Skettenis buf = (char *) alloca (register_size (gdbarch, regnum));
216b725ae77Skettenis frame_unwind_register (next_frame, regnum, buf);
217b725ae77Skettenis return extract_typed_address (buf, builtin_type_void_data_ptr);
218b725ae77Skettenis }
219b725ae77Skettenis
220b725ae77Skettenis static void
read_mem(void * baton,char * buf,CORE_ADDR addr,size_t len)221b725ae77Skettenis read_mem (void *baton, char *buf, CORE_ADDR addr, size_t len)
222b725ae77Skettenis {
223b725ae77Skettenis read_memory (addr, buf, len);
224b725ae77Skettenis }
225b725ae77Skettenis
226b725ae77Skettenis static void
no_get_frame_base(void * baton,unsigned char ** start,size_t * length)227b725ae77Skettenis no_get_frame_base (void *baton, unsigned char **start, size_t *length)
228b725ae77Skettenis {
229b725ae77Skettenis internal_error (__FILE__, __LINE__,
230b725ae77Skettenis "Support for DW_OP_fbreg is unimplemented");
231b725ae77Skettenis }
232b725ae77Skettenis
233b725ae77Skettenis static CORE_ADDR
no_get_tls_address(void * baton,CORE_ADDR offset)234b725ae77Skettenis no_get_tls_address (void *baton, CORE_ADDR offset)
235b725ae77Skettenis {
236b725ae77Skettenis internal_error (__FILE__, __LINE__,
237b725ae77Skettenis "Support for DW_OP_GNU_push_tls_address is unimplemented");
238b725ae77Skettenis }
239b725ae77Skettenis
240b725ae77Skettenis static CORE_ADDR
execute_stack_op(unsigned char * exp,ULONGEST len,struct frame_info * next_frame,CORE_ADDR initial)241b725ae77Skettenis execute_stack_op (unsigned char *exp, ULONGEST len,
242b725ae77Skettenis struct frame_info *next_frame, CORE_ADDR initial)
243b725ae77Skettenis {
244b725ae77Skettenis struct dwarf_expr_context *ctx;
245b725ae77Skettenis CORE_ADDR result;
246b725ae77Skettenis
247b725ae77Skettenis ctx = new_dwarf_expr_context ();
248b725ae77Skettenis ctx->baton = next_frame;
249b725ae77Skettenis ctx->read_reg = read_reg;
250b725ae77Skettenis ctx->read_mem = read_mem;
251b725ae77Skettenis ctx->get_frame_base = no_get_frame_base;
252b725ae77Skettenis ctx->get_tls_address = no_get_tls_address;
253b725ae77Skettenis
254b725ae77Skettenis dwarf_expr_push (ctx, initial);
255b725ae77Skettenis dwarf_expr_eval (ctx, exp, len);
256b725ae77Skettenis result = dwarf_expr_fetch (ctx, 0);
257b725ae77Skettenis
258b725ae77Skettenis if (ctx->in_reg)
259b725ae77Skettenis result = read_reg (next_frame, result);
260b725ae77Skettenis
261b725ae77Skettenis free_dwarf_expr_context (ctx);
262b725ae77Skettenis
263b725ae77Skettenis return result;
264b725ae77Skettenis }
265b725ae77Skettenis
266b725ae77Skettenis
267b725ae77Skettenis static void
execute_cfa_program(unsigned char * insn_ptr,unsigned char * insn_end,struct frame_info * next_frame,struct dwarf2_frame_state * fs)268b725ae77Skettenis execute_cfa_program (unsigned char *insn_ptr, unsigned char *insn_end,
269b725ae77Skettenis struct frame_info *next_frame,
270b725ae77Skettenis struct dwarf2_frame_state *fs)
271b725ae77Skettenis {
272b725ae77Skettenis CORE_ADDR pc = frame_pc_unwind (next_frame);
273b725ae77Skettenis int bytes_read;
274b725ae77Skettenis
275b725ae77Skettenis while (insn_ptr < insn_end && fs->pc <= pc)
276b725ae77Skettenis {
277b725ae77Skettenis unsigned char insn = *insn_ptr++;
278b725ae77Skettenis ULONGEST utmp, reg;
279b725ae77Skettenis LONGEST offset;
280b725ae77Skettenis
281b725ae77Skettenis if ((insn & 0xc0) == DW_CFA_advance_loc)
282b725ae77Skettenis fs->pc += (insn & 0x3f) * fs->code_align;
283b725ae77Skettenis else if ((insn & 0xc0) == DW_CFA_offset)
284b725ae77Skettenis {
285b725ae77Skettenis reg = insn & 0x3f;
286b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp);
287b725ae77Skettenis offset = utmp * fs->data_align;
288b725ae77Skettenis dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
289b725ae77Skettenis fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_OFFSET;
290b725ae77Skettenis fs->regs.reg[reg].loc.offset = offset;
291b725ae77Skettenis }
292b725ae77Skettenis else if ((insn & 0xc0) == DW_CFA_restore)
293b725ae77Skettenis {
294b725ae77Skettenis gdb_assert (fs->initial.reg);
295b725ae77Skettenis reg = insn & 0x3f;
296b725ae77Skettenis dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
297b725ae77Skettenis fs->regs.reg[reg] = fs->initial.reg[reg];
298b725ae77Skettenis }
299b725ae77Skettenis else
300b725ae77Skettenis {
301b725ae77Skettenis switch (insn)
302b725ae77Skettenis {
303b725ae77Skettenis case DW_CFA_set_loc:
304b725ae77Skettenis fs->pc = dwarf2_read_address (insn_ptr, insn_end, &bytes_read);
305b725ae77Skettenis insn_ptr += bytes_read;
306b725ae77Skettenis break;
307b725ae77Skettenis
308b725ae77Skettenis case DW_CFA_advance_loc1:
309b725ae77Skettenis utmp = extract_unsigned_integer (insn_ptr, 1);
310b725ae77Skettenis fs->pc += utmp * fs->code_align;
311b725ae77Skettenis insn_ptr++;
312b725ae77Skettenis break;
313b725ae77Skettenis case DW_CFA_advance_loc2:
314b725ae77Skettenis utmp = extract_unsigned_integer (insn_ptr, 2);
315b725ae77Skettenis fs->pc += utmp * fs->code_align;
316b725ae77Skettenis insn_ptr += 2;
317b725ae77Skettenis break;
318b725ae77Skettenis case DW_CFA_advance_loc4:
319b725ae77Skettenis utmp = extract_unsigned_integer (insn_ptr, 4);
320b725ae77Skettenis fs->pc += utmp * fs->code_align;
321b725ae77Skettenis insn_ptr += 4;
322b725ae77Skettenis break;
323b725ae77Skettenis
324b725ae77Skettenis case DW_CFA_offset_extended:
325b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, ®);
326b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp);
327b725ae77Skettenis offset = utmp * fs->data_align;
328b725ae77Skettenis dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
329b725ae77Skettenis fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_OFFSET;
330b725ae77Skettenis fs->regs.reg[reg].loc.offset = offset;
331b725ae77Skettenis break;
332b725ae77Skettenis
333b725ae77Skettenis case DW_CFA_restore_extended:
334b725ae77Skettenis gdb_assert (fs->initial.reg);
335b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, ®);
336b725ae77Skettenis dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
337b725ae77Skettenis fs->regs.reg[reg] = fs->initial.reg[reg];
338b725ae77Skettenis break;
339b725ae77Skettenis
340b725ae77Skettenis case DW_CFA_undefined:
341b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, ®);
342b725ae77Skettenis dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
343b725ae77Skettenis fs->regs.reg[reg].how = DWARF2_FRAME_REG_UNDEFINED;
344b725ae77Skettenis break;
345b725ae77Skettenis
346b725ae77Skettenis case DW_CFA_same_value:
347b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, ®);
348b725ae77Skettenis dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
349b725ae77Skettenis fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAME_VALUE;
350b725ae77Skettenis break;
351b725ae77Skettenis
352b725ae77Skettenis case DW_CFA_register:
353b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, ®);
354b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp);
355b725ae77Skettenis dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
356b725ae77Skettenis fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_REG;
357b725ae77Skettenis fs->regs.reg[reg].loc.reg = utmp;
358b725ae77Skettenis break;
359b725ae77Skettenis
360b725ae77Skettenis case DW_CFA_remember_state:
361b725ae77Skettenis {
362b725ae77Skettenis struct dwarf2_frame_state_reg_info *new_rs;
363b725ae77Skettenis
364b725ae77Skettenis new_rs = XMALLOC (struct dwarf2_frame_state_reg_info);
365b725ae77Skettenis *new_rs = fs->regs;
366b725ae77Skettenis fs->regs.reg = dwarf2_frame_state_copy_regs (&fs->regs);
367b725ae77Skettenis fs->regs.prev = new_rs;
368b725ae77Skettenis }
369b725ae77Skettenis break;
370b725ae77Skettenis
371b725ae77Skettenis case DW_CFA_restore_state:
372b725ae77Skettenis {
373b725ae77Skettenis struct dwarf2_frame_state_reg_info *old_rs = fs->regs.prev;
374b725ae77Skettenis
37511efff7fSkettenis if (old_rs == NULL)
37611efff7fSkettenis {
37711efff7fSkettenis complaint (&symfile_complaints, "\
37811efff7fSkettenis bad CFI data; mismatched DW_CFA_restore_state at 0x%s", paddr (fs->pc));
37911efff7fSkettenis }
38011efff7fSkettenis else
38111efff7fSkettenis {
382b725ae77Skettenis xfree (fs->regs.reg);
383b725ae77Skettenis fs->regs = *old_rs;
384b725ae77Skettenis xfree (old_rs);
385b725ae77Skettenis }
38611efff7fSkettenis }
387b725ae77Skettenis break;
388b725ae77Skettenis
389b725ae77Skettenis case DW_CFA_def_cfa:
390b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_reg);
391b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp);
392b725ae77Skettenis fs->cfa_offset = utmp;
393b725ae77Skettenis fs->cfa_how = CFA_REG_OFFSET;
394b725ae77Skettenis break;
395b725ae77Skettenis
396b725ae77Skettenis case DW_CFA_def_cfa_register:
397b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_reg);
398b725ae77Skettenis fs->cfa_how = CFA_REG_OFFSET;
399b725ae77Skettenis break;
400b725ae77Skettenis
401b725ae77Skettenis case DW_CFA_def_cfa_offset:
402b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_offset);
403b725ae77Skettenis /* cfa_how deliberately not set. */
404b725ae77Skettenis break;
405b725ae77Skettenis
406b725ae77Skettenis case DW_CFA_nop:
407b725ae77Skettenis break;
408b725ae77Skettenis
409b725ae77Skettenis case DW_CFA_def_cfa_expression:
410b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_exp_len);
411b725ae77Skettenis fs->cfa_exp = insn_ptr;
412b725ae77Skettenis fs->cfa_how = CFA_EXP;
413b725ae77Skettenis insn_ptr += fs->cfa_exp_len;
414b725ae77Skettenis break;
415b725ae77Skettenis
416b725ae77Skettenis case DW_CFA_expression:
417b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, ®);
418b725ae77Skettenis dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
419b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp);
420b725ae77Skettenis fs->regs.reg[reg].loc.exp = insn_ptr;
421b725ae77Skettenis fs->regs.reg[reg].exp_len = utmp;
422b725ae77Skettenis fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_EXP;
423b725ae77Skettenis insn_ptr += utmp;
424b725ae77Skettenis break;
425b725ae77Skettenis
426b725ae77Skettenis case DW_CFA_offset_extended_sf:
427b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, ®);
428b725ae77Skettenis insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset);
42911efff7fSkettenis offset *= fs->data_align;
430b725ae77Skettenis dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
431b725ae77Skettenis fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_OFFSET;
432b725ae77Skettenis fs->regs.reg[reg].loc.offset = offset;
433b725ae77Skettenis break;
434b725ae77Skettenis
435b725ae77Skettenis case DW_CFA_def_cfa_sf:
436b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_reg);
437b725ae77Skettenis insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset);
438b725ae77Skettenis fs->cfa_offset = offset * fs->data_align;
439b725ae77Skettenis fs->cfa_how = CFA_REG_OFFSET;
440b725ae77Skettenis break;
441b725ae77Skettenis
442b725ae77Skettenis case DW_CFA_def_cfa_offset_sf:
443b725ae77Skettenis insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset);
444b725ae77Skettenis fs->cfa_offset = offset * fs->data_align;
445b725ae77Skettenis /* cfa_how deliberately not set. */
446b725ae77Skettenis break;
447b725ae77Skettenis
448*84a83e23Skettenis case DW_CFA_val_expression:
449*84a83e23Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, ®);
450*84a83e23Skettenis dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
451*84a83e23Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp);
452*84a83e23Skettenis fs->regs.reg[reg].loc.exp = insn_ptr;
453*84a83e23Skettenis fs->regs.reg[reg].exp_len = utmp;
454*84a83e23Skettenis fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_VAL_EXP;
455*84a83e23Skettenis insn_ptr += utmp;
456*84a83e23Skettenis break;
457*84a83e23Skettenis
458b725ae77Skettenis case DW_CFA_GNU_args_size:
459b725ae77Skettenis /* Ignored. */
460b725ae77Skettenis insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp);
461b725ae77Skettenis break;
462b725ae77Skettenis
463b725ae77Skettenis default:
464b725ae77Skettenis internal_error (__FILE__, __LINE__, "Unknown CFI encountered.");
465b725ae77Skettenis }
466b725ae77Skettenis }
467b725ae77Skettenis }
468b725ae77Skettenis
469b725ae77Skettenis /* Don't allow remember/restore between CIE and FDE programs. */
470b725ae77Skettenis dwarf2_frame_state_free_regs (fs->regs.prev);
471b725ae77Skettenis fs->regs.prev = NULL;
472b725ae77Skettenis }
473b725ae77Skettenis
474b725ae77Skettenis
475b725ae77Skettenis /* Architecture-specific operations. */
476b725ae77Skettenis
477b725ae77Skettenis /* Per-architecture data key. */
478b725ae77Skettenis static struct gdbarch_data *dwarf2_frame_data;
479b725ae77Skettenis
480b725ae77Skettenis struct dwarf2_frame_ops
481b725ae77Skettenis {
482b725ae77Skettenis /* Pre-initialize the register state REG for register REGNUM. */
483b725ae77Skettenis void (*init_reg) (struct gdbarch *, int, struct dwarf2_frame_state_reg *);
484b725ae77Skettenis };
485b725ae77Skettenis
486b725ae77Skettenis /* Default architecture-specific register state initialization
487b725ae77Skettenis function. */
488b725ae77Skettenis
489b725ae77Skettenis static void
dwarf2_frame_default_init_reg(struct gdbarch * gdbarch,int regnum,struct dwarf2_frame_state_reg * reg)490b725ae77Skettenis dwarf2_frame_default_init_reg (struct gdbarch *gdbarch, int regnum,
491b725ae77Skettenis struct dwarf2_frame_state_reg *reg)
492b725ae77Skettenis {
493b725ae77Skettenis /* If we have a register that acts as a program counter, mark it as
494b725ae77Skettenis a destination for the return address. If we have a register that
495b725ae77Skettenis serves as the stack pointer, arrange for it to be filled with the
496b725ae77Skettenis call frame address (CFA). The other registers are marked as
497b725ae77Skettenis unspecified.
498b725ae77Skettenis
499b725ae77Skettenis We copy the return address to the program counter, since many
500b725ae77Skettenis parts in GDB assume that it is possible to get the return address
501b725ae77Skettenis by unwinding the program counter register. However, on ISA's
502b725ae77Skettenis with a dedicated return address register, the CFI usually only
503b725ae77Skettenis contains information to unwind that return address register.
504b725ae77Skettenis
505b725ae77Skettenis The reason we're treating the stack pointer special here is
506b725ae77Skettenis because in many cases GCC doesn't emit CFI for the stack pointer
507b725ae77Skettenis and implicitly assumes that it is equal to the CFA. This makes
508b725ae77Skettenis some sense since the DWARF specification (version 3, draft 8,
509b725ae77Skettenis p. 102) says that:
510b725ae77Skettenis
511b725ae77Skettenis "Typically, the CFA is defined to be the value of the stack
512b725ae77Skettenis pointer at the call site in the previous frame (which may be
513b725ae77Skettenis different from its value on entry to the current frame)."
514b725ae77Skettenis
515b725ae77Skettenis However, this isn't true for all platforms supported by GCC
516b725ae77Skettenis (e.g. IBM S/390 and zSeries). Those architectures should provide
517b725ae77Skettenis their own architecture-specific initialization function. */
518b725ae77Skettenis
519b725ae77Skettenis if (regnum == PC_REGNUM)
520b725ae77Skettenis reg->how = DWARF2_FRAME_REG_RA;
521b725ae77Skettenis else if (regnum == SP_REGNUM)
522b725ae77Skettenis reg->how = DWARF2_FRAME_REG_CFA;
523b725ae77Skettenis }
524b725ae77Skettenis
525b725ae77Skettenis /* Return a default for the architecture-specific operations. */
526b725ae77Skettenis
527b725ae77Skettenis static void *
dwarf2_frame_init(struct obstack * obstack)52811efff7fSkettenis dwarf2_frame_init (struct obstack *obstack)
529b725ae77Skettenis {
530b725ae77Skettenis struct dwarf2_frame_ops *ops;
531b725ae77Skettenis
53211efff7fSkettenis ops = OBSTACK_ZALLOC (obstack, struct dwarf2_frame_ops);
533b725ae77Skettenis ops->init_reg = dwarf2_frame_default_init_reg;
534b725ae77Skettenis return ops;
535b725ae77Skettenis }
536b725ae77Skettenis
537b725ae77Skettenis /* Set the architecture-specific register state initialization
538b725ae77Skettenis function for GDBARCH to INIT_REG. */
539b725ae77Skettenis
540b725ae77Skettenis void
dwarf2_frame_set_init_reg(struct gdbarch * gdbarch,void (* init_reg)(struct gdbarch *,int,struct dwarf2_frame_state_reg *))541b725ae77Skettenis dwarf2_frame_set_init_reg (struct gdbarch *gdbarch,
542b725ae77Skettenis void (*init_reg) (struct gdbarch *, int,
543b725ae77Skettenis struct dwarf2_frame_state_reg *))
544b725ae77Skettenis {
54511efff7fSkettenis struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data);
546b725ae77Skettenis
547b725ae77Skettenis ops->init_reg = init_reg;
548b725ae77Skettenis }
549b725ae77Skettenis
550b725ae77Skettenis /* Pre-initialize the register state REG for register REGNUM. */
551b725ae77Skettenis
552b725ae77Skettenis static void
dwarf2_frame_init_reg(struct gdbarch * gdbarch,int regnum,struct dwarf2_frame_state_reg * reg)553b725ae77Skettenis dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
554b725ae77Skettenis struct dwarf2_frame_state_reg *reg)
555b725ae77Skettenis {
55611efff7fSkettenis struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data);
557b725ae77Skettenis
558b725ae77Skettenis ops->init_reg (gdbarch, regnum, reg);
559b725ae77Skettenis }
560b725ae77Skettenis
561b725ae77Skettenis
562b725ae77Skettenis struct dwarf2_frame_cache
563b725ae77Skettenis {
564b725ae77Skettenis /* DWARF Call Frame Address. */
565b725ae77Skettenis CORE_ADDR cfa;
566b725ae77Skettenis
567b725ae77Skettenis /* Saved registers, indexed by GDB register number, not by DWARF
568b725ae77Skettenis register number. */
569b725ae77Skettenis struct dwarf2_frame_state_reg *reg;
570b725ae77Skettenis };
571b725ae77Skettenis
572b725ae77Skettenis static struct dwarf2_frame_cache *
dwarf2_frame_cache(struct frame_info * next_frame,void ** this_cache)573b725ae77Skettenis dwarf2_frame_cache (struct frame_info *next_frame, void **this_cache)
574b725ae77Skettenis {
575b725ae77Skettenis struct cleanup *old_chain;
576b725ae77Skettenis struct gdbarch *gdbarch = get_frame_arch (next_frame);
577b725ae77Skettenis const int num_regs = NUM_REGS + NUM_PSEUDO_REGS;
578b725ae77Skettenis struct dwarf2_frame_cache *cache;
579b725ae77Skettenis struct dwarf2_frame_state *fs;
580b725ae77Skettenis struct dwarf2_fde *fde;
581b725ae77Skettenis
582b725ae77Skettenis if (*this_cache)
583b725ae77Skettenis return *this_cache;
584b725ae77Skettenis
585b725ae77Skettenis /* Allocate a new cache. */
586b725ae77Skettenis cache = FRAME_OBSTACK_ZALLOC (struct dwarf2_frame_cache);
587b725ae77Skettenis cache->reg = FRAME_OBSTACK_CALLOC (num_regs, struct dwarf2_frame_state_reg);
588b725ae77Skettenis
589b725ae77Skettenis /* Allocate and initialize the frame state. */
590b725ae77Skettenis fs = XMALLOC (struct dwarf2_frame_state);
591b725ae77Skettenis memset (fs, 0, sizeof (struct dwarf2_frame_state));
592b725ae77Skettenis old_chain = make_cleanup (dwarf2_frame_state_free, fs);
593b725ae77Skettenis
594b725ae77Skettenis /* Unwind the PC.
595b725ae77Skettenis
596b725ae77Skettenis Note that if NEXT_FRAME is never supposed to return (i.e. a call
597b725ae77Skettenis to abort), the compiler might optimize away the instruction at
598b725ae77Skettenis NEXT_FRAME's return address. As a result the return address will
599b725ae77Skettenis point at some random instruction, and the CFI for that
600b725ae77Skettenis instruction is probably worthless to us. GCC's unwinder solves
601b725ae77Skettenis this problem by substracting 1 from the return address to get an
602b725ae77Skettenis address in the middle of a presumed call instruction (or the
603b725ae77Skettenis instruction in the associated delay slot). This should only be
604b725ae77Skettenis done for "normal" frames and not for resume-type frames (signal
605b725ae77Skettenis handlers, sentinel frames, dummy frames). The function
606b725ae77Skettenis frame_unwind_address_in_block does just this. It's not clear how
607b725ae77Skettenis reliable the method is though; there is the potential for the
608b725ae77Skettenis register state pre-call being different to that on return. */
609b725ae77Skettenis fs->pc = frame_unwind_address_in_block (next_frame);
610b725ae77Skettenis
611b725ae77Skettenis /* Find the correct FDE. */
612b725ae77Skettenis fde = dwarf2_frame_find_fde (&fs->pc);
613b725ae77Skettenis gdb_assert (fde != NULL);
614b725ae77Skettenis
615b725ae77Skettenis /* Extract any interesting information from the CIE. */
616b725ae77Skettenis fs->data_align = fde->cie->data_alignment_factor;
617b725ae77Skettenis fs->code_align = fde->cie->code_alignment_factor;
618b725ae77Skettenis fs->retaddr_column = fde->cie->return_address_register;
619b725ae77Skettenis
620b725ae77Skettenis /* First decode all the insns in the CIE. */
621b725ae77Skettenis execute_cfa_program (fde->cie->initial_instructions,
622b725ae77Skettenis fde->cie->end, next_frame, fs);
623b725ae77Skettenis
624b725ae77Skettenis /* Save the initialized register set. */
625b725ae77Skettenis fs->initial = fs->regs;
626b725ae77Skettenis fs->initial.reg = dwarf2_frame_state_copy_regs (&fs->regs);
627b725ae77Skettenis
628b725ae77Skettenis /* Then decode the insns in the FDE up to our target PC. */
629b725ae77Skettenis execute_cfa_program (fde->instructions, fde->end, next_frame, fs);
630b725ae77Skettenis
631b725ae77Skettenis /* Caclulate the CFA. */
632b725ae77Skettenis switch (fs->cfa_how)
633b725ae77Skettenis {
634b725ae77Skettenis case CFA_REG_OFFSET:
635b725ae77Skettenis cache->cfa = read_reg (next_frame, fs->cfa_reg);
636b725ae77Skettenis cache->cfa += fs->cfa_offset;
637b725ae77Skettenis break;
638b725ae77Skettenis
639b725ae77Skettenis case CFA_EXP:
640b725ae77Skettenis cache->cfa =
641b725ae77Skettenis execute_stack_op (fs->cfa_exp, fs->cfa_exp_len, next_frame, 0);
642b725ae77Skettenis break;
643b725ae77Skettenis
644b725ae77Skettenis default:
645b725ae77Skettenis internal_error (__FILE__, __LINE__, "Unknown CFA rule.");
646b725ae77Skettenis }
647b725ae77Skettenis
648b725ae77Skettenis /* Initialize the register state. */
649b725ae77Skettenis {
650b725ae77Skettenis int regnum;
651b725ae77Skettenis
652b725ae77Skettenis for (regnum = 0; regnum < num_regs; regnum++)
653b725ae77Skettenis dwarf2_frame_init_reg (gdbarch, regnum, &cache->reg[regnum]);
654b725ae77Skettenis }
655b725ae77Skettenis
656b725ae77Skettenis /* Go through the DWARF2 CFI generated table and save its register
657b725ae77Skettenis location information in the cache. Note that we don't skip the
658b725ae77Skettenis return address column; it's perfectly all right for it to
659b725ae77Skettenis correspond to a real register. If it doesn't correspond to a
660b725ae77Skettenis real register, or if we shouldn't treat it as such,
661b725ae77Skettenis DWARF2_REG_TO_REGNUM should be defined to return a number outside
662b725ae77Skettenis the range [0, NUM_REGS). */
663b725ae77Skettenis {
664b725ae77Skettenis int column; /* CFI speak for "register number". */
665b725ae77Skettenis
666b725ae77Skettenis for (column = 0; column < fs->regs.num_regs; column++)
667b725ae77Skettenis {
668b725ae77Skettenis /* Use the GDB register number as the destination index. */
669b725ae77Skettenis int regnum = DWARF2_REG_TO_REGNUM (column);
670b725ae77Skettenis
671b725ae77Skettenis /* If there's no corresponding GDB register, ignore it. */
672b725ae77Skettenis if (regnum < 0 || regnum >= num_regs)
673b725ae77Skettenis continue;
674b725ae77Skettenis
675b725ae77Skettenis /* NOTE: cagney/2003-09-05: CFI should specify the disposition
676b725ae77Skettenis of all debug info registers. If it doesn't, complain (but
677b725ae77Skettenis not too loudly). It turns out that GCC assumes that an
678b725ae77Skettenis unspecified register implies "same value" when CFI (draft
679b725ae77Skettenis 7) specifies nothing at all. Such a register could equally
680b725ae77Skettenis be interpreted as "undefined". Also note that this check
681b725ae77Skettenis isn't sufficient; it only checks that all registers in the
682b725ae77Skettenis range [0 .. max column] are specified, and won't detect
683b725ae77Skettenis problems when a debug info register falls outside of the
684b725ae77Skettenis table. We need a way of iterating through all the valid
685b725ae77Skettenis DWARF2 register numbers. */
686b725ae77Skettenis if (fs->regs.reg[column].how == DWARF2_FRAME_REG_UNSPECIFIED)
687b725ae77Skettenis complaint (&symfile_complaints,
688b725ae77Skettenis "Incomplete CFI data; unspecified registers at 0x%s",
689b725ae77Skettenis paddr (fs->pc));
690b725ae77Skettenis else
691b725ae77Skettenis cache->reg[regnum] = fs->regs.reg[column];
692b725ae77Skettenis }
693b725ae77Skettenis }
694b725ae77Skettenis
695b725ae77Skettenis /* Eliminate any DWARF2_FRAME_REG_RA rules. */
696b725ae77Skettenis {
697b725ae77Skettenis int regnum;
698b725ae77Skettenis
699b725ae77Skettenis for (regnum = 0; regnum < num_regs; regnum++)
700b725ae77Skettenis {
701b725ae77Skettenis if (cache->reg[regnum].how == DWARF2_FRAME_REG_RA)
702b725ae77Skettenis {
703b725ae77Skettenis struct dwarf2_frame_state_reg *retaddr_reg =
704b725ae77Skettenis &fs->regs.reg[fs->retaddr_column];
705b725ae77Skettenis
706b725ae77Skettenis /* It seems rather bizarre to specify an "empty" column as
707b725ae77Skettenis the return adress column. However, this is exactly
708b725ae77Skettenis what GCC does on some targets. It turns out that GCC
709b725ae77Skettenis assumes that the return address can be found in the
710b725ae77Skettenis register corresponding to the return address column.
711b725ae77Skettenis Incidentally, that's how should treat a return address
712b725ae77Skettenis column specifying "same value" too. */
713b725ae77Skettenis if (fs->retaddr_column < fs->regs.num_regs
714b725ae77Skettenis && retaddr_reg->how != DWARF2_FRAME_REG_UNSPECIFIED
715b725ae77Skettenis && retaddr_reg->how != DWARF2_FRAME_REG_SAME_VALUE)
716b725ae77Skettenis cache->reg[regnum] = *retaddr_reg;
717b725ae77Skettenis else
718b725ae77Skettenis {
719b725ae77Skettenis cache->reg[regnum].loc.reg = fs->retaddr_column;
720b725ae77Skettenis cache->reg[regnum].how = DWARF2_FRAME_REG_SAVED_REG;
721b725ae77Skettenis }
722b725ae77Skettenis }
723b725ae77Skettenis }
724b725ae77Skettenis }
725b725ae77Skettenis
726b725ae77Skettenis do_cleanups (old_chain);
727b725ae77Skettenis
728b725ae77Skettenis *this_cache = cache;
729b725ae77Skettenis return cache;
730b725ae77Skettenis }
731b725ae77Skettenis
732b725ae77Skettenis static void
dwarf2_frame_this_id(struct frame_info * next_frame,void ** this_cache,struct frame_id * this_id)733b725ae77Skettenis dwarf2_frame_this_id (struct frame_info *next_frame, void **this_cache,
734b725ae77Skettenis struct frame_id *this_id)
735b725ae77Skettenis {
736b725ae77Skettenis struct dwarf2_frame_cache *cache =
737b725ae77Skettenis dwarf2_frame_cache (next_frame, this_cache);
738b725ae77Skettenis
739b725ae77Skettenis (*this_id) = frame_id_build (cache->cfa, frame_func_unwind (next_frame));
740b725ae77Skettenis }
741b725ae77Skettenis
742b725ae77Skettenis static void
dwarf2_frame_prev_register(struct frame_info * next_frame,void ** this_cache,int regnum,int * optimizedp,enum lval_type * lvalp,CORE_ADDR * addrp,int * realnump,void * valuep)743b725ae77Skettenis dwarf2_frame_prev_register (struct frame_info *next_frame, void **this_cache,
744b725ae77Skettenis int regnum, int *optimizedp,
745b725ae77Skettenis enum lval_type *lvalp, CORE_ADDR *addrp,
746b725ae77Skettenis int *realnump, void *valuep)
747b725ae77Skettenis {
748b725ae77Skettenis struct gdbarch *gdbarch = get_frame_arch (next_frame);
749b725ae77Skettenis struct dwarf2_frame_cache *cache =
750b725ae77Skettenis dwarf2_frame_cache (next_frame, this_cache);
751*84a83e23Skettenis CORE_ADDR value;
752b725ae77Skettenis
753b725ae77Skettenis switch (cache->reg[regnum].how)
754b725ae77Skettenis {
755b725ae77Skettenis case DWARF2_FRAME_REG_UNDEFINED:
756b725ae77Skettenis /* If CFI explicitly specified that the value isn't defined,
757b725ae77Skettenis mark it as optimized away; the value isn't available. */
758b725ae77Skettenis *optimizedp = 1;
759b725ae77Skettenis *lvalp = not_lval;
760b725ae77Skettenis *addrp = 0;
761b725ae77Skettenis *realnump = -1;
762b725ae77Skettenis if (valuep)
763b725ae77Skettenis {
764b725ae77Skettenis /* In some cases, for example %eflags on the i386, we have
765b725ae77Skettenis to provide a sane value, even though this register wasn't
766b725ae77Skettenis saved. Assume we can get it from NEXT_FRAME. */
767b725ae77Skettenis frame_unwind_register (next_frame, regnum, valuep);
768b725ae77Skettenis }
769b725ae77Skettenis break;
770b725ae77Skettenis
771b725ae77Skettenis case DWARF2_FRAME_REG_SAVED_OFFSET:
772b725ae77Skettenis *optimizedp = 0;
773b725ae77Skettenis *lvalp = lval_memory;
774b725ae77Skettenis *addrp = cache->cfa + cache->reg[regnum].loc.offset;
775b725ae77Skettenis *realnump = -1;
776b725ae77Skettenis if (valuep)
777b725ae77Skettenis {
778b725ae77Skettenis /* Read the value in from memory. */
779b725ae77Skettenis read_memory (*addrp, valuep, register_size (gdbarch, regnum));
780b725ae77Skettenis }
781b725ae77Skettenis break;
782b725ae77Skettenis
783b725ae77Skettenis case DWARF2_FRAME_REG_SAVED_REG:
784b725ae77Skettenis regnum = DWARF2_REG_TO_REGNUM (cache->reg[regnum].loc.reg);
785b725ae77Skettenis frame_register_unwind (next_frame, regnum,
786b725ae77Skettenis optimizedp, lvalp, addrp, realnump, valuep);
787b725ae77Skettenis break;
788b725ae77Skettenis
789b725ae77Skettenis case DWARF2_FRAME_REG_SAVED_EXP:
790b725ae77Skettenis *optimizedp = 0;
791b725ae77Skettenis *lvalp = lval_memory;
792b725ae77Skettenis *addrp = execute_stack_op (cache->reg[regnum].loc.exp,
793b725ae77Skettenis cache->reg[regnum].exp_len,
794b725ae77Skettenis next_frame, cache->cfa);
795b725ae77Skettenis *realnump = -1;
796b725ae77Skettenis if (valuep)
797b725ae77Skettenis {
798b725ae77Skettenis /* Read the value in from memory. */
799b725ae77Skettenis read_memory (*addrp, valuep, register_size (gdbarch, regnum));
800b725ae77Skettenis }
801b725ae77Skettenis break;
802b725ae77Skettenis
803*84a83e23Skettenis case DWARF2_FRAME_REG_SAVED_VAL_EXP:
804*84a83e23Skettenis *optimizedp = 0;
805*84a83e23Skettenis *lvalp = not_lval;
806*84a83e23Skettenis *addrp = 0;
807*84a83e23Skettenis value = execute_stack_op (cache->reg[regnum].loc.exp,
808*84a83e23Skettenis cache->reg[regnum].exp_len,
809*84a83e23Skettenis next_frame, cache->cfa);
810*84a83e23Skettenis *realnump = -1;
811*84a83e23Skettenis if (valuep)
812*84a83e23Skettenis {
813*84a83e23Skettenis /* Store the value. */
814*84a83e23Skettenis store_typed_address (valuep, builtin_type_void_data_ptr, value);
815*84a83e23Skettenis }
816*84a83e23Skettenis break;
817*84a83e23Skettenis
818b725ae77Skettenis case DWARF2_FRAME_REG_UNSPECIFIED:
819b725ae77Skettenis /* GCC, in its infinite wisdom decided to not provide unwind
820b725ae77Skettenis information for registers that are "same value". Since
821b725ae77Skettenis DWARF2 (3 draft 7) doesn't define such behavior, said
822b725ae77Skettenis registers are actually undefined (which is different to CFI
823b725ae77Skettenis "undefined"). Code above issues a complaint about this.
824b725ae77Skettenis Here just fudge the books, assume GCC, and that the value is
825b725ae77Skettenis more inner on the stack. */
826b725ae77Skettenis frame_register_unwind (next_frame, regnum,
827b725ae77Skettenis optimizedp, lvalp, addrp, realnump, valuep);
828b725ae77Skettenis break;
829b725ae77Skettenis
830b725ae77Skettenis case DWARF2_FRAME_REG_SAME_VALUE:
831b725ae77Skettenis frame_register_unwind (next_frame, regnum,
832b725ae77Skettenis optimizedp, lvalp, addrp, realnump, valuep);
833b725ae77Skettenis break;
834b725ae77Skettenis
835b725ae77Skettenis case DWARF2_FRAME_REG_CFA:
836b725ae77Skettenis *optimizedp = 0;
837b725ae77Skettenis *lvalp = not_lval;
838b725ae77Skettenis *addrp = 0;
839b725ae77Skettenis *realnump = -1;
840b725ae77Skettenis if (valuep)
841b725ae77Skettenis {
842b725ae77Skettenis /* Store the value. */
843b725ae77Skettenis store_typed_address (valuep, builtin_type_void_data_ptr, cache->cfa);
844b725ae77Skettenis }
845b725ae77Skettenis break;
846b725ae77Skettenis
847b725ae77Skettenis default:
848b725ae77Skettenis internal_error (__FILE__, __LINE__, "Unknown register rule.");
849b725ae77Skettenis }
850b725ae77Skettenis }
851b725ae77Skettenis
852b725ae77Skettenis static const struct frame_unwind dwarf2_frame_unwind =
853b725ae77Skettenis {
854b725ae77Skettenis NORMAL_FRAME,
855b725ae77Skettenis dwarf2_frame_this_id,
856b725ae77Skettenis dwarf2_frame_prev_register
857b725ae77Skettenis };
858b725ae77Skettenis
859b725ae77Skettenis const struct frame_unwind *
dwarf2_frame_sniffer(struct frame_info * next_frame)860b725ae77Skettenis dwarf2_frame_sniffer (struct frame_info *next_frame)
861b725ae77Skettenis {
862b725ae77Skettenis /* Grab an address that is guarenteed to reside somewhere within the
863b725ae77Skettenis function. frame_pc_unwind(), for a no-return next function, can
864b725ae77Skettenis end up returning something past the end of this function's body. */
865b725ae77Skettenis CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame);
866b725ae77Skettenis if (dwarf2_frame_find_fde (&block_addr))
867b725ae77Skettenis return &dwarf2_frame_unwind;
868b725ae77Skettenis
869b725ae77Skettenis return NULL;
870b725ae77Skettenis }
871b725ae77Skettenis
872b725ae77Skettenis
873b725ae77Skettenis /* There is no explicitly defined relationship between the CFA and the
874b725ae77Skettenis location of frame's local variables and arguments/parameters.
875b725ae77Skettenis Therefore, frame base methods on this page should probably only be
876b725ae77Skettenis used as a last resort, just to avoid printing total garbage as a
877b725ae77Skettenis response to the "info frame" command. */
878b725ae77Skettenis
879b725ae77Skettenis static CORE_ADDR
dwarf2_frame_base_address(struct frame_info * next_frame,void ** this_cache)880b725ae77Skettenis dwarf2_frame_base_address (struct frame_info *next_frame, void **this_cache)
881b725ae77Skettenis {
882b725ae77Skettenis struct dwarf2_frame_cache *cache =
883b725ae77Skettenis dwarf2_frame_cache (next_frame, this_cache);
884b725ae77Skettenis
885b725ae77Skettenis return cache->cfa;
886b725ae77Skettenis }
887b725ae77Skettenis
888b725ae77Skettenis static const struct frame_base dwarf2_frame_base =
889b725ae77Skettenis {
890b725ae77Skettenis &dwarf2_frame_unwind,
891b725ae77Skettenis dwarf2_frame_base_address,
892b725ae77Skettenis dwarf2_frame_base_address,
893b725ae77Skettenis dwarf2_frame_base_address
894b725ae77Skettenis };
895b725ae77Skettenis
896b725ae77Skettenis const struct frame_base *
dwarf2_frame_base_sniffer(struct frame_info * next_frame)897b725ae77Skettenis dwarf2_frame_base_sniffer (struct frame_info *next_frame)
898b725ae77Skettenis {
899b725ae77Skettenis CORE_ADDR pc = frame_pc_unwind (next_frame);
900b725ae77Skettenis if (dwarf2_frame_find_fde (&pc))
901b725ae77Skettenis return &dwarf2_frame_base;
902b725ae77Skettenis
903b725ae77Skettenis return NULL;
904b725ae77Skettenis }
905b725ae77Skettenis
906b725ae77Skettenis /* A minimal decoding of DWARF2 compilation units. We only decode
907b725ae77Skettenis what's needed to get to the call frame information. */
908b725ae77Skettenis
909b725ae77Skettenis struct comp_unit
910b725ae77Skettenis {
911b725ae77Skettenis /* Keep the bfd convenient. */
912b725ae77Skettenis bfd *abfd;
913b725ae77Skettenis
914b725ae77Skettenis struct objfile *objfile;
915b725ae77Skettenis
916b725ae77Skettenis /* Linked list of CIEs for this object. */
917b725ae77Skettenis struct dwarf2_cie *cie;
918b725ae77Skettenis
919b725ae77Skettenis /* Pointer to the .debug_frame section loaded into memory. */
920b725ae77Skettenis char *dwarf_frame_buffer;
921b725ae77Skettenis
922b725ae77Skettenis /* Length of the loaded .debug_frame section. */
923b725ae77Skettenis unsigned long dwarf_frame_size;
924b725ae77Skettenis
925b725ae77Skettenis /* Pointer to the .debug_frame section. */
926b725ae77Skettenis asection *dwarf_frame_section;
927b725ae77Skettenis
928b725ae77Skettenis /* Base for DW_EH_PE_datarel encodings. */
929b725ae77Skettenis bfd_vma dbase;
930b725ae77Skettenis
931b725ae77Skettenis /* Base for DW_EH_PE_textrel encodings. */
932b725ae77Skettenis bfd_vma tbase;
933b725ae77Skettenis };
934b725ae77Skettenis
935b725ae77Skettenis const struct objfile_data *dwarf2_frame_objfile_data;
936b725ae77Skettenis
937b725ae77Skettenis static unsigned int
read_1_byte(bfd * bfd,char * buf)938b725ae77Skettenis read_1_byte (bfd *bfd, char *buf)
939b725ae77Skettenis {
940b725ae77Skettenis return bfd_get_8 (abfd, (bfd_byte *) buf);
941b725ae77Skettenis }
942b725ae77Skettenis
943b725ae77Skettenis static unsigned int
read_4_bytes(bfd * abfd,char * buf)944b725ae77Skettenis read_4_bytes (bfd *abfd, char *buf)
945b725ae77Skettenis {
946b725ae77Skettenis return bfd_get_32 (abfd, (bfd_byte *) buf);
947b725ae77Skettenis }
948b725ae77Skettenis
949b725ae77Skettenis static ULONGEST
read_8_bytes(bfd * abfd,char * buf)950b725ae77Skettenis read_8_bytes (bfd *abfd, char *buf)
951b725ae77Skettenis {
952b725ae77Skettenis return bfd_get_64 (abfd, (bfd_byte *) buf);
953b725ae77Skettenis }
954b725ae77Skettenis
955b725ae77Skettenis static ULONGEST
read_unsigned_leb128(bfd * abfd,char * buf,unsigned int * bytes_read_ptr)956b725ae77Skettenis read_unsigned_leb128 (bfd *abfd, char *buf, unsigned int *bytes_read_ptr)
957b725ae77Skettenis {
958b725ae77Skettenis ULONGEST result;
959b725ae77Skettenis unsigned int num_read;
960b725ae77Skettenis int shift;
961b725ae77Skettenis unsigned char byte;
962b725ae77Skettenis
963b725ae77Skettenis result = 0;
964b725ae77Skettenis shift = 0;
965b725ae77Skettenis num_read = 0;
966b725ae77Skettenis
967b725ae77Skettenis do
968b725ae77Skettenis {
969b725ae77Skettenis byte = bfd_get_8 (abfd, (bfd_byte *) buf);
970b725ae77Skettenis buf++;
971b725ae77Skettenis num_read++;
972b725ae77Skettenis result |= ((byte & 0x7f) << shift);
973b725ae77Skettenis shift += 7;
974b725ae77Skettenis }
975b725ae77Skettenis while (byte & 0x80);
976b725ae77Skettenis
977b725ae77Skettenis *bytes_read_ptr = num_read;
978b725ae77Skettenis
979b725ae77Skettenis return result;
980b725ae77Skettenis }
981b725ae77Skettenis
982b725ae77Skettenis static LONGEST
read_signed_leb128(bfd * abfd,char * buf,unsigned int * bytes_read_ptr)983b725ae77Skettenis read_signed_leb128 (bfd *abfd, char *buf, unsigned int *bytes_read_ptr)
984b725ae77Skettenis {
985b725ae77Skettenis LONGEST result;
986b725ae77Skettenis int shift;
987b725ae77Skettenis unsigned int num_read;
988b725ae77Skettenis unsigned char byte;
989b725ae77Skettenis
990b725ae77Skettenis result = 0;
991b725ae77Skettenis shift = 0;
992b725ae77Skettenis num_read = 0;
993b725ae77Skettenis
994b725ae77Skettenis do
995b725ae77Skettenis {
996b725ae77Skettenis byte = bfd_get_8 (abfd, (bfd_byte *) buf);
997b725ae77Skettenis buf++;
998b725ae77Skettenis num_read++;
999b725ae77Skettenis result |= ((byte & 0x7f) << shift);
1000b725ae77Skettenis shift += 7;
1001b725ae77Skettenis }
1002b725ae77Skettenis while (byte & 0x80);
1003b725ae77Skettenis
1004b725ae77Skettenis if ((shift < 32) && (byte & 0x40))
1005b725ae77Skettenis result |= -(1 << shift);
1006b725ae77Skettenis
1007b725ae77Skettenis *bytes_read_ptr = num_read;
1008b725ae77Skettenis
1009b725ae77Skettenis return result;
1010b725ae77Skettenis }
1011b725ae77Skettenis
1012b725ae77Skettenis static ULONGEST
read_initial_length(bfd * abfd,char * buf,unsigned int * bytes_read_ptr)1013b725ae77Skettenis read_initial_length (bfd *abfd, char *buf, unsigned int *bytes_read_ptr)
1014b725ae77Skettenis {
1015b725ae77Skettenis LONGEST result;
1016b725ae77Skettenis
1017b725ae77Skettenis result = bfd_get_32 (abfd, (bfd_byte *) buf);
1018b725ae77Skettenis if (result == 0xffffffff)
1019b725ae77Skettenis {
1020b725ae77Skettenis result = bfd_get_64 (abfd, (bfd_byte *) buf + 4);
1021b725ae77Skettenis *bytes_read_ptr = 12;
1022b725ae77Skettenis }
1023b725ae77Skettenis else
1024b725ae77Skettenis *bytes_read_ptr = 4;
1025b725ae77Skettenis
1026b725ae77Skettenis return result;
1027b725ae77Skettenis }
1028b725ae77Skettenis
1029b725ae77Skettenis
1030b725ae77Skettenis /* Pointer encoding helper functions. */
1031b725ae77Skettenis
1032b725ae77Skettenis /* GCC supports exception handling based on DWARF2 CFI. However, for
1033b725ae77Skettenis technical reasons, it encodes addresses in its FDE's in a different
1034b725ae77Skettenis way. Several "pointer encodings" are supported. The encoding
1035b725ae77Skettenis that's used for a particular FDE is determined by the 'R'
1036b725ae77Skettenis augmentation in the associated CIE. The argument of this
1037b725ae77Skettenis augmentation is a single byte.
1038b725ae77Skettenis
1039b725ae77Skettenis The address can be encoded as 2 bytes, 4 bytes, 8 bytes, or as a
1040b725ae77Skettenis LEB128. This is encoded in bits 0, 1 and 2. Bit 3 encodes whether
1041b725ae77Skettenis the address is signed or unsigned. Bits 4, 5 and 6 encode how the
1042b725ae77Skettenis address should be interpreted (absolute, relative to the current
1043b725ae77Skettenis position in the FDE, ...). Bit 7, indicates that the address
1044b725ae77Skettenis should be dereferenced. */
1045b725ae77Skettenis
1046b725ae77Skettenis static unsigned char
encoding_for_size(unsigned int size)1047b725ae77Skettenis encoding_for_size (unsigned int size)
1048b725ae77Skettenis {
1049b725ae77Skettenis switch (size)
1050b725ae77Skettenis {
1051b725ae77Skettenis case 2:
1052b725ae77Skettenis return DW_EH_PE_udata2;
1053b725ae77Skettenis case 4:
1054b725ae77Skettenis return DW_EH_PE_udata4;
1055b725ae77Skettenis case 8:
1056b725ae77Skettenis return DW_EH_PE_udata8;
1057b725ae77Skettenis default:
1058b725ae77Skettenis internal_error (__FILE__, __LINE__, "Unsupported address size");
1059b725ae77Skettenis }
1060b725ae77Skettenis }
1061b725ae77Skettenis
1062b725ae77Skettenis static unsigned int
size_of_encoded_value(unsigned char encoding)1063b725ae77Skettenis size_of_encoded_value (unsigned char encoding)
1064b725ae77Skettenis {
1065b725ae77Skettenis if (encoding == DW_EH_PE_omit)
1066b725ae77Skettenis return 0;
1067b725ae77Skettenis
1068b725ae77Skettenis switch (encoding & 0x07)
1069b725ae77Skettenis {
1070b725ae77Skettenis case DW_EH_PE_absptr:
1071b725ae77Skettenis return TYPE_LENGTH (builtin_type_void_data_ptr);
1072b725ae77Skettenis case DW_EH_PE_udata2:
1073b725ae77Skettenis return 2;
1074b725ae77Skettenis case DW_EH_PE_udata4:
1075b725ae77Skettenis return 4;
1076b725ae77Skettenis case DW_EH_PE_udata8:
1077b725ae77Skettenis return 8;
1078b725ae77Skettenis default:
1079b725ae77Skettenis internal_error (__FILE__, __LINE__, "Invalid or unsupported encoding");
1080b725ae77Skettenis }
1081b725ae77Skettenis }
1082b725ae77Skettenis
1083b725ae77Skettenis static CORE_ADDR
read_encoded_value(struct comp_unit * unit,unsigned char encoding,char * buf,unsigned int * bytes_read_ptr)1084b725ae77Skettenis read_encoded_value (struct comp_unit *unit, unsigned char encoding,
1085b725ae77Skettenis char *buf, unsigned int *bytes_read_ptr)
1086b725ae77Skettenis {
1087b725ae77Skettenis int ptr_len = size_of_encoded_value (DW_EH_PE_absptr);
1088b725ae77Skettenis ptrdiff_t offset;
1089b725ae77Skettenis CORE_ADDR base;
1090b725ae77Skettenis
1091b725ae77Skettenis /* GCC currently doesn't generate DW_EH_PE_indirect encodings for
1092b725ae77Skettenis FDE's. */
1093b725ae77Skettenis if (encoding & DW_EH_PE_indirect)
1094b725ae77Skettenis internal_error (__FILE__, __LINE__,
1095b725ae77Skettenis "Unsupported encoding: DW_EH_PE_indirect");
1096b725ae77Skettenis
1097b725ae77Skettenis *bytes_read_ptr = 0;
1098b725ae77Skettenis
1099b725ae77Skettenis switch (encoding & 0x70)
1100b725ae77Skettenis {
1101b725ae77Skettenis case DW_EH_PE_absptr:
1102b725ae77Skettenis base = 0;
1103b725ae77Skettenis break;
1104b725ae77Skettenis case DW_EH_PE_pcrel:
1105b725ae77Skettenis base = bfd_get_section_vma (unit->bfd, unit->dwarf_frame_section);
1106b725ae77Skettenis base += (buf - unit->dwarf_frame_buffer);
1107b725ae77Skettenis break;
1108b725ae77Skettenis case DW_EH_PE_datarel:
1109b725ae77Skettenis base = unit->dbase;
1110b725ae77Skettenis break;
1111b725ae77Skettenis case DW_EH_PE_textrel:
1112b725ae77Skettenis base = unit->tbase;
1113b725ae77Skettenis break;
111411efff7fSkettenis case DW_EH_PE_funcrel:
111511efff7fSkettenis /* FIXME: kettenis/20040501: For now just pretend
111611efff7fSkettenis DW_EH_PE_funcrel is equivalent to DW_EH_PE_absptr. For
111711efff7fSkettenis reading the initial location of an FDE it should be treated
111811efff7fSkettenis as such, and currently that's the only place where this code
111911efff7fSkettenis is used. */
112011efff7fSkettenis base = 0;
112111efff7fSkettenis break;
1122b725ae77Skettenis case DW_EH_PE_aligned:
1123b725ae77Skettenis base = 0;
1124b725ae77Skettenis offset = buf - unit->dwarf_frame_buffer;
1125b725ae77Skettenis if ((offset % ptr_len) != 0)
1126b725ae77Skettenis {
1127b725ae77Skettenis *bytes_read_ptr = ptr_len - (offset % ptr_len);
1128b725ae77Skettenis buf += *bytes_read_ptr;
1129b725ae77Skettenis }
1130b725ae77Skettenis break;
1131b725ae77Skettenis default:
1132b725ae77Skettenis internal_error (__FILE__, __LINE__, "Invalid or unsupported encoding");
1133b725ae77Skettenis }
1134b725ae77Skettenis
113511efff7fSkettenis if ((encoding & 0x07) == 0x00)
1136b725ae77Skettenis encoding |= encoding_for_size (ptr_len);
1137b725ae77Skettenis
1138b725ae77Skettenis switch (encoding & 0x0f)
1139b725ae77Skettenis {
1140b725ae77Skettenis case DW_EH_PE_udata2:
1141b725ae77Skettenis *bytes_read_ptr += 2;
1142b725ae77Skettenis return (base + bfd_get_16 (unit->abfd, (bfd_byte *) buf));
1143b725ae77Skettenis case DW_EH_PE_udata4:
1144b725ae77Skettenis *bytes_read_ptr += 4;
1145b725ae77Skettenis return (base + bfd_get_32 (unit->abfd, (bfd_byte *) buf));
1146b725ae77Skettenis case DW_EH_PE_udata8:
1147b725ae77Skettenis *bytes_read_ptr += 8;
1148b725ae77Skettenis return (base + bfd_get_64 (unit->abfd, (bfd_byte *) buf));
1149b725ae77Skettenis case DW_EH_PE_sdata2:
1150b725ae77Skettenis *bytes_read_ptr += 2;
1151b725ae77Skettenis return (base + bfd_get_signed_16 (unit->abfd, (bfd_byte *) buf));
1152b725ae77Skettenis case DW_EH_PE_sdata4:
1153b725ae77Skettenis *bytes_read_ptr += 4;
1154b725ae77Skettenis return (base + bfd_get_signed_32 (unit->abfd, (bfd_byte *) buf));
1155b725ae77Skettenis case DW_EH_PE_sdata8:
1156b725ae77Skettenis *bytes_read_ptr += 8;
1157b725ae77Skettenis return (base + bfd_get_signed_64 (unit->abfd, (bfd_byte *) buf));
1158b725ae77Skettenis default:
1159b725ae77Skettenis internal_error (__FILE__, __LINE__, "Invalid or unsupported encoding");
1160b725ae77Skettenis }
1161b725ae77Skettenis }
1162b725ae77Skettenis
1163b725ae77Skettenis
1164b725ae77Skettenis /* GCC uses a single CIE for all FDEs in a .debug_frame section.
1165b725ae77Skettenis That's why we use a simple linked list here. */
1166b725ae77Skettenis
1167b725ae77Skettenis static struct dwarf2_cie *
find_cie(struct comp_unit * unit,ULONGEST cie_pointer)1168b725ae77Skettenis find_cie (struct comp_unit *unit, ULONGEST cie_pointer)
1169b725ae77Skettenis {
1170b725ae77Skettenis struct dwarf2_cie *cie = unit->cie;
1171b725ae77Skettenis
1172b725ae77Skettenis while (cie)
1173b725ae77Skettenis {
1174b725ae77Skettenis if (cie->cie_pointer == cie_pointer)
1175b725ae77Skettenis return cie;
1176b725ae77Skettenis
1177b725ae77Skettenis cie = cie->next;
1178b725ae77Skettenis }
1179b725ae77Skettenis
1180b725ae77Skettenis return NULL;
1181b725ae77Skettenis }
1182b725ae77Skettenis
1183b725ae77Skettenis static void
add_cie(struct comp_unit * unit,struct dwarf2_cie * cie)1184b725ae77Skettenis add_cie (struct comp_unit *unit, struct dwarf2_cie *cie)
1185b725ae77Skettenis {
1186b725ae77Skettenis cie->next = unit->cie;
1187b725ae77Skettenis unit->cie = cie;
1188b725ae77Skettenis }
1189b725ae77Skettenis
1190b725ae77Skettenis /* Find the FDE for *PC. Return a pointer to the FDE, and store the
1191b725ae77Skettenis inital location associated with it into *PC. */
1192b725ae77Skettenis
1193b725ae77Skettenis static struct dwarf2_fde *
dwarf2_frame_find_fde(CORE_ADDR * pc)1194b725ae77Skettenis dwarf2_frame_find_fde (CORE_ADDR *pc)
1195b725ae77Skettenis {
1196b725ae77Skettenis struct objfile *objfile;
1197b725ae77Skettenis
1198b725ae77Skettenis ALL_OBJFILES (objfile)
1199b725ae77Skettenis {
1200b725ae77Skettenis struct dwarf2_fde *fde;
1201b725ae77Skettenis CORE_ADDR offset;
1202b725ae77Skettenis
1203b725ae77Skettenis fde = objfile_data (objfile, dwarf2_frame_objfile_data);
1204b725ae77Skettenis if (fde == NULL)
1205b725ae77Skettenis continue;
1206b725ae77Skettenis
1207b725ae77Skettenis gdb_assert (objfile->section_offsets);
1208b725ae77Skettenis offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1209b725ae77Skettenis
1210b725ae77Skettenis while (fde)
1211b725ae77Skettenis {
1212b725ae77Skettenis if (*pc >= fde->initial_location + offset
1213b725ae77Skettenis && *pc < fde->initial_location + offset + fde->address_range)
1214b725ae77Skettenis {
1215b725ae77Skettenis *pc = fde->initial_location + offset;
1216b725ae77Skettenis return fde;
1217b725ae77Skettenis }
1218b725ae77Skettenis
1219b725ae77Skettenis fde = fde->next;
1220b725ae77Skettenis }
1221b725ae77Skettenis }
1222b725ae77Skettenis
1223b725ae77Skettenis return NULL;
1224b725ae77Skettenis }
1225b725ae77Skettenis
1226b725ae77Skettenis static void
add_fde(struct comp_unit * unit,struct dwarf2_fde * fde)1227b725ae77Skettenis add_fde (struct comp_unit *unit, struct dwarf2_fde *fde)
1228b725ae77Skettenis {
1229b725ae77Skettenis fde->next = objfile_data (unit->objfile, dwarf2_frame_objfile_data);
1230b725ae77Skettenis set_objfile_data (unit->objfile, dwarf2_frame_objfile_data, fde);
1231b725ae77Skettenis }
1232b725ae77Skettenis
1233b725ae77Skettenis #ifdef CC_HAS_LONG_LONG
1234b725ae77Skettenis #define DW64_CIE_ID 0xffffffffffffffffULL
1235b725ae77Skettenis #else
1236b725ae77Skettenis #define DW64_CIE_ID ~0
1237b725ae77Skettenis #endif
1238b725ae77Skettenis
1239b725ae77Skettenis static char *decode_frame_entry (struct comp_unit *unit, char *start,
1240b725ae77Skettenis int eh_frame_p);
1241b725ae77Skettenis
1242b725ae77Skettenis /* Decode the next CIE or FDE. Return NULL if invalid input, otherwise
1243b725ae77Skettenis the next byte to be processed. */
1244b725ae77Skettenis static char *
decode_frame_entry_1(struct comp_unit * unit,char * start,int eh_frame_p)1245b725ae77Skettenis decode_frame_entry_1 (struct comp_unit *unit, char *start, int eh_frame_p)
1246b725ae77Skettenis {
1247b725ae77Skettenis char *buf;
1248b725ae77Skettenis LONGEST length;
1249b725ae77Skettenis unsigned int bytes_read;
1250b725ae77Skettenis int dwarf64_p;
1251b725ae77Skettenis ULONGEST cie_id;
1252b725ae77Skettenis ULONGEST cie_pointer;
1253b725ae77Skettenis char *end;
1254b725ae77Skettenis
1255b725ae77Skettenis buf = start;
1256b725ae77Skettenis length = read_initial_length (unit->abfd, buf, &bytes_read);
1257b725ae77Skettenis buf += bytes_read;
1258b725ae77Skettenis end = buf + length;
1259b725ae77Skettenis
1260b725ae77Skettenis /* Are we still within the section? */
1261b725ae77Skettenis if (end > unit->dwarf_frame_buffer + unit->dwarf_frame_size)
1262b725ae77Skettenis return NULL;
1263b725ae77Skettenis
1264b725ae77Skettenis if (length == 0)
1265b725ae77Skettenis return end;
1266b725ae77Skettenis
1267b725ae77Skettenis /* Distinguish between 32 and 64-bit encoded frame info. */
1268b725ae77Skettenis dwarf64_p = (bytes_read == 12);
1269b725ae77Skettenis
1270b725ae77Skettenis /* In a .eh_frame section, zero is used to distinguish CIEs from FDEs. */
1271b725ae77Skettenis if (eh_frame_p)
1272b725ae77Skettenis cie_id = 0;
1273b725ae77Skettenis else if (dwarf64_p)
1274b725ae77Skettenis cie_id = DW64_CIE_ID;
1275b725ae77Skettenis else
1276b725ae77Skettenis cie_id = DW_CIE_ID;
1277b725ae77Skettenis
1278b725ae77Skettenis if (dwarf64_p)
1279b725ae77Skettenis {
1280b725ae77Skettenis cie_pointer = read_8_bytes (unit->abfd, buf);
1281b725ae77Skettenis buf += 8;
1282b725ae77Skettenis }
1283b725ae77Skettenis else
1284b725ae77Skettenis {
1285b725ae77Skettenis cie_pointer = read_4_bytes (unit->abfd, buf);
1286b725ae77Skettenis buf += 4;
1287b725ae77Skettenis }
1288b725ae77Skettenis
1289b725ae77Skettenis if (cie_pointer == cie_id)
1290b725ae77Skettenis {
1291b725ae77Skettenis /* This is a CIE. */
1292b725ae77Skettenis struct dwarf2_cie *cie;
1293b725ae77Skettenis char *augmentation;
129411efff7fSkettenis unsigned int cie_version;
1295b725ae77Skettenis
1296b725ae77Skettenis /* Record the offset into the .debug_frame section of this CIE. */
1297b725ae77Skettenis cie_pointer = start - unit->dwarf_frame_buffer;
1298b725ae77Skettenis
1299b725ae77Skettenis /* Check whether we've already read it. */
1300b725ae77Skettenis if (find_cie (unit, cie_pointer))
1301b725ae77Skettenis return end;
1302b725ae77Skettenis
1303b725ae77Skettenis cie = (struct dwarf2_cie *)
1304b725ae77Skettenis obstack_alloc (&unit->objfile->objfile_obstack,
1305b725ae77Skettenis sizeof (struct dwarf2_cie));
1306b725ae77Skettenis cie->initial_instructions = NULL;
1307b725ae77Skettenis cie->cie_pointer = cie_pointer;
1308b725ae77Skettenis
1309b725ae77Skettenis /* The encoding for FDE's in a normal .debug_frame section
131011efff7fSkettenis depends on the target address size. */
131111efff7fSkettenis cie->encoding = DW_EH_PE_absptr;
1312b725ae77Skettenis
1313b725ae77Skettenis /* Check version number. */
131411efff7fSkettenis cie_version = read_1_byte (unit->abfd, buf);
131511efff7fSkettenis if (cie_version != 1 && cie_version != 3)
1316b725ae77Skettenis return NULL;
1317b725ae77Skettenis buf += 1;
1318b725ae77Skettenis
1319b725ae77Skettenis /* Interpret the interesting bits of the augmentation. */
1320b725ae77Skettenis augmentation = buf;
1321b725ae77Skettenis buf = augmentation + strlen (augmentation) + 1;
1322b725ae77Skettenis
1323b725ae77Skettenis /* The GCC 2.x "eh" augmentation has a pointer immediately
1324b725ae77Skettenis following the augmentation string, so it must be handled
1325b725ae77Skettenis first. */
1326b725ae77Skettenis if (augmentation[0] == 'e' && augmentation[1] == 'h')
1327b725ae77Skettenis {
1328b725ae77Skettenis /* Skip. */
1329b725ae77Skettenis buf += TYPE_LENGTH (builtin_type_void_data_ptr);
1330b725ae77Skettenis augmentation += 2;
1331b725ae77Skettenis }
1332b725ae77Skettenis
1333b725ae77Skettenis cie->code_alignment_factor =
1334b725ae77Skettenis read_unsigned_leb128 (unit->abfd, buf, &bytes_read);
1335b725ae77Skettenis buf += bytes_read;
1336b725ae77Skettenis
1337b725ae77Skettenis cie->data_alignment_factor =
1338b725ae77Skettenis read_signed_leb128 (unit->abfd, buf, &bytes_read);
1339b725ae77Skettenis buf += bytes_read;
1340b725ae77Skettenis
134111efff7fSkettenis if (cie_version == 1)
134211efff7fSkettenis {
1343b725ae77Skettenis cie->return_address_register = read_1_byte (unit->abfd, buf);
134411efff7fSkettenis bytes_read = 1;
134511efff7fSkettenis }
134611efff7fSkettenis else
134711efff7fSkettenis cie->return_address_register = read_unsigned_leb128 (unit->abfd, buf,
134811efff7fSkettenis &bytes_read);
134911efff7fSkettenis buf += bytes_read;
1350b725ae77Skettenis
1351b725ae77Skettenis cie->saw_z_augmentation = (*augmentation == 'z');
1352b725ae77Skettenis if (cie->saw_z_augmentation)
1353b725ae77Skettenis {
1354b725ae77Skettenis ULONGEST length;
1355b725ae77Skettenis
1356b725ae77Skettenis length = read_unsigned_leb128 (unit->abfd, buf, &bytes_read);
1357b725ae77Skettenis buf += bytes_read;
1358b725ae77Skettenis if (buf > end)
1359b725ae77Skettenis return NULL;
1360b725ae77Skettenis cie->initial_instructions = buf + length;
1361b725ae77Skettenis augmentation++;
1362b725ae77Skettenis }
1363b725ae77Skettenis
1364b725ae77Skettenis while (*augmentation)
1365b725ae77Skettenis {
1366b725ae77Skettenis /* "L" indicates a byte showing how the LSDA pointer is encoded. */
1367b725ae77Skettenis if (*augmentation == 'L')
1368b725ae77Skettenis {
1369b725ae77Skettenis /* Skip. */
1370b725ae77Skettenis buf++;
1371b725ae77Skettenis augmentation++;
1372b725ae77Skettenis }
1373b725ae77Skettenis
1374b725ae77Skettenis /* "R" indicates a byte indicating how FDE addresses are encoded. */
1375b725ae77Skettenis else if (*augmentation == 'R')
1376b725ae77Skettenis {
1377b725ae77Skettenis cie->encoding = *buf++;
1378b725ae77Skettenis augmentation++;
1379b725ae77Skettenis }
1380b725ae77Skettenis
1381b725ae77Skettenis /* "P" indicates a personality routine in the CIE augmentation. */
1382b725ae77Skettenis else if (*augmentation == 'P')
1383b725ae77Skettenis {
1384b725ae77Skettenis /* Skip. */
1385b725ae77Skettenis buf += size_of_encoded_value (*buf++);
1386b725ae77Skettenis augmentation++;
1387b725ae77Skettenis }
1388b725ae77Skettenis
1389b725ae77Skettenis /* Otherwise we have an unknown augmentation.
1390b725ae77Skettenis Bail out unless we saw a 'z' prefix. */
1391b725ae77Skettenis else
1392b725ae77Skettenis {
1393b725ae77Skettenis if (cie->initial_instructions == NULL)
1394b725ae77Skettenis return end;
1395b725ae77Skettenis
1396b725ae77Skettenis /* Skip unknown augmentations. */
1397b725ae77Skettenis buf = cie->initial_instructions;
1398b725ae77Skettenis break;
1399b725ae77Skettenis }
1400b725ae77Skettenis }
1401b725ae77Skettenis
1402b725ae77Skettenis cie->initial_instructions = buf;
1403b725ae77Skettenis cie->end = end;
1404b725ae77Skettenis
1405b725ae77Skettenis add_cie (unit, cie);
1406b725ae77Skettenis }
1407b725ae77Skettenis else
1408b725ae77Skettenis {
1409b725ae77Skettenis /* This is a FDE. */
1410b725ae77Skettenis struct dwarf2_fde *fde;
1411b725ae77Skettenis
1412b725ae77Skettenis /* In an .eh_frame section, the CIE pointer is the delta between the
1413b725ae77Skettenis address within the FDE where the CIE pointer is stored and the
1414b725ae77Skettenis address of the CIE. Convert it to an offset into the .eh_frame
1415b725ae77Skettenis section. */
1416b725ae77Skettenis if (eh_frame_p)
1417b725ae77Skettenis {
1418b725ae77Skettenis cie_pointer = buf - unit->dwarf_frame_buffer - cie_pointer;
1419b725ae77Skettenis cie_pointer -= (dwarf64_p ? 8 : 4);
1420b725ae77Skettenis }
1421b725ae77Skettenis
1422b725ae77Skettenis /* In either case, validate the result is still within the section. */
1423b725ae77Skettenis if (cie_pointer >= unit->dwarf_frame_size)
1424b725ae77Skettenis return NULL;
1425b725ae77Skettenis
1426b725ae77Skettenis fde = (struct dwarf2_fde *)
1427b725ae77Skettenis obstack_alloc (&unit->objfile->objfile_obstack,
1428b725ae77Skettenis sizeof (struct dwarf2_fde));
1429b725ae77Skettenis fde->cie = find_cie (unit, cie_pointer);
1430b725ae77Skettenis if (fde->cie == NULL)
1431b725ae77Skettenis {
1432b725ae77Skettenis decode_frame_entry (unit, unit->dwarf_frame_buffer + cie_pointer,
1433b725ae77Skettenis eh_frame_p);
1434b725ae77Skettenis fde->cie = find_cie (unit, cie_pointer);
1435b725ae77Skettenis }
1436b725ae77Skettenis
1437b725ae77Skettenis gdb_assert (fde->cie != NULL);
1438b725ae77Skettenis
1439b725ae77Skettenis fde->initial_location =
1440b725ae77Skettenis read_encoded_value (unit, fde->cie->encoding, buf, &bytes_read);
1441b725ae77Skettenis buf += bytes_read;
1442b725ae77Skettenis
1443b725ae77Skettenis fde->address_range =
1444b725ae77Skettenis read_encoded_value (unit, fde->cie->encoding & 0x0f, buf, &bytes_read);
1445b725ae77Skettenis buf += bytes_read;
1446b725ae77Skettenis
1447b725ae77Skettenis /* A 'z' augmentation in the CIE implies the presence of an
1448b725ae77Skettenis augmentation field in the FDE as well. The only thing known
1449b725ae77Skettenis to be in here at present is the LSDA entry for EH. So we
1450b725ae77Skettenis can skip the whole thing. */
1451b725ae77Skettenis if (fde->cie->saw_z_augmentation)
1452b725ae77Skettenis {
1453b725ae77Skettenis ULONGEST length;
1454b725ae77Skettenis
1455b725ae77Skettenis length = read_unsigned_leb128 (unit->abfd, buf, &bytes_read);
1456b725ae77Skettenis buf += bytes_read + length;
1457b725ae77Skettenis if (buf > end)
1458b725ae77Skettenis return NULL;
1459b725ae77Skettenis }
1460b725ae77Skettenis
1461b725ae77Skettenis fde->instructions = buf;
1462b725ae77Skettenis fde->end = end;
1463b725ae77Skettenis
1464b725ae77Skettenis add_fde (unit, fde);
1465b725ae77Skettenis }
1466b725ae77Skettenis
1467b725ae77Skettenis return end;
1468b725ae77Skettenis }
1469b725ae77Skettenis
1470b725ae77Skettenis /* Read a CIE or FDE in BUF and decode it. */
1471b725ae77Skettenis static char *
decode_frame_entry(struct comp_unit * unit,char * start,int eh_frame_p)1472b725ae77Skettenis decode_frame_entry (struct comp_unit *unit, char *start, int eh_frame_p)
1473b725ae77Skettenis {
1474b725ae77Skettenis enum { NONE, ALIGN4, ALIGN8, FAIL } workaround = NONE;
1475b725ae77Skettenis char *ret;
1476b725ae77Skettenis const char *msg;
1477b725ae77Skettenis ptrdiff_t start_offset;
1478b725ae77Skettenis
1479b725ae77Skettenis while (1)
1480b725ae77Skettenis {
1481b725ae77Skettenis ret = decode_frame_entry_1 (unit, start, eh_frame_p);
1482b725ae77Skettenis if (ret != NULL)
1483b725ae77Skettenis break;
1484b725ae77Skettenis
1485b725ae77Skettenis /* We have corrupt input data of some form. */
1486b725ae77Skettenis
1487b725ae77Skettenis /* ??? Try, weakly, to work around compiler/assembler/linker bugs
1488b725ae77Skettenis and mismatches wrt padding and alignment of debug sections. */
1489b725ae77Skettenis /* Note that there is no requirement in the standard for any
1490b725ae77Skettenis alignment at all in the frame unwind sections. Testing for
1491b725ae77Skettenis alignment before trying to interpret data would be incorrect.
1492b725ae77Skettenis
1493b725ae77Skettenis However, GCC traditionally arranged for frame sections to be
1494b725ae77Skettenis sized such that the FDE length and CIE fields happen to be
1495b725ae77Skettenis aligned (in theory, for performance). This, unfortunately,
1496b725ae77Skettenis was done with .align directives, which had the side effect of
1497b725ae77Skettenis forcing the section to be aligned by the linker.
1498b725ae77Skettenis
1499b725ae77Skettenis This becomes a problem when you have some other producer that
1500b725ae77Skettenis creates frame sections that are not as strictly aligned. That
1501b725ae77Skettenis produces a hole in the frame info that gets filled by the
1502b725ae77Skettenis linker with zeros.
1503b725ae77Skettenis
1504b725ae77Skettenis The GCC behaviour is arguably a bug, but it's effectively now
1505b725ae77Skettenis part of the ABI, so we're now stuck with it, at least at the
1506b725ae77Skettenis object file level. A smart linker may decide, in the process
1507b725ae77Skettenis of compressing duplicate CIE information, that it can rewrite
1508b725ae77Skettenis the entire output section without this extra padding. */
1509b725ae77Skettenis
1510b725ae77Skettenis start_offset = start - unit->dwarf_frame_buffer;
1511b725ae77Skettenis if (workaround < ALIGN4 && (start_offset & 3) != 0)
1512b725ae77Skettenis {
1513b725ae77Skettenis start += 4 - (start_offset & 3);
1514b725ae77Skettenis workaround = ALIGN4;
1515b725ae77Skettenis continue;
1516b725ae77Skettenis }
1517b725ae77Skettenis if (workaround < ALIGN8 && (start_offset & 7) != 0)
1518b725ae77Skettenis {
1519b725ae77Skettenis start += 8 - (start_offset & 7);
1520b725ae77Skettenis workaround = ALIGN8;
1521b725ae77Skettenis continue;
1522b725ae77Skettenis }
1523b725ae77Skettenis
1524b725ae77Skettenis /* Nothing left to try. Arrange to return as if we've consumed
1525b725ae77Skettenis the entire input section. Hopefully we'll get valid info from
1526b725ae77Skettenis the other of .debug_frame/.eh_frame. */
1527b725ae77Skettenis workaround = FAIL;
1528b725ae77Skettenis ret = unit->dwarf_frame_buffer + unit->dwarf_frame_size;
1529b725ae77Skettenis break;
1530b725ae77Skettenis }
1531b725ae77Skettenis
1532b725ae77Skettenis switch (workaround)
1533b725ae77Skettenis {
1534b725ae77Skettenis case NONE:
1535b725ae77Skettenis break;
1536b725ae77Skettenis
1537b725ae77Skettenis case ALIGN4:
1538b725ae77Skettenis complaint (&symfile_complaints,
1539b725ae77Skettenis "Corrupt data in %s:%s; align 4 workaround apparently succeeded",
1540b725ae77Skettenis unit->dwarf_frame_section->owner->filename,
1541b725ae77Skettenis unit->dwarf_frame_section->name);
1542b725ae77Skettenis break;
1543b725ae77Skettenis
1544b725ae77Skettenis case ALIGN8:
1545b725ae77Skettenis complaint (&symfile_complaints,
1546b725ae77Skettenis "Corrupt data in %s:%s; align 8 workaround apparently succeeded",
1547b725ae77Skettenis unit->dwarf_frame_section->owner->filename,
1548b725ae77Skettenis unit->dwarf_frame_section->name);
1549b725ae77Skettenis break;
1550b725ae77Skettenis
1551b725ae77Skettenis default:
1552b725ae77Skettenis complaint (&symfile_complaints,
1553b725ae77Skettenis "Corrupt data in %s:%s",
1554b725ae77Skettenis unit->dwarf_frame_section->owner->filename,
1555b725ae77Skettenis unit->dwarf_frame_section->name);
1556b725ae77Skettenis break;
1557b725ae77Skettenis }
1558b725ae77Skettenis
1559b725ae77Skettenis return ret;
1560b725ae77Skettenis }
1561b725ae77Skettenis
1562b725ae77Skettenis
1563b725ae77Skettenis /* FIXME: kettenis/20030504: This still needs to be integrated with
1564b725ae77Skettenis dwarf2read.c in a better way. */
1565b725ae77Skettenis
1566b725ae77Skettenis /* Imported from dwarf2read.c. */
1567b725ae77Skettenis extern asection *dwarf_frame_section;
1568b725ae77Skettenis extern asection *dwarf_eh_frame_section;
1569b725ae77Skettenis
1570b725ae77Skettenis /* Imported from dwarf2read.c. */
1571b725ae77Skettenis extern char *dwarf2_read_section (struct objfile *objfile, asection *sectp);
1572b725ae77Skettenis
1573b725ae77Skettenis void
dwarf2_build_frame_info(struct objfile * objfile)1574b725ae77Skettenis dwarf2_build_frame_info (struct objfile *objfile)
1575b725ae77Skettenis {
1576b725ae77Skettenis struct comp_unit unit;
1577b725ae77Skettenis char *frame_ptr;
1578b725ae77Skettenis
1579b725ae77Skettenis /* Build a minimal decoding of the DWARF2 compilation unit. */
1580b725ae77Skettenis unit.abfd = objfile->obfd;
1581b725ae77Skettenis unit.objfile = objfile;
1582b725ae77Skettenis unit.dbase = 0;
1583b725ae77Skettenis unit.tbase = 0;
1584b725ae77Skettenis
1585b725ae77Skettenis /* First add the information from the .eh_frame section. That way,
1586b725ae77Skettenis the FDEs from that section are searched last. */
1587b725ae77Skettenis if (dwarf_eh_frame_section)
1588b725ae77Skettenis {
1589b725ae77Skettenis asection *got, *txt;
1590b725ae77Skettenis
1591b725ae77Skettenis unit.cie = NULL;
1592b725ae77Skettenis unit.dwarf_frame_buffer = dwarf2_read_section (objfile,
1593b725ae77Skettenis dwarf_eh_frame_section);
1594b725ae77Skettenis
159511efff7fSkettenis unit.dwarf_frame_size = bfd_get_section_size (dwarf_eh_frame_section);
1596b725ae77Skettenis unit.dwarf_frame_section = dwarf_eh_frame_section;
1597b725ae77Skettenis
1598b725ae77Skettenis /* FIXME: kettenis/20030602: This is the DW_EH_PE_datarel base
1599b725ae77Skettenis that is used for the i386/amd64 target, which currently is
1600b725ae77Skettenis the only target in GCC that supports/uses the
1601b725ae77Skettenis DW_EH_PE_datarel encoding. */
1602b725ae77Skettenis got = bfd_get_section_by_name (unit.abfd, ".got");
1603b725ae77Skettenis if (got)
1604b725ae77Skettenis unit.dbase = got->vma;
1605b725ae77Skettenis
1606b725ae77Skettenis /* GCC emits the DW_EH_PE_textrel encoding type on sh and ia64
1607b725ae77Skettenis so far. */
1608b725ae77Skettenis txt = bfd_get_section_by_name (unit.abfd, ".text");
1609b725ae77Skettenis if (txt)
1610b725ae77Skettenis unit.tbase = txt->vma;
1611b725ae77Skettenis
1612b725ae77Skettenis frame_ptr = unit.dwarf_frame_buffer;
1613b725ae77Skettenis while (frame_ptr < unit.dwarf_frame_buffer + unit.dwarf_frame_size)
1614b725ae77Skettenis frame_ptr = decode_frame_entry (&unit, frame_ptr, 1);
1615b725ae77Skettenis }
1616b725ae77Skettenis
1617b725ae77Skettenis if (dwarf_frame_section)
1618b725ae77Skettenis {
1619b725ae77Skettenis unit.cie = NULL;
1620b725ae77Skettenis unit.dwarf_frame_buffer = dwarf2_read_section (objfile,
1621b725ae77Skettenis dwarf_frame_section);
162211efff7fSkettenis unit.dwarf_frame_size = bfd_get_section_size (dwarf_frame_section);
1623b725ae77Skettenis unit.dwarf_frame_section = dwarf_frame_section;
1624b725ae77Skettenis
1625b725ae77Skettenis frame_ptr = unit.dwarf_frame_buffer;
1626b725ae77Skettenis while (frame_ptr < unit.dwarf_frame_buffer + unit.dwarf_frame_size)
1627b725ae77Skettenis frame_ptr = decode_frame_entry (&unit, frame_ptr, 0);
1628b725ae77Skettenis }
1629b725ae77Skettenis }
1630b725ae77Skettenis
1631b725ae77Skettenis /* Provide a prototype to silence -Wmissing-prototypes. */
1632b725ae77Skettenis void _initialize_dwarf2_frame (void);
1633b725ae77Skettenis
1634b725ae77Skettenis void
_initialize_dwarf2_frame(void)1635b725ae77Skettenis _initialize_dwarf2_frame (void)
1636b725ae77Skettenis {
163711efff7fSkettenis dwarf2_frame_data = gdbarch_data_register_pre_init (dwarf2_frame_init);
1638b725ae77Skettenis dwarf2_frame_objfile_data = register_objfile_data ();
1639b725ae77Skettenis }
1640