re PR tree-optimization/71522 (Wrong optimization of memcpy through a var of type...
[platform/upstream/gcc.git] / gcc / dwarf2cfi.c
1 /* Dwarf2 Call Frame Information helper routines.
2    Copyright (C) 1992-2016 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "target.h"
24 #include "function.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "tree-pass.h"
28 #include "tm_p.h"
29 #include "emit-rtl.h"
30 #include "stor-layout.h"
31 #include "cfgbuild.h"
32 #include "dwarf2out.h"
33 #include "dwarf2asm.h"
34 #include "common/common-target.h"
35
36 #include "except.h"             /* expand_builtin_dwarf_sp_column */
37 #include "expr.h"               /* init_return_column_size */
38 #include "output.h"             /* asm_out_file */
39 #include "debug.h"              /* dwarf2out_do_frame, dwarf2out_do_cfi_asm */
40
41
42 /* ??? Poison these here until it can be done generically.  They've been
43    totally replaced in this file; make sure it stays that way.  */
44 #undef DWARF2_UNWIND_INFO
45 #undef DWARF2_FRAME_INFO
46 #if (GCC_VERSION >= 3000)
47  #pragma GCC poison DWARF2_UNWIND_INFO DWARF2_FRAME_INFO
48 #endif
49
50 #ifndef INCOMING_RETURN_ADDR_RTX
51 #define INCOMING_RETURN_ADDR_RTX  (gcc_unreachable (), NULL_RTX)
52 #endif
53
54 /* Maximum size (in bytes) of an artificially generated label.  */
55 #define MAX_ARTIFICIAL_LABEL_BYTES      30
56 \f
57 /* A collected description of an entire row of the abstract CFI table.  */
58 struct GTY(()) dw_cfi_row
59 {
60   /* The expression that computes the CFA, expressed in two different ways.
61      The CFA member for the simple cases, and the full CFI expression for
62      the complex cases.  The later will be a DW_CFA_cfa_expression.  */
63   dw_cfa_location cfa;
64   dw_cfi_ref cfa_cfi;
65
66   /* The expressions for any register column that is saved.  */
67   cfi_vec reg_save;
68 };
69
70 /* The caller's ORIG_REG is saved in SAVED_IN_REG.  */
71 struct GTY(()) reg_saved_in_data {
72   rtx orig_reg;
73   rtx saved_in_reg;
74 };
75
76
77 /* Since we no longer have a proper CFG, we're going to create a facsimile
78    of one on the fly while processing the frame-related insns.
79
80    We create dw_trace_info structures for each extended basic block beginning
81    and ending at a "save point".  Save points are labels, barriers, certain
82    notes, and of course the beginning and end of the function.
83
84    As we encounter control transfer insns, we propagate the "current"
85    row state across the edges to the starts of traces.  When checking is
86    enabled, we validate that we propagate the same data from all sources.
87
88    All traces are members of the TRACE_INFO array, in the order in which
89    they appear in the instruction stream.
90
91    All save points are present in the TRACE_INDEX hash, mapping the insn
92    starting a trace to the dw_trace_info describing the trace.  */
93
94 struct dw_trace_info
95 {
96   /* The insn that begins the trace.  */
97   rtx_insn *head;
98
99   /* The row state at the beginning and end of the trace.  */
100   dw_cfi_row *beg_row, *end_row;
101
102   /* Tracking for DW_CFA_GNU_args_size.  The "true" sizes are those we find
103      while scanning insns.  However, the args_size value is irrelevant at
104      any point except can_throw_internal_p insns.  Therefore the "delay"
105      sizes the values that must actually be emitted for this trace.  */
106   HOST_WIDE_INT beg_true_args_size, end_true_args_size;
107   HOST_WIDE_INT beg_delay_args_size, end_delay_args_size;
108
109   /* The first EH insn in the trace, where beg_delay_args_size must be set.  */
110   rtx_insn *eh_head;
111
112   /* The following variables contain data used in interpreting frame related
113      expressions.  These are not part of the "real" row state as defined by
114      Dwarf, but it seems like they need to be propagated into a trace in case
115      frame related expressions have been sunk.  */
116   /* ??? This seems fragile.  These variables are fragments of a larger
117      expression.  If we do not keep the entire expression together, we risk
118      not being able to put it together properly.  Consider forcing targets
119      to generate self-contained expressions and dropping all of the magic
120      interpretation code in this file.  Or at least refusing to shrink wrap
121      any frame related insn that doesn't contain a complete expression.  */
122
123   /* The register used for saving registers to the stack, and its offset
124      from the CFA.  */
125   dw_cfa_location cfa_store;
126
127   /* A temporary register holding an integral value used in adjusting SP
128      or setting up the store_reg.  The "offset" field holds the integer
129      value, not an offset.  */
130   dw_cfa_location cfa_temp;
131
132   /* A set of registers saved in other registers.  This is the inverse of
133      the row->reg_save info, if the entry is a DW_CFA_register.  This is
134      implemented as a flat array because it normally contains zero or 1
135      entry, depending on the target.  IA-64 is the big spender here, using
136      a maximum of 5 entries.  */
137   vec<reg_saved_in_data> regs_saved_in_regs;
138
139   /* An identifier for this trace.  Used only for debugging dumps.  */
140   unsigned id;
141
142   /* True if this trace immediately follows NOTE_INSN_SWITCH_TEXT_SECTIONS.  */
143   bool switch_sections;
144
145   /* True if we've seen different values incoming to beg_true_args_size.  */
146   bool args_size_undefined;
147 };
148
149
150 /* Hashtable helpers.  */
151
152 struct trace_info_hasher : nofree_ptr_hash <dw_trace_info>
153 {
154   static inline hashval_t hash (const dw_trace_info *);
155   static inline bool equal (const dw_trace_info *, const dw_trace_info *);
156 };
157
158 inline hashval_t
159 trace_info_hasher::hash (const dw_trace_info *ti)
160 {
161   return INSN_UID (ti->head);
162 }
163
164 inline bool
165 trace_info_hasher::equal (const dw_trace_info *a, const dw_trace_info *b)
166 {
167   return a->head == b->head;
168 }
169
170
171 /* The variables making up the pseudo-cfg, as described above.  */
172 static vec<dw_trace_info> trace_info;
173 static vec<dw_trace_info *> trace_work_list;
174 static hash_table<trace_info_hasher> *trace_index;
175
176 /* A vector of call frame insns for the CIE.  */
177 cfi_vec cie_cfi_vec;
178
179 /* The state of the first row of the FDE table, which includes the
180    state provided by the CIE.  */
181 static GTY(()) dw_cfi_row *cie_cfi_row;
182
183 static GTY(()) reg_saved_in_data *cie_return_save;
184
185 static GTY(()) unsigned long dwarf2out_cfi_label_num;
186
187 /* The insn after which a new CFI note should be emitted.  */
188 static rtx_insn *add_cfi_insn;
189
190 /* When non-null, add_cfi will add the CFI to this vector.  */
191 static cfi_vec *add_cfi_vec;
192
193 /* The current instruction trace.  */
194 static dw_trace_info *cur_trace;
195
196 /* The current, i.e. most recently generated, row of the CFI table.  */
197 static dw_cfi_row *cur_row;
198
199 /* A copy of the current CFA, for use during the processing of a
200    single insn.  */
201 static dw_cfa_location *cur_cfa;
202
203 /* We delay emitting a register save until either (a) we reach the end
204    of the prologue or (b) the register is clobbered.  This clusters
205    register saves so that there are fewer pc advances.  */
206
207 struct queued_reg_save {
208   rtx reg;
209   rtx saved_reg;
210   HOST_WIDE_INT cfa_offset;
211 };
212
213
214 static vec<queued_reg_save> queued_reg_saves;
215
216 /* True if any CFI directives were emitted at the current insn.  */
217 static bool any_cfis_emitted;
218
219 /* Short-hand for commonly used register numbers.  */
220 static unsigned dw_stack_pointer_regnum;
221 static unsigned dw_frame_pointer_regnum;
222 \f
223 /* Hook used by __throw.  */
224
225 rtx
226 expand_builtin_dwarf_sp_column (void)
227 {
228   unsigned int dwarf_regnum = DWARF_FRAME_REGNUM (STACK_POINTER_REGNUM);
229   return GEN_INT (DWARF2_FRAME_REG_OUT (dwarf_regnum, 1));
230 }
231
232 /* MEM is a memory reference for the register size table, each element of
233    which has mode MODE.  Initialize column C as a return address column.  */
234
235 static void
236 init_return_column_size (machine_mode mode, rtx mem, unsigned int c)
237 {
238   HOST_WIDE_INT offset = c * GET_MODE_SIZE (mode);
239   HOST_WIDE_INT size = GET_MODE_SIZE (Pmode);
240   emit_move_insn (adjust_address (mem, mode, offset),
241                   gen_int_mode (size, mode));
242 }
243
244 /* Datastructure used by expand_builtin_init_dwarf_reg_sizes and
245    init_one_dwarf_reg_size to communicate on what has been done by the
246    latter.  */
247
248 struct init_one_dwarf_reg_state
249 {
250   /* Whether the dwarf return column was initialized.  */
251   bool wrote_return_column;
252
253   /* For each hard register REGNO, whether init_one_dwarf_reg_size
254      was given REGNO to process already.  */
255   bool processed_regno [FIRST_PSEUDO_REGISTER];
256
257 };
258
259 /* Helper for expand_builtin_init_dwarf_reg_sizes.  Generate code to
260    initialize the dwarf register size table entry corresponding to register
261    REGNO in REGMODE.  TABLE is the table base address, SLOTMODE is the mode to
262    use for the size entry to initialize, and INIT_STATE is the communication
263    datastructure conveying what we're doing to our caller.  */
264
265 static
266 void init_one_dwarf_reg_size (int regno, machine_mode regmode,
267                               rtx table, machine_mode slotmode,
268                               init_one_dwarf_reg_state *init_state)
269 {
270   const unsigned int dnum = DWARF_FRAME_REGNUM (regno);
271   const unsigned int rnum = DWARF2_FRAME_REG_OUT (dnum, 1);
272   const unsigned int dcol = DWARF_REG_TO_UNWIND_COLUMN (rnum);
273   
274   const HOST_WIDE_INT slotoffset = dcol * GET_MODE_SIZE (slotmode);
275   const HOST_WIDE_INT regsize = GET_MODE_SIZE (regmode);
276
277   init_state->processed_regno[regno] = true;
278
279   if (rnum >= DWARF_FRAME_REGISTERS)
280     return;
281
282   if (dnum == DWARF_FRAME_RETURN_COLUMN)
283     {
284       if (regmode == VOIDmode)
285         return;
286       init_state->wrote_return_column = true;
287     }
288
289   if (slotoffset < 0)
290     return;
291
292   emit_move_insn (adjust_address (table, slotmode, slotoffset),
293                   gen_int_mode (regsize, slotmode));
294 }
295
296 /* Generate code to initialize the dwarf register size table located
297    at the provided ADDRESS.  */
298
299 void
300 expand_builtin_init_dwarf_reg_sizes (tree address)
301 {
302   unsigned int i;
303   machine_mode mode = TYPE_MODE (char_type_node);
304   rtx addr = expand_normal (address);
305   rtx mem = gen_rtx_MEM (BLKmode, addr);
306
307   init_one_dwarf_reg_state init_state;
308
309   memset ((char *)&init_state, 0, sizeof (init_state));
310
311   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
312     {
313       machine_mode save_mode;
314       rtx span;
315
316       /* No point in processing a register multiple times.  This could happen
317          with register spans, e.g. when a reg is first processed as a piece of
318          a span, then as a register on its own later on.  */
319
320       if (init_state.processed_regno[i])
321         continue;
322
323       save_mode = targetm.dwarf_frame_reg_mode (i);
324       span = targetm.dwarf_register_span (gen_rtx_REG (save_mode, i));
325
326       if (!span)
327         init_one_dwarf_reg_size (i, save_mode, mem, mode, &init_state);
328       else
329         {
330           for (int si = 0; si < XVECLEN (span, 0); si++)
331             {
332               rtx reg = XVECEXP (span, 0, si);
333
334               init_one_dwarf_reg_size
335                 (REGNO (reg), GET_MODE (reg), mem, mode, &init_state);
336             }
337         }
338     }
339
340   if (!init_state.wrote_return_column)
341     init_return_column_size (mode, mem, DWARF_FRAME_RETURN_COLUMN);
342
343 #ifdef DWARF_ALT_FRAME_RETURN_COLUMN
344   init_return_column_size (mode, mem, DWARF_ALT_FRAME_RETURN_COLUMN);
345 #endif
346
347   targetm.init_dwarf_reg_sizes_extra (address);
348 }
349
350 \f
351 static dw_trace_info *
352 get_trace_info (rtx_insn *insn)
353 {
354   dw_trace_info dummy;
355   dummy.head = insn;
356   return trace_index->find_with_hash (&dummy, INSN_UID (insn));
357 }
358
359 static bool
360 save_point_p (rtx_insn *insn)
361 {
362   /* Labels, except those that are really jump tables.  */
363   if (LABEL_P (insn))
364     return inside_basic_block_p (insn);
365
366   /* We split traces at the prologue/epilogue notes because those
367      are points at which the unwind info is usually stable.  This
368      makes it easier to find spots with identical unwind info so
369      that we can use remember/restore_state opcodes.  */
370   if (NOTE_P (insn))
371     switch (NOTE_KIND (insn))
372       {
373       case NOTE_INSN_PROLOGUE_END:
374       case NOTE_INSN_EPILOGUE_BEG:
375         return true;
376       }
377
378   return false;
379 }
380
381 /* Divide OFF by DWARF_CIE_DATA_ALIGNMENT, asserting no remainder.  */
382
383 static inline HOST_WIDE_INT
384 div_data_align (HOST_WIDE_INT off)
385 {
386   HOST_WIDE_INT r = off / DWARF_CIE_DATA_ALIGNMENT;
387   gcc_assert (r * DWARF_CIE_DATA_ALIGNMENT == off);
388   return r;
389 }
390
391 /* Return true if we need a signed version of a given opcode
392    (e.g. DW_CFA_offset_extended_sf vs DW_CFA_offset_extended).  */
393
394 static inline bool
395 need_data_align_sf_opcode (HOST_WIDE_INT off)
396 {
397   return DWARF_CIE_DATA_ALIGNMENT < 0 ? off > 0 : off < 0;
398 }
399
400 /* Return a pointer to a newly allocated Call Frame Instruction.  */
401
402 static inline dw_cfi_ref
403 new_cfi (void)
404 {
405   dw_cfi_ref cfi = ggc_alloc<dw_cfi_node> ();
406
407   cfi->dw_cfi_oprnd1.dw_cfi_reg_num = 0;
408   cfi->dw_cfi_oprnd2.dw_cfi_reg_num = 0;
409
410   return cfi;
411 }
412
413 /* Return a newly allocated CFI row, with no defined data.  */
414
415 static dw_cfi_row *
416 new_cfi_row (void)
417 {
418   dw_cfi_row *row = ggc_cleared_alloc<dw_cfi_row> ();
419
420   row->cfa.reg = INVALID_REGNUM;
421
422   return row;
423 }
424
425 /* Return a copy of an existing CFI row.  */
426
427 static dw_cfi_row *
428 copy_cfi_row (dw_cfi_row *src)
429 {
430   dw_cfi_row *dst = ggc_alloc<dw_cfi_row> ();
431
432   *dst = *src;
433   dst->reg_save = vec_safe_copy (src->reg_save);
434
435   return dst;
436 }
437
438 /* Generate a new label for the CFI info to refer to.  */
439
440 static char *
441 dwarf2out_cfi_label (void)
442 {
443   int num = dwarf2out_cfi_label_num++;
444   char label[20];
445
446   ASM_GENERATE_INTERNAL_LABEL (label, "LCFI", num);
447
448   return xstrdup (label);
449 }
450
451 /* Add CFI either to the current insn stream or to a vector, or both.  */
452
453 static void
454 add_cfi (dw_cfi_ref cfi)
455 {
456   any_cfis_emitted = true;
457
458   if (add_cfi_insn != NULL)
459     {
460       add_cfi_insn = emit_note_after (NOTE_INSN_CFI, add_cfi_insn);
461       NOTE_CFI (add_cfi_insn) = cfi;
462     }
463
464   if (add_cfi_vec != NULL)
465     vec_safe_push (*add_cfi_vec, cfi);
466 }
467
468 static void
469 add_cfi_args_size (HOST_WIDE_INT size)
470 {
471   dw_cfi_ref cfi = new_cfi ();
472
473   /* While we can occasionally have args_size < 0 internally, this state
474      should not persist at a point we actually need an opcode.  */
475   gcc_assert (size >= 0);
476
477   cfi->dw_cfi_opc = DW_CFA_GNU_args_size;
478   cfi->dw_cfi_oprnd1.dw_cfi_offset = size;
479
480   add_cfi (cfi);
481 }
482
483 static void
484 add_cfi_restore (unsigned reg)
485 {
486   dw_cfi_ref cfi = new_cfi ();
487
488   cfi->dw_cfi_opc = (reg & ~0x3f ? DW_CFA_restore_extended : DW_CFA_restore);
489   cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg;
490
491   add_cfi (cfi);
492 }
493
494 /* Perform ROW->REG_SAVE[COLUMN] = CFI.  CFI may be null, indicating
495    that the register column is no longer saved.  */
496
497 static void
498 update_row_reg_save (dw_cfi_row *row, unsigned column, dw_cfi_ref cfi)
499 {
500   if (vec_safe_length (row->reg_save) <= column)
501     vec_safe_grow_cleared (row->reg_save, column + 1);
502   (*row->reg_save)[column] = cfi;
503 }
504
505 /* This function fills in aa dw_cfa_location structure from a dwarf location
506    descriptor sequence.  */
507
508 static void
509 get_cfa_from_loc_descr (dw_cfa_location *cfa, struct dw_loc_descr_node *loc)
510 {
511   struct dw_loc_descr_node *ptr;
512   cfa->offset = 0;
513   cfa->base_offset = 0;
514   cfa->indirect = 0;
515   cfa->reg = -1;
516
517   for (ptr = loc; ptr != NULL; ptr = ptr->dw_loc_next)
518     {
519       enum dwarf_location_atom op = ptr->dw_loc_opc;
520
521       switch (op)
522         {
523         case DW_OP_reg0:
524         case DW_OP_reg1:
525         case DW_OP_reg2:
526         case DW_OP_reg3:
527         case DW_OP_reg4:
528         case DW_OP_reg5:
529         case DW_OP_reg6:
530         case DW_OP_reg7:
531         case DW_OP_reg8:
532         case DW_OP_reg9:
533         case DW_OP_reg10:
534         case DW_OP_reg11:
535         case DW_OP_reg12:
536         case DW_OP_reg13:
537         case DW_OP_reg14:
538         case DW_OP_reg15:
539         case DW_OP_reg16:
540         case DW_OP_reg17:
541         case DW_OP_reg18:
542         case DW_OP_reg19:
543         case DW_OP_reg20:
544         case DW_OP_reg21:
545         case DW_OP_reg22:
546         case DW_OP_reg23:
547         case DW_OP_reg24:
548         case DW_OP_reg25:
549         case DW_OP_reg26:
550         case DW_OP_reg27:
551         case DW_OP_reg28:
552         case DW_OP_reg29:
553         case DW_OP_reg30:
554         case DW_OP_reg31:
555           cfa->reg = op - DW_OP_reg0;
556           break;
557         case DW_OP_regx:
558           cfa->reg = ptr->dw_loc_oprnd1.v.val_int;
559           break;
560         case DW_OP_breg0:
561         case DW_OP_breg1:
562         case DW_OP_breg2:
563         case DW_OP_breg3:
564         case DW_OP_breg4:
565         case DW_OP_breg5:
566         case DW_OP_breg6:
567         case DW_OP_breg7:
568         case DW_OP_breg8:
569         case DW_OP_breg9:
570         case DW_OP_breg10:
571         case DW_OP_breg11:
572         case DW_OP_breg12:
573         case DW_OP_breg13:
574         case DW_OP_breg14:
575         case DW_OP_breg15:
576         case DW_OP_breg16:
577         case DW_OP_breg17:
578         case DW_OP_breg18:
579         case DW_OP_breg19:
580         case DW_OP_breg20:
581         case DW_OP_breg21:
582         case DW_OP_breg22:
583         case DW_OP_breg23:
584         case DW_OP_breg24:
585         case DW_OP_breg25:
586         case DW_OP_breg26:
587         case DW_OP_breg27:
588         case DW_OP_breg28:
589         case DW_OP_breg29:
590         case DW_OP_breg30:
591         case DW_OP_breg31:
592           cfa->reg = op - DW_OP_breg0;
593           cfa->base_offset = ptr->dw_loc_oprnd1.v.val_int;
594           break;
595         case DW_OP_bregx:
596           cfa->reg = ptr->dw_loc_oprnd1.v.val_int;
597           cfa->base_offset = ptr->dw_loc_oprnd2.v.val_int;
598           break;
599         case DW_OP_deref:
600           cfa->indirect = 1;
601           break;
602         case DW_OP_plus_uconst:
603           cfa->offset = ptr->dw_loc_oprnd1.v.val_unsigned;
604           break;
605         default:
606           gcc_unreachable ();
607         }
608     }
609 }
610
611 /* Find the previous value for the CFA, iteratively.  CFI is the opcode
612    to interpret, *LOC will be updated as necessary, *REMEMBER is used for
613    one level of remember/restore state processing.  */
614
615 void
616 lookup_cfa_1 (dw_cfi_ref cfi, dw_cfa_location *loc, dw_cfa_location *remember)
617 {
618   switch (cfi->dw_cfi_opc)
619     {
620     case DW_CFA_def_cfa_offset:
621     case DW_CFA_def_cfa_offset_sf:
622       loc->offset = cfi->dw_cfi_oprnd1.dw_cfi_offset;
623       break;
624     case DW_CFA_def_cfa_register:
625       loc->reg = cfi->dw_cfi_oprnd1.dw_cfi_reg_num;
626       break;
627     case DW_CFA_def_cfa:
628     case DW_CFA_def_cfa_sf:
629       loc->reg = cfi->dw_cfi_oprnd1.dw_cfi_reg_num;
630       loc->offset = cfi->dw_cfi_oprnd2.dw_cfi_offset;
631       break;
632     case DW_CFA_def_cfa_expression:
633       get_cfa_from_loc_descr (loc, cfi->dw_cfi_oprnd1.dw_cfi_loc);
634       break;
635
636     case DW_CFA_remember_state:
637       gcc_assert (!remember->in_use);
638       *remember = *loc;
639       remember->in_use = 1;
640       break;
641     case DW_CFA_restore_state:
642       gcc_assert (remember->in_use);
643       *loc = *remember;
644       remember->in_use = 0;
645       break;
646
647     default:
648       break;
649     }
650 }
651
652 /* Determine if two dw_cfa_location structures define the same data.  */
653
654 bool
655 cfa_equal_p (const dw_cfa_location *loc1, const dw_cfa_location *loc2)
656 {
657   return (loc1->reg == loc2->reg
658           && loc1->offset == loc2->offset
659           && loc1->indirect == loc2->indirect
660           && (loc1->indirect == 0
661               || loc1->base_offset == loc2->base_offset));
662 }
663
664 /* Determine if two CFI operands are identical.  */
665
666 static bool
667 cfi_oprnd_equal_p (enum dw_cfi_oprnd_type t, dw_cfi_oprnd *a, dw_cfi_oprnd *b)
668 {
669   switch (t)
670     {
671     case dw_cfi_oprnd_unused:
672       return true;
673     case dw_cfi_oprnd_reg_num:
674       return a->dw_cfi_reg_num == b->dw_cfi_reg_num;
675     case dw_cfi_oprnd_offset:
676       return a->dw_cfi_offset == b->dw_cfi_offset;
677     case dw_cfi_oprnd_addr:
678       return (a->dw_cfi_addr == b->dw_cfi_addr
679               || strcmp (a->dw_cfi_addr, b->dw_cfi_addr) == 0);
680     case dw_cfi_oprnd_loc:
681       return loc_descr_equal_p (a->dw_cfi_loc, b->dw_cfi_loc);
682     }
683   gcc_unreachable ();
684 }
685
686 /* Determine if two CFI entries are identical.  */
687
688 static bool
689 cfi_equal_p (dw_cfi_ref a, dw_cfi_ref b)
690 {
691   enum dwarf_call_frame_info opc;
692
693   /* Make things easier for our callers, including missing operands.  */
694   if (a == b)
695     return true;
696   if (a == NULL || b == NULL)
697     return false;
698
699   /* Obviously, the opcodes must match.  */
700   opc = a->dw_cfi_opc;
701   if (opc != b->dw_cfi_opc)
702     return false;
703
704   /* Compare the two operands, re-using the type of the operands as
705      already exposed elsewhere.  */
706   return (cfi_oprnd_equal_p (dw_cfi_oprnd1_desc (opc),
707                              &a->dw_cfi_oprnd1, &b->dw_cfi_oprnd1)
708           && cfi_oprnd_equal_p (dw_cfi_oprnd2_desc (opc),
709                                 &a->dw_cfi_oprnd2, &b->dw_cfi_oprnd2));
710 }
711
712 /* Determine if two CFI_ROW structures are identical.  */
713
714 static bool
715 cfi_row_equal_p (dw_cfi_row *a, dw_cfi_row *b)
716 {
717   size_t i, n_a, n_b, n_max;
718
719   if (a->cfa_cfi)
720     {
721       if (!cfi_equal_p (a->cfa_cfi, b->cfa_cfi))
722         return false;
723     }
724   else if (!cfa_equal_p (&a->cfa, &b->cfa))
725     return false;
726
727   n_a = vec_safe_length (a->reg_save);
728   n_b = vec_safe_length (b->reg_save);
729   n_max = MAX (n_a, n_b);
730
731   for (i = 0; i < n_max; ++i)
732     {
733       dw_cfi_ref r_a = NULL, r_b = NULL;
734
735       if (i < n_a)
736         r_a = (*a->reg_save)[i];
737       if (i < n_b)
738         r_b = (*b->reg_save)[i];
739
740       if (!cfi_equal_p (r_a, r_b))
741         return false;
742     }
743
744   return true;
745 }
746
747 /* The CFA is now calculated from NEW_CFA.  Consider OLD_CFA in determining
748    what opcode to emit.  Returns the CFI opcode to effect the change, or
749    NULL if NEW_CFA == OLD_CFA.  */
750
751 static dw_cfi_ref
752 def_cfa_0 (dw_cfa_location *old_cfa, dw_cfa_location *new_cfa)
753 {
754   dw_cfi_ref cfi;
755
756   /* If nothing changed, no need to issue any call frame instructions.  */
757   if (cfa_equal_p (old_cfa, new_cfa))
758     return NULL;
759
760   cfi = new_cfi ();
761
762   if (new_cfa->reg == old_cfa->reg && !new_cfa->indirect && !old_cfa->indirect)
763     {
764       /* Construct a "DW_CFA_def_cfa_offset <offset>" instruction, indicating
765          the CFA register did not change but the offset did.  The data
766          factoring for DW_CFA_def_cfa_offset_sf happens in output_cfi, or
767          in the assembler via the .cfi_def_cfa_offset directive.  */
768       if (new_cfa->offset < 0)
769         cfi->dw_cfi_opc = DW_CFA_def_cfa_offset_sf;
770       else
771         cfi->dw_cfi_opc = DW_CFA_def_cfa_offset;
772       cfi->dw_cfi_oprnd1.dw_cfi_offset = new_cfa->offset;
773     }
774   else if (new_cfa->offset == old_cfa->offset
775            && old_cfa->reg != INVALID_REGNUM
776            && !new_cfa->indirect
777            && !old_cfa->indirect)
778     {
779       /* Construct a "DW_CFA_def_cfa_register <register>" instruction,
780          indicating the CFA register has changed to <register> but the
781          offset has not changed.  */
782       cfi->dw_cfi_opc = DW_CFA_def_cfa_register;
783       cfi->dw_cfi_oprnd1.dw_cfi_reg_num = new_cfa->reg;
784     }
785   else if (new_cfa->indirect == 0)
786     {
787       /* Construct a "DW_CFA_def_cfa <register> <offset>" instruction,
788          indicating the CFA register has changed to <register> with
789          the specified offset.  The data factoring for DW_CFA_def_cfa_sf
790          happens in output_cfi, or in the assembler via the .cfi_def_cfa
791          directive.  */
792       if (new_cfa->offset < 0)
793         cfi->dw_cfi_opc = DW_CFA_def_cfa_sf;
794       else
795         cfi->dw_cfi_opc = DW_CFA_def_cfa;
796       cfi->dw_cfi_oprnd1.dw_cfi_reg_num = new_cfa->reg;
797       cfi->dw_cfi_oprnd2.dw_cfi_offset = new_cfa->offset;
798     }
799   else
800     {
801       /* Construct a DW_CFA_def_cfa_expression instruction to
802          calculate the CFA using a full location expression since no
803          register-offset pair is available.  */
804       struct dw_loc_descr_node *loc_list;
805
806       cfi->dw_cfi_opc = DW_CFA_def_cfa_expression;
807       loc_list = build_cfa_loc (new_cfa, 0);
808       cfi->dw_cfi_oprnd1.dw_cfi_loc = loc_list;
809     }
810
811   return cfi;
812 }
813
814 /* Similarly, but take OLD_CFA from CUR_ROW, and update it after the fact.  */
815
816 static void
817 def_cfa_1 (dw_cfa_location *new_cfa)
818 {
819   dw_cfi_ref cfi;
820
821   if (cur_trace->cfa_store.reg == new_cfa->reg && new_cfa->indirect == 0)
822     cur_trace->cfa_store.offset = new_cfa->offset;
823
824   cfi = def_cfa_0 (&cur_row->cfa, new_cfa);
825   if (cfi)
826     {
827       cur_row->cfa = *new_cfa;
828       cur_row->cfa_cfi = (cfi->dw_cfi_opc == DW_CFA_def_cfa_expression
829                           ? cfi : NULL);
830
831       add_cfi (cfi);
832     }
833 }
834
835 /* Add the CFI for saving a register.  REG is the CFA column number.
836    If SREG is -1, the register is saved at OFFSET from the CFA;
837    otherwise it is saved in SREG.  */
838
839 static void
840 reg_save (unsigned int reg, unsigned int sreg, HOST_WIDE_INT offset)
841 {
842   dw_fde_ref fde = cfun ? cfun->fde : NULL;
843   dw_cfi_ref cfi = new_cfi ();
844
845   cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg;
846
847   /* When stack is aligned, store REG using DW_CFA_expression with FP.  */
848   if (fde
849       && fde->stack_realign
850       && sreg == INVALID_REGNUM)
851     {
852       cfi->dw_cfi_opc = DW_CFA_expression;
853       cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg;
854       cfi->dw_cfi_oprnd2.dw_cfi_loc
855         = build_cfa_aligned_loc (&cur_row->cfa, offset,
856                                  fde->stack_realignment);
857     }
858   else if (sreg == INVALID_REGNUM)
859     {
860       if (need_data_align_sf_opcode (offset))
861         cfi->dw_cfi_opc = DW_CFA_offset_extended_sf;
862       else if (reg & ~0x3f)
863         cfi->dw_cfi_opc = DW_CFA_offset_extended;
864       else
865         cfi->dw_cfi_opc = DW_CFA_offset;
866       cfi->dw_cfi_oprnd2.dw_cfi_offset = offset;
867     }
868   else if (sreg == reg)
869     {
870       /* While we could emit something like DW_CFA_same_value or
871          DW_CFA_restore, we never expect to see something like that
872          in a prologue.  This is more likely to be a bug.  A backend
873          can always bypass this by using REG_CFA_RESTORE directly.  */
874       gcc_unreachable ();
875     }
876   else
877     {
878       cfi->dw_cfi_opc = DW_CFA_register;
879       cfi->dw_cfi_oprnd2.dw_cfi_reg_num = sreg;
880     }
881
882   add_cfi (cfi);
883   update_row_reg_save (cur_row, reg, cfi);
884 }
885
886 /* A subroutine of scan_trace.  Check INSN for a REG_ARGS_SIZE note
887    and adjust data structures to match.  */
888
889 static void
890 notice_args_size (rtx_insn *insn)
891 {
892   HOST_WIDE_INT args_size, delta;
893   rtx note;
894
895   note = find_reg_note (insn, REG_ARGS_SIZE, NULL);
896   if (note == NULL)
897     return;
898
899   args_size = INTVAL (XEXP (note, 0));
900   delta = args_size - cur_trace->end_true_args_size;
901   if (delta == 0)
902     return;
903
904   cur_trace->end_true_args_size = args_size;
905
906   /* If the CFA is computed off the stack pointer, then we must adjust
907      the computation of the CFA as well.  */
908   if (cur_cfa->reg == dw_stack_pointer_regnum)
909     {
910       gcc_assert (!cur_cfa->indirect);
911
912       /* Convert a change in args_size (always a positive in the
913          direction of stack growth) to a change in stack pointer.  */
914       if (!STACK_GROWS_DOWNWARD)
915         delta = -delta;
916
917       cur_cfa->offset += delta;
918     }
919 }
920
921 /* A subroutine of scan_trace.  INSN is can_throw_internal.  Update the
922    data within the trace related to EH insns and args_size.  */
923
924 static void
925 notice_eh_throw (rtx_insn *insn)
926 {
927   HOST_WIDE_INT args_size;
928
929   args_size = cur_trace->end_true_args_size;
930   if (cur_trace->eh_head == NULL)
931     {
932       cur_trace->eh_head = insn;
933       cur_trace->beg_delay_args_size = args_size;
934       cur_trace->end_delay_args_size = args_size;
935     }
936   else if (cur_trace->end_delay_args_size != args_size)
937     {
938       cur_trace->end_delay_args_size = args_size;
939
940       /* ??? If the CFA is the stack pointer, search backward for the last
941          CFI note and insert there.  Given that the stack changed for the
942          args_size change, there *must* be such a note in between here and
943          the last eh insn.  */
944       add_cfi_args_size (args_size);
945     }
946 }
947
948 /* Short-hand inline for the very common D_F_R (REGNO (x)) operation.  */
949 /* ??? This ought to go into dwarf2out.h, except that dwarf2out.h is
950    used in places where rtl is prohibited.  */
951
952 static inline unsigned
953 dwf_regno (const_rtx reg)
954 {
955   gcc_assert (REGNO (reg) < FIRST_PSEUDO_REGISTER);
956   return DWARF_FRAME_REGNUM (REGNO (reg));
957 }
958
959 /* Compare X and Y for equivalence.  The inputs may be REGs or PC_RTX.  */
960
961 static bool
962 compare_reg_or_pc (rtx x, rtx y)
963 {
964   if (REG_P (x) && REG_P (y))
965     return REGNO (x) == REGNO (y);
966   return x == y;
967 }
968
969 /* Record SRC as being saved in DEST.  DEST may be null to delete an
970    existing entry.  SRC may be a register or PC_RTX.  */
971
972 static void
973 record_reg_saved_in_reg (rtx dest, rtx src)
974 {
975   reg_saved_in_data *elt;
976   size_t i;
977
978   FOR_EACH_VEC_ELT (cur_trace->regs_saved_in_regs, i, elt)
979     if (compare_reg_or_pc (elt->orig_reg, src))
980       {
981         if (dest == NULL)
982           cur_trace->regs_saved_in_regs.unordered_remove (i);
983         else
984           elt->saved_in_reg = dest;
985         return;
986       }
987
988   if (dest == NULL)
989     return;
990
991   reg_saved_in_data e = {src, dest};
992   cur_trace->regs_saved_in_regs.safe_push (e);
993 }
994
995 /* Add an entry to QUEUED_REG_SAVES saying that REG is now saved at
996    SREG, or if SREG is NULL then it is saved at OFFSET to the CFA.  */
997
998 static void
999 queue_reg_save (rtx reg, rtx sreg, HOST_WIDE_INT offset)
1000 {
1001   queued_reg_save *q;
1002   queued_reg_save e = {reg, sreg, offset};
1003   size_t i;
1004
1005   /* Duplicates waste space, but it's also necessary to remove them
1006      for correctness, since the queue gets output in reverse order.  */
1007   FOR_EACH_VEC_ELT (queued_reg_saves, i, q)
1008     if (compare_reg_or_pc (q->reg, reg))
1009       {
1010         *q = e;
1011         return;
1012       }
1013
1014   queued_reg_saves.safe_push (e);
1015 }
1016
1017 /* Output all the entries in QUEUED_REG_SAVES.  */
1018
1019 static void
1020 dwarf2out_flush_queued_reg_saves (void)
1021 {
1022   queued_reg_save *q;
1023   size_t i;
1024
1025   FOR_EACH_VEC_ELT (queued_reg_saves, i, q)
1026     {
1027       unsigned int reg, sreg;
1028
1029       record_reg_saved_in_reg (q->saved_reg, q->reg);
1030
1031       if (q->reg == pc_rtx)
1032         reg = DWARF_FRAME_RETURN_COLUMN;
1033       else
1034         reg = dwf_regno (q->reg);
1035       if (q->saved_reg)
1036         sreg = dwf_regno (q->saved_reg);
1037       else
1038         sreg = INVALID_REGNUM;
1039       reg_save (reg, sreg, q->cfa_offset);
1040     }
1041
1042   queued_reg_saves.truncate (0);
1043 }
1044
1045 /* Does INSN clobber any register which QUEUED_REG_SAVES lists a saved
1046    location for?  Or, does it clobber a register which we've previously
1047    said that some other register is saved in, and for which we now
1048    have a new location for?  */
1049
1050 static bool
1051 clobbers_queued_reg_save (const_rtx insn)
1052 {
1053   queued_reg_save *q;
1054   size_t iq;
1055
1056   FOR_EACH_VEC_ELT (queued_reg_saves, iq, q)
1057     {
1058       size_t ir;
1059       reg_saved_in_data *rir;
1060
1061       if (modified_in_p (q->reg, insn))
1062         return true;
1063
1064       FOR_EACH_VEC_ELT (cur_trace->regs_saved_in_regs, ir, rir)
1065         if (compare_reg_or_pc (q->reg, rir->orig_reg)
1066             && modified_in_p (rir->saved_in_reg, insn))
1067           return true;
1068     }
1069
1070   return false;
1071 }
1072
1073 /* What register, if any, is currently saved in REG?  */
1074
1075 static rtx
1076 reg_saved_in (rtx reg)
1077 {
1078   unsigned int regn = REGNO (reg);
1079   queued_reg_save *q;
1080   reg_saved_in_data *rir;
1081   size_t i;
1082
1083   FOR_EACH_VEC_ELT (queued_reg_saves, i, q)
1084     if (q->saved_reg && regn == REGNO (q->saved_reg))
1085       return q->reg;
1086
1087   FOR_EACH_VEC_ELT (cur_trace->regs_saved_in_regs, i, rir)
1088     if (regn == REGNO (rir->saved_in_reg))
1089       return rir->orig_reg;
1090
1091   return NULL_RTX;
1092 }
1093
1094 /* A subroutine of dwarf2out_frame_debug, process a REG_DEF_CFA note.  */
1095
1096 static void
1097 dwarf2out_frame_debug_def_cfa (rtx pat)
1098 {
1099   memset (cur_cfa, 0, sizeof (*cur_cfa));
1100
1101   if (GET_CODE (pat) == PLUS)
1102     {
1103       cur_cfa->offset = INTVAL (XEXP (pat, 1));
1104       pat = XEXP (pat, 0);
1105     }
1106   if (MEM_P (pat))
1107     {
1108       cur_cfa->indirect = 1;
1109       pat = XEXP (pat, 0);
1110       if (GET_CODE (pat) == PLUS)
1111         {
1112           cur_cfa->base_offset = INTVAL (XEXP (pat, 1));
1113           pat = XEXP (pat, 0);
1114         }
1115     }
1116   /* ??? If this fails, we could be calling into the _loc functions to
1117      define a full expression.  So far no port does that.  */
1118   gcc_assert (REG_P (pat));
1119   cur_cfa->reg = dwf_regno (pat);
1120 }
1121
1122 /* A subroutine of dwarf2out_frame_debug, process a REG_ADJUST_CFA note.  */
1123
1124 static void
1125 dwarf2out_frame_debug_adjust_cfa (rtx pat)
1126 {
1127   rtx src, dest;
1128
1129   gcc_assert (GET_CODE (pat) == SET);
1130   dest = XEXP (pat, 0);
1131   src = XEXP (pat, 1);
1132
1133   switch (GET_CODE (src))
1134     {
1135     case PLUS:
1136       gcc_assert (dwf_regno (XEXP (src, 0)) == cur_cfa->reg);
1137       cur_cfa->offset -= INTVAL (XEXP (src, 1));
1138       break;
1139
1140     case REG:
1141       break;
1142
1143     default:
1144       gcc_unreachable ();
1145     }
1146
1147   cur_cfa->reg = dwf_regno (dest);
1148   gcc_assert (cur_cfa->indirect == 0);
1149 }
1150
1151 /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_OFFSET note.  */
1152
1153 static void
1154 dwarf2out_frame_debug_cfa_offset (rtx set)
1155 {
1156   HOST_WIDE_INT offset;
1157   rtx src, addr, span;
1158   unsigned int sregno;
1159
1160   src = XEXP (set, 1);
1161   addr = XEXP (set, 0);
1162   gcc_assert (MEM_P (addr));
1163   addr = XEXP (addr, 0);
1164
1165   /* As documented, only consider extremely simple addresses.  */
1166   switch (GET_CODE (addr))
1167     {
1168     case REG:
1169       gcc_assert (dwf_regno (addr) == cur_cfa->reg);
1170       offset = -cur_cfa->offset;
1171       break;
1172     case PLUS:
1173       gcc_assert (dwf_regno (XEXP (addr, 0)) == cur_cfa->reg);
1174       offset = INTVAL (XEXP (addr, 1)) - cur_cfa->offset;
1175       break;
1176     default:
1177       gcc_unreachable ();
1178     }
1179
1180   if (src == pc_rtx)
1181     {
1182       span = NULL;
1183       sregno = DWARF_FRAME_RETURN_COLUMN;
1184     }
1185   else
1186     {
1187       span = targetm.dwarf_register_span (src);
1188       sregno = dwf_regno (src);
1189     }
1190
1191   /* ??? We'd like to use queue_reg_save, but we need to come up with
1192      a different flushing heuristic for epilogues.  */
1193   if (!span)
1194     reg_save (sregno, INVALID_REGNUM, offset);
1195   else
1196     {
1197       /* We have a PARALLEL describing where the contents of SRC live.
1198          Adjust the offset for each piece of the PARALLEL.  */
1199       HOST_WIDE_INT span_offset = offset;
1200
1201       gcc_assert (GET_CODE (span) == PARALLEL);
1202
1203       const int par_len = XVECLEN (span, 0);
1204       for (int par_index = 0; par_index < par_len; par_index++)
1205         {
1206           rtx elem = XVECEXP (span, 0, par_index);
1207           sregno = dwf_regno (src);
1208           reg_save (sregno, INVALID_REGNUM, span_offset);
1209           span_offset += GET_MODE_SIZE (GET_MODE (elem));
1210         }
1211     }
1212 }
1213
1214 /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_REGISTER note.  */
1215
1216 static void
1217 dwarf2out_frame_debug_cfa_register (rtx set)
1218 {
1219   rtx src, dest;
1220   unsigned sregno, dregno;
1221
1222   src = XEXP (set, 1);
1223   dest = XEXP (set, 0);
1224
1225   record_reg_saved_in_reg (dest, src);
1226   if (src == pc_rtx)
1227     sregno = DWARF_FRAME_RETURN_COLUMN;
1228   else
1229     sregno = dwf_regno (src);
1230
1231   dregno = dwf_regno (dest);
1232
1233   /* ??? We'd like to use queue_reg_save, but we need to come up with
1234      a different flushing heuristic for epilogues.  */
1235   reg_save (sregno, dregno, 0);
1236 }
1237
1238 /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_EXPRESSION note. */
1239
1240 static void
1241 dwarf2out_frame_debug_cfa_expression (rtx set)
1242 {
1243   rtx src, dest, span;
1244   dw_cfi_ref cfi = new_cfi ();
1245   unsigned regno;
1246
1247   dest = SET_DEST (set);
1248   src = SET_SRC (set);
1249
1250   gcc_assert (REG_P (src));
1251   gcc_assert (MEM_P (dest));
1252
1253   span = targetm.dwarf_register_span (src);
1254   gcc_assert (!span);
1255
1256   regno = dwf_regno (src);
1257
1258   cfi->dw_cfi_opc = DW_CFA_expression;
1259   cfi->dw_cfi_oprnd1.dw_cfi_reg_num = regno;
1260   cfi->dw_cfi_oprnd2.dw_cfi_loc
1261     = mem_loc_descriptor (XEXP (dest, 0), get_address_mode (dest),
1262                           GET_MODE (dest), VAR_INIT_STATUS_INITIALIZED);
1263
1264   /* ??? We'd like to use queue_reg_save, were the interface different,
1265      and, as above, we could manage flushing for epilogues.  */
1266   add_cfi (cfi);
1267   update_row_reg_save (cur_row, regno, cfi);
1268 }
1269
1270 /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_RESTORE note.  */
1271
1272 static void
1273 dwarf2out_frame_debug_cfa_restore (rtx reg)
1274 {
1275   gcc_assert (REG_P (reg));
1276
1277   rtx span = targetm.dwarf_register_span (reg);
1278   if (!span)
1279     {
1280       unsigned int regno = dwf_regno (reg);
1281       add_cfi_restore (regno);
1282       update_row_reg_save (cur_row, regno, NULL);
1283     }
1284   else
1285     {
1286       /* We have a PARALLEL describing where the contents of REG live.
1287          Restore the register for each piece of the PARALLEL.  */
1288       gcc_assert (GET_CODE (span) == PARALLEL);
1289
1290       const int par_len = XVECLEN (span, 0);
1291       for (int par_index = 0; par_index < par_len; par_index++)
1292         {
1293           reg = XVECEXP (span, 0, par_index);
1294           gcc_assert (REG_P (reg));
1295           unsigned int regno = dwf_regno (reg);
1296           add_cfi_restore (regno);
1297           update_row_reg_save (cur_row, regno, NULL);
1298         }
1299     }
1300 }
1301
1302 /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_WINDOW_SAVE.
1303    ??? Perhaps we should note in the CIE where windows are saved (instead of
1304    assuming 0(cfa)) and what registers are in the window.  */
1305
1306 static void
1307 dwarf2out_frame_debug_cfa_window_save (void)
1308 {
1309   dw_cfi_ref cfi = new_cfi ();
1310
1311   cfi->dw_cfi_opc = DW_CFA_GNU_window_save;
1312   add_cfi (cfi);
1313 }
1314
1315 /* Record call frame debugging information for an expression EXPR,
1316    which either sets SP or FP (adjusting how we calculate the frame
1317    address) or saves a register to the stack or another register.
1318    LABEL indicates the address of EXPR.
1319
1320    This function encodes a state machine mapping rtxes to actions on
1321    cfa, cfa_store, and cfa_temp.reg.  We describe these rules so
1322    users need not read the source code.
1323
1324   The High-Level Picture
1325
1326   Changes in the register we use to calculate the CFA: Currently we
1327   assume that if you copy the CFA register into another register, we
1328   should take the other one as the new CFA register; this seems to
1329   work pretty well.  If it's wrong for some target, it's simple
1330   enough not to set RTX_FRAME_RELATED_P on the insn in question.
1331
1332   Changes in the register we use for saving registers to the stack:
1333   This is usually SP, but not always.  Again, we deduce that if you
1334   copy SP into another register (and SP is not the CFA register),
1335   then the new register is the one we will be using for register
1336   saves.  This also seems to work.
1337
1338   Register saves: There's not much guesswork about this one; if
1339   RTX_FRAME_RELATED_P is set on an insn which modifies memory, it's a
1340   register save, and the register used to calculate the destination
1341   had better be the one we think we're using for this purpose.
1342   It's also assumed that a copy from a call-saved register to another
1343   register is saving that register if RTX_FRAME_RELATED_P is set on
1344   that instruction.  If the copy is from a call-saved register to
1345   the *same* register, that means that the register is now the same
1346   value as in the caller.
1347
1348   Except: If the register being saved is the CFA register, and the
1349   offset is nonzero, we are saving the CFA, so we assume we have to
1350   use DW_CFA_def_cfa_expression.  If the offset is 0, we assume that
1351   the intent is to save the value of SP from the previous frame.
1352
1353   In addition, if a register has previously been saved to a different
1354   register,
1355
1356   Invariants / Summaries of Rules
1357
1358   cfa          current rule for calculating the CFA.  It usually
1359                consists of a register and an offset.  This is
1360                actually stored in *cur_cfa, but abbreviated
1361                for the purposes of this documentation.
1362   cfa_store    register used by prologue code to save things to the stack
1363                cfa_store.offset is the offset from the value of
1364                cfa_store.reg to the actual CFA
1365   cfa_temp     register holding an integral value.  cfa_temp.offset
1366                stores the value, which will be used to adjust the
1367                stack pointer.  cfa_temp is also used like cfa_store,
1368                to track stores to the stack via fp or a temp reg.
1369
1370   Rules  1- 4: Setting a register's value to cfa.reg or an expression
1371                with cfa.reg as the first operand changes the cfa.reg and its
1372                cfa.offset.  Rule 1 and 4 also set cfa_temp.reg and
1373                cfa_temp.offset.
1374
1375   Rules  6- 9: Set a non-cfa.reg register value to a constant or an
1376                expression yielding a constant.  This sets cfa_temp.reg
1377                and cfa_temp.offset.
1378
1379   Rule 5:      Create a new register cfa_store used to save items to the
1380                stack.
1381
1382   Rules 10-14: Save a register to the stack.  Define offset as the
1383                difference of the original location and cfa_store's
1384                location (or cfa_temp's location if cfa_temp is used).
1385
1386   Rules 16-20: If AND operation happens on sp in prologue, we assume
1387                stack is realigned.  We will use a group of DW_OP_XXX
1388                expressions to represent the location of the stored
1389                register instead of CFA+offset.
1390
1391   The Rules
1392
1393   "{a,b}" indicates a choice of a xor b.
1394   "<reg>:cfa.reg" indicates that <reg> must equal cfa.reg.
1395
1396   Rule 1:
1397   (set <reg1> <reg2>:cfa.reg)
1398   effects: cfa.reg = <reg1>
1399            cfa.offset unchanged
1400            cfa_temp.reg = <reg1>
1401            cfa_temp.offset = cfa.offset
1402
1403   Rule 2:
1404   (set sp ({minus,plus,losum} {sp,fp}:cfa.reg
1405                               {<const_int>,<reg>:cfa_temp.reg}))
1406   effects: cfa.reg = sp if fp used
1407            cfa.offset += {+/- <const_int>, cfa_temp.offset} if cfa.reg==sp
1408            cfa_store.offset += {+/- <const_int>, cfa_temp.offset}
1409              if cfa_store.reg==sp
1410
1411   Rule 3:
1412   (set fp ({minus,plus,losum} <reg>:cfa.reg <const_int>))
1413   effects: cfa.reg = fp
1414            cfa_offset += +/- <const_int>
1415
1416   Rule 4:
1417   (set <reg1> ({plus,losum} <reg2>:cfa.reg <const_int>))
1418   constraints: <reg1> != fp
1419                <reg1> != sp
1420   effects: cfa.reg = <reg1>
1421            cfa_temp.reg = <reg1>
1422            cfa_temp.offset = cfa.offset
1423
1424   Rule 5:
1425   (set <reg1> (plus <reg2>:cfa_temp.reg sp:cfa.reg))
1426   constraints: <reg1> != fp
1427                <reg1> != sp
1428   effects: cfa_store.reg = <reg1>
1429            cfa_store.offset = cfa.offset - cfa_temp.offset
1430
1431   Rule 6:
1432   (set <reg> <const_int>)
1433   effects: cfa_temp.reg = <reg>
1434            cfa_temp.offset = <const_int>
1435
1436   Rule 7:
1437   (set <reg1>:cfa_temp.reg (ior <reg2>:cfa_temp.reg <const_int>))
1438   effects: cfa_temp.reg = <reg1>
1439            cfa_temp.offset |= <const_int>
1440
1441   Rule 8:
1442   (set <reg> (high <exp>))
1443   effects: none
1444
1445   Rule 9:
1446   (set <reg> (lo_sum <exp> <const_int>))
1447   effects: cfa_temp.reg = <reg>
1448            cfa_temp.offset = <const_int>
1449
1450   Rule 10:
1451   (set (mem ({pre,post}_modify sp:cfa_store (???? <reg1> <const_int>))) <reg2>)
1452   effects: cfa_store.offset -= <const_int>
1453            cfa.offset = cfa_store.offset if cfa.reg == sp
1454            cfa.reg = sp
1455            cfa.base_offset = -cfa_store.offset
1456
1457   Rule 11:
1458   (set (mem ({pre_inc,pre_dec,post_dec} sp:cfa_store.reg)) <reg>)
1459   effects: cfa_store.offset += -/+ mode_size(mem)
1460            cfa.offset = cfa_store.offset if cfa.reg == sp
1461            cfa.reg = sp
1462            cfa.base_offset = -cfa_store.offset
1463
1464   Rule 12:
1465   (set (mem ({minus,plus,losum} <reg1>:{cfa_store,cfa_temp} <const_int>))
1466
1467        <reg2>)
1468   effects: cfa.reg = <reg1>
1469            cfa.base_offset = -/+ <const_int> - {cfa_store,cfa_temp}.offset
1470
1471   Rule 13:
1472   (set (mem <reg1>:{cfa_store,cfa_temp}) <reg2>)
1473   effects: cfa.reg = <reg1>
1474            cfa.base_offset = -{cfa_store,cfa_temp}.offset
1475
1476   Rule 14:
1477   (set (mem (post_inc <reg1>:cfa_temp <const_int>)) <reg2>)
1478   effects: cfa.reg = <reg1>
1479            cfa.base_offset = -cfa_temp.offset
1480            cfa_temp.offset -= mode_size(mem)
1481
1482   Rule 15:
1483   (set <reg> {unspec, unspec_volatile})
1484   effects: target-dependent
1485
1486   Rule 16:
1487   (set sp (and: sp <const_int>))
1488   constraints: cfa_store.reg == sp
1489   effects: cfun->fde.stack_realign = 1
1490            cfa_store.offset = 0
1491            fde->drap_reg = cfa.reg if cfa.reg != sp and cfa.reg != fp
1492
1493   Rule 17:
1494   (set (mem ({pre_inc, pre_dec} sp)) (mem (plus (cfa.reg) (const_int))))
1495   effects: cfa_store.offset += -/+ mode_size(mem)
1496
1497   Rule 18:
1498   (set (mem ({pre_inc, pre_dec} sp)) fp)
1499   constraints: fde->stack_realign == 1
1500   effects: cfa_store.offset = 0
1501            cfa.reg != HARD_FRAME_POINTER_REGNUM
1502
1503   Rule 19:
1504   (set (mem ({pre_inc, pre_dec} sp)) cfa.reg)
1505   constraints: fde->stack_realign == 1
1506                && cfa.offset == 0
1507                && cfa.indirect == 0
1508                && cfa.reg != HARD_FRAME_POINTER_REGNUM
1509   effects: Use DW_CFA_def_cfa_expression to define cfa
1510            cfa.reg == fde->drap_reg  */
1511
1512 static void
1513 dwarf2out_frame_debug_expr (rtx expr)
1514 {
1515   rtx src, dest, span;
1516   HOST_WIDE_INT offset;
1517   dw_fde_ref fde;
1518
1519   /* If RTX_FRAME_RELATED_P is set on a PARALLEL, process each member of
1520      the PARALLEL independently. The first element is always processed if
1521      it is a SET. This is for backward compatibility.   Other elements
1522      are processed only if they are SETs and the RTX_FRAME_RELATED_P
1523      flag is set in them.  */
1524   if (GET_CODE (expr) == PARALLEL || GET_CODE (expr) == SEQUENCE)
1525     {
1526       int par_index;
1527       int limit = XVECLEN (expr, 0);
1528       rtx elem;
1529
1530       /* PARALLELs have strict read-modify-write semantics, so we
1531          ought to evaluate every rvalue before changing any lvalue.
1532          It's cumbersome to do that in general, but there's an
1533          easy approximation that is enough for all current users:
1534          handle register saves before register assignments.  */
1535       if (GET_CODE (expr) == PARALLEL)
1536         for (par_index = 0; par_index < limit; par_index++)
1537           {
1538             elem = XVECEXP (expr, 0, par_index);
1539             if (GET_CODE (elem) == SET
1540                 && MEM_P (SET_DEST (elem))
1541                 && (RTX_FRAME_RELATED_P (elem) || par_index == 0))
1542               dwarf2out_frame_debug_expr (elem);
1543           }
1544
1545       for (par_index = 0; par_index < limit; par_index++)
1546         {
1547           elem = XVECEXP (expr, 0, par_index);
1548           if (GET_CODE (elem) == SET
1549               && (!MEM_P (SET_DEST (elem)) || GET_CODE (expr) == SEQUENCE)
1550               && (RTX_FRAME_RELATED_P (elem) || par_index == 0))
1551             dwarf2out_frame_debug_expr (elem);
1552         }
1553       return;
1554     }
1555
1556   gcc_assert (GET_CODE (expr) == SET);
1557
1558   src = SET_SRC (expr);
1559   dest = SET_DEST (expr);
1560
1561   if (REG_P (src))
1562     {
1563       rtx rsi = reg_saved_in (src);
1564       if (rsi)
1565         src = rsi;
1566     }
1567
1568   fde = cfun->fde;
1569
1570   switch (GET_CODE (dest))
1571     {
1572     case REG:
1573       switch (GET_CODE (src))
1574         {
1575           /* Setting FP from SP.  */
1576         case REG:
1577           if (cur_cfa->reg == dwf_regno (src))
1578             {
1579               /* Rule 1 */
1580               /* Update the CFA rule wrt SP or FP.  Make sure src is
1581                  relative to the current CFA register.
1582
1583                  We used to require that dest be either SP or FP, but the
1584                  ARM copies SP to a temporary register, and from there to
1585                  FP.  So we just rely on the backends to only set
1586                  RTX_FRAME_RELATED_P on appropriate insns.  */
1587               cur_cfa->reg = dwf_regno (dest);
1588               cur_trace->cfa_temp.reg = cur_cfa->reg;
1589               cur_trace->cfa_temp.offset = cur_cfa->offset;
1590             }
1591           else
1592             {
1593               /* Saving a register in a register.  */
1594               gcc_assert (!fixed_regs [REGNO (dest)]
1595                           /* For the SPARC and its register window.  */
1596                           || (dwf_regno (src) == DWARF_FRAME_RETURN_COLUMN));
1597
1598               /* After stack is aligned, we can only save SP in FP
1599                  if drap register is used.  In this case, we have
1600                  to restore stack pointer with the CFA value and we
1601                  don't generate this DWARF information.  */
1602               if (fde
1603                   && fde->stack_realign
1604                   && REGNO (src) == STACK_POINTER_REGNUM)
1605                 gcc_assert (REGNO (dest) == HARD_FRAME_POINTER_REGNUM
1606                             && fde->drap_reg != INVALID_REGNUM
1607                             && cur_cfa->reg != dwf_regno (src));
1608               else
1609                 queue_reg_save (src, dest, 0);
1610             }
1611           break;
1612
1613         case PLUS:
1614         case MINUS:
1615         case LO_SUM:
1616           if (dest == stack_pointer_rtx)
1617             {
1618               /* Rule 2 */
1619               /* Adjusting SP.  */
1620               switch (GET_CODE (XEXP (src, 1)))
1621                 {
1622                 case CONST_INT:
1623                   offset = INTVAL (XEXP (src, 1));
1624                   break;
1625                 case REG:
1626                   gcc_assert (dwf_regno (XEXP (src, 1))
1627                               == cur_trace->cfa_temp.reg);
1628                   offset = cur_trace->cfa_temp.offset;
1629                   break;
1630                 default:
1631                   gcc_unreachable ();
1632                 }
1633
1634               if (XEXP (src, 0) == hard_frame_pointer_rtx)
1635                 {
1636                   /* Restoring SP from FP in the epilogue.  */
1637                   gcc_assert (cur_cfa->reg == dw_frame_pointer_regnum);
1638                   cur_cfa->reg = dw_stack_pointer_regnum;
1639                 }
1640               else if (GET_CODE (src) == LO_SUM)
1641                 /* Assume we've set the source reg of the LO_SUM from sp.  */
1642                 ;
1643               else
1644                 gcc_assert (XEXP (src, 0) == stack_pointer_rtx);
1645
1646               if (GET_CODE (src) != MINUS)
1647                 offset = -offset;
1648               if (cur_cfa->reg == dw_stack_pointer_regnum)
1649                 cur_cfa->offset += offset;
1650               if (cur_trace->cfa_store.reg == dw_stack_pointer_regnum)
1651                 cur_trace->cfa_store.offset += offset;
1652             }
1653           else if (dest == hard_frame_pointer_rtx)
1654             {
1655               /* Rule 3 */
1656               /* Either setting the FP from an offset of the SP,
1657                  or adjusting the FP */
1658               gcc_assert (frame_pointer_needed);
1659
1660               gcc_assert (REG_P (XEXP (src, 0))
1661                           && dwf_regno (XEXP (src, 0)) == cur_cfa->reg
1662                           && CONST_INT_P (XEXP (src, 1)));
1663               offset = INTVAL (XEXP (src, 1));
1664               if (GET_CODE (src) != MINUS)
1665                 offset = -offset;
1666               cur_cfa->offset += offset;
1667               cur_cfa->reg = dw_frame_pointer_regnum;
1668             }
1669           else
1670             {
1671               gcc_assert (GET_CODE (src) != MINUS);
1672
1673               /* Rule 4 */
1674               if (REG_P (XEXP (src, 0))
1675                   && dwf_regno (XEXP (src, 0)) == cur_cfa->reg
1676                   && CONST_INT_P (XEXP (src, 1)))
1677                 {
1678                   /* Setting a temporary CFA register that will be copied
1679                      into the FP later on.  */
1680                   offset = - INTVAL (XEXP (src, 1));
1681                   cur_cfa->offset += offset;
1682                   cur_cfa->reg = dwf_regno (dest);
1683                   /* Or used to save regs to the stack.  */
1684                   cur_trace->cfa_temp.reg = cur_cfa->reg;
1685                   cur_trace->cfa_temp.offset = cur_cfa->offset;
1686                 }
1687
1688               /* Rule 5 */
1689               else if (REG_P (XEXP (src, 0))
1690                        && dwf_regno (XEXP (src, 0)) == cur_trace->cfa_temp.reg
1691                        && XEXP (src, 1) == stack_pointer_rtx)
1692                 {
1693                   /* Setting a scratch register that we will use instead
1694                      of SP for saving registers to the stack.  */
1695                   gcc_assert (cur_cfa->reg == dw_stack_pointer_regnum);
1696                   cur_trace->cfa_store.reg = dwf_regno (dest);
1697                   cur_trace->cfa_store.offset
1698                     = cur_cfa->offset - cur_trace->cfa_temp.offset;
1699                 }
1700
1701               /* Rule 9 */
1702               else if (GET_CODE (src) == LO_SUM
1703                        && CONST_INT_P (XEXP (src, 1)))
1704                 {
1705                   cur_trace->cfa_temp.reg = dwf_regno (dest);
1706                   cur_trace->cfa_temp.offset = INTVAL (XEXP (src, 1));
1707                 }
1708               else
1709                 gcc_unreachable ();
1710             }
1711           break;
1712
1713           /* Rule 6 */
1714         case CONST_INT:
1715           cur_trace->cfa_temp.reg = dwf_regno (dest);
1716           cur_trace->cfa_temp.offset = INTVAL (src);
1717           break;
1718
1719           /* Rule 7 */
1720         case IOR:
1721           gcc_assert (REG_P (XEXP (src, 0))
1722                       && dwf_regno (XEXP (src, 0)) == cur_trace->cfa_temp.reg
1723                       && CONST_INT_P (XEXP (src, 1)));
1724
1725           cur_trace->cfa_temp.reg = dwf_regno (dest);
1726           cur_trace->cfa_temp.offset |= INTVAL (XEXP (src, 1));
1727           break;
1728
1729           /* Skip over HIGH, assuming it will be followed by a LO_SUM,
1730              which will fill in all of the bits.  */
1731           /* Rule 8 */
1732         case HIGH:
1733           break;
1734
1735           /* Rule 15 */
1736         case UNSPEC:
1737         case UNSPEC_VOLATILE:
1738           /* All unspecs should be represented by REG_CFA_* notes.  */
1739           gcc_unreachable ();
1740           return;
1741
1742           /* Rule 16 */
1743         case AND:
1744           /* If this AND operation happens on stack pointer in prologue,
1745              we assume the stack is realigned and we extract the
1746              alignment.  */
1747           if (fde && XEXP (src, 0) == stack_pointer_rtx)
1748             {
1749               /* We interpret reg_save differently with stack_realign set.
1750                  Thus we must flush whatever we have queued first.  */
1751               dwarf2out_flush_queued_reg_saves ();
1752
1753               gcc_assert (cur_trace->cfa_store.reg
1754                           == dwf_regno (XEXP (src, 0)));
1755               fde->stack_realign = 1;
1756               fde->stack_realignment = INTVAL (XEXP (src, 1));
1757               cur_trace->cfa_store.offset = 0;
1758
1759               if (cur_cfa->reg != dw_stack_pointer_regnum
1760                   && cur_cfa->reg != dw_frame_pointer_regnum)
1761                 fde->drap_reg = cur_cfa->reg;
1762             }
1763           return;
1764
1765         default:
1766           gcc_unreachable ();
1767         }
1768       break;
1769
1770     case MEM:
1771
1772       /* Saving a register to the stack.  Make sure dest is relative to the
1773          CFA register.  */
1774       switch (GET_CODE (XEXP (dest, 0)))
1775         {
1776           /* Rule 10 */
1777           /* With a push.  */
1778         case PRE_MODIFY:
1779         case POST_MODIFY:
1780           /* We can't handle variable size modifications.  */
1781           gcc_assert (GET_CODE (XEXP (XEXP (XEXP (dest, 0), 1), 1))
1782                       == CONST_INT);
1783           offset = -INTVAL (XEXP (XEXP (XEXP (dest, 0), 1), 1));
1784
1785           gcc_assert (REGNO (XEXP (XEXP (dest, 0), 0)) == STACK_POINTER_REGNUM
1786                       && cur_trace->cfa_store.reg == dw_stack_pointer_regnum);
1787
1788           cur_trace->cfa_store.offset += offset;
1789           if (cur_cfa->reg == dw_stack_pointer_regnum)
1790             cur_cfa->offset = cur_trace->cfa_store.offset;
1791
1792           if (GET_CODE (XEXP (dest, 0)) == POST_MODIFY)
1793             offset -= cur_trace->cfa_store.offset;
1794           else
1795             offset = -cur_trace->cfa_store.offset;
1796           break;
1797
1798           /* Rule 11 */
1799         case PRE_INC:
1800         case PRE_DEC:
1801         case POST_DEC:
1802           offset = GET_MODE_SIZE (GET_MODE (dest));
1803           if (GET_CODE (XEXP (dest, 0)) == PRE_INC)
1804             offset = -offset;
1805
1806           gcc_assert ((REGNO (XEXP (XEXP (dest, 0), 0))
1807                        == STACK_POINTER_REGNUM)
1808                       && cur_trace->cfa_store.reg == dw_stack_pointer_regnum);
1809
1810           cur_trace->cfa_store.offset += offset;
1811
1812           /* Rule 18: If stack is aligned, we will use FP as a
1813              reference to represent the address of the stored
1814              regiser.  */
1815           if (fde
1816               && fde->stack_realign
1817               && REG_P (src)
1818               && REGNO (src) == HARD_FRAME_POINTER_REGNUM)
1819             {
1820               gcc_assert (cur_cfa->reg != dw_frame_pointer_regnum);
1821               cur_trace->cfa_store.offset = 0;
1822             }
1823
1824           if (cur_cfa->reg == dw_stack_pointer_regnum)
1825             cur_cfa->offset = cur_trace->cfa_store.offset;
1826
1827           if (GET_CODE (XEXP (dest, 0)) == POST_DEC)
1828             offset += -cur_trace->cfa_store.offset;
1829           else
1830             offset = -cur_trace->cfa_store.offset;
1831           break;
1832
1833           /* Rule 12 */
1834           /* With an offset.  */
1835         case PLUS:
1836         case MINUS:
1837         case LO_SUM:
1838           {
1839             unsigned int regno;
1840
1841             gcc_assert (CONST_INT_P (XEXP (XEXP (dest, 0), 1))
1842                         && REG_P (XEXP (XEXP (dest, 0), 0)));
1843             offset = INTVAL (XEXP (XEXP (dest, 0), 1));
1844             if (GET_CODE (XEXP (dest, 0)) == MINUS)
1845               offset = -offset;
1846
1847             regno = dwf_regno (XEXP (XEXP (dest, 0), 0));
1848
1849             if (cur_cfa->reg == regno)
1850               offset -= cur_cfa->offset;
1851             else if (cur_trace->cfa_store.reg == regno)
1852               offset -= cur_trace->cfa_store.offset;
1853             else
1854               {
1855                 gcc_assert (cur_trace->cfa_temp.reg == regno);
1856                 offset -= cur_trace->cfa_temp.offset;
1857               }
1858           }
1859           break;
1860
1861           /* Rule 13 */
1862           /* Without an offset.  */
1863         case REG:
1864           {
1865             unsigned int regno = dwf_regno (XEXP (dest, 0));
1866
1867             if (cur_cfa->reg == regno)
1868               offset = -cur_cfa->offset;
1869             else if (cur_trace->cfa_store.reg == regno)
1870               offset = -cur_trace->cfa_store.offset;
1871             else
1872               {
1873                 gcc_assert (cur_trace->cfa_temp.reg == regno);
1874                 offset = -cur_trace->cfa_temp.offset;
1875               }
1876           }
1877           break;
1878
1879           /* Rule 14 */
1880         case POST_INC:
1881           gcc_assert (cur_trace->cfa_temp.reg
1882                       == dwf_regno (XEXP (XEXP (dest, 0), 0)));
1883           offset = -cur_trace->cfa_temp.offset;
1884           cur_trace->cfa_temp.offset -= GET_MODE_SIZE (GET_MODE (dest));
1885           break;
1886
1887         default:
1888           gcc_unreachable ();
1889         }
1890
1891       /* Rule 17 */
1892       /* If the source operand of this MEM operation is a memory,
1893          we only care how much stack grew.  */
1894       if (MEM_P (src))
1895         break;
1896
1897       if (REG_P (src)
1898           && REGNO (src) != STACK_POINTER_REGNUM
1899           && REGNO (src) != HARD_FRAME_POINTER_REGNUM
1900           && dwf_regno (src) == cur_cfa->reg)
1901         {
1902           /* We're storing the current CFA reg into the stack.  */
1903
1904           if (cur_cfa->offset == 0)
1905             {
1906               /* Rule 19 */
1907               /* If stack is aligned, putting CFA reg into stack means
1908                  we can no longer use reg + offset to represent CFA.
1909                  Here we use DW_CFA_def_cfa_expression instead.  The
1910                  result of this expression equals to the original CFA
1911                  value.  */
1912               if (fde
1913                   && fde->stack_realign
1914                   && cur_cfa->indirect == 0
1915                   && cur_cfa->reg != dw_frame_pointer_regnum)
1916                 {
1917                   gcc_assert (fde->drap_reg == cur_cfa->reg);
1918
1919                   cur_cfa->indirect = 1;
1920                   cur_cfa->reg = dw_frame_pointer_regnum;
1921                   cur_cfa->base_offset = offset;
1922                   cur_cfa->offset = 0;
1923
1924                   fde->drap_reg_saved = 1;
1925                   break;
1926                 }
1927
1928               /* If the source register is exactly the CFA, assume
1929                  we're saving SP like any other register; this happens
1930                  on the ARM.  */
1931               queue_reg_save (stack_pointer_rtx, NULL_RTX, offset);
1932               break;
1933             }
1934           else
1935             {
1936               /* Otherwise, we'll need to look in the stack to
1937                  calculate the CFA.  */
1938               rtx x = XEXP (dest, 0);
1939
1940               if (!REG_P (x))
1941                 x = XEXP (x, 0);
1942               gcc_assert (REG_P (x));
1943
1944               cur_cfa->reg = dwf_regno (x);
1945               cur_cfa->base_offset = offset;
1946               cur_cfa->indirect = 1;
1947               break;
1948             }
1949         }
1950
1951       if (REG_P (src))
1952         span = targetm.dwarf_register_span (src);
1953       else
1954         span = NULL;
1955
1956       if (!span)
1957         queue_reg_save (src, NULL_RTX, offset);
1958       else
1959         {
1960           /* We have a PARALLEL describing where the contents of SRC live.
1961              Queue register saves for each piece of the PARALLEL.  */
1962           HOST_WIDE_INT span_offset = offset;
1963
1964           gcc_assert (GET_CODE (span) == PARALLEL);
1965
1966           const int par_len = XVECLEN (span, 0);
1967           for (int par_index = 0; par_index < par_len; par_index++)
1968             {
1969               rtx elem = XVECEXP (span, 0, par_index);
1970               queue_reg_save (elem, NULL_RTX, span_offset);
1971               span_offset += GET_MODE_SIZE (GET_MODE (elem));
1972             }
1973         }
1974       break;
1975
1976     default:
1977       gcc_unreachable ();
1978     }
1979 }
1980
1981 /* Record call frame debugging information for INSN, which either sets
1982    SP or FP (adjusting how we calculate the frame address) or saves a
1983    register to the stack.  */
1984
1985 static void
1986 dwarf2out_frame_debug (rtx_insn *insn)
1987 {
1988   rtx note, n, pat;
1989   bool handled_one = false;
1990
1991   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1992     switch (REG_NOTE_KIND (note))
1993       {
1994       case REG_FRAME_RELATED_EXPR:
1995         pat = XEXP (note, 0);
1996         goto do_frame_expr;
1997
1998       case REG_CFA_DEF_CFA:
1999         dwarf2out_frame_debug_def_cfa (XEXP (note, 0));
2000         handled_one = true;
2001         break;
2002
2003       case REG_CFA_ADJUST_CFA:
2004         n = XEXP (note, 0);
2005         if (n == NULL)
2006           {
2007             n = PATTERN (insn);
2008             if (GET_CODE (n) == PARALLEL)
2009               n = XVECEXP (n, 0, 0);
2010           }
2011         dwarf2out_frame_debug_adjust_cfa (n);
2012         handled_one = true;
2013         break;
2014
2015       case REG_CFA_OFFSET:
2016         n = XEXP (note, 0);
2017         if (n == NULL)
2018           n = single_set (insn);
2019         dwarf2out_frame_debug_cfa_offset (n);
2020         handled_one = true;
2021         break;
2022
2023       case REG_CFA_REGISTER:
2024         n = XEXP (note, 0);
2025         if (n == NULL)
2026           {
2027             n = PATTERN (insn);
2028             if (GET_CODE (n) == PARALLEL)
2029               n = XVECEXP (n, 0, 0);
2030           }
2031         dwarf2out_frame_debug_cfa_register (n);
2032         handled_one = true;
2033         break;
2034
2035       case REG_CFA_EXPRESSION:
2036         n = XEXP (note, 0);
2037         if (n == NULL)
2038           n = single_set (insn);
2039         dwarf2out_frame_debug_cfa_expression (n);
2040         handled_one = true;
2041         break;
2042
2043       case REG_CFA_RESTORE:
2044         n = XEXP (note, 0);
2045         if (n == NULL)
2046           {
2047             n = PATTERN (insn);
2048             if (GET_CODE (n) == PARALLEL)
2049               n = XVECEXP (n, 0, 0);
2050             n = XEXP (n, 0);
2051           }
2052         dwarf2out_frame_debug_cfa_restore (n);
2053         handled_one = true;
2054         break;
2055
2056       case REG_CFA_SET_VDRAP:
2057         n = XEXP (note, 0);
2058         if (REG_P (n))
2059           {
2060             dw_fde_ref fde = cfun->fde;
2061             if (fde)
2062               {
2063                 gcc_assert (fde->vdrap_reg == INVALID_REGNUM);
2064                 if (REG_P (n))
2065                   fde->vdrap_reg = dwf_regno (n);
2066               }
2067           }
2068         handled_one = true;
2069         break;
2070
2071       case REG_CFA_WINDOW_SAVE:
2072         dwarf2out_frame_debug_cfa_window_save ();
2073         handled_one = true;
2074         break;
2075
2076       case REG_CFA_FLUSH_QUEUE:
2077         /* The actual flush happens elsewhere.  */
2078         handled_one = true;
2079         break;
2080
2081       default:
2082         break;
2083       }
2084
2085   if (!handled_one)
2086     {
2087       pat = PATTERN (insn);
2088     do_frame_expr:
2089       dwarf2out_frame_debug_expr (pat);
2090
2091       /* Check again.  A parallel can save and update the same register.
2092          We could probably check just once, here, but this is safer than
2093          removing the check at the start of the function.  */
2094       if (clobbers_queued_reg_save (pat))
2095         dwarf2out_flush_queued_reg_saves ();
2096     }
2097 }
2098
2099 /* Emit CFI info to change the state from OLD_ROW to NEW_ROW.  */
2100
2101 static void
2102 change_cfi_row (dw_cfi_row *old_row, dw_cfi_row *new_row)
2103 {
2104   size_t i, n_old, n_new, n_max;
2105   dw_cfi_ref cfi;
2106
2107   if (new_row->cfa_cfi && !cfi_equal_p (old_row->cfa_cfi, new_row->cfa_cfi))
2108     add_cfi (new_row->cfa_cfi);
2109   else
2110     {
2111       cfi = def_cfa_0 (&old_row->cfa, &new_row->cfa);
2112       if (cfi)
2113         add_cfi (cfi);
2114     }
2115
2116   n_old = vec_safe_length (old_row->reg_save);
2117   n_new = vec_safe_length (new_row->reg_save);
2118   n_max = MAX (n_old, n_new);
2119
2120   for (i = 0; i < n_max; ++i)
2121     {
2122       dw_cfi_ref r_old = NULL, r_new = NULL;
2123
2124       if (i < n_old)
2125         r_old = (*old_row->reg_save)[i];
2126       if (i < n_new)
2127         r_new = (*new_row->reg_save)[i];
2128
2129       if (r_old == r_new)
2130         ;
2131       else if (r_new == NULL)
2132         add_cfi_restore (i);
2133       else if (!cfi_equal_p (r_old, r_new))
2134         add_cfi (r_new);
2135     }
2136 }
2137
2138 /* Examine CFI and return true if a cfi label and set_loc is needed
2139    beforehand.  Even when generating CFI assembler instructions, we
2140    still have to add the cfi to the list so that lookup_cfa_1 works
2141    later on.  When -g2 and above we even need to force emitting of
2142    CFI labels and add to list a DW_CFA_set_loc for convert_cfa_to_fb_loc_list
2143    purposes.  If we're generating DWARF3 output we use DW_OP_call_frame_cfa
2144    and so don't use convert_cfa_to_fb_loc_list.  */
2145
2146 static bool
2147 cfi_label_required_p (dw_cfi_ref cfi)
2148 {
2149   if (!dwarf2out_do_cfi_asm ())
2150     return true;
2151
2152   if (dwarf_version == 2
2153       && debug_info_level > DINFO_LEVEL_TERSE
2154       && (write_symbols == DWARF2_DEBUG
2155           || write_symbols == VMS_AND_DWARF2_DEBUG))
2156     {
2157       switch (cfi->dw_cfi_opc)
2158         {
2159         case DW_CFA_def_cfa_offset:
2160         case DW_CFA_def_cfa_offset_sf:
2161         case DW_CFA_def_cfa_register:
2162         case DW_CFA_def_cfa:
2163         case DW_CFA_def_cfa_sf:
2164         case DW_CFA_def_cfa_expression:
2165         case DW_CFA_restore_state:
2166           return true;
2167         default:
2168           return false;
2169         }
2170     }
2171   return false;
2172 }
2173
2174 /* Walk the function, looking for NOTE_INSN_CFI notes.  Add the CFIs to the
2175    function's FDE, adding CFI labels and set_loc/advance_loc opcodes as
2176    necessary.  */
2177 static void
2178 add_cfis_to_fde (void)
2179 {
2180   dw_fde_ref fde = cfun->fde;
2181   rtx_insn *insn, *next;
2182   /* We always start with a function_begin label.  */
2183   bool first = false;
2184
2185   for (insn = get_insns (); insn; insn = next)
2186     {
2187       next = NEXT_INSN (insn);
2188
2189       if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
2190         {
2191           fde->dw_fde_switch_cfi_index = vec_safe_length (fde->dw_fde_cfi);
2192           /* Don't attempt to advance_loc4 between labels
2193              in different sections.  */
2194           first = true;
2195         }
2196
2197       if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_CFI)
2198         {
2199           bool required = cfi_label_required_p (NOTE_CFI (insn));
2200           while (next)
2201             if (NOTE_P (next) && NOTE_KIND (next) == NOTE_INSN_CFI)
2202               {
2203                 required |= cfi_label_required_p (NOTE_CFI (next));
2204                 next = NEXT_INSN (next);
2205               }
2206             else if (active_insn_p (next)
2207                      || (NOTE_P (next) && (NOTE_KIND (next)
2208                                            == NOTE_INSN_SWITCH_TEXT_SECTIONS)))
2209               break;
2210             else
2211               next = NEXT_INSN (next);
2212           if (required)
2213             {
2214               int num = dwarf2out_cfi_label_num;
2215               const char *label = dwarf2out_cfi_label ();
2216               dw_cfi_ref xcfi;
2217
2218               /* Set the location counter to the new label.  */
2219               xcfi = new_cfi ();
2220               xcfi->dw_cfi_opc = (first ? DW_CFA_set_loc
2221                                   : DW_CFA_advance_loc4);
2222               xcfi->dw_cfi_oprnd1.dw_cfi_addr = label;
2223               vec_safe_push (fde->dw_fde_cfi, xcfi);
2224
2225               rtx_note *tmp = emit_note_before (NOTE_INSN_CFI_LABEL, insn);
2226               NOTE_LABEL_NUMBER (tmp) = num;
2227             }
2228
2229           do
2230             {
2231               if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_CFI)
2232                 vec_safe_push (fde->dw_fde_cfi, NOTE_CFI (insn));
2233               insn = NEXT_INSN (insn);
2234             }
2235           while (insn != next);
2236           first = false;
2237         }
2238     }
2239 }
2240
2241 /* If LABEL is the start of a trace, then initialize the state of that
2242    trace from CUR_TRACE and CUR_ROW.  */
2243
2244 static void
2245 maybe_record_trace_start (rtx_insn *start, rtx_insn *origin)
2246 {
2247   dw_trace_info *ti;
2248   HOST_WIDE_INT args_size;
2249
2250   ti = get_trace_info (start);
2251   gcc_assert (ti != NULL);
2252
2253   if (dump_file)
2254     {
2255       fprintf (dump_file, "   saw edge from trace %u to %u (via %s %d)\n",
2256                cur_trace->id, ti->id,
2257                (origin ? rtx_name[(int) GET_CODE (origin)] : "fallthru"),
2258                (origin ? INSN_UID (origin) : 0));
2259     }
2260
2261   args_size = cur_trace->end_true_args_size;
2262   if (ti->beg_row == NULL)
2263     {
2264       /* This is the first time we've encountered this trace.  Propagate
2265          state across the edge and push the trace onto the work list.  */
2266       ti->beg_row = copy_cfi_row (cur_row);
2267       ti->beg_true_args_size = args_size;
2268
2269       ti->cfa_store = cur_trace->cfa_store;
2270       ti->cfa_temp = cur_trace->cfa_temp;
2271       ti->regs_saved_in_regs = cur_trace->regs_saved_in_regs.copy ();
2272
2273       trace_work_list.safe_push (ti);
2274
2275       if (dump_file)
2276         fprintf (dump_file, "\tpush trace %u to worklist\n", ti->id);
2277     }
2278   else
2279     {
2280
2281       /* We ought to have the same state incoming to a given trace no
2282          matter how we arrive at the trace.  Anything else means we've
2283          got some kind of optimization error.  */
2284       gcc_checking_assert (cfi_row_equal_p (cur_row, ti->beg_row));
2285
2286       /* The args_size is allowed to conflict if it isn't actually used.  */
2287       if (ti->beg_true_args_size != args_size)
2288         ti->args_size_undefined = true;
2289     }
2290 }
2291
2292 /* Similarly, but handle the args_size and CFA reset across EH
2293    and non-local goto edges.  */
2294
2295 static void
2296 maybe_record_trace_start_abnormal (rtx_insn *start, rtx_insn *origin)
2297 {
2298   HOST_WIDE_INT save_args_size, delta;
2299   dw_cfa_location save_cfa;
2300
2301   save_args_size = cur_trace->end_true_args_size;
2302   if (save_args_size == 0)
2303     {
2304       maybe_record_trace_start (start, origin);
2305       return;
2306     }
2307
2308   delta = -save_args_size;
2309   cur_trace->end_true_args_size = 0;
2310
2311   save_cfa = cur_row->cfa;
2312   if (cur_row->cfa.reg == dw_stack_pointer_regnum)
2313     {
2314       /* Convert a change in args_size (always a positive in the
2315          direction of stack growth) to a change in stack pointer.  */
2316       if (!STACK_GROWS_DOWNWARD)
2317         delta = -delta;
2318
2319       cur_row->cfa.offset += delta;
2320     }
2321   
2322   maybe_record_trace_start (start, origin);
2323
2324   cur_trace->end_true_args_size = save_args_size;
2325   cur_row->cfa = save_cfa;
2326 }
2327
2328 /* Propagate CUR_TRACE state to the destinations implied by INSN.  */
2329 /* ??? Sadly, this is in large part a duplicate of make_edges.  */
2330
2331 static void
2332 create_trace_edges (rtx_insn *insn)
2333 {
2334   rtx tmp;
2335   int i, n;
2336
2337   if (JUMP_P (insn))
2338     {
2339       rtx_jump_table_data *table;
2340
2341       if (find_reg_note (insn, REG_NON_LOCAL_GOTO, NULL_RTX))
2342         return;
2343
2344       if (tablejump_p (insn, NULL, &table))
2345         {
2346           rtvec vec = table->get_labels ();
2347
2348           n = GET_NUM_ELEM (vec);
2349           for (i = 0; i < n; ++i)
2350             {
2351               rtx_insn *lab = as_a <rtx_insn *> (XEXP (RTVEC_ELT (vec, i), 0));
2352               maybe_record_trace_start (lab, insn);
2353             }
2354         }
2355       else if (computed_jump_p (insn))
2356         {
2357           for (rtx_insn_list *lab = forced_labels; lab; lab = lab->next ())
2358             maybe_record_trace_start (lab->insn (), insn);
2359         }
2360       else if (returnjump_p (insn))
2361         ;
2362       else if ((tmp = extract_asm_operands (PATTERN (insn))) != NULL)
2363         {
2364           n = ASM_OPERANDS_LABEL_LENGTH (tmp);
2365           for (i = 0; i < n; ++i)
2366             {
2367               rtx_insn *lab =
2368                 as_a <rtx_insn *> (XEXP (ASM_OPERANDS_LABEL (tmp, i), 0));
2369               maybe_record_trace_start (lab, insn);
2370             }
2371         }
2372       else
2373         {
2374           rtx_insn *lab = JUMP_LABEL_AS_INSN (insn);
2375           gcc_assert (lab != NULL);
2376           maybe_record_trace_start (lab, insn);
2377         }
2378     }
2379   else if (CALL_P (insn))
2380     {
2381       /* Sibling calls don't have edges inside this function.  */
2382       if (SIBLING_CALL_P (insn))
2383         return;
2384
2385       /* Process non-local goto edges.  */
2386       if (can_nonlocal_goto (insn))
2387         for (rtx_insn_list *lab = nonlocal_goto_handler_labels;
2388              lab;
2389              lab = lab->next ())
2390           maybe_record_trace_start_abnormal (lab->insn (), insn);
2391     }
2392   else if (rtx_sequence *seq = dyn_cast <rtx_sequence *> (PATTERN (insn)))
2393     {
2394       int i, n = seq->len ();
2395       for (i = 0; i < n; ++i)
2396         create_trace_edges (seq->insn (i));
2397       return;
2398     }
2399
2400   /* Process EH edges.  */
2401   if (CALL_P (insn) || cfun->can_throw_non_call_exceptions)
2402     {
2403       eh_landing_pad lp = get_eh_landing_pad_from_rtx (insn);
2404       if (lp)
2405         maybe_record_trace_start_abnormal (lp->landing_pad, insn);
2406     }
2407 }
2408
2409 /* A subroutine of scan_trace.  Do what needs to be done "after" INSN.  */
2410
2411 static void
2412 scan_insn_after (rtx_insn *insn)
2413 {
2414   if (RTX_FRAME_RELATED_P (insn))
2415     dwarf2out_frame_debug (insn);
2416   notice_args_size (insn);
2417 }
2418
2419 /* Scan the trace beginning at INSN and create the CFI notes for the
2420    instructions therein.  */
2421
2422 static void
2423 scan_trace (dw_trace_info *trace)
2424 {
2425   rtx_insn *prev, *insn = trace->head;
2426   dw_cfa_location this_cfa;
2427
2428   if (dump_file)
2429     fprintf (dump_file, "Processing trace %u : start at %s %d\n",
2430              trace->id, rtx_name[(int) GET_CODE (insn)],
2431              INSN_UID (insn));
2432
2433   trace->end_row = copy_cfi_row (trace->beg_row);
2434   trace->end_true_args_size = trace->beg_true_args_size;
2435
2436   cur_trace = trace;
2437   cur_row = trace->end_row;
2438
2439   this_cfa = cur_row->cfa;
2440   cur_cfa = &this_cfa;
2441
2442   for (prev = insn, insn = NEXT_INSN (insn);
2443        insn;
2444        prev = insn, insn = NEXT_INSN (insn))
2445     {
2446       rtx_insn *control;
2447
2448       /* Do everything that happens "before" the insn.  */
2449       add_cfi_insn = prev;
2450
2451       /* Notice the end of a trace.  */
2452       if (BARRIER_P (insn))
2453         {
2454           /* Don't bother saving the unneeded queued registers at all.  */
2455           queued_reg_saves.truncate (0);
2456           break;
2457         }
2458       if (save_point_p (insn))
2459         {
2460           /* Propagate across fallthru edges.  */
2461           dwarf2out_flush_queued_reg_saves ();
2462           maybe_record_trace_start (insn, NULL);
2463           break;
2464         }
2465
2466       if (DEBUG_INSN_P (insn) || !inside_basic_block_p (insn))
2467         continue;
2468
2469       /* Handle all changes to the row state.  Sequences require special
2470          handling for the positioning of the notes.  */
2471       if (rtx_sequence *pat = dyn_cast <rtx_sequence *> (PATTERN (insn)))
2472         {
2473           rtx_insn *elt;
2474           int i, n = pat->len ();
2475
2476           control = pat->insn (0);
2477           if (can_throw_internal (control))
2478             notice_eh_throw (control);
2479           dwarf2out_flush_queued_reg_saves ();
2480
2481           if (JUMP_P (control) && INSN_ANNULLED_BRANCH_P (control))
2482             {
2483               /* ??? Hopefully multiple delay slots are not annulled.  */
2484               gcc_assert (n == 2);
2485               gcc_assert (!RTX_FRAME_RELATED_P (control));
2486               gcc_assert (!find_reg_note (control, REG_ARGS_SIZE, NULL));
2487
2488               elt = pat->insn (1);
2489
2490               if (INSN_FROM_TARGET_P (elt))
2491                 {
2492                   HOST_WIDE_INT restore_args_size;
2493                   cfi_vec save_row_reg_save;
2494
2495                   /* If ELT is an instruction from target of an annulled
2496                      branch, the effects are for the target only and so
2497                      the args_size and CFA along the current path
2498                      shouldn't change.  */
2499                   add_cfi_insn = NULL;
2500                   restore_args_size = cur_trace->end_true_args_size;
2501                   cur_cfa = &cur_row->cfa;
2502                   save_row_reg_save = vec_safe_copy (cur_row->reg_save);
2503
2504                   scan_insn_after (elt);
2505
2506                   /* ??? Should we instead save the entire row state?  */
2507                   gcc_assert (!queued_reg_saves.length ());
2508
2509                   create_trace_edges (control);
2510
2511                   cur_trace->end_true_args_size = restore_args_size;
2512                   cur_row->cfa = this_cfa;
2513                   cur_row->reg_save = save_row_reg_save;
2514                   cur_cfa = &this_cfa;
2515                 }
2516               else
2517                 {
2518                   /* If ELT is a annulled branch-taken instruction (i.e.
2519                      executed only when branch is not taken), the args_size
2520                      and CFA should not change through the jump.  */
2521                   create_trace_edges (control);
2522
2523                   /* Update and continue with the trace.  */
2524                   add_cfi_insn = insn;
2525                   scan_insn_after (elt);
2526                   def_cfa_1 (&this_cfa);
2527                 }
2528               continue;
2529             }
2530
2531           /* The insns in the delay slot should all be considered to happen
2532              "before" a call insn.  Consider a call with a stack pointer
2533              adjustment in the delay slot.  The backtrace from the callee
2534              should include the sp adjustment.  Unfortunately, that leaves
2535              us with an unavoidable unwinding error exactly at the call insn
2536              itself.  For jump insns we'd prefer to avoid this error by
2537              placing the notes after the sequence.  */
2538           if (JUMP_P (control))
2539             add_cfi_insn = insn;
2540
2541           for (i = 1; i < n; ++i)
2542             {
2543               elt = pat->insn (i);
2544               scan_insn_after (elt);
2545             }
2546
2547           /* Make sure any register saves are visible at the jump target.  */
2548           dwarf2out_flush_queued_reg_saves ();
2549           any_cfis_emitted = false;
2550
2551           /* However, if there is some adjustment on the call itself, e.g.
2552              a call_pop, that action should be considered to happen after
2553              the call returns.  */
2554           add_cfi_insn = insn;
2555           scan_insn_after (control);
2556         }
2557       else
2558         {
2559           /* Flush data before calls and jumps, and of course if necessary.  */
2560           if (can_throw_internal (insn))
2561             {
2562               notice_eh_throw (insn);
2563               dwarf2out_flush_queued_reg_saves ();
2564             }
2565           else if (!NONJUMP_INSN_P (insn)
2566                    || clobbers_queued_reg_save (insn)
2567                    || find_reg_note (insn, REG_CFA_FLUSH_QUEUE, NULL))
2568             dwarf2out_flush_queued_reg_saves ();
2569           any_cfis_emitted = false;
2570
2571           add_cfi_insn = insn;
2572           scan_insn_after (insn);
2573           control = insn;
2574         }
2575
2576       /* Between frame-related-p and args_size we might have otherwise
2577          emitted two cfa adjustments.  Do it now.  */
2578       def_cfa_1 (&this_cfa);
2579
2580       /* Minimize the number of advances by emitting the entire queue
2581          once anything is emitted.  */
2582       if (any_cfis_emitted
2583           || find_reg_note (insn, REG_CFA_FLUSH_QUEUE, NULL))
2584         dwarf2out_flush_queued_reg_saves ();
2585
2586       /* Note that a test for control_flow_insn_p does exactly the
2587          same tests as are done to actually create the edges.  So
2588          always call the routine and let it not create edges for
2589          non-control-flow insns.  */
2590       create_trace_edges (control);
2591     }
2592
2593   add_cfi_insn = NULL;
2594   cur_row = NULL;
2595   cur_trace = NULL;
2596   cur_cfa = NULL;
2597 }
2598
2599 /* Scan the function and create the initial set of CFI notes.  */
2600
2601 static void
2602 create_cfi_notes (void)
2603 {
2604   dw_trace_info *ti;
2605
2606   gcc_checking_assert (!queued_reg_saves.exists ());
2607   gcc_checking_assert (!trace_work_list.exists ());
2608
2609   /* Always begin at the entry trace.  */
2610   ti = &trace_info[0];
2611   scan_trace (ti);
2612
2613   while (!trace_work_list.is_empty ())
2614     {
2615       ti = trace_work_list.pop ();
2616       scan_trace (ti);
2617     }
2618
2619   queued_reg_saves.release ();
2620   trace_work_list.release ();
2621 }
2622
2623 /* Return the insn before the first NOTE_INSN_CFI after START.  */
2624
2625 static rtx_insn *
2626 before_next_cfi_note (rtx_insn *start)
2627 {
2628   rtx_insn *prev = start;
2629   while (start)
2630     {
2631       if (NOTE_P (start) && NOTE_KIND (start) == NOTE_INSN_CFI)
2632         return prev;
2633       prev = start;
2634       start = NEXT_INSN (start);
2635     }
2636   gcc_unreachable ();
2637 }
2638
2639 /* Insert CFI notes between traces to properly change state between them.  */
2640
2641 static void
2642 connect_traces (void)
2643 {
2644   unsigned i, n = trace_info.length ();
2645   dw_trace_info *prev_ti, *ti;
2646
2647   /* ??? Ideally, we should have both queued and processed every trace.
2648      However the current representation of constant pools on various targets
2649      is indistinguishable from unreachable code.  Assume for the moment that
2650      we can simply skip over such traces.  */
2651   /* ??? Consider creating a DATA_INSN rtx code to indicate that
2652      these are not "real" instructions, and should not be considered.
2653      This could be generically useful for tablejump data as well.  */
2654   /* Remove all unprocessed traces from the list.  */
2655   for (i = n - 1; i > 0; --i)
2656     {
2657       ti = &trace_info[i];
2658       if (ti->beg_row == NULL)
2659         {
2660           trace_info.ordered_remove (i);
2661           n -= 1;
2662         }
2663       else
2664         gcc_assert (ti->end_row != NULL);
2665     }
2666
2667   /* Work from the end back to the beginning.  This lets us easily insert
2668      remember/restore_state notes in the correct order wrt other notes.  */
2669   prev_ti = &trace_info[n - 1];
2670   for (i = n - 1; i > 0; --i)
2671     {
2672       dw_cfi_row *old_row;
2673
2674       ti = prev_ti;
2675       prev_ti = &trace_info[i - 1];
2676
2677       add_cfi_insn = ti->head;
2678
2679       /* In dwarf2out_switch_text_section, we'll begin a new FDE
2680          for the portion of the function in the alternate text
2681          section.  The row state at the very beginning of that
2682          new FDE will be exactly the row state from the CIE.  */
2683       if (ti->switch_sections)
2684         old_row = cie_cfi_row;
2685       else
2686         {
2687           old_row = prev_ti->end_row;
2688           /* If there's no change from the previous end state, fine.  */
2689           if (cfi_row_equal_p (old_row, ti->beg_row))
2690             ;
2691           /* Otherwise check for the common case of sharing state with
2692              the beginning of an epilogue, but not the end.  Insert
2693              remember/restore opcodes in that case.  */
2694           else if (cfi_row_equal_p (prev_ti->beg_row, ti->beg_row))
2695             {
2696               dw_cfi_ref cfi;
2697
2698               /* Note that if we blindly insert the remember at the
2699                  start of the trace, we can wind up increasing the
2700                  size of the unwind info due to extra advance opcodes.
2701                  Instead, put the remember immediately before the next
2702                  state change.  We know there must be one, because the 
2703                  state at the beginning and head of the trace differ.  */
2704               add_cfi_insn = before_next_cfi_note (prev_ti->head);
2705               cfi = new_cfi ();
2706               cfi->dw_cfi_opc = DW_CFA_remember_state;
2707               add_cfi (cfi);
2708
2709               add_cfi_insn = ti->head;
2710               cfi = new_cfi ();
2711               cfi->dw_cfi_opc = DW_CFA_restore_state;
2712               add_cfi (cfi);
2713
2714               old_row = prev_ti->beg_row;
2715             }
2716           /* Otherwise, we'll simply change state from the previous end.  */
2717         }
2718
2719       change_cfi_row (old_row, ti->beg_row);
2720
2721       if (dump_file && add_cfi_insn != ti->head)
2722         {
2723           rtx_insn *note;
2724
2725           fprintf (dump_file, "Fixup between trace %u and %u:\n",
2726                    prev_ti->id, ti->id);
2727
2728           note = ti->head;
2729           do
2730             {
2731               note = NEXT_INSN (note);
2732               gcc_assert (NOTE_P (note) && NOTE_KIND (note) == NOTE_INSN_CFI);
2733               output_cfi_directive (dump_file, NOTE_CFI (note));
2734             }
2735           while (note != add_cfi_insn);
2736         }
2737     }
2738
2739   /* Connect args_size between traces that have can_throw_internal insns.  */
2740   if (cfun->eh->lp_array)
2741     {
2742       HOST_WIDE_INT prev_args_size = 0;
2743
2744       for (i = 0; i < n; ++i)
2745         {
2746           ti = &trace_info[i];
2747
2748           if (ti->switch_sections)
2749             prev_args_size = 0;
2750           if (ti->eh_head == NULL)
2751             continue;
2752           gcc_assert (!ti->args_size_undefined);
2753
2754           if (ti->beg_delay_args_size != prev_args_size)
2755             {
2756               /* ??? Search back to previous CFI note.  */
2757               add_cfi_insn = PREV_INSN (ti->eh_head);
2758               add_cfi_args_size (ti->beg_delay_args_size);
2759             }
2760
2761           prev_args_size = ti->end_delay_args_size;
2762         }
2763     }
2764 }
2765
2766 /* Set up the pseudo-cfg of instruction traces, as described at the
2767    block comment at the top of the file.  */
2768
2769 static void
2770 create_pseudo_cfg (void)
2771 {
2772   bool saw_barrier, switch_sections;
2773   dw_trace_info ti;
2774   rtx_insn *insn;
2775   unsigned i;
2776
2777   /* The first trace begins at the start of the function,
2778      and begins with the CIE row state.  */
2779   trace_info.create (16);
2780   memset (&ti, 0, sizeof (ti));
2781   ti.head = get_insns ();
2782   ti.beg_row = cie_cfi_row;
2783   ti.cfa_store = cie_cfi_row->cfa;
2784   ti.cfa_temp.reg = INVALID_REGNUM;
2785   trace_info.quick_push (ti);
2786
2787   if (cie_return_save)
2788     ti.regs_saved_in_regs.safe_push (*cie_return_save);
2789
2790   /* Walk all the insns, collecting start of trace locations.  */
2791   saw_barrier = false;
2792   switch_sections = false;
2793   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2794     {
2795       if (BARRIER_P (insn))
2796         saw_barrier = true;
2797       else if (NOTE_P (insn)
2798                && NOTE_KIND (insn) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
2799         {
2800           /* We should have just seen a barrier.  */
2801           gcc_assert (saw_barrier);
2802           switch_sections = true;
2803         }
2804       /* Watch out for save_point notes between basic blocks.
2805          In particular, a note after a barrier.  Do not record these,
2806          delaying trace creation until the label.  */
2807       else if (save_point_p (insn)
2808                && (LABEL_P (insn) || !saw_barrier))
2809         {
2810           memset (&ti, 0, sizeof (ti));
2811           ti.head = insn;
2812           ti.switch_sections = switch_sections;
2813           ti.id = trace_info.length ();
2814           trace_info.safe_push (ti);
2815
2816           saw_barrier = false;
2817           switch_sections = false;
2818         }
2819     }
2820
2821   /* Create the trace index after we've finished building trace_info,
2822      avoiding stale pointer problems due to reallocation.  */
2823   trace_index
2824     = new hash_table<trace_info_hasher> (trace_info.length ());
2825   dw_trace_info *tp;
2826   FOR_EACH_VEC_ELT (trace_info, i, tp)
2827     {
2828       dw_trace_info **slot;
2829
2830       if (dump_file)
2831         fprintf (dump_file, "Creating trace %u : start at %s %d%s\n", tp->id,
2832                  rtx_name[(int) GET_CODE (tp->head)], INSN_UID (tp->head),
2833                  tp->switch_sections ? " (section switch)" : "");
2834
2835       slot = trace_index->find_slot_with_hash (tp, INSN_UID (tp->head), INSERT);
2836       gcc_assert (*slot == NULL);
2837       *slot = tp;
2838     }
2839 }
2840
2841 /* Record the initial position of the return address.  RTL is
2842    INCOMING_RETURN_ADDR_RTX.  */
2843
2844 static void
2845 initial_return_save (rtx rtl)
2846 {
2847   unsigned int reg = INVALID_REGNUM;
2848   HOST_WIDE_INT offset = 0;
2849
2850   switch (GET_CODE (rtl))
2851     {
2852     case REG:
2853       /* RA is in a register.  */
2854       reg = dwf_regno (rtl);
2855       break;
2856
2857     case MEM:
2858       /* RA is on the stack.  */
2859       rtl = XEXP (rtl, 0);
2860       switch (GET_CODE (rtl))
2861         {
2862         case REG:
2863           gcc_assert (REGNO (rtl) == STACK_POINTER_REGNUM);
2864           offset = 0;
2865           break;
2866
2867         case PLUS:
2868           gcc_assert (REGNO (XEXP (rtl, 0)) == STACK_POINTER_REGNUM);
2869           offset = INTVAL (XEXP (rtl, 1));
2870           break;
2871
2872         case MINUS:
2873           gcc_assert (REGNO (XEXP (rtl, 0)) == STACK_POINTER_REGNUM);
2874           offset = -INTVAL (XEXP (rtl, 1));
2875           break;
2876
2877         default:
2878           gcc_unreachable ();
2879         }
2880
2881       break;
2882
2883     case PLUS:
2884       /* The return address is at some offset from any value we can
2885          actually load.  For instance, on the SPARC it is in %i7+8. Just
2886          ignore the offset for now; it doesn't matter for unwinding frames.  */
2887       gcc_assert (CONST_INT_P (XEXP (rtl, 1)));
2888       initial_return_save (XEXP (rtl, 0));
2889       return;
2890
2891     default:
2892       gcc_unreachable ();
2893     }
2894
2895   if (reg != DWARF_FRAME_RETURN_COLUMN)
2896     {
2897       if (reg != INVALID_REGNUM)
2898         record_reg_saved_in_reg (rtl, pc_rtx);
2899       reg_save (DWARF_FRAME_RETURN_COLUMN, reg, offset - cur_row->cfa.offset);
2900     }
2901 }
2902
2903 static void
2904 create_cie_data (void)
2905 {
2906   dw_cfa_location loc;
2907   dw_trace_info cie_trace;
2908
2909   dw_stack_pointer_regnum = DWARF_FRAME_REGNUM (STACK_POINTER_REGNUM);
2910
2911   memset (&cie_trace, 0, sizeof (cie_trace));
2912   cur_trace = &cie_trace;
2913
2914   add_cfi_vec = &cie_cfi_vec;
2915   cie_cfi_row = cur_row = new_cfi_row ();
2916
2917   /* On entry, the Canonical Frame Address is at SP.  */
2918   memset (&loc, 0, sizeof (loc));
2919   loc.reg = dw_stack_pointer_regnum;
2920   loc.offset = INCOMING_FRAME_SP_OFFSET;
2921   def_cfa_1 (&loc);
2922
2923   if (targetm.debug_unwind_info () == UI_DWARF2
2924       || targetm_common.except_unwind_info (&global_options) == UI_DWARF2)
2925     {
2926       initial_return_save (INCOMING_RETURN_ADDR_RTX);
2927
2928       /* For a few targets, we have the return address incoming into a
2929          register, but choose a different return column.  This will result
2930          in a DW_CFA_register for the return, and an entry in
2931          regs_saved_in_regs to match.  If the target later stores that
2932          return address register to the stack, we want to be able to emit
2933          the DW_CFA_offset against the return column, not the intermediate
2934          save register.  Save the contents of regs_saved_in_regs so that
2935          we can re-initialize it at the start of each function.  */
2936       switch (cie_trace.regs_saved_in_regs.length ())
2937         {
2938         case 0:
2939           break;
2940         case 1:
2941           cie_return_save = ggc_alloc<reg_saved_in_data> ();
2942           *cie_return_save = cie_trace.regs_saved_in_regs[0];
2943           cie_trace.regs_saved_in_regs.release ();
2944           break;
2945         default:
2946           gcc_unreachable ();
2947         }
2948     }
2949
2950   add_cfi_vec = NULL;
2951   cur_row = NULL;
2952   cur_trace = NULL;
2953 }
2954
2955 /* Annotate the function with NOTE_INSN_CFI notes to record the CFI
2956    state at each location within the function.  These notes will be
2957    emitted during pass_final.  */
2958
2959 static unsigned int
2960 execute_dwarf2_frame (void)
2961 {
2962   /* Different HARD_FRAME_POINTER_REGNUM might coexist in the same file.  */
2963   dw_frame_pointer_regnum = DWARF_FRAME_REGNUM (HARD_FRAME_POINTER_REGNUM);
2964
2965   /* The first time we're called, compute the incoming frame state.  */
2966   if (cie_cfi_vec == NULL)
2967     create_cie_data ();
2968
2969   dwarf2out_alloc_current_fde ();
2970
2971   create_pseudo_cfg ();
2972
2973   /* Do the work.  */
2974   create_cfi_notes ();
2975   connect_traces ();
2976   add_cfis_to_fde ();
2977
2978   /* Free all the data we allocated.  */
2979   {
2980     size_t i;
2981     dw_trace_info *ti;
2982
2983     FOR_EACH_VEC_ELT (trace_info, i, ti)
2984       ti->regs_saved_in_regs.release ();
2985   }
2986   trace_info.release ();
2987
2988   delete trace_index;
2989   trace_index = NULL;
2990
2991   return 0;
2992 }
2993 \f
2994 /* Convert a DWARF call frame info. operation to its string name */
2995
2996 static const char *
2997 dwarf_cfi_name (unsigned int cfi_opc)
2998 {
2999   const char *name = get_DW_CFA_name (cfi_opc);
3000
3001   if (name != NULL)
3002     return name;
3003
3004   return "DW_CFA_<unknown>";
3005 }
3006
3007 /* This routine will generate the correct assembly data for a location
3008    description based on a cfi entry with a complex address.  */
3009
3010 static void
3011 output_cfa_loc (dw_cfi_ref cfi, int for_eh)
3012 {
3013   dw_loc_descr_ref loc;
3014   unsigned long size;
3015
3016   if (cfi->dw_cfi_opc == DW_CFA_expression)
3017     {
3018       unsigned r =
3019         DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
3020       dw2_asm_output_data (1, r, NULL);
3021       loc = cfi->dw_cfi_oprnd2.dw_cfi_loc;
3022     }
3023   else
3024     loc = cfi->dw_cfi_oprnd1.dw_cfi_loc;
3025
3026   /* Output the size of the block.  */
3027   size = size_of_locs (loc);
3028   dw2_asm_output_data_uleb128 (size, NULL);
3029
3030   /* Now output the operations themselves.  */
3031   output_loc_sequence (loc, for_eh);
3032 }
3033
3034 /* Similar, but used for .cfi_escape.  */
3035
3036 static void
3037 output_cfa_loc_raw (dw_cfi_ref cfi)
3038 {
3039   dw_loc_descr_ref loc;
3040   unsigned long size;
3041
3042   if (cfi->dw_cfi_opc == DW_CFA_expression)
3043     {
3044       unsigned r =
3045         DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, 1);
3046       fprintf (asm_out_file, "%#x,", r);
3047       loc = cfi->dw_cfi_oprnd2.dw_cfi_loc;
3048     }
3049   else
3050     loc = cfi->dw_cfi_oprnd1.dw_cfi_loc;
3051
3052   /* Output the size of the block.  */
3053   size = size_of_locs (loc);
3054   dw2_asm_output_data_uleb128_raw (size);
3055   fputc (',', asm_out_file);
3056
3057   /* Now output the operations themselves.  */
3058   output_loc_sequence_raw (loc);
3059 }
3060
3061 /* Output a Call Frame Information opcode and its operand(s).  */
3062
3063 void
3064 output_cfi (dw_cfi_ref cfi, dw_fde_ref fde, int for_eh)
3065 {
3066   unsigned long r;
3067   HOST_WIDE_INT off;
3068
3069   if (cfi->dw_cfi_opc == DW_CFA_advance_loc)
3070     dw2_asm_output_data (1, (cfi->dw_cfi_opc
3071                              | (cfi->dw_cfi_oprnd1.dw_cfi_offset & 0x3f)),
3072                          "DW_CFA_advance_loc " HOST_WIDE_INT_PRINT_HEX,
3073                          ((unsigned HOST_WIDE_INT)
3074                           cfi->dw_cfi_oprnd1.dw_cfi_offset));
3075   else if (cfi->dw_cfi_opc == DW_CFA_offset)
3076     {
3077       r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
3078       dw2_asm_output_data (1, (cfi->dw_cfi_opc | (r & 0x3f)),
3079                            "DW_CFA_offset, column %#lx", r);
3080       off = div_data_align (cfi->dw_cfi_oprnd2.dw_cfi_offset);
3081       dw2_asm_output_data_uleb128 (off, NULL);
3082     }
3083   else if (cfi->dw_cfi_opc == DW_CFA_restore)
3084     {
3085       r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
3086       dw2_asm_output_data (1, (cfi->dw_cfi_opc | (r & 0x3f)),
3087                            "DW_CFA_restore, column %#lx", r);
3088     }
3089   else
3090     {
3091       dw2_asm_output_data (1, cfi->dw_cfi_opc,
3092                            "%s", dwarf_cfi_name (cfi->dw_cfi_opc));
3093
3094       switch (cfi->dw_cfi_opc)
3095         {
3096         case DW_CFA_set_loc:
3097           if (for_eh)
3098             dw2_asm_output_encoded_addr_rtx (
3099                 ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1, /*global=*/0),
3100                 gen_rtx_SYMBOL_REF (Pmode, cfi->dw_cfi_oprnd1.dw_cfi_addr),
3101                 false, NULL);
3102           else
3103             dw2_asm_output_addr (DWARF2_ADDR_SIZE,
3104                                  cfi->dw_cfi_oprnd1.dw_cfi_addr, NULL);
3105           fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
3106           break;
3107
3108         case DW_CFA_advance_loc1:
3109           dw2_asm_output_delta (1, cfi->dw_cfi_oprnd1.dw_cfi_addr,
3110                                 fde->dw_fde_current_label, NULL);
3111           fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
3112           break;
3113
3114         case DW_CFA_advance_loc2:
3115           dw2_asm_output_delta (2, cfi->dw_cfi_oprnd1.dw_cfi_addr,
3116                                 fde->dw_fde_current_label, NULL);
3117           fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
3118           break;
3119
3120         case DW_CFA_advance_loc4:
3121           dw2_asm_output_delta (4, cfi->dw_cfi_oprnd1.dw_cfi_addr,
3122                                 fde->dw_fde_current_label, NULL);
3123           fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
3124           break;
3125
3126         case DW_CFA_MIPS_advance_loc8:
3127           dw2_asm_output_delta (8, cfi->dw_cfi_oprnd1.dw_cfi_addr,
3128                                 fde->dw_fde_current_label, NULL);
3129           fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
3130           break;
3131
3132         case DW_CFA_offset_extended:
3133           r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
3134           dw2_asm_output_data_uleb128 (r, NULL);
3135           off = div_data_align (cfi->dw_cfi_oprnd2.dw_cfi_offset);
3136           dw2_asm_output_data_uleb128 (off, NULL);
3137           break;
3138
3139         case DW_CFA_def_cfa:
3140           r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
3141           dw2_asm_output_data_uleb128 (r, NULL);
3142           dw2_asm_output_data_uleb128 (cfi->dw_cfi_oprnd2.dw_cfi_offset, NULL);
3143           break;
3144
3145         case DW_CFA_offset_extended_sf:
3146           r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
3147           dw2_asm_output_data_uleb128 (r, NULL);
3148           off = div_data_align (cfi->dw_cfi_oprnd2.dw_cfi_offset);
3149           dw2_asm_output_data_sleb128 (off, NULL);
3150           break;
3151
3152         case DW_CFA_def_cfa_sf:
3153           r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
3154           dw2_asm_output_data_uleb128 (r, NULL);
3155           off = div_data_align (cfi->dw_cfi_oprnd2.dw_cfi_offset);
3156           dw2_asm_output_data_sleb128 (off, NULL);
3157           break;
3158
3159         case DW_CFA_restore_extended:
3160         case DW_CFA_undefined:
3161         case DW_CFA_same_value:
3162         case DW_CFA_def_cfa_register:
3163           r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
3164           dw2_asm_output_data_uleb128 (r, NULL);
3165           break;
3166
3167         case DW_CFA_register:
3168           r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
3169           dw2_asm_output_data_uleb128 (r, NULL);
3170           r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd2.dw_cfi_reg_num, for_eh);
3171           dw2_asm_output_data_uleb128 (r, NULL);
3172           break;
3173
3174         case DW_CFA_def_cfa_offset:
3175         case DW_CFA_GNU_args_size:
3176           dw2_asm_output_data_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_offset, NULL);
3177           break;
3178
3179         case DW_CFA_def_cfa_offset_sf:
3180           off = div_data_align (cfi->dw_cfi_oprnd1.dw_cfi_offset);
3181           dw2_asm_output_data_sleb128 (off, NULL);
3182           break;
3183
3184         case DW_CFA_GNU_window_save:
3185           break;
3186
3187         case DW_CFA_def_cfa_expression:
3188         case DW_CFA_expression:
3189           output_cfa_loc (cfi, for_eh);
3190           break;
3191
3192         case DW_CFA_GNU_negative_offset_extended:
3193           /* Obsoleted by DW_CFA_offset_extended_sf.  */
3194           gcc_unreachable ();
3195
3196         default:
3197           break;
3198         }
3199     }
3200 }
3201
3202 /* Similar, but do it via assembler directives instead.  */
3203
3204 void
3205 output_cfi_directive (FILE *f, dw_cfi_ref cfi)
3206 {
3207   unsigned long r, r2;
3208
3209   switch (cfi->dw_cfi_opc)
3210     {
3211     case DW_CFA_advance_loc:
3212     case DW_CFA_advance_loc1:
3213     case DW_CFA_advance_loc2:
3214     case DW_CFA_advance_loc4:
3215     case DW_CFA_MIPS_advance_loc8:
3216     case DW_CFA_set_loc:
3217       /* Should only be created in a code path not followed when emitting
3218          via directives.  The assembler is going to take care of this for
3219          us.  But this routines is also used for debugging dumps, so
3220          print something.  */
3221       gcc_assert (f != asm_out_file);
3222       fprintf (f, "\t.cfi_advance_loc\n");
3223       break;
3224
3225     case DW_CFA_offset:
3226     case DW_CFA_offset_extended:
3227     case DW_CFA_offset_extended_sf:
3228       r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, 1);
3229       fprintf (f, "\t.cfi_offset %lu, " HOST_WIDE_INT_PRINT_DEC"\n",
3230                r, cfi->dw_cfi_oprnd2.dw_cfi_offset);
3231       break;
3232
3233     case DW_CFA_restore:
3234     case DW_CFA_restore_extended:
3235       r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, 1);
3236       fprintf (f, "\t.cfi_restore %lu\n", r);
3237       break;
3238
3239     case DW_CFA_undefined:
3240       r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, 1);
3241       fprintf (f, "\t.cfi_undefined %lu\n", r);
3242       break;
3243
3244     case DW_CFA_same_value:
3245       r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, 1);
3246       fprintf (f, "\t.cfi_same_value %lu\n", r);
3247       break;
3248
3249     case DW_CFA_def_cfa:
3250     case DW_CFA_def_cfa_sf:
3251       r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, 1);
3252       fprintf (f, "\t.cfi_def_cfa %lu, " HOST_WIDE_INT_PRINT_DEC"\n",
3253                r, cfi->dw_cfi_oprnd2.dw_cfi_offset);
3254       break;
3255
3256     case DW_CFA_def_cfa_register:
3257       r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, 1);
3258       fprintf (f, "\t.cfi_def_cfa_register %lu\n", r);
3259       break;
3260
3261     case DW_CFA_register:
3262       r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, 1);
3263       r2 = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd2.dw_cfi_reg_num, 1);
3264       fprintf (f, "\t.cfi_register %lu, %lu\n", r, r2);
3265       break;
3266
3267     case DW_CFA_def_cfa_offset:
3268     case DW_CFA_def_cfa_offset_sf:
3269       fprintf (f, "\t.cfi_def_cfa_offset "
3270                HOST_WIDE_INT_PRINT_DEC"\n",
3271                cfi->dw_cfi_oprnd1.dw_cfi_offset);
3272       break;
3273
3274     case DW_CFA_remember_state:
3275       fprintf (f, "\t.cfi_remember_state\n");
3276       break;
3277     case DW_CFA_restore_state:
3278       fprintf (f, "\t.cfi_restore_state\n");
3279       break;
3280
3281     case DW_CFA_GNU_args_size:
3282       if (f == asm_out_file)
3283         {
3284           fprintf (f, "\t.cfi_escape %#x,", DW_CFA_GNU_args_size);
3285           dw2_asm_output_data_uleb128_raw (cfi->dw_cfi_oprnd1.dw_cfi_offset);
3286           if (flag_debug_asm)
3287             fprintf (f, "\t%s args_size " HOST_WIDE_INT_PRINT_DEC,
3288                      ASM_COMMENT_START, cfi->dw_cfi_oprnd1.dw_cfi_offset);
3289           fputc ('\n', f);
3290         }
3291       else
3292         {
3293           fprintf (f, "\t.cfi_GNU_args_size " HOST_WIDE_INT_PRINT_DEC "\n",
3294                    cfi->dw_cfi_oprnd1.dw_cfi_offset);
3295         }
3296       break;
3297
3298     case DW_CFA_GNU_window_save:
3299       fprintf (f, "\t.cfi_window_save\n");
3300       break;
3301
3302     case DW_CFA_def_cfa_expression:
3303       if (f != asm_out_file)
3304         {
3305           fprintf (f, "\t.cfi_def_cfa_expression ...\n");
3306           break;
3307         }
3308       /* FALLTHRU */
3309     case DW_CFA_expression:
3310       if (f != asm_out_file)
3311         {
3312           fprintf (f, "\t.cfi_cfa_expression ...\n");
3313           break;
3314         }
3315       fprintf (f, "\t.cfi_escape %#x,", cfi->dw_cfi_opc);
3316       output_cfa_loc_raw (cfi);
3317       fputc ('\n', f);
3318       break;
3319
3320     default:
3321       gcc_unreachable ();
3322     }
3323 }
3324
3325 void
3326 dwarf2out_emit_cfi (dw_cfi_ref cfi)
3327 {
3328   if (dwarf2out_do_cfi_asm ())
3329     output_cfi_directive (asm_out_file, cfi);
3330 }
3331
3332 static void
3333 dump_cfi_row (FILE *f, dw_cfi_row *row)
3334 {
3335   dw_cfi_ref cfi;
3336   unsigned i;
3337
3338   cfi = row->cfa_cfi;
3339   if (!cfi)
3340     {
3341       dw_cfa_location dummy;
3342       memset (&dummy, 0, sizeof (dummy));
3343       dummy.reg = INVALID_REGNUM;
3344       cfi = def_cfa_0 (&dummy, &row->cfa);
3345     }
3346   output_cfi_directive (f, cfi);
3347
3348   FOR_EACH_VEC_SAFE_ELT (row->reg_save, i, cfi)
3349     if (cfi)
3350       output_cfi_directive (f, cfi);
3351 }
3352
3353 void debug_cfi_row (dw_cfi_row *row);
3354
3355 void
3356 debug_cfi_row (dw_cfi_row *row)
3357 {
3358   dump_cfi_row (stderr, row);
3359 }
3360 \f
3361
3362 /* Save the result of dwarf2out_do_frame across PCH.
3363    This variable is tri-state, with 0 unset, >0 true, <0 false.  */
3364 static GTY(()) signed char saved_do_cfi_asm = 0;
3365
3366 /* Decide whether we want to emit frame unwind information for the current
3367    translation unit.  */
3368
3369 bool
3370 dwarf2out_do_frame (void)
3371 {
3372   /* We want to emit correct CFA location expressions or lists, so we
3373      have to return true if we're going to output debug info, even if
3374      we're not going to output frame or unwind info.  */
3375   if (write_symbols == DWARF2_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
3376     return true;
3377
3378   if (saved_do_cfi_asm > 0)
3379     return true;
3380
3381   if (targetm.debug_unwind_info () == UI_DWARF2)
3382     return true;
3383
3384   if ((flag_unwind_tables || flag_exceptions)
3385       && targetm_common.except_unwind_info (&global_options) == UI_DWARF2)
3386     return true;
3387
3388   return false;
3389 }
3390
3391 /* Decide whether to emit frame unwind via assembler directives.  */
3392
3393 bool
3394 dwarf2out_do_cfi_asm (void)
3395 {
3396   int enc;
3397
3398   if (saved_do_cfi_asm != 0)
3399     return saved_do_cfi_asm > 0;
3400
3401   /* Assume failure for a moment.  */
3402   saved_do_cfi_asm = -1;
3403
3404   if (!flag_dwarf2_cfi_asm || !dwarf2out_do_frame ())
3405     return false;
3406   if (!HAVE_GAS_CFI_PERSONALITY_DIRECTIVE)
3407     return false;
3408
3409   /* Make sure the personality encoding is one the assembler can support.
3410      In particular, aligned addresses can't be handled.  */
3411   enc = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/2,/*global=*/1);
3412   if ((enc & 0x70) != 0 && (enc & 0x70) != DW_EH_PE_pcrel)
3413     return false;
3414   enc = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0,/*global=*/0);
3415   if ((enc & 0x70) != 0 && (enc & 0x70) != DW_EH_PE_pcrel)
3416     return false;
3417
3418   /* If we can't get the assembler to emit only .debug_frame, and we don't need
3419      dwarf2 unwind info for exceptions, then emit .debug_frame by hand.  */
3420   if (!HAVE_GAS_CFI_SECTIONS_DIRECTIVE
3421       && !flag_unwind_tables && !flag_exceptions
3422       && targetm_common.except_unwind_info (&global_options) != UI_DWARF2)
3423     return false;
3424
3425   /* Success!  */
3426   saved_do_cfi_asm = 1;
3427   return true;
3428 }
3429
3430 namespace {
3431
3432 const pass_data pass_data_dwarf2_frame =
3433 {
3434   RTL_PASS, /* type */
3435   "dwarf2", /* name */
3436   OPTGROUP_NONE, /* optinfo_flags */
3437   TV_FINAL, /* tv_id */
3438   0, /* properties_required */
3439   0, /* properties_provided */
3440   0, /* properties_destroyed */
3441   0, /* todo_flags_start */
3442   0, /* todo_flags_finish */
3443 };
3444
3445 class pass_dwarf2_frame : public rtl_opt_pass
3446 {
3447 public:
3448   pass_dwarf2_frame (gcc::context *ctxt)
3449     : rtl_opt_pass (pass_data_dwarf2_frame, ctxt)
3450   {}
3451
3452   /* opt_pass methods: */
3453   virtual bool gate (function *);
3454   virtual unsigned int execute (function *) { return execute_dwarf2_frame (); }
3455
3456 }; // class pass_dwarf2_frame
3457
3458 bool
3459 pass_dwarf2_frame::gate (function *)
3460 {
3461   /* Targets which still implement the prologue in assembler text
3462      cannot use the generic dwarf2 unwinding.  */
3463   if (!targetm.have_prologue ())
3464     return false;
3465
3466   /* ??? What to do for UI_TARGET unwinding?  They might be able to benefit
3467      from the optimized shrink-wrapping annotations that we will compute.
3468      For now, only produce the CFI notes for dwarf2.  */
3469   return dwarf2out_do_frame ();
3470 }
3471
3472 } // anon namespace
3473
3474 rtl_opt_pass *
3475 make_pass_dwarf2_frame (gcc::context *ctxt)
3476 {
3477   return new pass_dwarf2_frame (ctxt);
3478 }
3479
3480 #include "gt-dwarf2cfi.h"