* config/i386/i386.md (mmx_pinsrw): Output operands in correct
[official-gcc.git] / gcc / frame-dwarf2.c
blob459af6d918a0b58ac96b0c9772019ee9801424a6
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 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)
12 any later version.
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
21 executable.)
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
35 do not apply. */
37 #include "tconfig.h"
38 #include "tsystem.h"
40 #include "defaults.h"
42 #ifdef DWARF2_UNWIND_INFO
43 #include "dwarf2.h"
44 #include "frame.h"
45 #include "gthr.h"
47 #ifdef __GTHREAD_MUTEX_INIT
48 static __gthread_mutex_t object_mutex = __GTHREAD_MUTEX_INIT;
49 #else
50 static __gthread_mutex_t object_mutex;
51 #endif
53 /* Don't use `fancy_abort' here even if config.h says to use it. */
54 #ifdef abort
55 #undef abort
56 #endif
58 /* Some types used by the DWARF 2 spec. */
60 typedef int sword __attribute__ ((mode (SI)));
61 typedef unsigned int uword __attribute__ ((mode (SI)));
62 typedef unsigned int uaddr __attribute__ ((mode (pointer)));
63 typedef int saddr __attribute__ ((mode (pointer)));
64 typedef unsigned char ubyte;
66 /* Terminology:
67 CIE - Common Information Element
68 FDE - Frame Descriptor Element
70 There is one per function, and it describes where the function code
71 is located, and what the register lifetimes and stack layout are
72 within the function.
74 The data structures are defined in the DWARF specfication, although
75 not in a very readable way (see LITERATURE).
77 Every time an exception is thrown, the code needs to locate the FDE
78 for the current function, and starts to look for exception regions
79 from that FDE. This works in a two-level search:
80 a) in a linear search, find the shared image (i.e. DLL) containing
81 the PC
82 b) using the FDE table for that shared object, locate the FDE using
83 binary search (which requires the sorting). */
85 /* The first few fields of a CIE. The CIE_id field is 0 for a CIE,
86 to distinguish it from a valid FDE. FDEs are aligned to an addressing
87 unit boundary, but the fields within are unaligned. */
89 struct dwarf_cie {
90 uword length;
91 sword CIE_id;
92 ubyte version;
93 char augmentation[0];
94 } __attribute__ ((packed, aligned (__alignof__ (void *))));
96 /* The first few fields of an FDE. */
98 struct dwarf_fde {
99 uword length;
100 sword CIE_delta;
101 void* pc_begin;
102 uaddr pc_range;
103 } __attribute__ ((packed, aligned (__alignof__ (void *))));
105 typedef struct dwarf_fde fde;
107 /* Objects to be searched for frame unwind info. */
109 static struct object *objects;
111 /* The information we care about from a CIE. */
113 struct cie_info {
114 char *augmentation;
115 void *eh_ptr;
116 int code_align;
117 int data_align;
118 unsigned ra_regno;
121 /* The current unwind state, plus a saved copy for DW_CFA_remember_state. */
123 struct frame_state_internal
125 struct frame_state s;
126 struct frame_state_internal *saved_state;
129 /* This is undefined below if we need it to be an actual function. */
130 #define init_object_mutex_once()
132 #if __GTHREADS
133 #ifdef __GTHREAD_MUTEX_INIT_FUNCTION
135 /* Helper for init_object_mutex_once. */
137 static void
138 init_object_mutex (void)
140 __GTHREAD_MUTEX_INIT_FUNCTION (&object_mutex);
143 /* Call this to arrange to initialize the object mutex. */
145 #undef init_object_mutex_once
146 static void
147 init_object_mutex_once (void)
149 static __gthread_once_t once = __GTHREAD_ONCE_INIT;
150 __gthread_once (&once, init_object_mutex);
153 #endif /* __GTHREAD_MUTEX_INIT_FUNCTION */
154 #endif /* __GTHREADS */
156 /* Decode the unsigned LEB128 constant at BUF into the variable pointed to
157 by R, and return the new value of BUF. */
159 static void *
160 decode_uleb128 (unsigned char *buf, unsigned *r)
162 unsigned shift = 0;
163 unsigned result = 0;
165 while (1)
167 unsigned byte = *buf++;
168 result |= (byte & 0x7f) << shift;
169 if ((byte & 0x80) == 0)
170 break;
171 shift += 7;
173 *r = result;
174 return buf;
177 /* Decode the signed LEB128 constant at BUF into the variable pointed to
178 by R, and return the new value of BUF. */
180 static void *
181 decode_sleb128 (unsigned char *buf, int *r)
183 unsigned shift = 0;
184 unsigned result = 0;
185 unsigned byte;
187 while (1)
189 byte = *buf++;
190 result |= (byte & 0x7f) << shift;
191 shift += 7;
192 if ((byte & 0x80) == 0)
193 break;
195 if (shift < (sizeof (*r) * 8) && (byte & 0x40) != 0)
196 result |= - (1 << shift);
198 *r = result;
199 return buf;
202 /* Read unaligned data from the instruction buffer. */
204 union unaligned {
205 void *p;
206 unsigned b2 __attribute__ ((mode (HI)));
207 unsigned b4 __attribute__ ((mode (SI)));
208 unsigned b8 __attribute__ ((mode (DI)));
209 } __attribute__ ((packed));
210 static inline void *
211 read_pointer (void *p)
212 { union unaligned *up = p; return up->p; }
213 static inline unsigned
214 read_1byte (void *p)
215 { return *(unsigned char *)p; }
216 static inline unsigned
217 read_2byte (void *p)
218 { union unaligned *up = p; return up->b2; }
219 static inline unsigned
220 read_4byte (void *p)
221 { union unaligned *up = p; return up->b4; }
222 static inline unsigned long
223 read_8byte (void *p)
224 { union unaligned *up = p; return up->b8; }
226 /* Ordering function for FDEs. Functions can't overlap, so we just compare
227 their starting addresses. */
229 static inline saddr
230 fde_compare (fde *x, fde *y)
232 return (saddr)x->pc_begin - (saddr)y->pc_begin;
235 /* Return the address of the FDE after P. */
237 static inline fde *
238 next_fde (fde *p)
240 return (fde *)(((char *)p) + p->length + sizeof (p->length));
243 #include "frame.c"
245 static size_t
246 count_fdes (fde *this_fde)
248 size_t count;
250 for (count = 0; this_fde->length != 0; this_fde = next_fde (this_fde))
252 /* Skip CIEs and linked once FDE entries. */
253 if (this_fde->CIE_delta == 0 || this_fde->pc_begin == 0)
254 continue;
256 ++count;
259 return count;
262 static void
263 add_fdes (fde *this_fde, fde_accumulator *accu, void **beg_ptr, void **end_ptr)
265 void *pc_begin = *beg_ptr;
266 void *pc_end = *end_ptr;
268 for (; this_fde->length != 0; this_fde = next_fde (this_fde))
270 /* Skip CIEs and linked once FDE entries. */
271 if (this_fde->CIE_delta == 0 || this_fde->pc_begin == 0)
272 continue;
274 fde_insert (accu, this_fde);
276 if (this_fde->pc_begin < pc_begin)
277 pc_begin = this_fde->pc_begin;
278 if (this_fde->pc_begin + this_fde->pc_range > pc_end)
279 pc_end = this_fde->pc_begin + this_fde->pc_range;
282 *beg_ptr = pc_begin;
283 *end_ptr = pc_end;
286 /* search this fde table for the one containing the pc */
287 static fde *
288 search_fdes (fde *this_fde, void *pc)
290 for (; this_fde->length != 0; this_fde = next_fde (this_fde))
292 /* Skip CIEs and linked once FDE entries. */
293 if (this_fde->CIE_delta == 0 || this_fde->pc_begin == 0)
294 continue;
296 if ((uaddr)((char *)pc - (char *)this_fde->pc_begin) < this_fde->pc_range)
297 return this_fde;
299 return NULL;
302 /* Set up a sorted array of pointers to FDEs for a loaded object. We
303 count up the entries before allocating the array because it's likely to
304 be faster. We can be called multiple times, should we have failed to
305 allocate a sorted fde array on a previous occasion. */
307 static void
308 frame_init (struct object* ob)
310 size_t count;
311 fde_accumulator accu;
312 void *pc_begin, *pc_end;
313 fde **array;
315 if (ob->pc_begin)
316 count = ob->count;
317 else if (ob->fde_array)
319 fde **p = ob->fde_array;
320 for (count = 0; *p; ++p)
321 count += count_fdes (*p);
323 else
324 count = count_fdes (ob->fde_begin);
325 ob->count = count;
327 if (!start_fde_sort (&accu, count) && ob->pc_begin)
328 return;
330 pc_begin = (void*)(uaddr)-1;
331 pc_end = 0;
333 if (ob->fde_array)
335 fde **p = ob->fde_array;
336 for (; *p; ++p)
337 add_fdes (*p, &accu, &pc_begin, &pc_end);
339 else
340 add_fdes (ob->fde_begin, &accu, &pc_begin, &pc_end);
342 array = end_fde_sort (&accu, count);
343 if (array)
344 ob->fde_array = array;
345 ob->pc_begin = pc_begin;
346 ob->pc_end = pc_end;
349 /* Return a pointer to the FDE for the function containing PC. */
351 static fde *
352 find_fde (void *pc)
354 struct object *ob;
355 size_t lo, hi;
357 init_object_mutex_once ();
358 __gthread_mutex_lock (&object_mutex);
360 /* Linear search through the objects, to find the one containing the pc. */
361 for (ob = objects; ob; ob = ob->next)
363 if (ob->pc_begin == 0)
364 frame_init (ob);
365 if (pc >= ob->pc_begin && pc < ob->pc_end)
366 break;
369 if (ob == 0)
371 __gthread_mutex_unlock (&object_mutex);
372 return 0;
375 if (!ob->fde_array || (void *)ob->fde_array == (void *)ob->fde_begin)
376 frame_init (ob);
378 if (ob->fde_array && (void *)ob->fde_array != (void *)ob->fde_begin)
380 __gthread_mutex_unlock (&object_mutex);
382 /* Standard binary search algorithm. */
383 for (lo = 0, hi = ob->count; lo < hi; )
385 size_t i = (lo + hi) / 2;
386 fde *f = ob->fde_array[i];
388 if (pc < f->pc_begin)
389 hi = i;
390 else if (pc >= f->pc_begin + f->pc_range)
391 lo = i + 1;
392 else
393 return f;
396 else
398 /* Long slow labourious linear search, cos we've no memory. */
399 fde *f;
401 if (ob->fde_array)
403 fde **p = ob->fde_array;
407 f = search_fdes (*p, pc);
408 if (f)
409 break;
410 p++;
412 while (*p);
414 else
415 f = search_fdes (ob->fde_begin, pc);
416 __gthread_mutex_unlock (&object_mutex);
417 return f;
419 return 0;
422 static inline struct dwarf_cie *
423 get_cie (fde *f)
425 return ((void *)&f->CIE_delta) - f->CIE_delta;
428 /* Extract any interesting information from the CIE for the translation
429 unit F belongs to. */
431 static void *
432 extract_cie_info (fde *f, struct cie_info *c)
434 void *p;
435 int i;
437 c->augmentation = get_cie (f)->augmentation;
439 if (strcmp (c->augmentation, "") != 0
440 && strcmp (c->augmentation, "eh") != 0
441 && c->augmentation[0] != 'z')
442 return 0;
444 p = c->augmentation + strlen (c->augmentation) + 1;
446 if (strcmp (c->augmentation, "eh") == 0)
448 c->eh_ptr = read_pointer (p);
449 p += sizeof (void *);
451 else
452 c->eh_ptr = 0;
454 p = decode_uleb128 (p, &c->code_align);
455 p = decode_sleb128 (p, &c->data_align);
456 c->ra_regno = *(unsigned char *)p++;
458 /* If the augmentation starts with 'z', we now see the length of the
459 augmentation fields. */
460 if (c->augmentation[0] == 'z')
462 p = decode_uleb128 (p, &i);
463 p += i;
466 return p;
469 /* Decode a DW_OP stack operation. */
471 static void *
472 decode_stack_op (unsigned char *buf, struct frame_state *state)
474 enum dwarf_location_atom op;
475 int offset;
477 op = *buf++;
478 switch (op)
480 case DW_OP_reg0:
481 case DW_OP_reg1:
482 case DW_OP_reg2:
483 case DW_OP_reg3:
484 case DW_OP_reg4:
485 case DW_OP_reg5:
486 case DW_OP_reg6:
487 case DW_OP_reg7:
488 case DW_OP_reg8:
489 case DW_OP_reg9:
490 case DW_OP_reg10:
491 case DW_OP_reg11:
492 case DW_OP_reg12:
493 case DW_OP_reg13:
494 case DW_OP_reg14:
495 case DW_OP_reg15:
496 case DW_OP_reg16:
497 case DW_OP_reg17:
498 case DW_OP_reg18:
499 case DW_OP_reg19:
500 case DW_OP_reg20:
501 case DW_OP_reg21:
502 case DW_OP_reg22:
503 case DW_OP_reg23:
504 case DW_OP_reg24:
505 case DW_OP_reg25:
506 case DW_OP_reg26:
507 case DW_OP_reg27:
508 case DW_OP_reg28:
509 case DW_OP_reg29:
510 case DW_OP_reg30:
511 case DW_OP_reg31:
512 state->cfa_reg = op - DW_OP_reg0;
513 break;
514 case DW_OP_regx:
515 buf = decode_sleb128 (buf, &offset);
516 state->cfa_reg = offset;
517 break;
518 case DW_OP_breg0:
519 case DW_OP_breg1:
520 case DW_OP_breg2:
521 case DW_OP_breg3:
522 case DW_OP_breg4:
523 case DW_OP_breg5:
524 case DW_OP_breg6:
525 case DW_OP_breg7:
526 case DW_OP_breg8:
527 case DW_OP_breg9:
528 case DW_OP_breg10:
529 case DW_OP_breg11:
530 case DW_OP_breg12:
531 case DW_OP_breg13:
532 case DW_OP_breg14:
533 case DW_OP_breg15:
534 case DW_OP_breg16:
535 case DW_OP_breg17:
536 case DW_OP_breg18:
537 case DW_OP_breg19:
538 case DW_OP_breg20:
539 case DW_OP_breg21:
540 case DW_OP_breg22:
541 case DW_OP_breg23:
542 case DW_OP_breg24:
543 case DW_OP_breg25:
544 case DW_OP_breg26:
545 case DW_OP_breg27:
546 case DW_OP_breg28:
547 case DW_OP_breg29:
548 case DW_OP_breg30:
549 case DW_OP_breg31:
550 state->cfa_reg = op - DW_OP_breg0;
551 buf = decode_sleb128 (buf, &offset);
552 state->base_offset = offset;
553 break;
554 case DW_OP_bregx:
555 buf = decode_sleb128 (buf, &offset);
556 state->cfa_reg = offset;
557 buf = decode_sleb128 (buf, &offset);
558 state->base_offset = offset;
559 break;
560 case DW_OP_deref:
561 state->indirect = 1;
562 break;
563 case DW_OP_plus_uconst:
564 buf = decode_uleb128 (buf, &offset);
565 state->cfa_offset = offset;
566 break;
567 default:
568 abort ();
570 return buf;
572 /* Decode one instruction's worth of DWARF 2 call frame information.
573 Used by __frame_state_for. Takes pointers P to the instruction to
574 decode, STATE to the current register unwind information, INFO to the
575 current CIE information, and PC to the current PC value. Returns a
576 pointer to the next instruction. */
578 static void *
579 execute_cfa_insn (void *p, struct frame_state_internal *state,
580 struct cie_info *info, void **pc)
582 unsigned insn = *(unsigned char *)p++;
583 unsigned reg;
584 int offset;
586 if (insn & DW_CFA_advance_loc)
587 *pc += ((insn & 0x3f) * info->code_align);
588 else if (insn & DW_CFA_offset)
590 reg = (insn & 0x3f);
591 p = decode_uleb128 (p, &offset);
592 if (reg == state->s.cfa_reg)
593 /* Don't record anything about this register; it's only used to
594 reload SP in the epilogue. We don't want to copy in SP
595 values for outer frames; we handle restoring SP specially. */;
596 else
598 offset *= info->data_align;
599 state->s.saved[reg] = REG_SAVED_OFFSET;
600 state->s.reg_or_offset[reg] = offset;
603 else if (insn & DW_CFA_restore)
605 reg = (insn & 0x3f);
606 state->s.saved[reg] = REG_UNSAVED;
608 else switch (insn)
610 case DW_CFA_set_loc:
611 *pc = read_pointer (p);
612 p += sizeof (void *);
613 break;
614 case DW_CFA_advance_loc1:
615 *pc += read_1byte (p);
616 p += 1;
617 break;
618 case DW_CFA_advance_loc2:
619 *pc += read_2byte (p);
620 p += 2;
621 break;
622 case DW_CFA_advance_loc4:
623 *pc += read_4byte (p);
624 p += 4;
625 break;
627 case DW_CFA_offset_extended:
628 p = decode_uleb128 (p, &reg);
629 p = decode_uleb128 (p, &offset);
630 if (reg == state->s.cfa_reg)
631 /* Don't record anything; see above. */;
632 else
634 offset *= info->data_align;
635 state->s.saved[reg] = REG_SAVED_OFFSET;
636 state->s.reg_or_offset[reg] = offset;
638 break;
639 case DW_CFA_restore_extended:
640 p = decode_uleb128 (p, &reg);
641 state->s.saved[reg] = REG_UNSAVED;
642 break;
644 case DW_CFA_undefined:
645 case DW_CFA_same_value:
646 case DW_CFA_nop:
647 break;
649 case DW_CFA_register:
651 unsigned reg2;
652 p = decode_uleb128 (p, &reg);
653 p = decode_uleb128 (p, &reg2);
654 state->s.saved[reg] = REG_SAVED_REG;
655 state->s.reg_or_offset[reg] = reg2;
657 break;
659 case DW_CFA_def_cfa:
660 p = decode_uleb128 (p, &reg);
661 p = decode_uleb128 (p, &offset);
662 state->s.cfa_reg = reg;
663 state->s.cfa_offset = offset;
664 break;
665 case DW_CFA_def_cfa_register:
666 p = decode_uleb128 (p, &reg);
667 state->s.cfa_reg = reg;
668 break;
669 case DW_CFA_def_cfa_offset:
670 p = decode_uleb128 (p, &offset);
671 state->s.cfa_offset = offset;
672 break;
673 case DW_CFA_def_cfa_expression:
675 void *end;
676 state->s.cfa_reg = 0;
677 state->s.cfa_offset = 0;
678 state->s.base_offset = 0;
679 state->s.indirect = 0;
681 p = decode_uleb128 (p, &offset);
682 end = p + offset;
683 while (p < end)
684 p = decode_stack_op (p, &(state->s));
685 break;
688 case DW_CFA_remember_state:
690 struct frame_state_internal *save =
691 (struct frame_state_internal *)
692 malloc (sizeof (struct frame_state_internal));
693 memcpy (save, state, sizeof (struct frame_state_internal));
694 state->saved_state = save;
696 break;
697 case DW_CFA_restore_state:
699 struct frame_state_internal *save = state->saved_state;
700 memcpy (state, save, sizeof (struct frame_state_internal));
701 free (save);
703 break;
705 /* FIXME: Hardcoded for SPARC register window configuration. */
706 case DW_CFA_GNU_window_save:
707 for (reg = 16; reg < 32; ++reg)
709 state->s.saved[reg] = REG_SAVED_OFFSET;
710 state->s.reg_or_offset[reg] = (reg - 16) * sizeof (void *);
712 break;
714 case DW_CFA_GNU_args_size:
715 p = decode_uleb128 (p, &offset);
716 state->s.args_size = offset;
717 break;
719 case DW_CFA_GNU_negative_offset_extended:
720 p = decode_uleb128 (p, &reg);
721 p = decode_uleb128 (p, &offset);
722 offset *= info->data_align;
723 state->s.saved[reg] = REG_SAVED_OFFSET;
724 state->s.reg_or_offset[reg] = -offset;
725 break;
727 default:
728 abort ();
730 return p;
733 /* Called from __throw to find the registers to restore for a given
734 PC_TARGET. The caller should allocate a local variable of `struct
735 frame_state' (declared in frame.h) and pass its address to STATE_IN. */
737 struct frame_state *
738 __frame_state_for (void *pc_target, struct frame_state *state_in)
740 fde *f;
741 void *insn, *end, *pc;
742 struct cie_info info;
743 struct frame_state_internal state;
745 f = find_fde (pc_target);
746 if (f == 0)
747 return 0;
749 insn = extract_cie_info (f, &info);
750 if (insn == 0)
751 return 0;
753 memset (&state, 0, sizeof (state));
754 state.s.retaddr_column = info.ra_regno;
755 state.s.eh_ptr = info.eh_ptr;
757 /* First decode all the insns in the CIE. */
758 end = next_fde ((fde*) get_cie (f));
759 while (insn < end)
760 insn = execute_cfa_insn (insn, &state, &info, 0);
762 insn = ((fde *)f) + 1;
764 if (info.augmentation[0] == 'z')
766 int i;
767 insn = decode_uleb128 (insn, &i);
768 insn += i;
771 /* Then the insns in the FDE up to our target PC. */
772 end = next_fde (f);
773 pc = f->pc_begin;
774 while (insn < end && pc <= pc_target)
775 insn = execute_cfa_insn (insn, &state, &info, &pc);
777 memcpy (state_in, &state.s, sizeof (state.s));
778 return state_in;
780 #endif /* DWARF2_UNWIND_INFO */