2003-01-13 Andrew Cagney <ac131313@redhat.com>
[deliverable/binutils-gdb.git] / gdb / dwarf2cfi.c
1 /* Stack unwinding code based on dwarf2 frame info for GDB, the GNU debugger.
2
3 Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
4
5 Contributed by Jiri Smid, SuSE Labs.
6 Based on code written by Daniel Berlin (dan@dberlin.org).
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
24
25 #include "defs.h"
26 #include "gdbcore.h"
27 #include "symtab.h"
28 #include "symfile.h"
29 #include "objfiles.h"
30 #include "target.h"
31 #include "elf/dwarf2.h"
32 #include "inferior.h"
33 #include "regcache.h"
34 #include "dwarf2cfi.h"
35 #include "gdb_assert.h"
36
37 /* Common Information Entry - holds information that is shared among many
38 Frame Descriptors. */
39 struct cie_unit
40 {
41 /* Offset of this unit in .debug_frame or .eh_frame. */
42 ULONGEST offset;
43
44 /* A null-terminated string that identifies the augmentation to this CIE or
45 to the FDEs that use it. */
46 char *augmentation;
47
48 /* A constant that is factored out of all advance location instructions. */
49 unsigned int code_align;
50
51 /* A constant that is factored out of all offset instructions. */
52 int data_align;
53
54 /* A constant that indicates which regiter represents the return address
55 of a function. */
56 unsigned char ra;
57
58 /* Indicates how addresses are encoded. */
59 unsigned char addr_encoding;
60
61 /* Pointer and length of the cie program. */
62 char *data;
63 unsigned int data_length;
64
65 struct objfile *objfile;
66
67 /* Next in chain. */
68 struct cie_unit *next;
69 };
70
71 /* Frame Description Entry. */
72 struct fde_unit
73 {
74 /* Address of the first location associated with this entry. */
75 CORE_ADDR initial_location;
76
77 /* Length of program section described by this entry. */
78 CORE_ADDR address_range;
79
80 /* Pointer to asociated CIE. */
81 struct cie_unit *cie_ptr;
82
83 /* Pointer and length of the cie program. */
84 char *data;
85 unsigned int data_length;
86 };
87
88 struct fde_array
89 {
90 struct fde_unit **array;
91 int elems;
92 int array_size;
93 };
94
95 struct frame_state_reg
96 {
97 union
98 {
99 unsigned int reg;
100 long offset;
101 unsigned char *exp;
102 }
103 loc;
104 enum
105 {
106 REG_UNSAVED,
107 REG_SAVED_OFFSET,
108 REG_SAVED_REG,
109 REG_SAVED_EXP,
110 }
111 how;
112 };
113
114 struct frame_state
115 {
116 /* Each register save state can be described in terms of a CFA slot,
117 another register, or a location expression. */
118 struct frame_state_regs
119 {
120 struct frame_state_reg *reg;
121
122 /* Used to implement DW_CFA_remember_state. */
123 struct frame_state_regs *prev;
124 }
125 regs;
126
127 /* The CFA can be described in terms of a reg+offset or a
128 location expression. */
129 long cfa_offset;
130 int cfa_reg;
131 unsigned char *cfa_exp;
132 enum
133 {
134 CFA_UNSET,
135 CFA_REG_OFFSET,
136 CFA_EXP,
137 }
138 cfa_how;
139
140 /* The PC described by the current frame state. */
141 CORE_ADDR pc;
142
143 /* The information we care about from the CIE/FDE. */
144 int data_align;
145 unsigned int code_align;
146 unsigned char retaddr_column;
147 unsigned char addr_encoding;
148
149 struct objfile *objfile;
150 };
151
152 enum ptr_encoding
153 {
154 PE_absptr = DW_EH_PE_absptr,
155 PE_pcrel = DW_EH_PE_pcrel,
156 PE_textrel = DW_EH_PE_textrel,
157 PE_datarel = DW_EH_PE_datarel,
158 PE_funcrel = DW_EH_PE_funcrel
159 };
160
161 #define UNWIND_CONTEXT(fi) ((struct context *) (deprecated_get_frame_context (fi)))
162 \f
163
164 static struct cie_unit *cie_chunks;
165 static struct fde_array fde_chunks;
166 /* Obstack for allocating temporary storage used during unwind operations. */
167 static struct obstack unwind_tmp_obstack;
168
169 extern file_ptr dwarf_frame_offset;
170 extern unsigned int dwarf_frame_size;
171 extern file_ptr dwarf_eh_frame_offset;
172 extern unsigned int dwarf_eh_frame_size;
173 \f
174
175 extern char *dwarf2_read_section (struct objfile *objfile, file_ptr offset,
176 unsigned int size);
177
178 static struct fde_unit *fde_unit_alloc (void);
179 static struct cie_unit *cie_unit_alloc (void);
180 static void fde_chunks_need_space ();
181
182 static void unwind_tmp_obstack_init ();
183 static void unwind_tmp_obstack_free ();
184
185 static unsigned int read_1u (bfd *abfd, char **p);
186 static int read_1s (bfd *abfd, char **p);
187 static unsigned int read_2u (bfd *abfd, char **p);
188 static int read_2s (bfd *abfd, char **p);
189 static unsigned int read_4u (bfd *abfd, char **p);
190 static int read_4s (bfd *abfd, char **p);
191 static ULONGEST read_8u (bfd *abfd, char **p);
192 static LONGEST read_8s (bfd *abfd, char **p);
193
194 static ULONGEST read_uleb128 (bfd *abfd, char **p);
195 static LONGEST read_sleb128 (bfd *abfd, char **p);
196 static CORE_ADDR read_pointer (bfd *abfd, char **p);
197 static CORE_ADDR read_encoded_pointer (bfd *abfd, char **p,
198 unsigned char encoding);
199 static enum ptr_encoding pointer_encoding (unsigned char encoding);
200
201 static LONGEST read_initial_length (bfd *abfd, char *buf, int *bytes_read);
202 static ULONGEST read_length (bfd *abfd, char *buf, int *bytes_read,
203 int dwarf64);
204
205 static int is_cie (ULONGEST cie_id, int dwarf64);
206 static int compare_fde_unit (const void *a, const void *b);
207 void dwarf2_build_frame_info (struct objfile *objfile);
208
209 static void execute_cfa_program (struct objfile *objfile, char *insn_ptr,
210 char *insn_end, struct context *context,
211 struct frame_state *fs);
212 static struct fde_unit *get_fde_for_addr (CORE_ADDR pc);
213 static void frame_state_for (struct context *context, struct frame_state *fs);
214 static void get_reg (char *reg, struct context *context, int regnum);
215 static CORE_ADDR execute_stack_op (struct objfile *objfile,
216 char *op_ptr, char *op_end,
217 struct context *context,
218 CORE_ADDR initial);
219 static void update_context (struct context *context, struct frame_state *fs,
220 int chain);
221 \f
222
223 /* Memory allocation functions. */
224 static struct fde_unit *
225 fde_unit_alloc (void)
226 {
227 struct fde_unit *fde;
228
229 fde = (struct fde_unit *) xmalloc (sizeof (struct fde_unit));
230 memset (fde, 0, sizeof (struct fde_unit));
231 return fde;
232 }
233
234 static struct cie_unit *
235 cie_unit_alloc (void)
236 {
237 struct cie_unit *cie;
238
239 cie = (struct cie_unit *) xmalloc (sizeof (struct cie_unit));
240 memset (cie, 0, sizeof (struct cie_unit));
241 return cie;
242 }
243
244 static void
245 fde_chunks_need_space (void)
246 {
247 if (fde_chunks.elems < fde_chunks.array_size)
248 return;
249 fde_chunks.array_size =
250 fde_chunks.array_size ? 2 * fde_chunks.array_size : 1024;
251 fde_chunks.array =
252 xrealloc (fde_chunks.array,
253 sizeof (struct fde_unit) * fde_chunks.array_size);
254 }
255
256 /* Alocate a new `struct context' on temporary obstack. */
257 struct context *
258 context_alloc (void)
259 {
260 struct context *context;
261
262 int regs_size = sizeof (struct context_reg) * NUM_REGS;
263
264 context = (struct context *) obstack_alloc (&unwind_tmp_obstack,
265 sizeof (struct context));
266 memset (context, 0, sizeof (struct context));
267 context->reg = (struct context_reg *) obstack_alloc (&unwind_tmp_obstack,
268 regs_size);
269 memset (context->reg, 0, regs_size);
270 return context;
271 }
272
273 /* Alocate a new `struct frame_state' on temporary obstack. */
274 struct frame_state *
275 frame_state_alloc (void)
276 {
277 struct frame_state *fs;
278
279 int regs_size = sizeof (struct frame_state_reg) * NUM_REGS;
280
281 fs = (struct frame_state *) obstack_alloc (&unwind_tmp_obstack,
282 sizeof (struct frame_state));
283 memset (fs, 0, sizeof (struct frame_state));
284 fs->regs.reg =
285 (struct frame_state_reg *) obstack_alloc (&unwind_tmp_obstack, regs_size);
286 memset (fs->regs.reg, 0, regs_size);
287 return fs;
288 }
289
290 static void
291 unwind_tmp_obstack_init (void)
292 {
293 obstack_init (&unwind_tmp_obstack);
294 }
295
296 static void
297 unwind_tmp_obstack_free (void)
298 {
299 obstack_free (&unwind_tmp_obstack, NULL);
300 unwind_tmp_obstack_init ();
301 }
302
303 void
304 context_cpy (struct context *dst, struct context *src)
305 {
306 int regs_size = sizeof (struct context_reg) * NUM_REGS;
307 struct context_reg *dreg;
308
309 /* Since `struct context' contains a pointer to an array with
310 register values, make sure we end up with a copy of that array,
311 and not with a copy of the pointer to that array. */
312 dreg = dst->reg;
313 *dst = *src;
314 dst->reg = dreg;
315 memcpy (dst->reg, src->reg, regs_size);
316 }
317
318 static unsigned int
319 read_1u (bfd *abfd, char **p)
320 {
321 unsigned ret;
322
323 ret = bfd_get_8 (abfd, (bfd_byte *) * p);
324 (*p)++;
325 return ret;
326 }
327
328 static int
329 read_1s (bfd *abfd, char **p)
330 {
331 int ret;
332
333 ret = bfd_get_signed_8 (abfd, (bfd_byte *) * p);
334 (*p)++;
335 return ret;
336 }
337
338 static unsigned int
339 read_2u (bfd *abfd, char **p)
340 {
341 unsigned ret;
342
343 ret = bfd_get_16 (abfd, (bfd_byte *) * p);
344 (*p)++;
345 return ret;
346 }
347
348 static int
349 read_2s (bfd *abfd, char **p)
350 {
351 int ret;
352
353 ret = bfd_get_signed_16 (abfd, (bfd_byte *) * p);
354 (*p) += 2;
355 return ret;
356 }
357
358 static unsigned int
359 read_4u (bfd *abfd, char **p)
360 {
361 unsigned int ret;
362
363 ret = bfd_get_32 (abfd, (bfd_byte *) * p);
364 (*p) += 4;
365 return ret;
366 }
367
368 static int
369 read_4s (bfd *abfd, char **p)
370 {
371 int ret;
372
373 ret = bfd_get_signed_32 (abfd, (bfd_byte *) * p);
374 (*p) += 4;
375 return ret;
376 }
377
378 static ULONGEST
379 read_8u (bfd *abfd, char **p)
380 {
381 ULONGEST ret;
382
383 ret = bfd_get_64 (abfd, (bfd_byte *) * p);
384 (*p) += 8;
385 return ret;
386 }
387
388 static LONGEST
389 read_8s (bfd *abfd, char **p)
390 {
391 LONGEST ret;
392
393 ret = bfd_get_signed_64 (abfd, (bfd_byte *) * p);
394 (*p) += 8;
395 return ret;
396 }
397
398 static ULONGEST
399 read_uleb128 (bfd *abfd, char **p)
400 {
401 ULONGEST ret;
402 int i, shift;
403 unsigned char byte;
404
405 ret = 0;
406 shift = 0;
407 i = 0;
408 while (1)
409 {
410 byte = bfd_get_8 (abfd, (bfd_byte *) * p);
411 (*p)++;
412 ret |= ((unsigned long) (byte & 127) << shift);
413 if ((byte & 128) == 0)
414 {
415 break;
416 }
417 shift += 7;
418 }
419 return ret;
420 }
421
422 static LONGEST
423 read_sleb128 (bfd *abfd, char **p)
424 {
425 LONGEST ret;
426 int i, shift, size, num_read;
427 unsigned char byte;
428
429 ret = 0;
430 shift = 0;
431 size = 32;
432 num_read = 0;
433 i = 0;
434 while (1)
435 {
436 byte = bfd_get_8 (abfd, (bfd_byte *) * p);
437 (*p)++;
438 ret |= ((long) (byte & 127) << shift);
439 shift += 7;
440 if ((byte & 128) == 0)
441 {
442 break;
443 }
444 }
445 if ((shift < size) && (byte & 0x40))
446 {
447 ret |= -(1 << shift);
448 }
449 return ret;
450 }
451
452 static CORE_ADDR
453 read_pointer (bfd *abfd, char **p)
454 {
455 switch (TARGET_ADDR_BIT / TARGET_CHAR_BIT)
456 {
457 case 4:
458 return read_4u (abfd, p);
459 case 8:
460 return read_8u (abfd, p);
461 default:
462 error ("dwarf cfi error: unsupported target address length.");
463 }
464 }
465
466 /* Read the appropriate amount of data from *P and return the
467 resulting value based on ENCODING, which the calling function must
468 provide. */
469 static CORE_ADDR
470 read_encoded_pointer (bfd *abfd, char **p, unsigned char encoding)
471 {
472 CORE_ADDR ret;
473
474 switch (encoding & 0x0f)
475 {
476 case DW_EH_PE_absptr:
477 ret = read_pointer (abfd, p);
478 break;
479
480 case DW_EH_PE_uleb128:
481 ret = read_uleb128 (abfd, p);
482 break;
483 case DW_EH_PE_sleb128:
484 ret = read_sleb128 (abfd, p);
485 break;
486
487 case DW_EH_PE_udata2:
488 ret = read_2u (abfd, p);
489 break;
490 case DW_EH_PE_udata4:
491 ret = read_4u (abfd, p);
492 break;
493 case DW_EH_PE_udata8:
494 ret = read_8u (abfd, p);
495 break;
496
497 case DW_EH_PE_sdata2:
498 ret = read_2s (abfd, p);
499 break;
500 case DW_EH_PE_sdata4:
501 ret = read_4s (abfd, p);
502 break;
503 case DW_EH_PE_sdata8:
504 ret = read_8s (abfd, p);
505 break;
506
507 default:
508 internal_error (__FILE__, __LINE__,
509 "read_encoded_pointer: unknown pointer encoding");
510 }
511
512 return ret;
513 }
514
515 /* The variable 'encoding' carries three different flags:
516 - encoding & 0x0f : size of the address (handled in read_encoded_pointer())
517 - encoding & 0x70 : type (absolute, relative, ...)
518 - encoding & 0x80 : indirect flag (DW_EH_PE_indirect == 0x80). */
519 enum ptr_encoding
520 pointer_encoding (unsigned char encoding)
521 {
522 int ret;
523
524 if (encoding & DW_EH_PE_indirect)
525 warning ("CFI: Unsupported pointer encoding: DW_EH_PE_indirect");
526
527 switch (encoding & 0x70)
528 {
529 case DW_EH_PE_absptr:
530 case DW_EH_PE_pcrel:
531 case DW_EH_PE_textrel:
532 case DW_EH_PE_datarel:
533 case DW_EH_PE_funcrel:
534 ret = encoding & 0x70;
535 break;
536 default:
537 internal_error (__FILE__, __LINE__, "CFI: unknown pointer encoding");
538 }
539 return ret;
540 }
541
542 static LONGEST
543 read_initial_length (bfd *abfd, char *buf, int *bytes_read)
544 {
545 LONGEST ret = 0;
546
547 ret = bfd_get_32 (abfd, (bfd_byte *) buf);
548
549 if (ret == 0xffffffff)
550 {
551 ret = bfd_get_64 (abfd, (bfd_byte *) buf + 4);
552 *bytes_read = 12;
553 }
554 else
555 {
556 *bytes_read = 4;
557 }
558
559 return ret;
560 }
561
562 static ULONGEST
563 read_length (bfd *abfd, char *buf, int *bytes_read, int dwarf64)
564 {
565 if (dwarf64)
566 {
567 *bytes_read = 8;
568 return read_8u (abfd, &buf);
569 }
570 else
571 {
572 *bytes_read = 4;
573 return read_4u (abfd, &buf);
574 }
575 }
576
577 static void
578 execute_cfa_program (struct objfile *objfile, char *insn_ptr, char *insn_end,
579 struct context *context, struct frame_state *fs)
580 {
581 struct frame_state_regs *unused_rs = NULL;
582
583 /* Don't allow remember/restore between CIE and FDE programs. */
584 fs->regs.prev = NULL;
585
586 while (insn_ptr < insn_end && fs->pc < context->ra)
587 {
588 unsigned char insn = *insn_ptr++;
589 ULONGEST reg, uoffset;
590 LONGEST offset;
591
592 if (insn & DW_CFA_advance_loc)
593 fs->pc += (insn & 0x3f) * fs->code_align;
594 else if (insn & DW_CFA_offset)
595 {
596 reg = insn & 0x3f;
597 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
598 offset = (long) uoffset *fs->data_align;
599 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
600 fs->regs.reg[reg].loc.offset = offset;
601 }
602 else if (insn & DW_CFA_restore)
603 {
604 reg = insn & 0x3f;
605 fs->regs.reg[reg].how = REG_UNSAVED;
606 }
607 else
608 switch (insn)
609 {
610 case DW_CFA_set_loc:
611 fs->pc = read_encoded_pointer (objfile->obfd, &insn_ptr,
612 fs->addr_encoding);
613
614 if (pointer_encoding (fs->addr_encoding) != PE_absptr)
615 warning ("CFI: DW_CFA_set_loc uses relative addressing");
616
617 break;
618
619 case DW_CFA_advance_loc1:
620 fs->pc += read_1u (objfile->obfd, &insn_ptr);
621 break;
622 case DW_CFA_advance_loc2:
623 fs->pc += read_2u (objfile->obfd, &insn_ptr);
624 break;
625 case DW_CFA_advance_loc4:
626 fs->pc += read_4u (objfile->obfd, &insn_ptr);
627 break;
628
629 case DW_CFA_offset_extended:
630 reg = read_uleb128 (objfile->obfd, &insn_ptr);
631 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
632 offset = (long) uoffset *fs->data_align;
633 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
634 fs->regs.reg[reg].loc.offset = offset;
635 break;
636
637 case DW_CFA_restore_extended:
638 reg = read_uleb128 (objfile->obfd, &insn_ptr);
639 fs->regs.reg[reg].how = REG_UNSAVED;
640 break;
641
642 case DW_CFA_undefined:
643 case DW_CFA_same_value:
644 case DW_CFA_nop:
645 break;
646
647 case DW_CFA_register:
648 {
649 ULONGEST reg2;
650 reg = read_uleb128 (objfile->obfd, &insn_ptr);
651 reg2 = read_uleb128 (objfile->obfd, &insn_ptr);
652 fs->regs.reg[reg].how = REG_SAVED_REG;
653 fs->regs.reg[reg].loc.reg = reg2;
654 }
655 break;
656
657 case DW_CFA_remember_state:
658 {
659 struct frame_state_regs *new_rs;
660 if (unused_rs)
661 {
662 new_rs = unused_rs;
663 unused_rs = unused_rs->prev;
664 }
665 else
666 new_rs = xmalloc (sizeof (struct frame_state_regs));
667
668 *new_rs = fs->regs;
669 fs->regs.prev = new_rs;
670 }
671 break;
672
673 case DW_CFA_restore_state:
674 {
675 struct frame_state_regs *old_rs = fs->regs.prev;
676 fs->regs = *old_rs;
677 old_rs->prev = unused_rs;
678 unused_rs = old_rs;
679 }
680 break;
681
682 case DW_CFA_def_cfa:
683 reg = read_uleb128 (objfile->obfd, &insn_ptr);
684 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
685 fs->cfa_reg = reg;
686 fs->cfa_offset = uoffset;
687 fs->cfa_how = CFA_REG_OFFSET;
688 break;
689
690 case DW_CFA_def_cfa_register:
691 reg = read_uleb128 (objfile->obfd, &insn_ptr);
692 fs->cfa_reg = reg;
693 fs->cfa_how = CFA_REG_OFFSET;
694 break;
695
696 case DW_CFA_def_cfa_offset:
697 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
698 fs->cfa_offset = uoffset;
699 break;
700
701 case DW_CFA_def_cfa_expression:
702 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
703 fs->cfa_exp = insn_ptr;
704 fs->cfa_how = CFA_EXP;
705 insn_ptr += uoffset;
706 break;
707
708 case DW_CFA_expression:
709 reg = read_uleb128 (objfile->obfd, &insn_ptr);
710 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
711 fs->regs.reg[reg].how = REG_SAVED_EXP;
712 fs->regs.reg[reg].loc.exp = insn_ptr;
713 insn_ptr += uoffset;
714 break;
715
716 /* From the 2.1 draft. */
717 case DW_CFA_offset_extended_sf:
718 reg = read_uleb128 (objfile->obfd, &insn_ptr);
719 offset = read_sleb128 (objfile->obfd, &insn_ptr);
720 offset *= fs->data_align;
721 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
722 fs->regs.reg[reg].loc.offset = offset;
723 break;
724
725 case DW_CFA_def_cfa_sf:
726 reg = read_uleb128 (objfile->obfd, &insn_ptr);
727 offset = read_sleb128 (objfile->obfd, &insn_ptr);
728 fs->cfa_offset = offset;
729 fs->cfa_reg = reg;
730 fs->cfa_how = CFA_REG_OFFSET;
731 break;
732
733 case DW_CFA_def_cfa_offset_sf:
734 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
735 fs->cfa_offset = uoffset;
736 /* cfa_how deliberately not set. */
737 break;
738
739 case DW_CFA_GNU_window_save:
740 /* ??? Hardcoded for SPARC register window configuration. */
741 for (reg = 16; reg < 32; ++reg)
742 {
743 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
744 fs->regs.reg[reg].loc.offset = (reg - 16) * sizeof (void *);
745 }
746 break;
747
748 case DW_CFA_GNU_args_size:
749 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
750 context->args_size = uoffset;
751 break;
752
753 case DW_CFA_GNU_negative_offset_extended:
754 /* Obsoleted by DW_CFA_offset_extended_sf, but used by
755 older PowerPC code. */
756 reg = read_uleb128 (objfile->obfd, &insn_ptr);
757 uoffset = read_uleb128 (objfile->obfd, &insn_ptr);
758 offset = (long) uoffset *fs->data_align;
759 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
760 fs->regs.reg[reg].loc.offset = -offset;
761 break;
762
763 default:
764 error ("dwarf cfi error: unknown cfa instruction %d.", insn);
765 }
766 }
767 }
768
769 static struct fde_unit *
770 get_fde_for_addr (CORE_ADDR pc)
771 {
772 size_t lo, hi;
773 struct fde_unit *fde = NULL;
774 lo = 0;
775 hi = fde_chunks.elems;
776
777 while (lo < hi)
778 {
779 size_t i = (lo + hi) / 2;
780 fde = fde_chunks.array[i];
781 if (pc < fde->initial_location)
782 hi = i;
783 else if (pc >= fde->initial_location + fde->address_range)
784 lo = i + 1;
785 else
786 return fde;
787 }
788 return 0;
789 }
790
791 static void
792 frame_state_for (struct context *context, struct frame_state *fs)
793 {
794 struct fde_unit *fde;
795 struct cie_unit *cie;
796
797 context->args_size = 0;
798 context->lsda = 0;
799
800 fde = get_fde_for_addr (context->ra - 1);
801
802 if (fde == NULL)
803 return;
804
805 fs->pc = fde->initial_location;
806
807 gdb_assert (fde->cie_ptr != NULL);
808
809 cie = fde->cie_ptr;
810
811 fs->code_align = cie->code_align;
812 fs->data_align = cie->data_align;
813 fs->retaddr_column = cie->ra;
814 fs->addr_encoding = cie->addr_encoding;
815 fs->objfile = cie->objfile;
816
817 execute_cfa_program (cie->objfile, cie->data,
818 cie->data + cie->data_length, context, fs);
819 execute_cfa_program (cie->objfile, fde->data,
820 fde->data + fde->data_length, context, fs);
821 }
822
823 static void
824 get_reg (char *reg, struct context *context, int regnum)
825 {
826 switch (context->reg[regnum].how)
827 {
828 case REG_CTX_UNSAVED:
829 deprecated_read_register_gen (regnum, reg);
830 break;
831 case REG_CTX_SAVED_OFFSET:
832 target_read_memory (context->cfa + context->reg[regnum].loc.offset,
833 reg, REGISTER_RAW_SIZE (regnum));
834 break;
835 case REG_CTX_SAVED_REG:
836 deprecated_read_register_gen (context->reg[regnum].loc.reg, reg);
837 break;
838 case REG_CTX_SAVED_ADDR:
839 target_read_memory (context->reg[regnum].loc.addr,
840 reg, REGISTER_RAW_SIZE (regnum));
841 break;
842 case REG_CTX_VALUE:
843 memcpy (reg, &context->reg[regnum].loc.addr,
844 REGISTER_RAW_SIZE (regnum));
845 break;
846 default:
847 internal_error (__FILE__, __LINE__, "get_reg: unknown register rule");
848 }
849 }
850
851 /* Decode a DW_OP stack program. Return the top of stack. Push INITIAL
852 onto the stack to start. */
853 static CORE_ADDR
854 execute_stack_op (struct objfile *objfile,
855 char *op_ptr, char *op_end, struct context *context,
856 CORE_ADDR initial)
857 {
858 CORE_ADDR stack[64]; /* ??? Assume this is enough. */
859 int stack_elt;
860
861 stack[0] = initial;
862 stack_elt = 1;
863
864 while (op_ptr < op_end)
865 {
866 enum dwarf_location_atom op = *op_ptr++;
867 CORE_ADDR result;
868 ULONGEST reg;
869 LONGEST offset;
870
871 switch (op)
872 {
873 case DW_OP_lit0:
874 case DW_OP_lit1:
875 case DW_OP_lit2:
876 case DW_OP_lit3:
877 case DW_OP_lit4:
878 case DW_OP_lit5:
879 case DW_OP_lit6:
880 case DW_OP_lit7:
881 case DW_OP_lit8:
882 case DW_OP_lit9:
883 case DW_OP_lit10:
884 case DW_OP_lit11:
885 case DW_OP_lit12:
886 case DW_OP_lit13:
887 case DW_OP_lit14:
888 case DW_OP_lit15:
889 case DW_OP_lit16:
890 case DW_OP_lit17:
891 case DW_OP_lit18:
892 case DW_OP_lit19:
893 case DW_OP_lit20:
894 case DW_OP_lit21:
895 case DW_OP_lit22:
896 case DW_OP_lit23:
897 case DW_OP_lit24:
898 case DW_OP_lit25:
899 case DW_OP_lit26:
900 case DW_OP_lit27:
901 case DW_OP_lit28:
902 case DW_OP_lit29:
903 case DW_OP_lit30:
904 case DW_OP_lit31:
905 result = op - DW_OP_lit0;
906 break;
907
908 case DW_OP_addr:
909 result = read_pointer (objfile->obfd, &op_ptr);
910 break;
911
912 case DW_OP_const1u:
913 result = read_1u (objfile->obfd, &op_ptr);
914 break;
915 case DW_OP_const1s:
916 result = read_1s (objfile->obfd, &op_ptr);
917 break;
918 case DW_OP_const2u:
919 result = read_2u (objfile->obfd, &op_ptr);
920 break;
921 case DW_OP_const2s:
922 result = read_2s (objfile->obfd, &op_ptr);
923 break;
924 case DW_OP_const4u:
925 result = read_4u (objfile->obfd, &op_ptr);
926 break;
927 case DW_OP_const4s:
928 result = read_4s (objfile->obfd, &op_ptr);
929 break;
930 case DW_OP_const8u:
931 result = read_8u (objfile->obfd, &op_ptr);
932 break;
933 case DW_OP_const8s:
934 result = read_8s (objfile->obfd, &op_ptr);
935 break;
936 case DW_OP_constu:
937 result = read_uleb128 (objfile->obfd, &op_ptr);
938 break;
939 case DW_OP_consts:
940 result = read_sleb128 (objfile->obfd, &op_ptr);
941 break;
942
943 case DW_OP_reg0:
944 case DW_OP_reg1:
945 case DW_OP_reg2:
946 case DW_OP_reg3:
947 case DW_OP_reg4:
948 case DW_OP_reg5:
949 case DW_OP_reg6:
950 case DW_OP_reg7:
951 case DW_OP_reg8:
952 case DW_OP_reg9:
953 case DW_OP_reg10:
954 case DW_OP_reg11:
955 case DW_OP_reg12:
956 case DW_OP_reg13:
957 case DW_OP_reg14:
958 case DW_OP_reg15:
959 case DW_OP_reg16:
960 case DW_OP_reg17:
961 case DW_OP_reg18:
962 case DW_OP_reg19:
963 case DW_OP_reg20:
964 case DW_OP_reg21:
965 case DW_OP_reg22:
966 case DW_OP_reg23:
967 case DW_OP_reg24:
968 case DW_OP_reg25:
969 case DW_OP_reg26:
970 case DW_OP_reg27:
971 case DW_OP_reg28:
972 case DW_OP_reg29:
973 case DW_OP_reg30:
974 case DW_OP_reg31:
975 get_reg ((char *) &result, context, op - DW_OP_reg0);
976 break;
977 case DW_OP_regx:
978 reg = read_uleb128 (objfile->obfd, &op_ptr);
979 get_reg ((char *) &result, context, reg);
980 break;
981
982 case DW_OP_breg0:
983 case DW_OP_breg1:
984 case DW_OP_breg2:
985 case DW_OP_breg3:
986 case DW_OP_breg4:
987 case DW_OP_breg5:
988 case DW_OP_breg6:
989 case DW_OP_breg7:
990 case DW_OP_breg8:
991 case DW_OP_breg9:
992 case DW_OP_breg10:
993 case DW_OP_breg11:
994 case DW_OP_breg12:
995 case DW_OP_breg13:
996 case DW_OP_breg14:
997 case DW_OP_breg15:
998 case DW_OP_breg16:
999 case DW_OP_breg17:
1000 case DW_OP_breg18:
1001 case DW_OP_breg19:
1002 case DW_OP_breg20:
1003 case DW_OP_breg21:
1004 case DW_OP_breg22:
1005 case DW_OP_breg23:
1006 case DW_OP_breg24:
1007 case DW_OP_breg25:
1008 case DW_OP_breg26:
1009 case DW_OP_breg27:
1010 case DW_OP_breg28:
1011 case DW_OP_breg29:
1012 case DW_OP_breg30:
1013 case DW_OP_breg31:
1014 offset = read_sleb128 (objfile->obfd, &op_ptr);
1015 get_reg ((char *) &result, context, op - DW_OP_breg0);
1016 result += offset;
1017 break;
1018 case DW_OP_bregx:
1019 reg = read_uleb128 (objfile->obfd, &op_ptr);
1020 offset = read_sleb128 (objfile->obfd, &op_ptr);
1021 get_reg ((char *) &result, context, reg);
1022 result += offset;
1023 break;
1024
1025 case DW_OP_dup:
1026 if (stack_elt < 1)
1027 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1028 result = stack[stack_elt - 1];
1029 break;
1030
1031 case DW_OP_drop:
1032 if (--stack_elt < 0)
1033 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1034 goto no_push;
1035
1036 case DW_OP_pick:
1037 offset = *op_ptr++;
1038 if (offset >= stack_elt - 1)
1039 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1040 result = stack[stack_elt - 1 - offset];
1041 break;
1042
1043 case DW_OP_over:
1044 if (stack_elt < 2)
1045 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1046 result = stack[stack_elt - 2];
1047 break;
1048
1049 case DW_OP_rot:
1050 {
1051 CORE_ADDR t1, t2, t3;
1052
1053 if (stack_elt < 3)
1054 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1055 t1 = stack[stack_elt - 1];
1056 t2 = stack[stack_elt - 2];
1057 t3 = stack[stack_elt - 3];
1058 stack[stack_elt - 1] = t2;
1059 stack[stack_elt - 2] = t3;
1060 stack[stack_elt - 3] = t1;
1061 goto no_push;
1062 }
1063
1064 case DW_OP_deref:
1065 case DW_OP_deref_size:
1066 case DW_OP_abs:
1067 case DW_OP_neg:
1068 case DW_OP_not:
1069 case DW_OP_plus_uconst:
1070 /* Unary operations. */
1071 if (--stack_elt < 0)
1072 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1073 result = stack[stack_elt];
1074
1075 switch (op)
1076 {
1077 case DW_OP_deref:
1078 {
1079 int len = TARGET_ADDR_BIT / TARGET_CHAR_BIT;
1080 if (len != 4 && len != 8)
1081 internal_error (__FILE__, __LINE__,
1082 "execute_stack_op error");
1083 result = read_memory_unsigned_integer (result, len);
1084 }
1085 break;
1086
1087 case DW_OP_deref_size:
1088 {
1089 int len = *op_ptr++;
1090 if (len != 1 && len != 2 && len != 4 && len != 8)
1091 internal_error (__FILE__, __LINE__,
1092 "execute_stack_op error");
1093 result = read_memory_unsigned_integer (result, len);
1094 }
1095 break;
1096
1097 case DW_OP_abs:
1098 if (result < 0)
1099 result = -result;
1100 break;
1101 case DW_OP_neg:
1102 result = -result;
1103 break;
1104 case DW_OP_not:
1105 result = ~result;
1106 break;
1107 case DW_OP_plus_uconst:
1108 result += read_uleb128 (objfile->obfd, &op_ptr);
1109 break;
1110 default:
1111 break;
1112 }
1113 break;
1114
1115 case DW_OP_and:
1116 case DW_OP_div:
1117 case DW_OP_minus:
1118 case DW_OP_mod:
1119 case DW_OP_mul:
1120 case DW_OP_or:
1121 case DW_OP_plus:
1122 case DW_OP_le:
1123 case DW_OP_ge:
1124 case DW_OP_eq:
1125 case DW_OP_lt:
1126 case DW_OP_gt:
1127 case DW_OP_ne:
1128 {
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];
1135
1136 switch (op)
1137 {
1138 case DW_OP_and:
1139 result = second & first;
1140 break;
1141 case DW_OP_div:
1142 result = (LONGEST) second / (LONGEST) first;
1143 break;
1144 case DW_OP_minus:
1145 result = second - first;
1146 break;
1147 case DW_OP_mod:
1148 result = (LONGEST) second % (LONGEST) first;
1149 break;
1150 case DW_OP_mul:
1151 result = second * first;
1152 break;
1153 case DW_OP_or:
1154 result = second | first;
1155 break;
1156 case DW_OP_plus:
1157 result = second + first;
1158 break;
1159 case DW_OP_shl:
1160 result = second << first;
1161 break;
1162 case DW_OP_shr:
1163 result = second >> first;
1164 break;
1165 case DW_OP_shra:
1166 result = (LONGEST) second >> first;
1167 break;
1168 case DW_OP_xor:
1169 result = second ^ first;
1170 break;
1171 case DW_OP_le:
1172 result = (LONGEST) first <= (LONGEST) second;
1173 break;
1174 case DW_OP_ge:
1175 result = (LONGEST) first >= (LONGEST) second;
1176 break;
1177 case DW_OP_eq:
1178 result = (LONGEST) first == (LONGEST) second;
1179 break;
1180 case DW_OP_lt:
1181 result = (LONGEST) first < (LONGEST) second;
1182 break;
1183 case DW_OP_gt:
1184 result = (LONGEST) first > (LONGEST) second;
1185 break;
1186 case DW_OP_ne:
1187 result = (LONGEST) first != (LONGEST) second;
1188 break;
1189 default:
1190 error ("execute_stack_op: Unknown DW_OP_ value");
1191 break;
1192 }
1193 }
1194 break;
1195
1196 case DW_OP_skip:
1197 offset = read_2s (objfile->obfd, &op_ptr);
1198 op_ptr += offset;
1199 goto no_push;
1200
1201 case DW_OP_bra:
1202 if (--stack_elt < 0)
1203 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1204 offset = read_2s (objfile->obfd, &op_ptr);
1205 if (stack[stack_elt] != 0)
1206 op_ptr += offset;
1207 goto no_push;
1208
1209 case DW_OP_nop:
1210 goto no_push;
1211
1212 default:
1213 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1214 }
1215
1216 /* Most things push a result value. */
1217 if ((size_t) stack_elt >= sizeof (stack) / sizeof (*stack))
1218 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1219 stack[++stack_elt] = result;
1220 no_push:;
1221 }
1222
1223 /* We were executing this program to get a value. It should be
1224 at top of stack. */
1225 if (--stack_elt < 0)
1226 internal_error (__FILE__, __LINE__, "execute_stack_op error");
1227 return stack[stack_elt];
1228 }
1229
1230 static void
1231 update_context (struct context *context, struct frame_state *fs, int chain)
1232 {
1233 struct context *orig_context;
1234 CORE_ADDR cfa = 0;
1235 long i;
1236
1237 unwind_tmp_obstack_init ();
1238
1239 orig_context = context_alloc ();
1240 context_cpy (orig_context, context);
1241
1242 /* Compute this frame's CFA. */
1243 switch (fs->cfa_how)
1244 {
1245 case CFA_REG_OFFSET:
1246 get_reg ((char *) &cfa, context, fs->cfa_reg);
1247 cfa += fs->cfa_offset;
1248 break;
1249
1250 case CFA_EXP:
1251 /* ??? No way of knowing what register number is the stack pointer
1252 to do the same sort of handling as above. Assume that if the
1253 CFA calculation is so complicated as to require a stack program
1254 that this will not be a problem. */
1255 {
1256 char *exp = fs->cfa_exp;
1257 ULONGEST len;
1258
1259 len = read_uleb128 (fs->objfile->obfd, &exp);
1260 cfa = (CORE_ADDR) execute_stack_op (fs->objfile, exp,
1261 exp + len, context, 0);
1262 break;
1263 }
1264 default:
1265 break;
1266 }
1267 context->cfa = cfa;
1268
1269 if (!chain)
1270 orig_context->cfa = cfa;
1271
1272 /* Compute the addresses of all registers saved in this frame. */
1273 for (i = 0; i < NUM_REGS; ++i)
1274 switch (fs->regs.reg[i].how)
1275 {
1276 case REG_UNSAVED:
1277 if (i == SP_REGNUM)
1278 {
1279 context->reg[i].how = REG_CTX_VALUE;
1280 context->reg[i].loc.addr = cfa;
1281 }
1282 else
1283 context->reg[i].how = REG_CTX_UNSAVED;
1284 break;
1285 case REG_SAVED_OFFSET:
1286 context->reg[i].how = REG_CTX_SAVED_OFFSET;
1287 context->reg[i].loc.offset = fs->regs.reg[i].loc.offset;
1288 break;
1289 case REG_SAVED_REG:
1290 switch (orig_context->reg[fs->regs.reg[i].loc.reg].how)
1291 {
1292 case REG_CTX_UNSAVED:
1293 context->reg[i].how = REG_CTX_UNSAVED;
1294 break;
1295 case REG_CTX_SAVED_OFFSET:
1296 context->reg[i].how = REG_CTX_SAVED_OFFSET;
1297 context->reg[i].loc.offset = orig_context->cfa - context->cfa +
1298 orig_context->reg[fs->regs.reg[i].loc.reg].loc.offset;
1299 break;
1300 case REG_CTX_SAVED_REG:
1301 context->reg[i].how = REG_CTX_SAVED_REG;
1302 context->reg[i].loc.reg =
1303 orig_context->reg[fs->regs.reg[i].loc.reg].loc.reg;
1304 break;
1305 case REG_CTX_SAVED_ADDR:
1306 context->reg[i].how = REG_CTX_SAVED_ADDR;
1307 context->reg[i].loc.addr =
1308 orig_context->reg[fs->regs.reg[i].loc.reg].loc.addr;
1309 break;
1310 default:
1311 internal_error (__FILE__, __LINE__, "bad switch");
1312 }
1313 break;
1314 case REG_SAVED_EXP:
1315 {
1316 char *exp = fs->regs.reg[i].loc.exp;
1317 ULONGEST len;
1318 CORE_ADDR val;
1319
1320 len = read_uleb128 (fs->objfile->obfd, &exp);
1321 val = execute_stack_op (fs->objfile, exp, exp + len,
1322 orig_context, cfa);
1323 context->reg[i].how = REG_CTX_SAVED_ADDR;
1324 context->reg[i].loc.addr = val;
1325 }
1326 break;
1327 default:
1328 internal_error (__FILE__, __LINE__, "bad switch");
1329 }
1330 get_reg ((char *) &context->ra, context, fs->retaddr_column);
1331 unwind_tmp_obstack_free ();
1332 }
1333
1334 static int
1335 is_cie (ULONGEST cie_id, int dwarf64)
1336 {
1337 return dwarf64 ? (cie_id == 0xffffffffffffffff) : (cie_id == 0xffffffff);
1338 }
1339
1340 static int
1341 compare_fde_unit (const void *a, const void *b)
1342 {
1343 struct fde_unit **first, **second;
1344 first = (struct fde_unit **) a;
1345 second = (struct fde_unit **) b;
1346 if ((*first)->initial_location > (*second)->initial_location)
1347 return 1;
1348 else if ((*first)->initial_location < (*second)->initial_location)
1349 return -1;
1350 else
1351 return 0;
1352 }
1353
1354 /* Build the cie_chunks and fde_chunks tables from informations
1355 found in .debug_frame and .eh_frame sections. */
1356 /* We can handle both of these sections almost in the same way, however there
1357 are some exceptions:
1358 - CIE ID is -1 in debug_frame, but 0 in eh_frame
1359 - eh_frame may contain some more information that are used only by gcc
1360 (eg. personality pointer, LSDA pointer, ...). Most of them we can ignore.
1361 - In debug_frame FDE's item cie_id contains offset of it's parent CIE.
1362 In eh_frame FDE's item cie_id is a relative pointer to the parent CIE.
1363 Anyway we don't need to bother with this, because we are smart enough
1364 to keep the pointer to the parent CIE of oncomming FDEs in 'last_cie'.
1365 - Although debug_frame items can contain Augmentation as well as
1366 eh_frame ones, I have never seen them non-empty. Thus only in eh_frame
1367 we can encounter for example non-absolute pointers (Aug. 'R').
1368 -- mludvig */
1369 static void
1370 parse_frame_info (struct objfile *objfile, file_ptr frame_offset,
1371 unsigned int frame_size, int eh_frame)
1372 {
1373 bfd *abfd = objfile->obfd;
1374 asection *curr_section_ptr;
1375 char *start = NULL;
1376 char *end = NULL;
1377 char *frame_buffer = NULL;
1378 char *curr_section_name, *aug_data;
1379 struct cie_unit *last_cie = NULL;
1380 int last_dup_fde = 0;
1381 int aug_len, i;
1382 CORE_ADDR curr_section_vma = 0;
1383
1384 unwind_tmp_obstack_init ();
1385
1386 frame_buffer = dwarf2_read_section (objfile, frame_offset, frame_size);
1387
1388 start = frame_buffer;
1389 end = frame_buffer + frame_size;
1390
1391 curr_section_name = eh_frame ? ".eh_frame" : ".debug_frame";
1392 curr_section_ptr = bfd_get_section_by_name (abfd, curr_section_name);
1393 if (curr_section_ptr)
1394 curr_section_vma = curr_section_ptr->vma;
1395
1396 if (start)
1397 {
1398 while (start < end)
1399 {
1400 unsigned long length;
1401 ULONGEST cie_id;
1402 ULONGEST unit_offset = start - frame_buffer;
1403 int bytes_read, dwarf64;
1404 char *block_end;
1405
1406 length = read_initial_length (abfd, start, &bytes_read);
1407 start += bytes_read;
1408 dwarf64 = (bytes_read == 12);
1409 block_end = start + length;
1410
1411 if (length == 0)
1412 {
1413 start = block_end;
1414 continue;
1415 }
1416
1417 cie_id = read_length (abfd, start, &bytes_read, dwarf64);
1418 start += bytes_read;
1419
1420 if ((eh_frame && cie_id == 0) || is_cie (cie_id, dwarf64))
1421 {
1422 struct cie_unit *cie = cie_unit_alloc ();
1423 char *aug;
1424
1425 cie->objfile = objfile;
1426 cie->next = cie_chunks;
1427 cie_chunks = cie;
1428
1429 cie->objfile = objfile;
1430
1431 cie->offset = unit_offset;
1432
1433 start++; /* version */
1434
1435 cie->augmentation = aug = start;
1436 while (*start++); /* Skips last NULL as well */
1437
1438 cie->code_align = read_uleb128 (abfd, &start);
1439 cie->data_align = read_sleb128 (abfd, &start);
1440 cie->ra = read_1u (abfd, &start);
1441
1442 /* Augmentation:
1443 z Indicates that a uleb128 is present to size the
1444 augmentation section.
1445 L Indicates the encoding (and thus presence) of
1446 an LSDA pointer in the FDE augmentation.
1447 R Indicates a non-default pointer encoding for
1448 FDE code pointers.
1449 P Indicates the presence of an encoding + language
1450 personality routine in the CIE augmentation.
1451
1452 [This info comes from GCC's dwarf2out.c]
1453 */
1454 if (*aug == 'z')
1455 {
1456 aug_len = read_uleb128 (abfd, &start);
1457 aug_data = start;
1458 start += aug_len;
1459 ++aug;
1460 }
1461
1462 cie->data = start;
1463 cie->data_length = block_end - cie->data;
1464
1465 while (*aug != '\0')
1466 {
1467 if (aug[0] == 'e' && aug[1] == 'h')
1468 {
1469 aug_data += sizeof (void *);
1470 aug++;
1471 }
1472 else if (aug[0] == 'R')
1473 cie->addr_encoding = *aug_data++;
1474 else if (aug[0] == 'P')
1475 {
1476 CORE_ADDR pers_addr;
1477 int pers_addr_enc;
1478
1479 pers_addr_enc = *aug_data++;
1480 /* We don't need pers_addr value and so we
1481 don't care about it's encoding. */
1482 pers_addr = read_encoded_pointer (abfd, &aug_data,
1483 pers_addr_enc);
1484 }
1485 else if (aug[0] == 'L' && eh_frame)
1486 {
1487 int lsda_addr_enc;
1488
1489 /* Perhaps we should save this to CIE for later use?
1490 Do we need it for something in GDB? */
1491 lsda_addr_enc = *aug_data++;
1492 }
1493 else
1494 warning ("CFI warning: unknown augmentation \"%c\""
1495 " in \"%s\" of\n"
1496 "\t%s", aug[0], curr_section_name,
1497 objfile->name);
1498 aug++;
1499 }
1500
1501 last_cie = cie;
1502 }
1503 else
1504 {
1505 struct fde_unit *fde;
1506 struct cie_unit *cie;
1507 int dup = 0;
1508 CORE_ADDR init_loc;
1509
1510 /* We assume that debug_frame is in order
1511 CIE,FDE,CIE,FDE,FDE,... and thus the CIE for this FDE
1512 should be stored in last_cie pointer. If not, we'll
1513 try to find it by the older way. */
1514 if (last_cie)
1515 cie = last_cie;
1516 else
1517 {
1518 warning ("CFI: last_cie == NULL. "
1519 "Perhaps a malformed %s section in '%s'...?\n",
1520 curr_section_name, objfile->name);
1521
1522 cie = cie_chunks;
1523 while (cie)
1524 {
1525 if (cie->objfile == objfile)
1526 {
1527 if (eh_frame &&
1528 (cie->offset ==
1529 (unit_offset + bytes_read - cie_id)))
1530 break;
1531 if (!eh_frame && (cie->offset == cie_id))
1532 break;
1533 }
1534
1535 cie = cie->next;
1536 }
1537 if (!cie)
1538 error ("CFI: can't find CIE pointer");
1539 }
1540
1541 init_loc = read_encoded_pointer (abfd, &start,
1542 cie->addr_encoding);
1543
1544 switch (pointer_encoding (cie->addr_encoding))
1545 {
1546 case PE_absptr:
1547 break;
1548 case PE_pcrel:
1549 /* start-frame_buffer gives offset from
1550 the beginning of actual section. */
1551 init_loc += curr_section_vma + start - frame_buffer;
1552 break;
1553 default:
1554 warning ("CFI: Unsupported pointer encoding\n");
1555 }
1556
1557 /* For relocatable objects we must add an offset telling
1558 where the section is actually mapped in the memory. */
1559 init_loc += ANOFFSET (objfile->section_offsets,
1560 SECT_OFF_TEXT (objfile));
1561
1562 /* If we have both .debug_frame and .eh_frame present in
1563 a file, we must eliminate duplicate FDEs. For now we'll
1564 run through all entries in fde_chunks and check it one
1565 by one. Perhaps in the future we can implement a faster
1566 searching algorithm. */
1567 /* eh_frame==2 indicates, that this file has an already
1568 parsed .debug_frame too. When eh_frame==1 it means, that no
1569 .debug_frame is present and thus we don't need to check for
1570 duplicities. eh_frame==0 means, that we parse .debug_frame
1571 and don't need to care about duplicate FDEs, because
1572 .debug_frame is parsed first. */
1573 if (eh_frame == 2)
1574 for (i = 0; eh_frame == 2 && i < fde_chunks.elems; i++)
1575 {
1576 /* We assume that FDEs in .debug_frame and .eh_frame
1577 have the same order (if they are present, of course).
1578 If we find a duplicate entry for one FDE and save
1579 it's index to last_dup_fde it's very likely, that
1580 we'll find an entry for the following FDE right after
1581 the previous one. Thus in many cases we'll run this
1582 loop only once. */
1583 last_dup_fde = (last_dup_fde + i) % fde_chunks.elems;
1584 if (fde_chunks.array[last_dup_fde]->initial_location
1585 == init_loc)
1586 {
1587 dup = 1;
1588 break;
1589 }
1590 }
1591
1592 /* Allocate a new entry only if this FDE isn't a duplicate of
1593 something we have already seen. */
1594 if (!dup)
1595 {
1596 fde_chunks_need_space ();
1597 fde = fde_unit_alloc ();
1598
1599 fde_chunks.array[fde_chunks.elems++] = fde;
1600
1601 fde->initial_location = init_loc;
1602 fde->address_range = read_encoded_pointer (abfd, &start,
1603 cie->
1604 addr_encoding);
1605
1606 fde->cie_ptr = cie;
1607
1608 /* Here we intentionally ignore augmentation data
1609 from FDE, because we don't need them. */
1610 if (cie->augmentation[0] == 'z')
1611 start += read_uleb128 (abfd, &start);
1612
1613 fde->data = start;
1614 fde->data_length = block_end - start;
1615 }
1616 }
1617 start = block_end;
1618 }
1619 qsort (fde_chunks.array, fde_chunks.elems,
1620 sizeof (struct fde_unit *), compare_fde_unit);
1621 }
1622 }
1623
1624 /* We must parse both .debug_frame section and .eh_frame because
1625 * not all frames must be present in both of these sections. */
1626 void
1627 dwarf2_build_frame_info (struct objfile *objfile)
1628 {
1629 int after_debug_frame = 0;
1630
1631 /* If we have .debug_frame then the parser is called with
1632 eh_frame==0 for .debug_frame and eh_frame==2 for .eh_frame,
1633 otherwise it's only called once for .eh_frame with argument
1634 eh_frame==1. */
1635
1636 if (dwarf_frame_offset)
1637 {
1638 parse_frame_info (objfile, dwarf_frame_offset,
1639 dwarf_frame_size, 0 /* = debug_frame */ );
1640 after_debug_frame = 1;
1641 }
1642
1643 if (dwarf_eh_frame_offset)
1644 parse_frame_info (objfile, dwarf_eh_frame_offset, dwarf_eh_frame_size,
1645 1 /* = eh_frame */ + after_debug_frame);
1646 }
1647
1648 /* Return the frame address. */
1649 CORE_ADDR
1650 cfi_read_fp (void)
1651 {
1652 struct context *context;
1653 struct frame_state *fs;
1654 CORE_ADDR cfa;
1655
1656 unwind_tmp_obstack_init ();
1657
1658 context = context_alloc ();
1659 fs = frame_state_alloc ();
1660
1661 context->ra = read_pc () + 1;
1662
1663 frame_state_for (context, fs);
1664 update_context (context, fs, 0);
1665
1666 cfa = context->cfa;
1667
1668 unwind_tmp_obstack_free ();
1669
1670 return cfa;
1671 }
1672
1673 /* Store the frame address. This function is not used. */
1674
1675 void
1676 cfi_write_fp (CORE_ADDR val)
1677 {
1678 struct context *context;
1679 struct frame_state *fs;
1680
1681 unwind_tmp_obstack_init ();
1682
1683 context = context_alloc ();
1684 fs = frame_state_alloc ();
1685
1686 context->ra = read_pc () + 1;
1687
1688 frame_state_for (context, fs);
1689
1690 if (fs->cfa_how == CFA_REG_OFFSET)
1691 {
1692 val -= fs->cfa_offset;
1693 deprecated_write_register_gen (fs->cfa_reg, (char *) &val);
1694 }
1695 else
1696 warning ("Can't write fp.");
1697
1698 unwind_tmp_obstack_free ();
1699 }
1700
1701 /* Restore the machine to the state it had before the current frame
1702 was created. */
1703 void
1704 cfi_pop_frame (struct frame_info *fi)
1705 {
1706 char *regbuf = alloca (MAX_REGISTER_RAW_SIZE);
1707 int regnum;
1708
1709 for (regnum = 0; regnum < NUM_REGS; regnum++)
1710 {
1711 get_reg (regbuf, UNWIND_CONTEXT (fi), regnum);
1712 deprecated_write_register_bytes (REGISTER_BYTE (regnum), regbuf,
1713 REGISTER_RAW_SIZE (regnum));
1714 }
1715 write_register (PC_REGNUM, UNWIND_CONTEXT (fi)->ra);
1716
1717 flush_cached_frames ();
1718 }
1719
1720 /* Determine the address of the calling function's frame. */
1721 CORE_ADDR
1722 cfi_frame_chain (struct frame_info *fi)
1723 {
1724 struct context *context;
1725 struct frame_state *fs;
1726 CORE_ADDR cfa;
1727
1728 unwind_tmp_obstack_init ();
1729
1730 context = context_alloc ();
1731 fs = frame_state_alloc ();
1732 context_cpy (context, UNWIND_CONTEXT (fi));
1733
1734 /* outermost frame */
1735 if (context->ra == 0)
1736 {
1737 unwind_tmp_obstack_free ();
1738 return 0;
1739 }
1740
1741 frame_state_for (context, fs);
1742 update_context (context, fs, 1);
1743
1744 cfa = context->cfa;
1745 unwind_tmp_obstack_free ();
1746
1747 return cfa;
1748 }
1749
1750 /* Sets the pc of the frame. */
1751 CORE_ADDR
1752 cfi_init_frame_pc (int fromleaf, struct frame_info *fi)
1753 {
1754 if (get_next_frame (fi))
1755 {
1756 CORE_ADDR pc;
1757 /* FIXME: cagney/2002-12-04: This is straight wrong. It's
1758 assuming that the PC is CORE_ADDR (a host quantity) in size. */
1759 get_reg ((void *)&pc, UNWIND_CONTEXT (get_next_frame (fi)), PC_REGNUM);
1760 return pc;
1761 }
1762 else
1763 return read_pc ();
1764 }
1765
1766 /* Initialize unwind context informations of the frame. */
1767 void
1768 cfi_init_extra_frame_info (int fromleaf, struct frame_info *fi)
1769 {
1770 struct frame_state *fs;
1771
1772 unwind_tmp_obstack_init ();
1773
1774 fs = frame_state_alloc ();
1775 deprecated_set_frame_context (fi, frame_obstack_zalloc (sizeof (struct context)));
1776 UNWIND_CONTEXT (fi)->reg =
1777 frame_obstack_zalloc (sizeof (struct context_reg) * NUM_REGS);
1778 memset (UNWIND_CONTEXT (fi)->reg, 0,
1779 sizeof (struct context_reg) * NUM_REGS);
1780
1781 if (get_next_frame (fi))
1782 {
1783 context_cpy (UNWIND_CONTEXT (fi), UNWIND_CONTEXT (get_next_frame (fi)));
1784 frame_state_for (UNWIND_CONTEXT (fi), fs);
1785 update_context (UNWIND_CONTEXT (fi), fs, 1);
1786 }
1787 else
1788 {
1789 UNWIND_CONTEXT (fi)->ra = get_frame_pc (fi) + 1;
1790 frame_state_for (UNWIND_CONTEXT (fi), fs);
1791 update_context (UNWIND_CONTEXT (fi), fs, 0);
1792 }
1793
1794 unwind_tmp_obstack_free ();
1795 }
1796
1797 /* Obtain return address of the frame. */
1798 CORE_ADDR
1799 cfi_get_ra (struct frame_info *fi)
1800 {
1801 return UNWIND_CONTEXT (fi)->ra;
1802 }
1803
1804 /* Find register number REGNUM relative to FRAME and put its
1805 (raw) contents in *RAW_BUFFER. Set *OPTIMIZED if the variable
1806 was optimized out (and thus can't be fetched). If the variable
1807 was fetched from memory, set *ADDRP to where it was fetched from,
1808 otherwise it was fetched from a register.
1809
1810 The argument RAW_BUFFER must point to aligned memory. */
1811 void
1812 cfi_get_saved_register (char *raw_buffer,
1813 int *optimized,
1814 CORE_ADDR *addrp,
1815 struct frame_info *frame,
1816 int regnum, enum lval_type *lval)
1817 {
1818 if (!target_has_registers)
1819 error ("No registers.");
1820
1821 /* Normal systems don't optimize out things with register numbers. */
1822 if (optimized != NULL)
1823 *optimized = 0;
1824
1825 if (addrp) /* default assumption: not found in memory */
1826 *addrp = 0;
1827
1828 if (!get_next_frame (frame))
1829 {
1830 deprecated_read_register_gen (regnum, raw_buffer);
1831 if (lval != NULL)
1832 *lval = lval_register;
1833 if (addrp != NULL)
1834 *addrp = REGISTER_BYTE (regnum);
1835 }
1836 else
1837 {
1838 frame = get_next_frame (frame);
1839 switch (UNWIND_CONTEXT (frame)->reg[regnum].how)
1840 {
1841 case REG_CTX_UNSAVED:
1842 deprecated_read_register_gen (regnum, raw_buffer);
1843 if (lval != NULL)
1844 *lval = not_lval;
1845 if (optimized != NULL)
1846 *optimized = 1;
1847 break;
1848 case REG_CTX_SAVED_OFFSET:
1849 target_read_memory (UNWIND_CONTEXT (frame)->cfa +
1850 UNWIND_CONTEXT (frame)->reg[regnum].loc.offset,
1851 raw_buffer, REGISTER_RAW_SIZE (regnum));
1852 if (lval != NULL)
1853 *lval = lval_memory;
1854 if (addrp != NULL)
1855 *addrp =
1856 UNWIND_CONTEXT (frame)->cfa +
1857 UNWIND_CONTEXT (frame)->reg[regnum].loc.offset;
1858 break;
1859 case REG_CTX_SAVED_REG:
1860 deprecated_read_register_gen (UNWIND_CONTEXT (frame)->reg[regnum].loc.reg,
1861 raw_buffer);
1862 if (lval != NULL)
1863 *lval = lval_register;
1864 if (addrp != NULL)
1865 *addrp =
1866 REGISTER_BYTE (UNWIND_CONTEXT (frame)->reg[regnum].loc.reg);
1867 break;
1868 case REG_CTX_SAVED_ADDR:
1869 target_read_memory (UNWIND_CONTEXT (frame)->reg[regnum].loc.addr,
1870 raw_buffer, REGISTER_RAW_SIZE (regnum));
1871 if (lval != NULL)
1872 *lval = lval_memory;
1873 if (addrp != NULL)
1874 *addrp = UNWIND_CONTEXT (frame)->reg[regnum].loc.addr;
1875 break;
1876 case REG_CTX_VALUE:
1877 memcpy (raw_buffer, &UNWIND_CONTEXT (frame)->reg[regnum].loc.addr,
1878 REGISTER_RAW_SIZE (regnum));
1879 if (lval != NULL)
1880 *lval = not_lval;
1881 if (optimized != NULL)
1882 *optimized = 0;
1883 break;
1884 default:
1885 internal_error (__FILE__, __LINE__,
1886 "cfi_get_saved_register: unknown register rule");
1887 }
1888 }
1889 }
1890
1891 /* Return the register that the function uses for a frame pointer,
1892 plus any necessary offset to be applied to the register before
1893 any frame pointer offsets. */
1894 void
1895 cfi_virtual_frame_pointer (CORE_ADDR pc, int *frame_reg,
1896 LONGEST * frame_offset)
1897 {
1898 struct context *context;
1899 struct frame_state *fs;
1900
1901 unwind_tmp_obstack_init ();
1902
1903 context = context_alloc ();
1904 fs = frame_state_alloc ();
1905
1906 context->ra = read_pc () + 1;
1907
1908 frame_state_for (context, fs);
1909
1910 if (fs->cfa_how == CFA_REG_OFFSET)
1911 {
1912 *frame_reg = fs->cfa_reg;
1913 *frame_offset = fs->cfa_offset;
1914 }
1915 else
1916 error ("dwarf cfi error: CFA is not defined as CFA_REG_OFFSET");
1917
1918 unwind_tmp_obstack_free ();
1919 }
This page took 0.073231 seconds and 4 git commands to generate.