1 /* Subroutines needed for unwinding DWARF 2 format stack frame info
2 for exception handling. */
3 /* Compile this one with gcc. */
4 /* Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
5 Contributed by Jason Merrill <jason@cygnus.com>.
7 This file is part of GNU CC.
9 GNU CC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
14 In addition to the permissions in the GNU General Public License, the
15 Free Software Foundation gives you unlimited permission to link the
16 compiled version of this file into combinations with other programs,
17 and to distribute those combinations without any restriction coming
18 from the use of this file. (The General Public License restrictions
19 do apply in other respects; for example, they cover modification of
20 the file, and distribution when not linked into a combine
23 GNU CC is distributed in the hope that it will be useful,
24 but WITHOUT ANY WARRANTY; without even the implied warranty of
25 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 GNU General Public License for more details.
28 You should have received a copy of the GNU General Public License
29 along with GNU CC; see the file COPYING. If not, write to
30 the Free Software Foundation, 59 Temple Place - Suite 330,
31 Boston, MA 02111-1307, USA. */
33 /* It is incorrect to include config.h here, because this file is being
34 compiled for the target, and hence definitions concerning only the host
40 #ifdef DWARF2_UNWIND_INFO
45 #ifdef __GTHREAD_MUTEX_INIT
46 static __gthread_mutex_t object_mutex
= __GTHREAD_MUTEX_INIT
;
48 static __gthread_mutex_t object_mutex
;
51 /* Don't use `fancy_abort' here even if config.h says to use it. */
56 /* Some types used by the DWARF 2 spec. */
58 typedef int sword
__attribute__ ((mode (SI
)));
59 typedef unsigned int uword
__attribute__ ((mode (SI
)));
60 typedef unsigned int uaddr
__attribute__ ((mode (pointer
)));
61 typedef int saddr
__attribute__ ((mode (pointer
)));
62 typedef unsigned char ubyte
;
65 CIE - Common Information Element
66 FDE - Frame Descriptor Element
68 There is one per function, and it describes where the function code
69 is located, and what the register lifetimes and stack layout are
72 The data structures are defined in the DWARF specfication, although
73 not in a very readable way (see LITERATURE).
75 Every time an exception is thrown, the code needs to locate the FDE
76 for the current function, and starts to look for exception regions
77 from that FDE. This works in a two-level search:
78 a) in a linear search, find the shared image (i.e. DLL) containing
80 b) using the FDE table for that shared object, locate the FDE using
81 binary search (which requires the sorting). */
83 /* The first few fields of a CIE. The CIE_id field is 0 for a CIE,
84 to distinguish it from a valid FDE. FDEs are aligned to an addressing
85 unit boundary, but the fields within are unaligned. */
92 } __attribute__ ((packed
, aligned (__alignof__ (void *))));
94 /* The first few fields of an FDE. */
101 } __attribute__ ((packed
, aligned (__alignof__ (void *))));
103 typedef struct dwarf_fde fde
;
105 /* Objects to be searched for frame unwind info. */
107 static struct object
*objects
;
109 /* The information we care about from a CIE. */
119 /* The current unwind state, plus a saved copy for DW_CFA_remember_state. */
121 struct frame_state_internal
123 struct frame_state s
;
124 struct frame_state_internal
*saved_state
;
127 /* This is undefined below if we need it to be an actual function. */
128 #define init_object_mutex_once()
131 #ifdef __GTHREAD_MUTEX_INIT_FUNCTION
133 /* Helper for init_object_mutex_once. */
136 init_object_mutex (void)
138 __GTHREAD_MUTEX_INIT_FUNCTION (&object_mutex
);
141 /* Call this to arrange to initialize the object mutex. */
143 #undef init_object_mutex_once
145 init_object_mutex_once (void)
147 static __gthread_once_t once
= __GTHREAD_ONCE_INIT
;
148 __gthread_once (&once
, init_object_mutex
);
151 #endif /* __GTHREAD_MUTEX_INIT_FUNCTION */
152 #endif /* __GTHREADS */
154 /* Decode the unsigned LEB128 constant at BUF into the variable pointed to
155 by R, and return the new value of BUF. */
158 decode_uleb128 (unsigned char *buf
, unsigned *r
)
165 unsigned byte
= *buf
++;
166 result
|= (byte
& 0x7f) << shift
;
167 if ((byte
& 0x80) == 0)
175 /* Decode the signed LEB128 constant at BUF into the variable pointed to
176 by R, and return the new value of BUF. */
179 decode_sleb128 (unsigned char *buf
, int *r
)
188 result
|= (byte
& 0x7f) << shift
;
190 if ((byte
& 0x80) == 0)
193 if (shift
< (sizeof (*r
) * 8) && (byte
& 0x40) != 0)
194 result
|= - (1 << shift
);
200 /* Read unaligned data from the instruction buffer. */
204 unsigned b2
__attribute__ ((mode (HI
)));
205 unsigned b4
__attribute__ ((mode (SI
)));
206 unsigned b8
__attribute__ ((mode (DI
)));
207 } __attribute__ ((packed
));
209 read_pointer (void *p
)
210 { union unaligned
*up
= p
; return up
->p
; }
211 static inline unsigned
213 { return *(unsigned char *)p
; }
214 static inline unsigned
216 { union unaligned
*up
= p
; return up
->b2
; }
217 static inline unsigned
219 { union unaligned
*up
= p
; return up
->b4
; }
220 static inline unsigned long
222 { union unaligned
*up
= p
; return up
->b8
; }
224 /* Ordering function for FDEs. Functions can't overlap, so we just compare
225 their starting addresses. */
228 fde_compare (fde
*x
, fde
*y
)
230 return (saddr
)x
->pc_begin
- (saddr
)y
->pc_begin
;
233 /* Return the address of the FDE after P. */
238 return (fde
*)(((char *)p
) + p
->length
+ sizeof (p
->length
));
244 count_fdes (fde
*this_fde
)
248 for (count
= 0; this_fde
->length
!= 0; this_fde
= next_fde (this_fde
))
250 /* Skip CIEs and linked once FDE entries. */
251 if (this_fde
->CIE_delta
== 0 || this_fde
->pc_begin
== 0)
261 add_fdes (fde
*this_fde
, fde_accumulator
*accu
, void **beg_ptr
, void **end_ptr
)
263 void *pc_begin
= *beg_ptr
;
264 void *pc_end
= *end_ptr
;
266 for (; this_fde
->length
!= 0; this_fde
= next_fde (this_fde
))
268 /* Skip CIEs and linked once FDE entries. */
269 if (this_fde
->CIE_delta
== 0 || this_fde
->pc_begin
== 0)
272 fde_insert (accu
, this_fde
);
274 if (this_fde
->pc_begin
< pc_begin
)
275 pc_begin
= this_fde
->pc_begin
;
276 if (this_fde
->pc_begin
+ this_fde
->pc_range
> pc_end
)
277 pc_end
= this_fde
->pc_begin
+ this_fde
->pc_range
;
284 /* search this fde table for the one containing the pc */
286 search_fdes (fde
*this_fde
, void *pc
)
288 for (; this_fde
->length
!= 0; this_fde
= next_fde (this_fde
))
290 /* Skip CIEs and linked once FDE entries. */
291 if (this_fde
->CIE_delta
== 0 || this_fde
->pc_begin
== 0)
294 if ((uaddr
)((char *)pc
- (char *)this_fde
->pc_begin
) < this_fde
->pc_range
)
300 /* Set up a sorted array of pointers to FDEs for a loaded object. We
301 count up the entries before allocating the array because it's likely to
302 be faster. We can be called multiple times, should we have failed to
303 allocate a sorted fde array on a previous occasion. */
306 frame_init (struct object
* ob
)
309 fde_accumulator accu
;
310 void *pc_begin
, *pc_end
;
315 else if (ob
->fde_array
)
317 fde
**p
= ob
->fde_array
;
318 for (count
= 0; *p
; ++p
)
319 count
+= count_fdes (*p
);
322 count
= count_fdes (ob
->fde_begin
);
325 if (!start_fde_sort (&accu
, count
) && ob
->pc_begin
)
328 pc_begin
= (void*)(uaddr
)-1;
333 fde
**p
= ob
->fde_array
;
335 add_fdes (*p
, &accu
, &pc_begin
, &pc_end
);
338 add_fdes (ob
->fde_begin
, &accu
, &pc_begin
, &pc_end
);
340 array
= end_fde_sort (&accu
, count
);
342 ob
->fde_array
= array
;
343 ob
->pc_begin
= pc_begin
;
347 /* Return a pointer to the FDE for the function containing PC. */
355 init_object_mutex_once ();
356 __gthread_mutex_lock (&object_mutex
);
358 /* Linear search through the objects, to find the one containing the pc. */
359 for (ob
= objects
; ob
; ob
= ob
->next
)
361 if (ob
->pc_begin
== 0)
363 if (pc
>= ob
->pc_begin
&& pc
< ob
->pc_end
)
369 __gthread_mutex_unlock (&object_mutex
);
373 if (!ob
->fde_array
|| (void *)ob
->fde_array
== (void *)ob
->fde_begin
)
376 if (ob
->fde_array
&& (void *)ob
->fde_array
!= (void *)ob
->fde_begin
)
378 __gthread_mutex_unlock (&object_mutex
);
380 /* Standard binary search algorithm. */
381 for (lo
= 0, hi
= ob
->count
; lo
< hi
; )
383 size_t i
= (lo
+ hi
) / 2;
384 fde
*f
= ob
->fde_array
[i
];
386 if (pc
< f
->pc_begin
)
388 else if (pc
>= f
->pc_begin
+ f
->pc_range
)
396 /* Long slow labourious linear search, cos we've no memory. */
401 fde
**p
= ob
->fde_array
;
405 f
= search_fdes (*p
, pc
);
413 f
= search_fdes (ob
->fde_begin
, pc
);
414 __gthread_mutex_unlock (&object_mutex
);
420 static inline struct dwarf_cie
*
423 return ((void *)&f
->CIE_delta
) - f
->CIE_delta
;
426 /* Extract any interesting information from the CIE for the translation
427 unit F belongs to. */
430 extract_cie_info (fde
*f
, struct cie_info
*c
)
435 c
->augmentation
= get_cie (f
)->augmentation
;
437 if (strcmp (c
->augmentation
, "") != 0
438 && strcmp (c
->augmentation
, "eh") != 0
439 && c
->augmentation
[0] != 'z')
442 p
= c
->augmentation
+ strlen (c
->augmentation
) + 1;
444 if (strcmp (c
->augmentation
, "eh") == 0)
446 c
->eh_ptr
= read_pointer (p
);
447 p
+= sizeof (void *);
452 p
= decode_uleb128 (p
, &c
->code_align
);
453 p
= decode_sleb128 (p
, &c
->data_align
);
454 c
->ra_regno
= *(unsigned char *)p
++;
456 /* If the augmentation starts with 'z', we now see the length of the
457 augmentation fields. */
458 if (c
->augmentation
[0] == 'z')
460 p
= decode_uleb128 (p
, &i
);
467 /* Decode a DW_OP stack operation. */
470 decode_stack_op (unsigned char *buf
, struct frame_state
*state
)
472 enum dwarf_location_atom op
;
510 state
->cfa_reg
= op
- DW_OP_reg0
;
513 buf
= decode_sleb128 (buf
, &offset
);
514 state
->cfa_reg
= offset
;
548 state
->cfa_reg
= op
- DW_OP_breg0
;
549 buf
= decode_sleb128 (buf
, &offset
);
550 state
->base_offset
= offset
;
553 buf
= decode_sleb128 (buf
, &offset
);
554 state
->cfa_reg
= offset
;
555 buf
= decode_sleb128 (buf
, &offset
);
556 state
->base_offset
= offset
;
561 case DW_OP_plus_uconst
:
562 buf
= decode_uleb128 (buf
, &offset
);
563 state
->cfa_offset
= offset
;
570 /* Decode one instruction's worth of DWARF 2 call frame information.
571 Used by __frame_state_for. Takes pointers P to the instruction to
572 decode, STATE to the current register unwind information, INFO to the
573 current CIE information, and PC to the current PC value. Returns a
574 pointer to the next instruction. */
577 execute_cfa_insn (void *p
, struct frame_state_internal
*state
,
578 struct cie_info
*info
, void **pc
)
580 unsigned insn
= *(unsigned char *)p
++;
584 if (insn
& DW_CFA_advance_loc
)
585 *pc
+= ((insn
& 0x3f) * info
->code_align
);
586 else if (insn
& DW_CFA_offset
)
589 p
= decode_uleb128 (p
, &offset
);
590 if (reg
== state
->s
.cfa_reg
)
591 /* Don't record anything about this register; it's only used to
592 reload SP in the epilogue. We don't want to copy in SP
593 values for outer frames; we handle restoring SP specially. */;
596 offset
*= info
->data_align
;
597 state
->s
.saved
[reg
] = REG_SAVED_OFFSET
;
598 state
->s
.reg_or_offset
[reg
] = offset
;
601 else if (insn
& DW_CFA_restore
)
604 state
->s
.saved
[reg
] = REG_UNSAVED
;
609 *pc
= read_pointer (p
);
610 p
+= sizeof (void *);
612 case DW_CFA_advance_loc1
:
613 *pc
+= read_1byte (p
);
616 case DW_CFA_advance_loc2
:
617 *pc
+= read_2byte (p
);
620 case DW_CFA_advance_loc4
:
621 *pc
+= read_4byte (p
);
625 case DW_CFA_offset_extended
:
626 p
= decode_uleb128 (p
, ®
);
627 p
= decode_uleb128 (p
, &offset
);
628 if (reg
== state
->s
.cfa_reg
)
629 /* Don't record anything; see above. */;
632 offset
*= info
->data_align
;
633 state
->s
.saved
[reg
] = REG_SAVED_OFFSET
;
634 state
->s
.reg_or_offset
[reg
] = offset
;
637 case DW_CFA_restore_extended
:
638 p
= decode_uleb128 (p
, ®
);
639 state
->s
.saved
[reg
] = REG_UNSAVED
;
642 case DW_CFA_undefined
:
643 case DW_CFA_same_value
:
647 case DW_CFA_register
:
650 p
= decode_uleb128 (p
, ®
);
651 p
= decode_uleb128 (p
, ®2
);
652 state
->s
.saved
[reg
] = REG_SAVED_REG
;
653 state
->s
.reg_or_offset
[reg
] = reg2
;
658 p
= decode_uleb128 (p
, ®
);
659 p
= decode_uleb128 (p
, &offset
);
660 state
->s
.cfa_reg
= reg
;
661 state
->s
.cfa_offset
= offset
;
663 case DW_CFA_def_cfa_register
:
664 p
= decode_uleb128 (p
, ®
);
665 state
->s
.cfa_reg
= reg
;
667 case DW_CFA_def_cfa_offset
:
668 p
= decode_uleb128 (p
, &offset
);
669 state
->s
.cfa_offset
= offset
;
671 case DW_CFA_def_cfa_expression
:
674 state
->s
.cfa_reg
= 0;
675 state
->s
.cfa_offset
= 0;
676 state
->s
.base_offset
= 0;
677 state
->s
.indirect
= 0;
679 p
= decode_uleb128 (p
, &offset
);
682 p
= decode_stack_op (p
, &(state
->s
));
686 case DW_CFA_remember_state
:
688 struct frame_state_internal
*save
=
689 (struct frame_state_internal
*)
690 malloc (sizeof (struct frame_state_internal
));
691 memcpy (save
, state
, sizeof (struct frame_state_internal
));
692 state
->saved_state
= save
;
695 case DW_CFA_restore_state
:
697 struct frame_state_internal
*save
= state
->saved_state
;
698 memcpy (state
, save
, sizeof (struct frame_state_internal
));
703 /* FIXME: Hardcoded for SPARC register window configuration. */
704 case DW_CFA_GNU_window_save
:
705 for (reg
= 16; reg
< 32; ++reg
)
707 state
->s
.saved
[reg
] = REG_SAVED_OFFSET
;
708 state
->s
.reg_or_offset
[reg
] = (reg
- 16) * sizeof (void *);
712 case DW_CFA_GNU_args_size
:
713 p
= decode_uleb128 (p
, &offset
);
714 state
->s
.args_size
= offset
;
717 case DW_CFA_GNU_negative_offset_extended
:
718 p
= decode_uleb128 (p
, ®
);
719 p
= decode_uleb128 (p
, &offset
);
720 offset
*= info
->data_align
;
721 state
->s
.saved
[reg
] = REG_SAVED_OFFSET
;
722 state
->s
.reg_or_offset
[reg
] = -offset
;
731 /* Called from __throw to find the registers to restore for a given
732 PC_TARGET. The caller should allocate a local variable of `struct
733 frame_state' (declared in frame.h) and pass its address to STATE_IN. */
736 __frame_state_for (void *pc_target
, struct frame_state
*state_in
)
739 void *insn
, *end
, *pc
;
740 struct cie_info info
;
741 struct frame_state_internal state
;
743 f
= find_fde (pc_target
);
747 insn
= extract_cie_info (f
, &info
);
751 memset (&state
, 0, sizeof (state
));
752 state
.s
.retaddr_column
= info
.ra_regno
;
753 state
.s
.eh_ptr
= info
.eh_ptr
;
755 /* First decode all the insns in the CIE. */
756 end
= next_fde ((fde
*) get_cie (f
));
758 insn
= execute_cfa_insn (insn
, &state
, &info
, 0);
760 insn
= ((fde
*)f
) + 1;
762 if (info
.augmentation
[0] == 'z')
765 insn
= decode_uleb128 (insn
, &i
);
769 /* Then the insns in the FDE up to our target PC. */
772 while (insn
< end
&& pc
<= pc_target
)
773 insn
= execute_cfa_insn (insn
, &state
, &info
, &pc
);
775 memcpy (state_in
, &state
.s
, sizeof (state
.s
));
778 #endif /* DWARF2_UNWIND_INFO */