1 /* Stack unwinding code based on dwarf2 frame info for GDB, the GNU debugger.
3 Free Software Foundation, Inc.
4 Contributed by Jiri Smid, SuSE Labs.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
28 #include "elf/dwarf2.h"
31 #include "dwarf2cfi.h"
33 /* Common Information Entry - holds information that is shared among many
37 /* Offset of this unit in dwarf_frame_buffer. */
40 /* A null-terminated string that identifies the augmentation to this CIE or
41 to the FDEs that use it. */
44 /* A constant that is factored out of all advance location instructions. */
45 unsigned int code_align;
47 /* A constant that is factored out of all offset instructions. */
50 /* A constant that indicates which regiter represents the return address
54 /* Indicates how addresses are encoded. */
55 unsigned char addr_encoding;
57 /* Pointer and length of the cie program. */
59 unsigned int data_length;
61 struct objfile *objfile;
64 struct cie_unit *next;
67 /* Frame Description Entry. */
70 /* Address of the first location associated with this entry. */
71 CORE_ADDR initial_location;
73 /* Length of program section described by this entry. */
74 CORE_ADDR address_range;
76 /* Pointer to asociated CIE. */
77 struct cie_unit *cie_ptr;
79 /* Pointer and length of the cie program. */
81 unsigned int data_length;
86 struct fde_unit **array;
103 REG_CTX_SAVED_OFFSET,
111 /* This is the register and unwind state for a particular frame. */
114 struct context_reg *reg;
122 struct frame_state_reg
143 /* Each register save state can be described in terms of a CFA slot,
144 another register, or a location expression. */
145 struct frame_state_regs
147 struct frame_state_reg *reg;
149 /* Used to implement DW_CFA_remember_state. */
150 struct frame_state_regs *prev;
154 /* The CFA can be described in terms of a reg+offset or a
155 location expression. */
158 unsigned char *cfa_exp;
167 /* The PC described by the current frame state. */
170 /* The information we care about from the CIE/FDE. */
172 unsigned int code_align;
173 unsigned char retaddr_column;
174 unsigned char addr_encoding;
176 struct objfile *objfile;
179 #define UNWIND_CONTEXT(fi) ((struct context *) (fi->context))
182 static struct cie_unit *cie_chunks;
183 static struct fde_array fde_chunks;
184 /* Obstack for allocating temporary storage used during unwind operations. */
185 static struct obstack unwind_tmp_obstack;
187 extern file_ptr dwarf_frame_offset;
188 extern unsigned int dwarf_frame_size;
189 extern file_ptr dwarf_eh_frame_offset;
190 extern unsigned int dwarf_eh_frame_size;
192 static char *dwarf_frame_buffer;
195 extern char *dwarf2_read_section (struct objfile *objfile, file_ptr offset,
198 static struct fde_unit *fde_unit_alloc (void);
199 static struct cie_unit *cie_unit_alloc (void);
200 static void fde_chunks_need_space ();
202 static struct context *context_alloc ();
203 static struct frame_state *frame_state_alloc ();
204 static void unwind_tmp_obstack_free ();
205 static void context_cpy (struct context *dst, struct context *src);
207 static unsigned int read_1u (bfd *abfd, char **p);
208 static int read_1s (bfd *abfd, char **p);
209 static unsigned int read_2u (bfd *abfd, char **p);
210 static int read_2s (bfd *abfd, char **p);
211 static unsigned int read_4u (bfd *abfd, char **p);
212 static int read_4s (bfd *abfd, char **p);
213 static ULONGEST read_8u (bfd *abfd, char **p);
214 static LONGEST read_8s (bfd *abfd, char **p);
216 static ULONGEST read_uleb128 (bfd *abfd, char **p);
217 static LONGEST read_sleb128 (bfd *abfd, char **p);
218 static CORE_ADDR read_pointer (bfd *abfd, char **p);
219 static CORE_ADDR read_encoded_pointer (bfd *abfd, char **p,
220 unsigned char encoding);
222 static LONGEST read_initial_length (bfd *abfd, char *buf, int *bytes_read);
223 static ULONGEST read_length (bfd *abfd, char *buf, int *bytes_read,
225 static ULONGEST read_address (bfd *abfd, char **p);
228 static int is_cie (ULONGEST cie_id, int dwarf64);
229 static int compare_fde_unit (const void *a, const void *b);
230 void dwarf2_build_frame_info (struct objfile *objfile);
232 static void execute_cfa_program (struct objfile *objfile, char *insn_ptr,
233 char *insn_end, struct context *context,
234 struct frame_state *fs);
235 static struct fde_unit *get_fde_for_addr (CORE_ADDR pc);
236 static void frame_state_for (struct context *context, struct frame_state *fs);
237 static void get_reg (char *reg, struct context *context, int regnum);
238 static CORE_ADDR execute_stack_op (struct objfile *objfile,
239 char *op_ptr, char *op_end,
240 struct context *context, CORE_ADDR initial);
241 static void update_context (struct context *context, struct frame_state *fs,
245 /* Memory allocation functions. */
246 static struct fde_unit *
247 fde_unit_alloc (void)
249 struct fde_unit *fde;
251 fde = (struct fde_unit *) xmalloc (sizeof (struct fde_unit));
252 memset (fde, 0, sizeof (struct fde_unit));
256 static struct cie_unit *
257 cie_unit_alloc (void)
259 struct cie_unit *cie;
261 cie = (struct cie_unit *) xmalloc (sizeof (struct cie_unit));
262 memset (cie, 0, sizeof (struct cie_unit));
267 fde_chunks_need_space ()
269 if (fde_chunks.elems < fde_chunks.array_size)
271 fde_chunks.array_size =
272 fde_chunks.array_size ? 2 * fde_chunks.array_size : 1024;
274 xrealloc (fde_chunks.array,
275 sizeof (struct fde_unit) * fde_chunks.array_size);
278 /* Alocate a new `struct context' on temporary obstack. */
279 static struct context *
282 struct context *context;
283 struct context_reg *reg;
284 int regs_size = sizeof (struct context_reg) * NUM_REGS;
286 context = (struct context *) obstack_alloc (&unwind_tmp_obstack,
287 sizeof (struct context));
288 memset (context, 0, sizeof (struct context));
289 context->reg = (struct context_reg *) obstack_alloc (&unwind_tmp_obstack,
291 memset (context->reg, 0, regs_size);
295 /* Alocate a new `struct frame_state' on temporary obstack. */
296 static struct frame_state *
299 struct frame_state *fs;
300 struct frame_state_reg *reg;
301 int regs_size = sizeof (struct frame_state_reg) * NUM_REGS;
303 fs = (struct frame_state *) obstack_alloc (&unwind_tmp_obstack,
304 sizeof (struct frame_state));
305 memset (fs, 0, sizeof (struct frame_state));
306 fs->regs.reg = (struct frame_state_reg *) obstack_alloc (&unwind_tmp_obstack,
308 memset (fs->regs.reg, 0, regs_size);
313 unwind_tmp_obstack_free ()
315 obstack_free (&unwind_tmp_obstack, NULL);
316 obstack_init (&unwind_tmp_obstack);
320 context_cpy (struct context *dst, struct context *src)
322 struct context_reg *reg = dst->reg;
323 int regs_size = sizeof (struct context_reg) * NUM_REGS;
326 memcpy (dst->reg, src->reg, regs_size);
331 read_1u (bfd *abfd, char **p)
335 ret= bfd_get_8 (abfd, (bfd_byte *) *p);
341 read_1s (bfd *abfd, char **p)
345 ret= bfd_get_signed_8 (abfd, (bfd_byte *) *p);
351 read_2u (bfd *abfd, char **p)
355 ret= bfd_get_16 (abfd, (bfd_byte *) *p);
361 read_2s (bfd *abfd, char **p)
365 ret= bfd_get_signed_16 (abfd, (bfd_byte *) *p);
371 read_4u (bfd *abfd, char **p)
375 ret= bfd_get_32 (abfd, (bfd_byte *) *p);
381 read_4s (bfd *abfd, char **p)
385 ret= bfd_get_signed_32 (abfd, (bfd_byte *) *p);
391 read_8u (bfd *abfd, char **p)
395 ret = bfd_get_64 (abfd, (bfd_byte *) *p);
401 read_8s (bfd *abfd, char **p)
405 ret = bfd_get_signed_64 (abfd, (bfd_byte *) *p);
411 read_uleb128 (bfd *abfd, char **p)
422 byte = bfd_get_8 (abfd, (bfd_byte *) *p);
424 ret |= ((unsigned long) (byte & 127) << shift);
425 if ((byte & 128) == 0)
435 read_sleb128 (bfd *abfd, char **p)
438 int i, shift, size, num_read;
448 byte = bfd_get_8 (abfd, (bfd_byte *) *p);
450 ret |= ((long) (byte & 127) << shift);
452 if ((byte & 128) == 0)
457 if ((shift < size) && (byte & 0x40))
459 ret |= -(1 << shift);
465 read_pointer (bfd *abfd, char **p)
467 switch (TARGET_ADDR_BIT / TARGET_CHAR_BIT)
470 return read_4u (abfd, p);
472 return read_8u (abfd, p);
474 error ("dwarf cfi error: unsupported target address length.");
479 read_encoded_pointer (bfd *abfd, char **p, unsigned char encoding)
483 switch (encoding & 0x0f)
485 case DW_EH_PE_absptr:
486 ret = read_pointer (abfd, p);
489 case DW_EH_PE_uleb128:
490 ret = read_uleb128 (abfd, p);
492 case DW_EH_PE_sleb128:
493 ret = read_sleb128 (abfd, p);
496 case DW_EH_PE_udata2:
497 ret = read_2u (abfd, p);
499 case DW_EH_PE_udata4:
500 ret = read_4u (abfd, p);
502 case DW_EH_PE_udata8:
503 ret = read_8u (abfd, p);
506 case DW_EH_PE_sdata2:
507 ret = read_2s (abfd, p);
509 case DW_EH_PE_sdata4:
510 ret = read_4s (abfd, p);
512 case DW_EH_PE_sdata8:
513 ret = read_8s (abfd, p);
517 internal_error (__FILE__, __LINE__,
518 "read_encoded_pointer: unknown pointer encoding");
522 switch (encoding & 0xf0)
524 case DW_EH_PE_absptr:
527 ret += (CORE_ADDR) *p;
529 case DW_EH_PE_textrel:
530 case DW_EH_PE_datarel:
531 case DW_EH_PE_funcrel:
533 internal_error (__FILE__, __LINE__,
534 "read_encoded_pointer: unknown pointer encoding");
541 read_initial_length (bfd * abfd, char *buf, int *bytes_read)
545 ret = bfd_get_32 (abfd, (bfd_byte *) buf);
547 if (ret == 0xffffffff)
549 ret = bfd_get_64 (abfd, (bfd_byte *) buf + 4);
561 read_length (bfd * abfd, char *buf, int *bytes_read, int dwarf64)
566 return read_8u (abfd, &buf);
571 return read_4u (abfd, &buf);
576 execute_cfa_program ( struct objfile *objfile, char *insn_ptr, char *insn_end,
577 struct context *context, struct frame_state *fs)
579 struct frame_state_regs *unused_rs = NULL;
581 /* Don't allow remember/restore between CIE and FDE programs. */
582 fs->regs.prev = NULL;
584 while (insn_ptr < insn_end && fs->pc < context->ra)
586 unsigned char insn = *insn_ptr++;
587 ULONGEST reg, uoffset;
591 if (insn & DW_CFA_advance_loc)
592 fs->pc += (insn & 0x3f) * fs->code_align;
593 else if (insn & DW_CFA_offset)
596 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
597 offset = (long) uoffset * fs->data_align;
598 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
599 fs->regs.reg[reg].loc.offset = offset;
601 else if (insn & DW_CFA_restore)
604 fs->regs.reg[reg].how = REG_UNSAVED;
610 fs->pc = read_encoded_pointer (objfile->obfd, &insn_ptr,
614 case DW_CFA_advance_loc1:
615 fs->pc += read_1u (objfile->obfd, &insn_ptr);
617 case DW_CFA_advance_loc2:
618 fs->pc += read_2u (objfile->obfd, &insn_ptr);
620 case DW_CFA_advance_loc4:
621 fs->pc += read_4u (objfile->obfd, &insn_ptr);
624 case DW_CFA_offset_extended:
625 reg = read_uleb128 (objfile->obfd, &insn_ptr);
626 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
627 offset = (long) uoffset *fs->data_align;
628 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
629 fs->regs.reg[reg].loc.offset = offset;
632 case DW_CFA_restore_extended:
633 reg = read_uleb128 (objfile->obfd, &insn_ptr);
634 fs->regs.reg[reg].how = REG_UNSAVED;
637 case DW_CFA_undefined:
638 case DW_CFA_same_value:
642 case DW_CFA_register:
645 reg = read_uleb128 (objfile->obfd, &insn_ptr);
646 reg2 = read_uleb128 (objfile->obfd, &insn_ptr);
647 fs->regs.reg[reg].how = REG_SAVED_REG;
648 fs->regs.reg[reg].loc.reg = reg2;
652 case DW_CFA_remember_state:
654 struct frame_state_regs *new_rs;
658 unused_rs = unused_rs->prev;
661 new_rs = xmalloc (sizeof (struct frame_state_regs));
664 fs->regs.prev = new_rs;
668 case DW_CFA_restore_state:
670 struct frame_state_regs *old_rs = fs->regs.prev;
672 old_rs->prev = unused_rs;
678 reg = read_uleb128 (objfile->obfd, &insn_ptr);
679 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
681 fs->cfa_offset = uoffset;
682 fs->cfa_how = CFA_REG_OFFSET;
685 case DW_CFA_def_cfa_register:
686 reg = read_uleb128 (objfile->obfd, &insn_ptr);
688 fs->cfa_how = CFA_REG_OFFSET;
691 case DW_CFA_def_cfa_offset:
692 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
693 fs->cfa_offset = uoffset;
696 case DW_CFA_def_cfa_expression:
697 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
698 fs->cfa_exp = insn_ptr;
699 fs->cfa_how = CFA_EXP;
703 case DW_CFA_expression:
704 reg = read_uleb128 (objfile->obfd, &insn_ptr);
705 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
706 fs->regs.reg[reg].how = REG_SAVED_EXP;
707 fs->regs.reg[reg].loc.exp = insn_ptr;
711 /* From the 2.1 draft. */
712 case DW_CFA_offset_extended_sf:
713 reg = read_uleb128 (objfile->obfd, &insn_ptr);
714 offset = read_sleb128 (objfile->obfd, &insn_ptr);
715 offset *= fs->data_align;
716 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
717 fs->regs.reg[reg].loc.offset = offset;
720 case DW_CFA_def_cfa_sf:
721 reg = read_uleb128 (objfile->obfd, &insn_ptr);
722 offset = read_sleb128 (objfile->obfd, &insn_ptr);
723 fs->cfa_offset = offset;
725 fs->cfa_how = CFA_REG_OFFSET;
728 case DW_CFA_def_cfa_offset_sf:
729 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
730 fs->cfa_offset = uoffset;
731 /* cfa_how deliberately not set. */
734 case DW_CFA_GNU_window_save:
735 /* ??? Hardcoded for SPARC register window configuration. */
736 for (reg = 16; reg < 32; ++reg)
738 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
739 fs->regs.reg[reg].loc.offset = (reg - 16) * sizeof (void *);
743 case DW_CFA_GNU_args_size:
744 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
745 context->args_size = uoffset;
748 case DW_CFA_GNU_negative_offset_extended:
749 /* Obsoleted by DW_CFA_offset_extended_sf, but used by
750 older PowerPC code. */
751 reg = read_uleb128 (objfile->obfd, &insn_ptr);
752 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
753 offset = (long) uoffset *fs->data_align;
754 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
755 fs->regs.reg[reg].loc.offset = -offset;
759 error ("dwarf cfi error: unknown cfa instruction %d.", insn);
764 static struct fde_unit *
765 get_fde_for_addr (CORE_ADDR pc)
768 struct fde_unit *fde = NULL;
770 hi = fde_chunks.elems;
774 size_t i = (lo + hi) / 2;
775 fde = fde_chunks.array[i];
776 if (pc < fde->initial_location)
778 else if (pc >= fde->initial_location + fde->address_range)
787 frame_state_for (struct context *context, struct frame_state *fs)
789 struct fde_unit *fde;
790 struct cie_unit *cie;
791 unsigned char *aug, *insn, *end;
793 context->args_size = 0;
796 if ((fde = get_fde_for_addr (context->ra - 1)) != NULL)
798 fs->pc = fde->initial_location;
801 fs->code_align = cie->code_align;
802 fs->data_align = cie->data_align;
803 fs->retaddr_column = cie->ra;
804 fs->addr_encoding = cie->addr_encoding;
805 fs->objfile = cie->objfile;
807 execute_cfa_program (cie->objfile, cie->data,
808 cie->data + cie->data_length, context, fs);
809 execute_cfa_program (cie->objfile, fde->data,
810 fde->data + fde->data_length, context, fs);
815 get_reg (char *reg, struct context *context, int regnum)
817 switch (context->reg[regnum].how)
819 case REG_CTX_UNSAVED:
820 read_register_gen (regnum, reg);
822 case REG_CTX_SAVED_OFFSET:
823 target_read_memory (context->cfa + context->reg[regnum].loc.offset,
824 reg, REGISTER_RAW_SIZE (regnum));
826 case REG_CTX_SAVED_REG:
827 read_register_gen (context->reg[regnum].loc.reg, reg);
829 case REG_CTX_SAVED_ADDR:
830 target_read_memory (context->reg[regnum].loc.addr,
831 reg, REGISTER_RAW_SIZE (regnum));
834 memcpy (reg, &context->reg[regnum].loc.addr,
835 REGISTER_RAW_SIZE (regnum));
838 internal_error (__FILE__, __LINE__,
839 "get_reg: unknown register rule");
843 /* Decode a DW_OP stack program. Return the top of stack. Push INITIAL
844 onto the stack to start. */
846 execute_stack_op (struct objfile *objfile,
847 char *op_ptr, char *op_end, struct context *context,
850 CORE_ADDR stack[64]; /* ??? Assume this is enough. */
856 while (op_ptr < op_end)
858 enum dwarf_location_atom op = *op_ptr++;
859 ULONGEST result, reg;
896 result = op - DW_OP_lit0;
900 result = read_pointer (objfile->obfd, &op_ptr);
904 result = read_1u (objfile->obfd, &op_ptr);
907 result = read_1s (objfile->obfd, &op_ptr);
910 result = read_2u (objfile->obfd, &op_ptr);
913 result = read_2s (objfile->obfd, &op_ptr);
916 result = read_4u (objfile->obfd, &op_ptr);
919 result = read_4s (objfile->obfd, &op_ptr);
922 result = read_8u (objfile->obfd, &op_ptr);
925 result = read_8s (objfile->obfd, &op_ptr);
928 result = read_uleb128 (objfile->obfd, &op_ptr);
931 result = read_sleb128 (objfile->obfd, &op_ptr);
966 get_reg ((char *) &result, context, op - DW_OP_reg0);
969 reg = read_uleb128 (objfile->obfd, &op_ptr);
970 get_reg ((char *) &result, context, reg);
1005 offset = read_sleb128 (objfile->obfd, &op_ptr);
1006 get_reg ((char *) &result, context, op - DW_OP_breg0);
1010 reg = read_uleb128 (objfile->obfd, &op_ptr);
1011 offset = read_sleb128 (objfile->obfd, &op_ptr);
1012 get_reg ((char *) &result, context, reg);
1018 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1019 result = stack[stack_elt - 1];
1023 if (--stack_elt < 0)
1024 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1029 if (offset >= stack_elt - 1)
1030 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1031 result = stack[stack_elt - 1 - offset];
1036 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1037 result = stack[stack_elt - 2];
1042 CORE_ADDR t1, t2, t3;
1045 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1046 t1 = stack[stack_elt - 1];
1047 t2 = stack[stack_elt - 2];
1048 t3 = stack[stack_elt - 3];
1049 stack[stack_elt - 1] = t2;
1050 stack[stack_elt - 2] = t3;
1051 stack[stack_elt - 3] = t1;
1056 case DW_OP_deref_size:
1060 case DW_OP_plus_uconst:
1061 /* Unary operations. */
1062 if (--stack_elt < 0)
1063 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1064 result = stack[stack_elt];
1070 char *ptr = (char *) result;
1071 result = read_pointer (objfile->obfd, &ptr);
1075 case DW_OP_deref_size:
1077 char *ptr = (char *) result;
1081 result = read_1u (objfile->obfd, &ptr);
1084 result = read_2u (objfile->obfd, &ptr);
1087 result = read_4u (objfile->obfd, &ptr);
1090 result = read_8u (objfile->obfd, &ptr);
1093 internal_error (__FILE__, __LINE__,
1094 "execute_stack_op error");
1109 case DW_OP_plus_uconst:
1110 result += read_uleb128 (objfile->obfd, &op_ptr);
1129 /* Binary operations. */
1130 CORE_ADDR first, second;
1131 if ((stack_elt -= 2) < 0)
1132 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1133 second = stack[stack_elt];
1134 first = stack[stack_elt + 1];
1139 result = second & first;
1142 result = (LONGEST) second / (LONGEST) first;
1145 result = second - first;
1148 result = (LONGEST) second % (LONGEST) first;
1151 result = second * first;
1154 result = second | first;
1157 result = second + first;
1160 result = second << first;
1163 result = second >> first;
1166 result = (LONGEST) second >> first;
1169 result = second ^ first;
1172 result = (LONGEST) first <= (LONGEST) second;
1175 result = (LONGEST) first >= (LONGEST) second;
1178 result = (LONGEST) first == (LONGEST) second;
1181 result = (LONGEST) first < (LONGEST) second;
1184 result = (LONGEST) first > (LONGEST) second;
1187 result = (LONGEST) first != (LONGEST) second;
1194 offset = read_2s (objfile->obfd, &op_ptr);
1199 if (--stack_elt < 0)
1200 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1201 offset = read_2s (objfile->obfd, &op_ptr);
1202 if (stack[stack_elt] != 0)
1210 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1213 /* Most things push a result value. */
1214 if ((size_t) stack_elt >= sizeof (stack) / sizeof (*stack))
1215 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1216 stack[++stack_elt] = result;
1220 /* We were executing this program to get a value. It should be
1222 if (--stack_elt < 0)
1223 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1224 return stack[stack_elt];
1228 update_context (struct context *context, struct frame_state *fs, int chain)
1230 struct context *orig_context;
1234 orig_context = context_alloc ();
1235 context_cpy (orig_context, context);
1236 /* Compute this frame's CFA. */
1237 switch (fs->cfa_how)
1239 case CFA_REG_OFFSET:
1240 get_reg ((char *) &cfa, context, fs->cfa_reg);
1241 cfa += fs->cfa_offset;
1245 /* ??? No way of knowing what register number is the stack pointer
1246 to do the same sort of handling as above. Assume that if the
1247 CFA calculation is so complicated as to require a stack program
1248 that this will not be a problem. */
1250 char *exp = fs->cfa_exp;
1253 len = read_uleb128 (fs->objfile->obfd, &exp);
1254 cfa = (CORE_ADDR) execute_stack_op (fs->objfile, exp,
1255 exp + len, context, 0);
1262 orig_context->cfa = cfa;
1264 /* Compute the addresses of all registers saved in this frame. */
1265 for (i = 0; i < NUM_REGS; ++i)
1266 switch (fs->regs.reg[i].how)
1271 context->reg[i].how = REG_CTX_VALUE;
1272 context->reg[i].loc.addr = cfa;
1275 context->reg[i].how = REG_CTX_UNSAVED;
1277 case REG_SAVED_OFFSET:
1278 context->reg[i].how = REG_CTX_SAVED_OFFSET;
1279 context->reg[i].loc.offset = fs->regs.reg[i].loc.offset;
1282 switch (orig_context->reg[fs->regs.reg[i].loc.reg].how)
1284 case REG_CTX_UNSAVED:
1285 context->reg[i].how = REG_CTX_UNSAVED;
1287 case REG_CTX_SAVED_OFFSET:
1288 context->reg[i].how = REG_CTX_SAVED_OFFSET;
1289 context->reg[i].loc.offset = orig_context->cfa - context->cfa +
1290 orig_context->reg[fs->regs.reg[i].loc.reg].loc.offset;
1292 case REG_CTX_SAVED_REG:
1293 context->reg[i].how = REG_CTX_SAVED_REG;
1294 context->reg[i].loc.reg =
1295 orig_context->reg[fs->regs.reg[i].loc.reg].loc.reg;
1297 case REG_CTX_SAVED_ADDR:
1298 context->reg[i].how = REG_CTX_SAVED_ADDR;
1299 context->reg[i].loc.addr =
1300 orig_context->reg[fs->regs.reg[i].loc.reg].loc.addr;
1302 internal_error (__FILE__, __LINE__,
1303 "cfi_update_context: unknown register rule");
1308 char *exp = fs->regs.reg[i].loc.exp;
1312 len = read_uleb128 (fs->objfile->obfd, &exp);
1313 val = execute_stack_op (fs->objfile, exp, exp + len,
1315 context->reg[i].how = REG_CTX_SAVED_ADDR;
1316 context->reg[i].loc.addr = val;
1320 internal_error (__FILE__, __LINE__,
1321 "cfi_update_context: unknown register rule");
1324 get_reg ((char *) &context->ra, context, fs->retaddr_column);
1325 unwind_tmp_obstack_free ();
1329 is_cie (ULONGEST cie_id, int dwarf64)
1331 return dwarf64 ? (cie_id == 0xffffffffffffffff) : (cie_id == 0xffffffff);
1335 compare_fde_unit (const void *a, const void *b)
1337 struct fde_unit **first, **second;
1338 first = (struct fde_unit **) a;
1339 second = (struct fde_unit **) b;
1340 if ((*first)->initial_location > (*second)->initial_location)
1342 else if ((*first)->initial_location < (*second)->initial_location)
1348 /* Build the cie_chunks and fde_chunks tables from informations
1349 in .debug.frame section. */
1351 dwarf2_build_frame_info (struct objfile *objfile)
1353 bfd *abfd = objfile->obfd;
1357 obstack_init (&unwind_tmp_obstack);
1359 dwarf_frame_buffer = 0;
1361 if (dwarf_frame_offset)
1363 dwarf_frame_buffer = dwarf2_read_section (objfile,
1367 start = dwarf_frame_buffer;
1368 end = dwarf_frame_buffer + dwarf_frame_size;
1370 else if (dwarf_eh_frame_offset)
1372 dwarf_frame_buffer = dwarf2_read_section (objfile,
1373 dwarf_eh_frame_offset,
1374 dwarf_eh_frame_size);
1376 start = dwarf_frame_buffer;
1377 end = dwarf_frame_buffer + dwarf_eh_frame_size;
1384 unsigned long length;
1386 ULONGEST unit_offset = start - dwarf_frame_buffer;
1391 length = read_initial_length (abfd, start, &bytes_read);
1392 start += bytes_read;
1393 dwarf64 = (bytes_read == 12);
1394 block_end = start + length;
1396 cie_id = read_length (abfd, start, &bytes_read, dwarf64);
1397 start += bytes_read;
1399 if (is_cie (cie_id, dwarf64))
1401 struct cie_unit *cie = cie_unit_alloc ();
1404 cie->objfile = objfile;
1405 cie->next = cie_chunks;
1408 cie->objfile = objfile;
1410 cie->offset = unit_offset;
1412 start++; /* version */
1414 cie->augmentation = aug = start;
1417 start++; /* skip past NUL */
1419 cie->code_align = read_uleb128 (abfd, &start);
1420 cie->data_align = read_sleb128 (abfd, &start);
1421 cie->ra = read_1u (abfd, &start);
1425 int xtra = read_uleb128 (abfd, &start);
1430 while (*aug != '\0')
1432 if (aug[0] == 'e' && aug[1] == 'h')
1434 start += sizeof (void *);
1437 else if (aug[0] == 'R')
1439 cie->addr_encoding = *start++;
1442 else if (aug[0] == 'P')
1445 ptr = read_encoded_pointer (abfd, &start,
1446 cie->addr_encoding);
1450 warning ("unknown augmentation");
1454 cie->data_length = block_end - start;
1458 struct fde_unit *fde;
1459 struct cie_unit *cie;
1461 fde_chunks_need_space ();
1462 fde = fde_unit_alloc ();
1464 fde_chunks.array[fde_chunks.elems++] = fde;
1465 fde->initial_location = read_pointer (abfd, &start);
1466 fde->address_range = read_pointer (abfd, &start);
1468 for (cie = cie_chunks;
1469 cie && (cie->offset != cie_id); cie = cie->next);
1471 error ("dwarf cfi error: can't find CIE pointer");
1474 if (cie->augmentation[0] == 'z')
1475 read_uleb128 (abfd, &start);
1478 fde->data_length = block_end - start;
1482 qsort (fde_chunks.array, fde_chunks.elems,
1483 sizeof (struct fde_unit *), compare_fde_unit);
1488 /* Return the frame address. */
1492 struct context *context;
1493 struct frame_state *fs;
1496 context = context_alloc ();
1497 fs = frame_state_alloc ();
1499 context->ra = read_pc () + 1;
1501 frame_state_for (context, fs);
1502 update_context (context, fs, 0);
1505 unwind_tmp_obstack_free ();
1509 /* Store the frame address. */
1511 cfi_write_fp (CORE_ADDR val)
1513 struct context *context;
1514 struct frame_state *fs;
1516 context = context_alloc ();
1517 fs = frame_state_alloc ();
1519 context->ra = read_pc () + 1;
1521 frame_state_for (context, fs);
1523 if (fs->cfa_how == CFA_REG_OFFSET)
1525 val -= fs->cfa_offset;
1526 write_register_gen (fs->cfa_reg, (char *) &val);
1529 warning ("Can't write fp.");
1531 unwind_tmp_obstack_free ();
1534 /* Restore the machine to the state it had before the current frame
1537 cfi_pop_frame (struct frame_info *fi)
1539 char regbuf[MAX_REGISTER_RAW_SIZE];
1542 fi = get_current_frame ();
1544 for (regnum = 0; regnum < NUM_REGS; regnum++)
1546 get_reg (regbuf, UNWIND_CONTEXT (fi), regnum);
1547 write_register_bytes (REGISTER_BYTE (regnum), regbuf,
1548 REGISTER_RAW_SIZE (regnum));
1550 write_register (PC_REGNUM, UNWIND_CONTEXT (fi)->ra);
1552 flush_cached_frames ();
1555 /* Determine the address of the calling function's frame. */
1557 cfi_frame_chain (struct frame_info *fi)
1559 struct context *context;
1560 struct frame_state *fs;
1563 context = context_alloc ();
1564 fs = frame_state_alloc ();
1565 context_cpy (context, UNWIND_CONTEXT (fi));
1567 /* outermost frame */
1568 if (context->ra == 0)
1570 unwind_tmp_obstack_free ();
1574 frame_state_for (context, fs);
1575 update_context (context, fs, 1);
1578 unwind_tmp_obstack_free ();
1582 /* Sets the pc of the frame. */
1584 cfi_init_frame_pc (int fromleaf, struct frame_info *fi)
1587 get_reg ((char *) &(fi->pc), UNWIND_CONTEXT (fi->next), PC_REGNUM);
1589 fi->pc = read_pc ();
1592 /* Initialize unwind context informations of the frame. */
1594 cfi_init_extra_frame_info (int fromleaf, struct frame_info *fi)
1596 struct frame_state *fs;
1598 fs = frame_state_alloc ();
1599 fi->context = frame_obstack_alloc (sizeof (struct context));
1600 UNWIND_CONTEXT (fi)->reg =
1601 frame_obstack_alloc (sizeof (struct context_reg) * NUM_REGS);
1602 memset (UNWIND_CONTEXT (fi)->reg, 0,
1603 sizeof (struct context_reg) * NUM_REGS);
1607 context_cpy (UNWIND_CONTEXT (fi), UNWIND_CONTEXT (fi->next));
1608 frame_state_for (UNWIND_CONTEXT (fi), fs);
1609 update_context (UNWIND_CONTEXT (fi), fs, 1);
1613 UNWIND_CONTEXT (fi)->ra = fi->pc + 1;
1614 frame_state_for (UNWIND_CONTEXT (fi), fs);
1615 update_context (UNWIND_CONTEXT (fi), fs, 0);
1617 unwind_tmp_obstack_free ();
1620 /* Obtain return address of the frame. */
1622 cfi_get_ra (struct frame_info *fi)
1624 return UNWIND_CONTEXT (fi)->ra;
1627 /* Find register number REGNUM relative to FRAME and put its
1628 (raw) contents in *RAW_BUFFER. Set *OPTIMIZED if the variable
1629 was optimized out (and thus can't be fetched). If the variable
1630 was fetched from memory, set *ADDRP to where it was fetched from,
1631 otherwise it was fetched from a register.
1633 The argument RAW_BUFFER must point to aligned memory. */
1635 cfi_get_saved_register (char *raw_buffer,
1638 struct frame_info *frame,
1639 int regnum, enum lval_type *lval)
1641 if (!target_has_registers)
1642 error ("No registers.");
1644 /* Normal systems don't optimize out things with register numbers. */
1645 if (optimized != NULL)
1648 if (addrp) /* default assumption: not found in memory */
1653 read_register_gen (regnum, raw_buffer);
1655 *lval = lval_register;
1657 *addrp = REGISTER_BYTE (regnum);
1661 frame = frame->next;
1662 switch (UNWIND_CONTEXT (frame)->reg[regnum].how)
1664 case REG_CTX_UNSAVED:
1665 read_register_gen (regnum, raw_buffer);
1668 if (optimized != NULL)
1671 case REG_CTX_SAVED_OFFSET:
1672 target_read_memory (UNWIND_CONTEXT (frame)->cfa +
1673 UNWIND_CONTEXT (frame)->reg[regnum].loc.offset,
1674 raw_buffer, REGISTER_RAW_SIZE (regnum));
1676 *lval = lval_memory;
1679 UNWIND_CONTEXT (frame)->cfa +
1680 UNWIND_CONTEXT (frame)->reg[regnum].loc.offset;
1682 case REG_CTX_SAVED_REG:
1683 read_register_gen (UNWIND_CONTEXT (frame)->reg[regnum].loc.reg,
1686 *lval = lval_register;
1689 REGISTER_BYTE (UNWIND_CONTEXT (frame)->reg[regnum].loc.reg);
1691 case REG_CTX_SAVED_ADDR:
1692 target_read_memory (UNWIND_CONTEXT (frame)->reg[regnum].loc.addr,
1693 raw_buffer, REGISTER_RAW_SIZE (regnum));
1695 *lval = lval_memory;
1697 *addrp = UNWIND_CONTEXT (frame)->reg[regnum].loc.addr;
1700 memcpy (raw_buffer, &UNWIND_CONTEXT (frame)->reg[regnum].loc.addr,
1701 REGISTER_RAW_SIZE (regnum));
1704 if (optimized != NULL)
1708 internal_error (__FILE__, __LINE__,
1709 "cfi_get_saved_register: unknown register rule");
1714 /* Return the register that the function uses for a frame pointer,
1715 plus any necessary offset to be applied to the register before
1716 any frame pointer offsets. */
1718 cfi_virtual_frame_pointer (CORE_ADDR pc, int *frame_reg,
1719 LONGEST * frame_offset)
1721 struct context *context;
1722 struct frame_state *fs;
1724 context = context_alloc ();
1725 fs = frame_state_alloc ();
1727 context->ra = read_pc () + 1;
1729 frame_state_for (context, fs);
1731 if (fs->cfa_how == CFA_REG_OFFSET)
1733 *frame_reg = fs->cfa_reg;
1734 *frame_offset = fs->cfa_offset;
1737 error ("dwarf cfi error: CFA is not defined as CFA_REG_OFFSET");
1739 unwind_tmp_obstack_free ();