xref: /openbsd-src/gnu/usr.bin/binutils/gdb/dwarf2-frame.c (revision 84a83e238ec8f89c0ce5bb1a5d6f3f5cc1612949)
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, &reg);
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, &reg);
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, &reg);
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, &reg);
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, &reg);
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, &reg);
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, &reg);
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, &reg);
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