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