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