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