57619.C: Rename to 57619.cc.
[official-gcc.git] / gcc / final.c
blob52d1589ad6ff116f8e70a4d9d17c499bc9309711
1 /* Convert RTL to assembler code and output it, for GNU compiler.
2 Copyright (C) 1987-2016 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
20 /* This is the final pass of the compiler.
21 It looks at the rtl code for a function and outputs assembler code.
23 Call `final_start_function' to output the assembler code for function entry,
24 `final' to output assembler code for some RTL code,
25 `final_end_function' to output assembler code for function exit.
26 If a function is compiled in several pieces, each piece is
27 output separately with `final'.
29 Some optimizations are also done at this level.
30 Move instructions that were made unnecessary by good register allocation
31 are detected and omitted from the output. (Though most of these
32 are removed by the last jump pass.)
34 Instructions to set the condition codes are omitted when it can be
35 seen that the condition codes already had the desired values.
37 In some cases it is sufficient if the inherited condition codes
38 have related values, but this may require the following insn
39 (the one that tests the condition codes) to be modified.
41 The code for the function prologue and epilogue are generated
42 directly in assembler by the target functions function_prologue and
43 function_epilogue. Those instructions never exist as rtl. */
45 #include "config.h"
46 #define INCLUDE_ALGORITHM /* reverse */
47 #include "system.h"
48 #include "coretypes.h"
49 #include "backend.h"
50 #include "target.h"
51 #include "rtl.h"
52 #include "tree.h"
53 #include "cfghooks.h"
54 #include "df.h"
55 #include "memmodel.h"
56 #include "tm_p.h"
57 #include "insn-config.h"
58 #include "regs.h"
59 #include "emit-rtl.h"
60 #include "recog.h"
61 #include "cgraph.h"
62 #include "tree-pretty-print.h" /* for dump_function_header */
63 #include "varasm.h"
64 #include "insn-attr.h"
65 #include "conditions.h"
66 #include "flags.h"
67 #include "output.h"
68 #include "except.h"
69 #include "rtl-error.h"
70 #include "toplev.h" /* exact_log2, floor_log2 */
71 #include "reload.h"
72 #include "intl.h"
73 #include "cfgrtl.h"
74 #include "debug.h"
75 #include "tree-pass.h"
76 #include "tree-ssa.h"
77 #include "cfgloop.h"
78 #include "params.h"
79 #include "asan.h"
80 #include "rtl-iter.h"
81 #include "print-rtl.h"
83 #ifdef XCOFF_DEBUGGING_INFO
84 #include "xcoffout.h" /* Needed for external data declarations. */
85 #endif
87 #include "dwarf2out.h"
89 #ifdef DBX_DEBUGGING_INFO
90 #include "dbxout.h"
91 #endif
93 #include "sdbout.h"
95 /* Most ports that aren't using cc0 don't need to define CC_STATUS_INIT.
96 So define a null default for it to save conditionalization later. */
97 #ifndef CC_STATUS_INIT
98 #define CC_STATUS_INIT
99 #endif
101 /* Is the given character a logical line separator for the assembler? */
102 #ifndef IS_ASM_LOGICAL_LINE_SEPARATOR
103 #define IS_ASM_LOGICAL_LINE_SEPARATOR(C, STR) ((C) == ';')
104 #endif
106 #ifndef JUMP_TABLES_IN_TEXT_SECTION
107 #define JUMP_TABLES_IN_TEXT_SECTION 0
108 #endif
110 /* Bitflags used by final_scan_insn. */
111 #define SEEN_NOTE 1
112 #define SEEN_EMITTED 2
114 /* Last insn processed by final_scan_insn. */
115 static rtx_insn *debug_insn;
116 rtx_insn *current_output_insn;
118 /* Line number of last NOTE. */
119 static int last_linenum;
121 /* Last discriminator written to assembly. */
122 static int last_discriminator;
124 /* Discriminator of current block. */
125 static int discriminator;
127 /* Highest line number in current block. */
128 static int high_block_linenum;
130 /* Likewise for function. */
131 static int high_function_linenum;
133 /* Filename of last NOTE. */
134 static const char *last_filename;
136 /* Override filename and line number. */
137 static const char *override_filename;
138 static int override_linenum;
140 /* Whether to force emission of a line note before the next insn. */
141 static bool force_source_line = false;
143 extern const int length_unit_log; /* This is defined in insn-attrtab.c. */
145 /* Nonzero while outputting an `asm' with operands.
146 This means that inconsistencies are the user's fault, so don't die.
147 The precise value is the insn being output, to pass to error_for_asm. */
148 const rtx_insn *this_is_asm_operands;
150 /* Number of operands of this insn, for an `asm' with operands. */
151 static unsigned int insn_noperands;
153 /* Compare optimization flag. */
155 static rtx last_ignored_compare = 0;
157 /* Assign a unique number to each insn that is output.
158 This can be used to generate unique local labels. */
160 static int insn_counter = 0;
162 /* This variable contains machine-dependent flags (defined in tm.h)
163 set and examined by output routines
164 that describe how to interpret the condition codes properly. */
166 CC_STATUS cc_status;
168 /* During output of an insn, this contains a copy of cc_status
169 from before the insn. */
171 CC_STATUS cc_prev_status;
173 /* Number of unmatched NOTE_INSN_BLOCK_BEG notes we have seen. */
175 static int block_depth;
177 /* Nonzero if have enabled APP processing of our assembler output. */
179 static int app_on;
181 /* If we are outputting an insn sequence, this contains the sequence rtx.
182 Zero otherwise. */
184 rtx_sequence *final_sequence;
186 #ifdef ASSEMBLER_DIALECT
188 /* Number of the assembler dialect to use, starting at 0. */
189 static int dialect_number;
190 #endif
192 /* Nonnull if the insn currently being emitted was a COND_EXEC pattern. */
193 rtx current_insn_predicate;
195 /* True if printing into -fdump-final-insns= dump. */
196 bool final_insns_dump_p;
198 /* True if profile_function should be called, but hasn't been called yet. */
199 static bool need_profile_function;
201 static int asm_insn_count (rtx);
202 static void profile_function (FILE *);
203 static void profile_after_prologue (FILE *);
204 static bool notice_source_line (rtx_insn *, bool *);
205 static rtx walk_alter_subreg (rtx *, bool *);
206 static void output_asm_name (void);
207 static void output_alternate_entry_point (FILE *, rtx_insn *);
208 static tree get_mem_expr_from_op (rtx, int *);
209 static void output_asm_operand_names (rtx *, int *, int);
210 #ifdef LEAF_REGISTERS
211 static void leaf_renumber_regs (rtx_insn *);
212 #endif
213 #if HAVE_cc0
214 static int alter_cond (rtx);
215 #endif
216 #ifndef ADDR_VEC_ALIGN
217 static int final_addr_vec_align (rtx);
218 #endif
219 static int align_fuzz (rtx, rtx, int, unsigned);
220 static void collect_fn_hard_reg_usage (void);
221 static tree get_call_fndecl (rtx_insn *);
223 /* Initialize data in final at the beginning of a compilation. */
225 void
226 init_final (const char *filename ATTRIBUTE_UNUSED)
228 app_on = 0;
229 final_sequence = 0;
231 #ifdef ASSEMBLER_DIALECT
232 dialect_number = ASSEMBLER_DIALECT;
233 #endif
236 /* Default target function prologue and epilogue assembler output.
238 If not overridden for epilogue code, then the function body itself
239 contains return instructions wherever needed. */
240 void
241 default_function_pro_epilogue (FILE *file ATTRIBUTE_UNUSED,
242 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
246 void
247 default_function_switched_text_sections (FILE *file ATTRIBUTE_UNUSED,
248 tree decl ATTRIBUTE_UNUSED,
249 bool new_is_cold ATTRIBUTE_UNUSED)
253 /* Default target hook that outputs nothing to a stream. */
254 void
255 no_asm_to_stream (FILE *file ATTRIBUTE_UNUSED)
259 /* Enable APP processing of subsequent output.
260 Used before the output from an `asm' statement. */
262 void
263 app_enable (void)
265 if (! app_on)
267 fputs (ASM_APP_ON, asm_out_file);
268 app_on = 1;
272 /* Disable APP processing of subsequent output.
273 Called from varasm.c before most kinds of output. */
275 void
276 app_disable (void)
278 if (app_on)
280 fputs (ASM_APP_OFF, asm_out_file);
281 app_on = 0;
285 /* Return the number of slots filled in the current
286 delayed branch sequence (we don't count the insn needing the
287 delay slot). Zero if not in a delayed branch sequence. */
290 dbr_sequence_length (void)
292 if (final_sequence != 0)
293 return XVECLEN (final_sequence, 0) - 1;
294 else
295 return 0;
298 /* The next two pages contain routines used to compute the length of an insn
299 and to shorten branches. */
301 /* Arrays for insn lengths, and addresses. The latter is referenced by
302 `insn_current_length'. */
304 static int *insn_lengths;
306 vec<int> insn_addresses_;
308 /* Max uid for which the above arrays are valid. */
309 static int insn_lengths_max_uid;
311 /* Address of insn being processed. Used by `insn_current_length'. */
312 int insn_current_address;
314 /* Address of insn being processed in previous iteration. */
315 int insn_last_address;
317 /* known invariant alignment of insn being processed. */
318 int insn_current_align;
320 /* After shorten_branches, for any insn, uid_align[INSN_UID (insn)]
321 gives the next following alignment insn that increases the known
322 alignment, or NULL_RTX if there is no such insn.
323 For any alignment obtained this way, we can again index uid_align with
324 its uid to obtain the next following align that in turn increases the
325 alignment, till we reach NULL_RTX; the sequence obtained this way
326 for each insn we'll call the alignment chain of this insn in the following
327 comments. */
329 struct label_alignment
331 short alignment;
332 short max_skip;
335 static rtx *uid_align;
336 static int *uid_shuid;
337 static struct label_alignment *label_align;
339 /* Indicate that branch shortening hasn't yet been done. */
341 void
342 init_insn_lengths (void)
344 if (uid_shuid)
346 free (uid_shuid);
347 uid_shuid = 0;
349 if (insn_lengths)
351 free (insn_lengths);
352 insn_lengths = 0;
353 insn_lengths_max_uid = 0;
355 if (HAVE_ATTR_length)
356 INSN_ADDRESSES_FREE ();
357 if (uid_align)
359 free (uid_align);
360 uid_align = 0;
364 /* Obtain the current length of an insn. If branch shortening has been done,
365 get its actual length. Otherwise, use FALLBACK_FN to calculate the
366 length. */
367 static int
368 get_attr_length_1 (rtx_insn *insn, int (*fallback_fn) (rtx_insn *))
370 rtx body;
371 int i;
372 int length = 0;
374 if (!HAVE_ATTR_length)
375 return 0;
377 if (insn_lengths_max_uid > INSN_UID (insn))
378 return insn_lengths[INSN_UID (insn)];
379 else
380 switch (GET_CODE (insn))
382 case NOTE:
383 case BARRIER:
384 case CODE_LABEL:
385 case DEBUG_INSN:
386 return 0;
388 case CALL_INSN:
389 case JUMP_INSN:
390 length = fallback_fn (insn);
391 break;
393 case INSN:
394 body = PATTERN (insn);
395 if (GET_CODE (body) == USE || GET_CODE (body) == CLOBBER)
396 return 0;
398 else if (GET_CODE (body) == ASM_INPUT || asm_noperands (body) >= 0)
399 length = asm_insn_count (body) * fallback_fn (insn);
400 else if (rtx_sequence *seq = dyn_cast <rtx_sequence *> (body))
401 for (i = 0; i < seq->len (); i++)
402 length += get_attr_length_1 (seq->insn (i), fallback_fn);
403 else
404 length = fallback_fn (insn);
405 break;
407 default:
408 break;
411 #ifdef ADJUST_INSN_LENGTH
412 ADJUST_INSN_LENGTH (insn, length);
413 #endif
414 return length;
417 /* Obtain the current length of an insn. If branch shortening has been done,
418 get its actual length. Otherwise, get its maximum length. */
420 get_attr_length (rtx_insn *insn)
422 return get_attr_length_1 (insn, insn_default_length);
425 /* Obtain the current length of an insn. If branch shortening has been done,
426 get its actual length. Otherwise, get its minimum length. */
428 get_attr_min_length (rtx_insn *insn)
430 return get_attr_length_1 (insn, insn_min_length);
433 /* Code to handle alignment inside shorten_branches. */
435 /* Here is an explanation how the algorithm in align_fuzz can give
436 proper results:
438 Call a sequence of instructions beginning with alignment point X
439 and continuing until the next alignment point `block X'. When `X'
440 is used in an expression, it means the alignment value of the
441 alignment point.
443 Call the distance between the start of the first insn of block X, and
444 the end of the last insn of block X `IX', for the `inner size of X'.
445 This is clearly the sum of the instruction lengths.
447 Likewise with the next alignment-delimited block following X, which we
448 shall call block Y.
450 Call the distance between the start of the first insn of block X, and
451 the start of the first insn of block Y `OX', for the `outer size of X'.
453 The estimated padding is then OX - IX.
455 OX can be safely estimated as
457 if (X >= Y)
458 OX = round_up(IX, Y)
459 else
460 OX = round_up(IX, X) + Y - X
462 Clearly est(IX) >= real(IX), because that only depends on the
463 instruction lengths, and those being overestimated is a given.
465 Clearly round_up(foo, Z) >= round_up(bar, Z) if foo >= bar, so
466 we needn't worry about that when thinking about OX.
468 When X >= Y, the alignment provided by Y adds no uncertainty factor
469 for branch ranges starting before X, so we can just round what we have.
470 But when X < Y, we don't know anything about the, so to speak,
471 `middle bits', so we have to assume the worst when aligning up from an
472 address mod X to one mod Y, which is Y - X. */
474 #ifndef LABEL_ALIGN
475 #define LABEL_ALIGN(LABEL) align_labels_log
476 #endif
478 #ifndef LOOP_ALIGN
479 #define LOOP_ALIGN(LABEL) align_loops_log
480 #endif
482 #ifndef LABEL_ALIGN_AFTER_BARRIER
483 #define LABEL_ALIGN_AFTER_BARRIER(LABEL) 0
484 #endif
486 #ifndef JUMP_ALIGN
487 #define JUMP_ALIGN(LABEL) align_jumps_log
488 #endif
491 default_label_align_after_barrier_max_skip (rtx_insn *insn ATTRIBUTE_UNUSED)
493 return 0;
497 default_loop_align_max_skip (rtx_insn *insn ATTRIBUTE_UNUSED)
499 return align_loops_max_skip;
503 default_label_align_max_skip (rtx_insn *insn ATTRIBUTE_UNUSED)
505 return align_labels_max_skip;
509 default_jump_align_max_skip (rtx_insn *insn ATTRIBUTE_UNUSED)
511 return align_jumps_max_skip;
514 #ifndef ADDR_VEC_ALIGN
515 static int
516 final_addr_vec_align (rtx addr_vec)
518 int align = GET_MODE_SIZE (GET_MODE (PATTERN (addr_vec)));
520 if (align > BIGGEST_ALIGNMENT / BITS_PER_UNIT)
521 align = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
522 return exact_log2 (align);
526 #define ADDR_VEC_ALIGN(ADDR_VEC) final_addr_vec_align (ADDR_VEC)
527 #endif
529 #ifndef INSN_LENGTH_ALIGNMENT
530 #define INSN_LENGTH_ALIGNMENT(INSN) length_unit_log
531 #endif
533 #define INSN_SHUID(INSN) (uid_shuid[INSN_UID (INSN)])
535 static int min_labelno, max_labelno;
537 #define LABEL_TO_ALIGNMENT(LABEL) \
538 (label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].alignment)
540 #define LABEL_TO_MAX_SKIP(LABEL) \
541 (label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].max_skip)
543 /* For the benefit of port specific code do this also as a function. */
546 label_to_alignment (rtx label)
548 if (CODE_LABEL_NUMBER (label) <= max_labelno)
549 return LABEL_TO_ALIGNMENT (label);
550 return 0;
554 label_to_max_skip (rtx label)
556 if (CODE_LABEL_NUMBER (label) <= max_labelno)
557 return LABEL_TO_MAX_SKIP (label);
558 return 0;
561 /* The differences in addresses
562 between a branch and its target might grow or shrink depending on
563 the alignment the start insn of the range (the branch for a forward
564 branch or the label for a backward branch) starts out on; if these
565 differences are used naively, they can even oscillate infinitely.
566 We therefore want to compute a 'worst case' address difference that
567 is independent of the alignment the start insn of the range end
568 up on, and that is at least as large as the actual difference.
569 The function align_fuzz calculates the amount we have to add to the
570 naively computed difference, by traversing the part of the alignment
571 chain of the start insn of the range that is in front of the end insn
572 of the range, and considering for each alignment the maximum amount
573 that it might contribute to a size increase.
575 For casesi tables, we also want to know worst case minimum amounts of
576 address difference, in case a machine description wants to introduce
577 some common offset that is added to all offsets in a table.
578 For this purpose, align_fuzz with a growth argument of 0 computes the
579 appropriate adjustment. */
581 /* Compute the maximum delta by which the difference of the addresses of
582 START and END might grow / shrink due to a different address for start
583 which changes the size of alignment insns between START and END.
584 KNOWN_ALIGN_LOG is the alignment known for START.
585 GROWTH should be ~0 if the objective is to compute potential code size
586 increase, and 0 if the objective is to compute potential shrink.
587 The return value is undefined for any other value of GROWTH. */
589 static int
590 align_fuzz (rtx start, rtx end, int known_align_log, unsigned int growth)
592 int uid = INSN_UID (start);
593 rtx align_label;
594 int known_align = 1 << known_align_log;
595 int end_shuid = INSN_SHUID (end);
596 int fuzz = 0;
598 for (align_label = uid_align[uid]; align_label; align_label = uid_align[uid])
600 int align_addr, new_align;
602 uid = INSN_UID (align_label);
603 align_addr = INSN_ADDRESSES (uid) - insn_lengths[uid];
604 if (uid_shuid[uid] > end_shuid)
605 break;
606 known_align_log = LABEL_TO_ALIGNMENT (align_label);
607 new_align = 1 << known_align_log;
608 if (new_align < known_align)
609 continue;
610 fuzz += (-align_addr ^ growth) & (new_align - known_align);
611 known_align = new_align;
613 return fuzz;
616 /* Compute a worst-case reference address of a branch so that it
617 can be safely used in the presence of aligned labels. Since the
618 size of the branch itself is unknown, the size of the branch is
619 not included in the range. I.e. for a forward branch, the reference
620 address is the end address of the branch as known from the previous
621 branch shortening pass, minus a value to account for possible size
622 increase due to alignment. For a backward branch, it is the start
623 address of the branch as known from the current pass, plus a value
624 to account for possible size increase due to alignment.
625 NB.: Therefore, the maximum offset allowed for backward branches needs
626 to exclude the branch size. */
629 insn_current_reference_address (rtx_insn *branch)
631 rtx dest;
632 int seq_uid;
634 if (! INSN_ADDRESSES_SET_P ())
635 return 0;
637 rtx_insn *seq = NEXT_INSN (PREV_INSN (branch));
638 seq_uid = INSN_UID (seq);
639 if (!JUMP_P (branch))
640 /* This can happen for example on the PA; the objective is to know the
641 offset to address something in front of the start of the function.
642 Thus, we can treat it like a backward branch.
643 We assume here that FUNCTION_BOUNDARY / BITS_PER_UNIT is larger than
644 any alignment we'd encounter, so we skip the call to align_fuzz. */
645 return insn_current_address;
646 dest = JUMP_LABEL (branch);
648 /* BRANCH has no proper alignment chain set, so use SEQ.
649 BRANCH also has no INSN_SHUID. */
650 if (INSN_SHUID (seq) < INSN_SHUID (dest))
652 /* Forward branch. */
653 return (insn_last_address + insn_lengths[seq_uid]
654 - align_fuzz (seq, dest, length_unit_log, ~0));
656 else
658 /* Backward branch. */
659 return (insn_current_address
660 + align_fuzz (dest, seq, length_unit_log, ~0));
664 /* Compute branch alignments based on frequency information in the
665 CFG. */
667 unsigned int
668 compute_alignments (void)
670 int log, max_skip, max_log;
671 basic_block bb;
672 int freq_max = 0;
673 int freq_threshold = 0;
675 if (label_align)
677 free (label_align);
678 label_align = 0;
681 max_labelno = max_label_num ();
682 min_labelno = get_first_label_num ();
683 label_align = XCNEWVEC (struct label_alignment, max_labelno - min_labelno + 1);
685 /* If not optimizing or optimizing for size, don't assign any alignments. */
686 if (! optimize || optimize_function_for_size_p (cfun))
687 return 0;
689 if (dump_file)
691 dump_reg_info (dump_file);
692 dump_flow_info (dump_file, TDF_DETAILS);
693 flow_loops_dump (dump_file, NULL, 1);
695 loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
696 FOR_EACH_BB_FN (bb, cfun)
697 if (bb->frequency > freq_max)
698 freq_max = bb->frequency;
699 freq_threshold = freq_max / PARAM_VALUE (PARAM_ALIGN_THRESHOLD);
701 if (dump_file)
702 fprintf (dump_file, "freq_max: %i\n",freq_max);
703 FOR_EACH_BB_FN (bb, cfun)
705 rtx_insn *label = BB_HEAD (bb);
706 int fallthru_frequency = 0, branch_frequency = 0, has_fallthru = 0;
707 edge e;
708 edge_iterator ei;
710 if (!LABEL_P (label)
711 || optimize_bb_for_size_p (bb))
713 if (dump_file)
714 fprintf (dump_file,
715 "BB %4i freq %4i loop %2i loop_depth %2i skipped.\n",
716 bb->index, bb->frequency, bb->loop_father->num,
717 bb_loop_depth (bb));
718 continue;
720 max_log = LABEL_ALIGN (label);
721 max_skip = targetm.asm_out.label_align_max_skip (label);
723 FOR_EACH_EDGE (e, ei, bb->preds)
725 if (e->flags & EDGE_FALLTHRU)
726 has_fallthru = 1, fallthru_frequency += EDGE_FREQUENCY (e);
727 else
728 branch_frequency += EDGE_FREQUENCY (e);
730 if (dump_file)
732 fprintf (dump_file, "BB %4i freq %4i loop %2i loop_depth"
733 " %2i fall %4i branch %4i",
734 bb->index, bb->frequency, bb->loop_father->num,
735 bb_loop_depth (bb),
736 fallthru_frequency, branch_frequency);
737 if (!bb->loop_father->inner && bb->loop_father->num)
738 fprintf (dump_file, " inner_loop");
739 if (bb->loop_father->header == bb)
740 fprintf (dump_file, " loop_header");
741 fprintf (dump_file, "\n");
744 /* There are two purposes to align block with no fallthru incoming edge:
745 1) to avoid fetch stalls when branch destination is near cache boundary
746 2) to improve cache efficiency in case the previous block is not executed
747 (so it does not need to be in the cache).
749 We to catch first case, we align frequently executed blocks.
750 To catch the second, we align blocks that are executed more frequently
751 than the predecessor and the predecessor is likely to not be executed
752 when function is called. */
754 if (!has_fallthru
755 && (branch_frequency > freq_threshold
756 || (bb->frequency > bb->prev_bb->frequency * 10
757 && (bb->prev_bb->frequency
758 <= ENTRY_BLOCK_PTR_FOR_FN (cfun)->frequency / 2))))
760 log = JUMP_ALIGN (label);
761 if (dump_file)
762 fprintf (dump_file, " jump alignment added.\n");
763 if (max_log < log)
765 max_log = log;
766 max_skip = targetm.asm_out.jump_align_max_skip (label);
769 /* In case block is frequent and reached mostly by non-fallthru edge,
770 align it. It is most likely a first block of loop. */
771 if (has_fallthru
772 && !(single_succ_p (bb)
773 && single_succ (bb) == EXIT_BLOCK_PTR_FOR_FN (cfun))
774 && optimize_bb_for_speed_p (bb)
775 && branch_frequency + fallthru_frequency > freq_threshold
776 && (branch_frequency
777 > fallthru_frequency * PARAM_VALUE (PARAM_ALIGN_LOOP_ITERATIONS)))
779 log = LOOP_ALIGN (label);
780 if (dump_file)
781 fprintf (dump_file, " internal loop alignment added.\n");
782 if (max_log < log)
784 max_log = log;
785 max_skip = targetm.asm_out.loop_align_max_skip (label);
788 LABEL_TO_ALIGNMENT (label) = max_log;
789 LABEL_TO_MAX_SKIP (label) = max_skip;
792 loop_optimizer_finalize ();
793 free_dominance_info (CDI_DOMINATORS);
794 return 0;
797 /* Grow the LABEL_ALIGN array after new labels are created. */
799 static void
800 grow_label_align (void)
802 int old = max_labelno;
803 int n_labels;
804 int n_old_labels;
806 max_labelno = max_label_num ();
808 n_labels = max_labelno - min_labelno + 1;
809 n_old_labels = old - min_labelno + 1;
811 label_align = XRESIZEVEC (struct label_alignment, label_align, n_labels);
813 /* Range of labels grows monotonically in the function. Failing here
814 means that the initialization of array got lost. */
815 gcc_assert (n_old_labels <= n_labels);
817 memset (label_align + n_old_labels, 0,
818 (n_labels - n_old_labels) * sizeof (struct label_alignment));
821 /* Update the already computed alignment information. LABEL_PAIRS is a vector
822 made up of pairs of labels for which the alignment information of the first
823 element will be copied from that of the second element. */
825 void
826 update_alignments (vec<rtx> &label_pairs)
828 unsigned int i = 0;
829 rtx iter, label = NULL_RTX;
831 if (max_labelno != max_label_num ())
832 grow_label_align ();
834 FOR_EACH_VEC_ELT (label_pairs, i, iter)
835 if (i & 1)
837 LABEL_TO_ALIGNMENT (label) = LABEL_TO_ALIGNMENT (iter);
838 LABEL_TO_MAX_SKIP (label) = LABEL_TO_MAX_SKIP (iter);
840 else
841 label = iter;
844 namespace {
846 const pass_data pass_data_compute_alignments =
848 RTL_PASS, /* type */
849 "alignments", /* name */
850 OPTGROUP_NONE, /* optinfo_flags */
851 TV_NONE, /* tv_id */
852 0, /* properties_required */
853 0, /* properties_provided */
854 0, /* properties_destroyed */
855 0, /* todo_flags_start */
856 0, /* todo_flags_finish */
859 class pass_compute_alignments : public rtl_opt_pass
861 public:
862 pass_compute_alignments (gcc::context *ctxt)
863 : rtl_opt_pass (pass_data_compute_alignments, ctxt)
866 /* opt_pass methods: */
867 virtual unsigned int execute (function *) { return compute_alignments (); }
869 }; // class pass_compute_alignments
871 } // anon namespace
873 rtl_opt_pass *
874 make_pass_compute_alignments (gcc::context *ctxt)
876 return new pass_compute_alignments (ctxt);
880 /* Make a pass over all insns and compute their actual lengths by shortening
881 any branches of variable length if possible. */
883 /* shorten_branches might be called multiple times: for example, the SH
884 port splits out-of-range conditional branches in MACHINE_DEPENDENT_REORG.
885 In order to do this, it needs proper length information, which it obtains
886 by calling shorten_branches. This cannot be collapsed with
887 shorten_branches itself into a single pass unless we also want to integrate
888 reorg.c, since the branch splitting exposes new instructions with delay
889 slots. */
891 void
892 shorten_branches (rtx_insn *first)
894 rtx_insn *insn;
895 int max_uid;
896 int i;
897 int max_log;
898 int max_skip;
899 #define MAX_CODE_ALIGN 16
900 rtx_insn *seq;
901 int something_changed = 1;
902 char *varying_length;
903 rtx body;
904 int uid;
905 rtx align_tab[MAX_CODE_ALIGN];
907 /* Compute maximum UID and allocate label_align / uid_shuid. */
908 max_uid = get_max_uid ();
910 /* Free uid_shuid before reallocating it. */
911 free (uid_shuid);
913 uid_shuid = XNEWVEC (int, max_uid);
915 if (max_labelno != max_label_num ())
916 grow_label_align ();
918 /* Initialize label_align and set up uid_shuid to be strictly
919 monotonically rising with insn order. */
920 /* We use max_log here to keep track of the maximum alignment we want to
921 impose on the next CODE_LABEL (or the current one if we are processing
922 the CODE_LABEL itself). */
924 max_log = 0;
925 max_skip = 0;
927 for (insn = get_insns (), i = 1; insn; insn = NEXT_INSN (insn))
929 int log;
931 INSN_SHUID (insn) = i++;
932 if (INSN_P (insn))
933 continue;
935 if (LABEL_P (insn))
937 rtx_insn *next;
938 bool next_is_jumptable;
940 /* Merge in alignments computed by compute_alignments. */
941 log = LABEL_TO_ALIGNMENT (insn);
942 if (max_log < log)
944 max_log = log;
945 max_skip = LABEL_TO_MAX_SKIP (insn);
948 next = next_nonnote_insn (insn);
949 next_is_jumptable = next && JUMP_TABLE_DATA_P (next);
950 if (!next_is_jumptable)
952 log = LABEL_ALIGN (insn);
953 if (max_log < log)
955 max_log = log;
956 max_skip = targetm.asm_out.label_align_max_skip (insn);
959 /* ADDR_VECs only take room if read-only data goes into the text
960 section. */
961 if ((JUMP_TABLES_IN_TEXT_SECTION
962 || readonly_data_section == text_section)
963 && next_is_jumptable)
965 log = ADDR_VEC_ALIGN (next);
966 if (max_log < log)
968 max_log = log;
969 max_skip = targetm.asm_out.label_align_max_skip (insn);
972 LABEL_TO_ALIGNMENT (insn) = max_log;
973 LABEL_TO_MAX_SKIP (insn) = max_skip;
974 max_log = 0;
975 max_skip = 0;
977 else if (BARRIER_P (insn))
979 rtx_insn *label;
981 for (label = insn; label && ! INSN_P (label);
982 label = NEXT_INSN (label))
983 if (LABEL_P (label))
985 log = LABEL_ALIGN_AFTER_BARRIER (insn);
986 if (max_log < log)
988 max_log = log;
989 max_skip = targetm.asm_out.label_align_after_barrier_max_skip (label);
991 break;
995 if (!HAVE_ATTR_length)
996 return;
998 /* Allocate the rest of the arrays. */
999 insn_lengths = XNEWVEC (int, max_uid);
1000 insn_lengths_max_uid = max_uid;
1001 /* Syntax errors can lead to labels being outside of the main insn stream.
1002 Initialize insn_addresses, so that we get reproducible results. */
1003 INSN_ADDRESSES_ALLOC (max_uid);
1005 varying_length = XCNEWVEC (char, max_uid);
1007 /* Initialize uid_align. We scan instructions
1008 from end to start, and keep in align_tab[n] the last seen insn
1009 that does an alignment of at least n+1, i.e. the successor
1010 in the alignment chain for an insn that does / has a known
1011 alignment of n. */
1012 uid_align = XCNEWVEC (rtx, max_uid);
1014 for (i = MAX_CODE_ALIGN; --i >= 0;)
1015 align_tab[i] = NULL_RTX;
1016 seq = get_last_insn ();
1017 for (; seq; seq = PREV_INSN (seq))
1019 int uid = INSN_UID (seq);
1020 int log;
1021 log = (LABEL_P (seq) ? LABEL_TO_ALIGNMENT (seq) : 0);
1022 uid_align[uid] = align_tab[0];
1023 if (log)
1025 /* Found an alignment label. */
1026 uid_align[uid] = align_tab[log];
1027 for (i = log - 1; i >= 0; i--)
1028 align_tab[i] = seq;
1032 /* When optimizing, we start assuming minimum length, and keep increasing
1033 lengths as we find the need for this, till nothing changes.
1034 When not optimizing, we start assuming maximum lengths, and
1035 do a single pass to update the lengths. */
1036 bool increasing = optimize != 0;
1038 #ifdef CASE_VECTOR_SHORTEN_MODE
1039 if (optimize)
1041 /* Look for ADDR_DIFF_VECs, and initialize their minimum and maximum
1042 label fields. */
1044 int min_shuid = INSN_SHUID (get_insns ()) - 1;
1045 int max_shuid = INSN_SHUID (get_last_insn ()) + 1;
1046 int rel;
1048 for (insn = first; insn != 0; insn = NEXT_INSN (insn))
1050 rtx min_lab = NULL_RTX, max_lab = NULL_RTX, pat;
1051 int len, i, min, max, insn_shuid;
1052 int min_align;
1053 addr_diff_vec_flags flags;
1055 if (! JUMP_TABLE_DATA_P (insn)
1056 || GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
1057 continue;
1058 pat = PATTERN (insn);
1059 len = XVECLEN (pat, 1);
1060 gcc_assert (len > 0);
1061 min_align = MAX_CODE_ALIGN;
1062 for (min = max_shuid, max = min_shuid, i = len - 1; i >= 0; i--)
1064 rtx lab = XEXP (XVECEXP (pat, 1, i), 0);
1065 int shuid = INSN_SHUID (lab);
1066 if (shuid < min)
1068 min = shuid;
1069 min_lab = lab;
1071 if (shuid > max)
1073 max = shuid;
1074 max_lab = lab;
1076 if (min_align > LABEL_TO_ALIGNMENT (lab))
1077 min_align = LABEL_TO_ALIGNMENT (lab);
1079 XEXP (pat, 2) = gen_rtx_LABEL_REF (Pmode, min_lab);
1080 XEXP (pat, 3) = gen_rtx_LABEL_REF (Pmode, max_lab);
1081 insn_shuid = INSN_SHUID (insn);
1082 rel = INSN_SHUID (XEXP (XEXP (pat, 0), 0));
1083 memset (&flags, 0, sizeof (flags));
1084 flags.min_align = min_align;
1085 flags.base_after_vec = rel > insn_shuid;
1086 flags.min_after_vec = min > insn_shuid;
1087 flags.max_after_vec = max > insn_shuid;
1088 flags.min_after_base = min > rel;
1089 flags.max_after_base = max > rel;
1090 ADDR_DIFF_VEC_FLAGS (pat) = flags;
1092 if (increasing)
1093 PUT_MODE (pat, CASE_VECTOR_SHORTEN_MODE (0, 0, pat));
1096 #endif /* CASE_VECTOR_SHORTEN_MODE */
1098 /* Compute initial lengths, addresses, and varying flags for each insn. */
1099 int (*length_fun) (rtx_insn *) = increasing ? insn_min_length : insn_default_length;
1101 for (insn_current_address = 0, insn = first;
1102 insn != 0;
1103 insn_current_address += insn_lengths[uid], insn = NEXT_INSN (insn))
1105 uid = INSN_UID (insn);
1107 insn_lengths[uid] = 0;
1109 if (LABEL_P (insn))
1111 int log = LABEL_TO_ALIGNMENT (insn);
1112 if (log)
1114 int align = 1 << log;
1115 int new_address = (insn_current_address + align - 1) & -align;
1116 insn_lengths[uid] = new_address - insn_current_address;
1120 INSN_ADDRESSES (uid) = insn_current_address + insn_lengths[uid];
1122 if (NOTE_P (insn) || BARRIER_P (insn)
1123 || LABEL_P (insn) || DEBUG_INSN_P (insn))
1124 continue;
1125 if (insn->deleted ())
1126 continue;
1128 body = PATTERN (insn);
1129 if (JUMP_TABLE_DATA_P (insn))
1131 /* This only takes room if read-only data goes into the text
1132 section. */
1133 if (JUMP_TABLES_IN_TEXT_SECTION
1134 || readonly_data_section == text_section)
1135 insn_lengths[uid] = (XVECLEN (body,
1136 GET_CODE (body) == ADDR_DIFF_VEC)
1137 * GET_MODE_SIZE (GET_MODE (body)));
1138 /* Alignment is handled by ADDR_VEC_ALIGN. */
1140 else if (GET_CODE (body) == ASM_INPUT || asm_noperands (body) >= 0)
1141 insn_lengths[uid] = asm_insn_count (body) * insn_default_length (insn);
1142 else if (rtx_sequence *body_seq = dyn_cast <rtx_sequence *> (body))
1144 int i;
1145 int const_delay_slots;
1146 if (DELAY_SLOTS)
1147 const_delay_slots = const_num_delay_slots (body_seq->insn (0));
1148 else
1149 const_delay_slots = 0;
1151 int (*inner_length_fun) (rtx_insn *)
1152 = const_delay_slots ? length_fun : insn_default_length;
1153 /* Inside a delay slot sequence, we do not do any branch shortening
1154 if the shortening could change the number of delay slots
1155 of the branch. */
1156 for (i = 0; i < body_seq->len (); i++)
1158 rtx_insn *inner_insn = body_seq->insn (i);
1159 int inner_uid = INSN_UID (inner_insn);
1160 int inner_length;
1162 if (GET_CODE (PATTERN (inner_insn)) == ASM_INPUT
1163 || asm_noperands (PATTERN (inner_insn)) >= 0)
1164 inner_length = (asm_insn_count (PATTERN (inner_insn))
1165 * insn_default_length (inner_insn));
1166 else
1167 inner_length = inner_length_fun (inner_insn);
1169 insn_lengths[inner_uid] = inner_length;
1170 if (const_delay_slots)
1172 if ((varying_length[inner_uid]
1173 = insn_variable_length_p (inner_insn)) != 0)
1174 varying_length[uid] = 1;
1175 INSN_ADDRESSES (inner_uid) = (insn_current_address
1176 + insn_lengths[uid]);
1178 else
1179 varying_length[inner_uid] = 0;
1180 insn_lengths[uid] += inner_length;
1183 else if (GET_CODE (body) != USE && GET_CODE (body) != CLOBBER)
1185 insn_lengths[uid] = length_fun (insn);
1186 varying_length[uid] = insn_variable_length_p (insn);
1189 /* If needed, do any adjustment. */
1190 #ifdef ADJUST_INSN_LENGTH
1191 ADJUST_INSN_LENGTH (insn, insn_lengths[uid]);
1192 if (insn_lengths[uid] < 0)
1193 fatal_insn ("negative insn length", insn);
1194 #endif
1197 /* Now loop over all the insns finding varying length insns. For each,
1198 get the current insn length. If it has changed, reflect the change.
1199 When nothing changes for a full pass, we are done. */
1201 while (something_changed)
1203 something_changed = 0;
1204 insn_current_align = MAX_CODE_ALIGN - 1;
1205 for (insn_current_address = 0, insn = first;
1206 insn != 0;
1207 insn = NEXT_INSN (insn))
1209 int new_length;
1210 #ifdef ADJUST_INSN_LENGTH
1211 int tmp_length;
1212 #endif
1213 int length_align;
1215 uid = INSN_UID (insn);
1217 if (LABEL_P (insn))
1219 int log = LABEL_TO_ALIGNMENT (insn);
1221 #ifdef CASE_VECTOR_SHORTEN_MODE
1222 /* If the mode of a following jump table was changed, we
1223 may need to update the alignment of this label. */
1224 rtx_insn *next;
1225 bool next_is_jumptable;
1227 next = next_nonnote_insn (insn);
1228 next_is_jumptable = next && JUMP_TABLE_DATA_P (next);
1229 if ((JUMP_TABLES_IN_TEXT_SECTION
1230 || readonly_data_section == text_section)
1231 && next_is_jumptable)
1233 int newlog = ADDR_VEC_ALIGN (next);
1234 if (newlog != log)
1236 log = newlog;
1237 LABEL_TO_ALIGNMENT (insn) = log;
1238 something_changed = 1;
1241 #endif
1243 if (log > insn_current_align)
1245 int align = 1 << log;
1246 int new_address= (insn_current_address + align - 1) & -align;
1247 insn_lengths[uid] = new_address - insn_current_address;
1248 insn_current_align = log;
1249 insn_current_address = new_address;
1251 else
1252 insn_lengths[uid] = 0;
1253 INSN_ADDRESSES (uid) = insn_current_address;
1254 continue;
1257 length_align = INSN_LENGTH_ALIGNMENT (insn);
1258 if (length_align < insn_current_align)
1259 insn_current_align = length_align;
1261 insn_last_address = INSN_ADDRESSES (uid);
1262 INSN_ADDRESSES (uid) = insn_current_address;
1264 #ifdef CASE_VECTOR_SHORTEN_MODE
1265 if (optimize
1266 && JUMP_TABLE_DATA_P (insn)
1267 && GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
1269 rtx body = PATTERN (insn);
1270 int old_length = insn_lengths[uid];
1271 rtx_insn *rel_lab =
1272 safe_as_a <rtx_insn *> (XEXP (XEXP (body, 0), 0));
1273 rtx min_lab = XEXP (XEXP (body, 2), 0);
1274 rtx max_lab = XEXP (XEXP (body, 3), 0);
1275 int rel_addr = INSN_ADDRESSES (INSN_UID (rel_lab));
1276 int min_addr = INSN_ADDRESSES (INSN_UID (min_lab));
1277 int max_addr = INSN_ADDRESSES (INSN_UID (max_lab));
1278 rtx_insn *prev;
1279 int rel_align = 0;
1280 addr_diff_vec_flags flags;
1281 machine_mode vec_mode;
1283 /* Avoid automatic aggregate initialization. */
1284 flags = ADDR_DIFF_VEC_FLAGS (body);
1286 /* Try to find a known alignment for rel_lab. */
1287 for (prev = rel_lab;
1288 prev
1289 && ! insn_lengths[INSN_UID (prev)]
1290 && ! (varying_length[INSN_UID (prev)] & 1);
1291 prev = PREV_INSN (prev))
1292 if (varying_length[INSN_UID (prev)] & 2)
1294 rel_align = LABEL_TO_ALIGNMENT (prev);
1295 break;
1298 /* See the comment on addr_diff_vec_flags in rtl.h for the
1299 meaning of the flags values. base: REL_LAB vec: INSN */
1300 /* Anything after INSN has still addresses from the last
1301 pass; adjust these so that they reflect our current
1302 estimate for this pass. */
1303 if (flags.base_after_vec)
1304 rel_addr += insn_current_address - insn_last_address;
1305 if (flags.min_after_vec)
1306 min_addr += insn_current_address - insn_last_address;
1307 if (flags.max_after_vec)
1308 max_addr += insn_current_address - insn_last_address;
1309 /* We want to know the worst case, i.e. lowest possible value
1310 for the offset of MIN_LAB. If MIN_LAB is after REL_LAB,
1311 its offset is positive, and we have to be wary of code shrink;
1312 otherwise, it is negative, and we have to be vary of code
1313 size increase. */
1314 if (flags.min_after_base)
1316 /* If INSN is between REL_LAB and MIN_LAB, the size
1317 changes we are about to make can change the alignment
1318 within the observed offset, therefore we have to break
1319 it up into two parts that are independent. */
1320 if (! flags.base_after_vec && flags.min_after_vec)
1322 min_addr -= align_fuzz (rel_lab, insn, rel_align, 0);
1323 min_addr -= align_fuzz (insn, min_lab, 0, 0);
1325 else
1326 min_addr -= align_fuzz (rel_lab, min_lab, rel_align, 0);
1328 else
1330 if (flags.base_after_vec && ! flags.min_after_vec)
1332 min_addr -= align_fuzz (min_lab, insn, 0, ~0);
1333 min_addr -= align_fuzz (insn, rel_lab, 0, ~0);
1335 else
1336 min_addr -= align_fuzz (min_lab, rel_lab, 0, ~0);
1338 /* Likewise, determine the highest lowest possible value
1339 for the offset of MAX_LAB. */
1340 if (flags.max_after_base)
1342 if (! flags.base_after_vec && flags.max_after_vec)
1344 max_addr += align_fuzz (rel_lab, insn, rel_align, ~0);
1345 max_addr += align_fuzz (insn, max_lab, 0, ~0);
1347 else
1348 max_addr += align_fuzz (rel_lab, max_lab, rel_align, ~0);
1350 else
1352 if (flags.base_after_vec && ! flags.max_after_vec)
1354 max_addr += align_fuzz (max_lab, insn, 0, 0);
1355 max_addr += align_fuzz (insn, rel_lab, 0, 0);
1357 else
1358 max_addr += align_fuzz (max_lab, rel_lab, 0, 0);
1360 vec_mode = CASE_VECTOR_SHORTEN_MODE (min_addr - rel_addr,
1361 max_addr - rel_addr, body);
1362 if (!increasing
1363 || (GET_MODE_SIZE (vec_mode)
1364 >= GET_MODE_SIZE (GET_MODE (body))))
1365 PUT_MODE (body, vec_mode);
1366 if (JUMP_TABLES_IN_TEXT_SECTION
1367 || readonly_data_section == text_section)
1369 insn_lengths[uid]
1370 = (XVECLEN (body, 1) * GET_MODE_SIZE (GET_MODE (body)));
1371 insn_current_address += insn_lengths[uid];
1372 if (insn_lengths[uid] != old_length)
1373 something_changed = 1;
1376 continue;
1378 #endif /* CASE_VECTOR_SHORTEN_MODE */
1380 if (! (varying_length[uid]))
1382 if (NONJUMP_INSN_P (insn)
1383 && GET_CODE (PATTERN (insn)) == SEQUENCE)
1385 int i;
1387 body = PATTERN (insn);
1388 for (i = 0; i < XVECLEN (body, 0); i++)
1390 rtx inner_insn = XVECEXP (body, 0, i);
1391 int inner_uid = INSN_UID (inner_insn);
1393 INSN_ADDRESSES (inner_uid) = insn_current_address;
1395 insn_current_address += insn_lengths[inner_uid];
1398 else
1399 insn_current_address += insn_lengths[uid];
1401 continue;
1404 if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
1406 rtx_sequence *seqn = as_a <rtx_sequence *> (PATTERN (insn));
1407 int i;
1409 body = PATTERN (insn);
1410 new_length = 0;
1411 for (i = 0; i < seqn->len (); i++)
1413 rtx_insn *inner_insn = seqn->insn (i);
1414 int inner_uid = INSN_UID (inner_insn);
1415 int inner_length;
1417 INSN_ADDRESSES (inner_uid) = insn_current_address;
1419 /* insn_current_length returns 0 for insns with a
1420 non-varying length. */
1421 if (! varying_length[inner_uid])
1422 inner_length = insn_lengths[inner_uid];
1423 else
1424 inner_length = insn_current_length (inner_insn);
1426 if (inner_length != insn_lengths[inner_uid])
1428 if (!increasing || inner_length > insn_lengths[inner_uid])
1430 insn_lengths[inner_uid] = inner_length;
1431 something_changed = 1;
1433 else
1434 inner_length = insn_lengths[inner_uid];
1436 insn_current_address += inner_length;
1437 new_length += inner_length;
1440 else
1442 new_length = insn_current_length (insn);
1443 insn_current_address += new_length;
1446 #ifdef ADJUST_INSN_LENGTH
1447 /* If needed, do any adjustment. */
1448 tmp_length = new_length;
1449 ADJUST_INSN_LENGTH (insn, new_length);
1450 insn_current_address += (new_length - tmp_length);
1451 #endif
1453 if (new_length != insn_lengths[uid]
1454 && (!increasing || new_length > insn_lengths[uid]))
1456 insn_lengths[uid] = new_length;
1457 something_changed = 1;
1459 else
1460 insn_current_address += insn_lengths[uid] - new_length;
1462 /* For a non-optimizing compile, do only a single pass. */
1463 if (!increasing)
1464 break;
1467 free (varying_length);
1470 /* Given the body of an INSN known to be generated by an ASM statement, return
1471 the number of machine instructions likely to be generated for this insn.
1472 This is used to compute its length. */
1474 static int
1475 asm_insn_count (rtx body)
1477 const char *templ;
1479 if (GET_CODE (body) == ASM_INPUT)
1480 templ = XSTR (body, 0);
1481 else
1482 templ = decode_asm_operands (body, NULL, NULL, NULL, NULL, NULL);
1484 return asm_str_count (templ);
1487 /* Return the number of machine instructions likely to be generated for the
1488 inline-asm template. */
1490 asm_str_count (const char *templ)
1492 int count = 1;
1494 if (!*templ)
1495 return 0;
1497 for (; *templ; templ++)
1498 if (IS_ASM_LOGICAL_LINE_SEPARATOR (*templ, templ)
1499 || *templ == '\n')
1500 count++;
1502 return count;
1505 /* ??? This is probably the wrong place for these. */
1506 /* Structure recording the mapping from source file and directory
1507 names at compile time to those to be embedded in debug
1508 information. */
1509 struct debug_prefix_map
1511 const char *old_prefix;
1512 const char *new_prefix;
1513 size_t old_len;
1514 size_t new_len;
1515 struct debug_prefix_map *next;
1518 /* Linked list of such structures. */
1519 static debug_prefix_map *debug_prefix_maps;
1522 /* Record a debug file prefix mapping. ARG is the argument to
1523 -fdebug-prefix-map and must be of the form OLD=NEW. */
1525 void
1526 add_debug_prefix_map (const char *arg)
1528 debug_prefix_map *map;
1529 const char *p;
1531 p = strchr (arg, '=');
1532 if (!p)
1534 error ("invalid argument %qs to -fdebug-prefix-map", arg);
1535 return;
1537 map = XNEW (debug_prefix_map);
1538 map->old_prefix = xstrndup (arg, p - arg);
1539 map->old_len = p - arg;
1540 p++;
1541 map->new_prefix = xstrdup (p);
1542 map->new_len = strlen (p);
1543 map->next = debug_prefix_maps;
1544 debug_prefix_maps = map;
1547 /* Perform user-specified mapping of debug filename prefixes. Return
1548 the new name corresponding to FILENAME. */
1550 const char *
1551 remap_debug_filename (const char *filename)
1553 debug_prefix_map *map;
1554 char *s;
1555 const char *name;
1556 size_t name_len;
1558 for (map = debug_prefix_maps; map; map = map->next)
1559 if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0)
1560 break;
1561 if (!map)
1562 return filename;
1563 name = filename + map->old_len;
1564 name_len = strlen (name) + 1;
1565 s = (char *) alloca (name_len + map->new_len);
1566 memcpy (s, map->new_prefix, map->new_len);
1567 memcpy (s + map->new_len, name, name_len);
1568 return ggc_strdup (s);
1571 /* Return true if DWARF2 debug info can be emitted for DECL. */
1573 static bool
1574 dwarf2_debug_info_emitted_p (tree decl)
1576 if (write_symbols != DWARF2_DEBUG && write_symbols != VMS_AND_DWARF2_DEBUG)
1577 return false;
1579 if (DECL_IGNORED_P (decl))
1580 return false;
1582 return true;
1585 /* Return scope resulting from combination of S1 and S2. */
1586 static tree
1587 choose_inner_scope (tree s1, tree s2)
1589 if (!s1)
1590 return s2;
1591 if (!s2)
1592 return s1;
1593 if (BLOCK_NUMBER (s1) > BLOCK_NUMBER (s2))
1594 return s1;
1595 return s2;
1598 /* Emit lexical block notes needed to change scope from S1 to S2. */
1600 static void
1601 change_scope (rtx_insn *orig_insn, tree s1, tree s2)
1603 rtx_insn *insn = orig_insn;
1604 tree com = NULL_TREE;
1605 tree ts1 = s1, ts2 = s2;
1606 tree s;
1608 while (ts1 != ts2)
1610 gcc_assert (ts1 && ts2);
1611 if (BLOCK_NUMBER (ts1) > BLOCK_NUMBER (ts2))
1612 ts1 = BLOCK_SUPERCONTEXT (ts1);
1613 else if (BLOCK_NUMBER (ts1) < BLOCK_NUMBER (ts2))
1614 ts2 = BLOCK_SUPERCONTEXT (ts2);
1615 else
1617 ts1 = BLOCK_SUPERCONTEXT (ts1);
1618 ts2 = BLOCK_SUPERCONTEXT (ts2);
1621 com = ts1;
1623 /* Close scopes. */
1624 s = s1;
1625 while (s != com)
1627 rtx_note *note = emit_note_before (NOTE_INSN_BLOCK_END, insn);
1628 NOTE_BLOCK (note) = s;
1629 s = BLOCK_SUPERCONTEXT (s);
1632 /* Open scopes. */
1633 s = s2;
1634 while (s != com)
1636 insn = emit_note_before (NOTE_INSN_BLOCK_BEG, insn);
1637 NOTE_BLOCK (insn) = s;
1638 s = BLOCK_SUPERCONTEXT (s);
1642 /* Rebuild all the NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes based
1643 on the scope tree and the newly reordered instructions. */
1645 static void
1646 reemit_insn_block_notes (void)
1648 tree cur_block = DECL_INITIAL (cfun->decl);
1649 rtx_insn *insn;
1650 rtx_note *note;
1652 insn = get_insns ();
1653 for (; insn; insn = NEXT_INSN (insn))
1655 tree this_block;
1657 /* Prevent lexical blocks from straddling section boundaries. */
1658 if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
1660 for (tree s = cur_block; s != DECL_INITIAL (cfun->decl);
1661 s = BLOCK_SUPERCONTEXT (s))
1663 rtx_note *note = emit_note_before (NOTE_INSN_BLOCK_END, insn);
1664 NOTE_BLOCK (note) = s;
1665 note = emit_note_after (NOTE_INSN_BLOCK_BEG, insn);
1666 NOTE_BLOCK (note) = s;
1670 if (!active_insn_p (insn))
1671 continue;
1673 /* Avoid putting scope notes between jump table and its label. */
1674 if (JUMP_TABLE_DATA_P (insn))
1675 continue;
1677 this_block = insn_scope (insn);
1678 /* For sequences compute scope resulting from merging all scopes
1679 of instructions nested inside. */
1680 if (rtx_sequence *body = dyn_cast <rtx_sequence *> (PATTERN (insn)))
1682 int i;
1684 this_block = NULL;
1685 for (i = 0; i < body->len (); i++)
1686 this_block = choose_inner_scope (this_block,
1687 insn_scope (body->insn (i)));
1689 if (! this_block)
1691 if (INSN_LOCATION (insn) == UNKNOWN_LOCATION)
1692 continue;
1693 else
1694 this_block = DECL_INITIAL (cfun->decl);
1697 if (this_block != cur_block)
1699 change_scope (insn, cur_block, this_block);
1700 cur_block = this_block;
1704 /* change_scope emits before the insn, not after. */
1705 note = emit_note (NOTE_INSN_DELETED);
1706 change_scope (note, cur_block, DECL_INITIAL (cfun->decl));
1707 delete_insn (note);
1709 reorder_blocks ();
1712 static const char *some_local_dynamic_name;
1714 /* Locate some local-dynamic symbol still in use by this function
1715 so that we can print its name in local-dynamic base patterns.
1716 Return null if there are no local-dynamic references. */
1718 const char *
1719 get_some_local_dynamic_name ()
1721 subrtx_iterator::array_type array;
1722 rtx_insn *insn;
1724 if (some_local_dynamic_name)
1725 return some_local_dynamic_name;
1727 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
1728 if (NONDEBUG_INSN_P (insn))
1729 FOR_EACH_SUBRTX (iter, array, PATTERN (insn), ALL)
1731 const_rtx x = *iter;
1732 if (GET_CODE (x) == SYMBOL_REF)
1734 if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
1735 return some_local_dynamic_name = XSTR (x, 0);
1736 if (CONSTANT_POOL_ADDRESS_P (x))
1737 iter.substitute (get_pool_constant (x));
1741 return 0;
1744 /* Output assembler code for the start of a function,
1745 and initialize some of the variables in this file
1746 for the new function. The label for the function and associated
1747 assembler pseudo-ops have already been output in `assemble_start_function'.
1749 FIRST is the first insn of the rtl for the function being compiled.
1750 FILE is the file to write assembler code to.
1751 OPTIMIZE_P is nonzero if we should eliminate redundant
1752 test and compare insns. */
1754 void
1755 final_start_function (rtx_insn *first, FILE *file,
1756 int optimize_p ATTRIBUTE_UNUSED)
1758 block_depth = 0;
1760 this_is_asm_operands = 0;
1762 need_profile_function = false;
1764 last_filename = LOCATION_FILE (prologue_location);
1765 last_linenum = LOCATION_LINE (prologue_location);
1766 last_discriminator = discriminator = 0;
1768 high_block_linenum = high_function_linenum = last_linenum;
1770 if (flag_sanitize & SANITIZE_ADDRESS)
1771 asan_function_start ();
1773 if (!DECL_IGNORED_P (current_function_decl))
1774 debug_hooks->begin_prologue (last_linenum, last_filename);
1776 if (!dwarf2_debug_info_emitted_p (current_function_decl))
1777 dwarf2out_begin_prologue (0, NULL);
1779 #ifdef LEAF_REG_REMAP
1780 if (crtl->uses_only_leaf_regs)
1781 leaf_renumber_regs (first);
1782 #endif
1784 /* The Sun386i and perhaps other machines don't work right
1785 if the profiling code comes after the prologue. */
1786 if (targetm.profile_before_prologue () && crtl->profile)
1788 if (targetm.asm_out.function_prologue == default_function_pro_epilogue
1789 && targetm.have_prologue ())
1791 rtx_insn *insn;
1792 for (insn = first; insn; insn = NEXT_INSN (insn))
1793 if (!NOTE_P (insn))
1795 insn = NULL;
1796 break;
1798 else if (NOTE_KIND (insn) == NOTE_INSN_BASIC_BLOCK
1799 || NOTE_KIND (insn) == NOTE_INSN_FUNCTION_BEG)
1800 break;
1801 else if (NOTE_KIND (insn) == NOTE_INSN_DELETED
1802 || NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION)
1803 continue;
1804 else
1806 insn = NULL;
1807 break;
1810 if (insn)
1811 need_profile_function = true;
1812 else
1813 profile_function (file);
1815 else
1816 profile_function (file);
1819 /* If debugging, assign block numbers to all of the blocks in this
1820 function. */
1821 if (write_symbols)
1823 reemit_insn_block_notes ();
1824 number_blocks (current_function_decl);
1825 /* We never actually put out begin/end notes for the top-level
1826 block in the function. But, conceptually, that block is
1827 always needed. */
1828 TREE_ASM_WRITTEN (DECL_INITIAL (current_function_decl)) = 1;
1831 if (warn_frame_larger_than
1832 && get_frame_size () > frame_larger_than_size)
1834 /* Issue a warning */
1835 warning (OPT_Wframe_larger_than_,
1836 "the frame size of %wd bytes is larger than %wd bytes",
1837 get_frame_size (), frame_larger_than_size);
1840 /* First output the function prologue: code to set up the stack frame. */
1841 targetm.asm_out.function_prologue (file, get_frame_size ());
1843 /* If the machine represents the prologue as RTL, the profiling code must
1844 be emitted when NOTE_INSN_PROLOGUE_END is scanned. */
1845 if (! targetm.have_prologue ())
1846 profile_after_prologue (file);
1849 static void
1850 profile_after_prologue (FILE *file ATTRIBUTE_UNUSED)
1852 if (!targetm.profile_before_prologue () && crtl->profile)
1853 profile_function (file);
1856 static void
1857 profile_function (FILE *file ATTRIBUTE_UNUSED)
1859 #ifndef NO_PROFILE_COUNTERS
1860 # define NO_PROFILE_COUNTERS 0
1861 #endif
1862 #ifdef ASM_OUTPUT_REG_PUSH
1863 rtx sval = NULL, chain = NULL;
1865 if (cfun->returns_struct)
1866 sval = targetm.calls.struct_value_rtx (TREE_TYPE (current_function_decl),
1867 true);
1868 if (cfun->static_chain_decl)
1869 chain = targetm.calls.static_chain (current_function_decl, true);
1870 #endif /* ASM_OUTPUT_REG_PUSH */
1872 if (! NO_PROFILE_COUNTERS)
1874 int align = MIN (BIGGEST_ALIGNMENT, LONG_TYPE_SIZE);
1875 switch_to_section (data_section);
1876 ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
1877 targetm.asm_out.internal_label (file, "LP", current_function_funcdef_no);
1878 assemble_integer (const0_rtx, LONG_TYPE_SIZE / BITS_PER_UNIT, align, 1);
1881 switch_to_section (current_function_section ());
1883 #ifdef ASM_OUTPUT_REG_PUSH
1884 if (sval && REG_P (sval))
1885 ASM_OUTPUT_REG_PUSH (file, REGNO (sval));
1886 if (chain && REG_P (chain))
1887 ASM_OUTPUT_REG_PUSH (file, REGNO (chain));
1888 #endif
1890 FUNCTION_PROFILER (file, current_function_funcdef_no);
1892 #ifdef ASM_OUTPUT_REG_PUSH
1893 if (chain && REG_P (chain))
1894 ASM_OUTPUT_REG_POP (file, REGNO (chain));
1895 if (sval && REG_P (sval))
1896 ASM_OUTPUT_REG_POP (file, REGNO (sval));
1897 #endif
1900 /* Output assembler code for the end of a function.
1901 For clarity, args are same as those of `final_start_function'
1902 even though not all of them are needed. */
1904 void
1905 final_end_function (void)
1907 app_disable ();
1909 if (!DECL_IGNORED_P (current_function_decl))
1910 debug_hooks->end_function (high_function_linenum);
1912 /* Finally, output the function epilogue:
1913 code to restore the stack frame and return to the caller. */
1914 targetm.asm_out.function_epilogue (asm_out_file, get_frame_size ());
1916 /* And debug output. */
1917 if (!DECL_IGNORED_P (current_function_decl))
1918 debug_hooks->end_epilogue (last_linenum, last_filename);
1920 if (!dwarf2_debug_info_emitted_p (current_function_decl)
1921 && dwarf2out_do_frame ())
1922 dwarf2out_end_epilogue (last_linenum, last_filename);
1924 some_local_dynamic_name = 0;
1928 /* Dumper helper for basic block information. FILE is the assembly
1929 output file, and INSN is the instruction being emitted. */
1931 static void
1932 dump_basic_block_info (FILE *file, rtx_insn *insn, basic_block *start_to_bb,
1933 basic_block *end_to_bb, int bb_map_size, int *bb_seqn)
1935 basic_block bb;
1937 if (!flag_debug_asm)
1938 return;
1940 if (INSN_UID (insn) < bb_map_size
1941 && (bb = start_to_bb[INSN_UID (insn)]) != NULL)
1943 edge e;
1944 edge_iterator ei;
1946 fprintf (file, "%s BLOCK %d", ASM_COMMENT_START, bb->index);
1947 if (bb->frequency)
1948 fprintf (file, " freq:%d", bb->frequency);
1949 if (bb->count)
1950 fprintf (file, " count:%" PRId64,
1951 bb->count);
1952 fprintf (file, " seq:%d", (*bb_seqn)++);
1953 fprintf (file, "\n%s PRED:", ASM_COMMENT_START);
1954 FOR_EACH_EDGE (e, ei, bb->preds)
1956 dump_edge_info (file, e, TDF_DETAILS, 0);
1958 fprintf (file, "\n");
1960 if (INSN_UID (insn) < bb_map_size
1961 && (bb = end_to_bb[INSN_UID (insn)]) != NULL)
1963 edge e;
1964 edge_iterator ei;
1966 fprintf (asm_out_file, "%s SUCC:", ASM_COMMENT_START);
1967 FOR_EACH_EDGE (e, ei, bb->succs)
1969 dump_edge_info (asm_out_file, e, TDF_DETAILS, 1);
1971 fprintf (file, "\n");
1975 /* Output assembler code for some insns: all or part of a function.
1976 For description of args, see `final_start_function', above. */
1978 void
1979 final (rtx_insn *first, FILE *file, int optimize_p)
1981 rtx_insn *insn, *next;
1982 int seen = 0;
1984 /* Used for -dA dump. */
1985 basic_block *start_to_bb = NULL;
1986 basic_block *end_to_bb = NULL;
1987 int bb_map_size = 0;
1988 int bb_seqn = 0;
1990 last_ignored_compare = 0;
1992 if (HAVE_cc0)
1993 for (insn = first; insn; insn = NEXT_INSN (insn))
1995 /* If CC tracking across branches is enabled, record the insn which
1996 jumps to each branch only reached from one place. */
1997 if (optimize_p && JUMP_P (insn))
1999 rtx lab = JUMP_LABEL (insn);
2000 if (lab && LABEL_P (lab) && LABEL_NUSES (lab) == 1)
2002 LABEL_REFS (lab) = insn;
2007 init_recog ();
2009 CC_STATUS_INIT;
2011 if (flag_debug_asm)
2013 basic_block bb;
2015 bb_map_size = get_max_uid () + 1;
2016 start_to_bb = XCNEWVEC (basic_block, bb_map_size);
2017 end_to_bb = XCNEWVEC (basic_block, bb_map_size);
2019 /* There is no cfg for a thunk. */
2020 if (!cfun->is_thunk)
2021 FOR_EACH_BB_REVERSE_FN (bb, cfun)
2023 start_to_bb[INSN_UID (BB_HEAD (bb))] = bb;
2024 end_to_bb[INSN_UID (BB_END (bb))] = bb;
2028 /* Output the insns. */
2029 for (insn = first; insn;)
2031 if (HAVE_ATTR_length)
2033 if ((unsigned) INSN_UID (insn) >= INSN_ADDRESSES_SIZE ())
2035 /* This can be triggered by bugs elsewhere in the compiler if
2036 new insns are created after init_insn_lengths is called. */
2037 gcc_assert (NOTE_P (insn));
2038 insn_current_address = -1;
2040 else
2041 insn_current_address = INSN_ADDRESSES (INSN_UID (insn));
2044 dump_basic_block_info (file, insn, start_to_bb, end_to_bb,
2045 bb_map_size, &bb_seqn);
2046 insn = final_scan_insn (insn, file, optimize_p, 0, &seen);
2049 if (flag_debug_asm)
2051 free (start_to_bb);
2052 free (end_to_bb);
2055 /* Remove CFI notes, to avoid compare-debug failures. */
2056 for (insn = first; insn; insn = next)
2058 next = NEXT_INSN (insn);
2059 if (NOTE_P (insn)
2060 && (NOTE_KIND (insn) == NOTE_INSN_CFI
2061 || NOTE_KIND (insn) == NOTE_INSN_CFI_LABEL))
2062 delete_insn (insn);
2066 const char *
2067 get_insn_template (int code, rtx insn)
2069 switch (insn_data[code].output_format)
2071 case INSN_OUTPUT_FORMAT_SINGLE:
2072 return insn_data[code].output.single;
2073 case INSN_OUTPUT_FORMAT_MULTI:
2074 return insn_data[code].output.multi[which_alternative];
2075 case INSN_OUTPUT_FORMAT_FUNCTION:
2076 gcc_assert (insn);
2077 return (*insn_data[code].output.function) (recog_data.operand,
2078 as_a <rtx_insn *> (insn));
2080 default:
2081 gcc_unreachable ();
2085 /* Emit the appropriate declaration for an alternate-entry-point
2086 symbol represented by INSN, to FILE. INSN is a CODE_LABEL with
2087 LABEL_KIND != LABEL_NORMAL.
2089 The case fall-through in this function is intentional. */
2090 static void
2091 output_alternate_entry_point (FILE *file, rtx_insn *insn)
2093 const char *name = LABEL_NAME (insn);
2095 switch (LABEL_KIND (insn))
2097 case LABEL_WEAK_ENTRY:
2098 #ifdef ASM_WEAKEN_LABEL
2099 ASM_WEAKEN_LABEL (file, name);
2100 gcc_fallthrough ();
2101 #endif
2102 case LABEL_GLOBAL_ENTRY:
2103 targetm.asm_out.globalize_label (file, name);
2104 gcc_fallthrough ();
2105 case LABEL_STATIC_ENTRY:
2106 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
2107 ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
2108 #endif
2109 ASM_OUTPUT_LABEL (file, name);
2110 break;
2112 case LABEL_NORMAL:
2113 default:
2114 gcc_unreachable ();
2118 /* Given a CALL_INSN, find and return the nested CALL. */
2119 static rtx
2120 call_from_call_insn (rtx_call_insn *insn)
2122 rtx x;
2123 gcc_assert (CALL_P (insn));
2124 x = PATTERN (insn);
2126 while (GET_CODE (x) != CALL)
2128 switch (GET_CODE (x))
2130 default:
2131 gcc_unreachable ();
2132 case COND_EXEC:
2133 x = COND_EXEC_CODE (x);
2134 break;
2135 case PARALLEL:
2136 x = XVECEXP (x, 0, 0);
2137 break;
2138 case SET:
2139 x = XEXP (x, 1);
2140 break;
2143 return x;
2146 /* Print a comment into the asm showing FILENAME, LINENUM, and the
2147 corresponding source line, if available. */
2149 static void
2150 asm_show_source (const char *filename, int linenum)
2152 if (!filename)
2153 return;
2155 int line_size;
2156 const char *line = location_get_source_line (filename, linenum, &line_size);
2157 if (!line)
2158 return;
2160 fprintf (asm_out_file, "%s %s:%i: ", ASM_COMMENT_START, filename, linenum);
2161 /* "line" is not 0-terminated, so we must use line_size. */
2162 fwrite (line, 1, line_size, asm_out_file);
2163 fputc ('\n', asm_out_file);
2166 /* The final scan for one insn, INSN.
2167 Args are same as in `final', except that INSN
2168 is the insn being scanned.
2169 Value returned is the next insn to be scanned.
2171 NOPEEPHOLES is the flag to disallow peephole processing (currently
2172 used for within delayed branch sequence output).
2174 SEEN is used to track the end of the prologue, for emitting
2175 debug information. We force the emission of a line note after
2176 both NOTE_INSN_PROLOGUE_END and NOTE_INSN_FUNCTION_BEG. */
2178 rtx_insn *
2179 final_scan_insn (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED,
2180 int nopeepholes ATTRIBUTE_UNUSED, int *seen)
2182 #if HAVE_cc0
2183 rtx set;
2184 #endif
2185 rtx_insn *next;
2187 insn_counter++;
2189 /* Ignore deleted insns. These can occur when we split insns (due to a
2190 template of "#") while not optimizing. */
2191 if (insn->deleted ())
2192 return NEXT_INSN (insn);
2194 switch (GET_CODE (insn))
2196 case NOTE:
2197 switch (NOTE_KIND (insn))
2199 case NOTE_INSN_DELETED:
2200 case NOTE_INSN_UPDATE_SJLJ_CONTEXT:
2201 break;
2203 case NOTE_INSN_SWITCH_TEXT_SECTIONS:
2204 in_cold_section_p = !in_cold_section_p;
2206 if (dwarf2out_do_frame ())
2207 dwarf2out_switch_text_section ();
2208 else if (!DECL_IGNORED_P (current_function_decl))
2209 debug_hooks->switch_text_section ();
2211 switch_to_section (current_function_section ());
2212 targetm.asm_out.function_switched_text_sections (asm_out_file,
2213 current_function_decl,
2214 in_cold_section_p);
2215 /* Emit a label for the split cold section. Form label name by
2216 suffixing "cold" to the original function's name. */
2217 if (in_cold_section_p)
2219 cold_function_name
2220 = clone_function_name (current_function_decl, "cold");
2221 #ifdef ASM_DECLARE_COLD_FUNCTION_NAME
2222 ASM_DECLARE_COLD_FUNCTION_NAME (asm_out_file,
2223 IDENTIFIER_POINTER
2224 (cold_function_name),
2225 current_function_decl);
2226 #else
2227 ASM_OUTPUT_LABEL (asm_out_file,
2228 IDENTIFIER_POINTER (cold_function_name));
2229 #endif
2231 break;
2233 case NOTE_INSN_BASIC_BLOCK:
2234 if (need_profile_function)
2236 profile_function (asm_out_file);
2237 need_profile_function = false;
2240 if (targetm.asm_out.unwind_emit)
2241 targetm.asm_out.unwind_emit (asm_out_file, insn);
2243 discriminator = NOTE_BASIC_BLOCK (insn)->discriminator;
2245 break;
2247 case NOTE_INSN_EH_REGION_BEG:
2248 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LEHB",
2249 NOTE_EH_HANDLER (insn));
2250 break;
2252 case NOTE_INSN_EH_REGION_END:
2253 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LEHE",
2254 NOTE_EH_HANDLER (insn));
2255 break;
2257 case NOTE_INSN_PROLOGUE_END:
2258 targetm.asm_out.function_end_prologue (file);
2259 profile_after_prologue (file);
2261 if ((*seen & (SEEN_EMITTED | SEEN_NOTE)) == SEEN_NOTE)
2263 *seen |= SEEN_EMITTED;
2264 force_source_line = true;
2266 else
2267 *seen |= SEEN_NOTE;
2269 break;
2271 case NOTE_INSN_EPILOGUE_BEG:
2272 if (!DECL_IGNORED_P (current_function_decl))
2273 (*debug_hooks->begin_epilogue) (last_linenum, last_filename);
2274 targetm.asm_out.function_begin_epilogue (file);
2275 break;
2277 case NOTE_INSN_CFI:
2278 dwarf2out_emit_cfi (NOTE_CFI (insn));
2279 break;
2281 case NOTE_INSN_CFI_LABEL:
2282 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LCFI",
2283 NOTE_LABEL_NUMBER (insn));
2284 break;
2286 case NOTE_INSN_FUNCTION_BEG:
2287 if (need_profile_function)
2289 profile_function (asm_out_file);
2290 need_profile_function = false;
2293 app_disable ();
2294 if (!DECL_IGNORED_P (current_function_decl))
2295 debug_hooks->end_prologue (last_linenum, last_filename);
2297 if ((*seen & (SEEN_EMITTED | SEEN_NOTE)) == SEEN_NOTE)
2299 *seen |= SEEN_EMITTED;
2300 force_source_line = true;
2302 else
2303 *seen |= SEEN_NOTE;
2305 break;
2307 case NOTE_INSN_BLOCK_BEG:
2308 if (debug_info_level == DINFO_LEVEL_NORMAL
2309 || debug_info_level == DINFO_LEVEL_VERBOSE
2310 || write_symbols == DWARF2_DEBUG
2311 || write_symbols == VMS_AND_DWARF2_DEBUG
2312 || write_symbols == VMS_DEBUG)
2314 int n = BLOCK_NUMBER (NOTE_BLOCK (insn));
2316 app_disable ();
2317 ++block_depth;
2318 high_block_linenum = last_linenum;
2320 /* Output debugging info about the symbol-block beginning. */
2321 if (!DECL_IGNORED_P (current_function_decl))
2322 debug_hooks->begin_block (last_linenum, n);
2324 /* Mark this block as output. */
2325 TREE_ASM_WRITTEN (NOTE_BLOCK (insn)) = 1;
2327 if (write_symbols == DBX_DEBUG
2328 || write_symbols == SDB_DEBUG)
2330 location_t *locus_ptr
2331 = block_nonartificial_location (NOTE_BLOCK (insn));
2333 if (locus_ptr != NULL)
2335 override_filename = LOCATION_FILE (*locus_ptr);
2336 override_linenum = LOCATION_LINE (*locus_ptr);
2339 break;
2341 case NOTE_INSN_BLOCK_END:
2342 if (debug_info_level == DINFO_LEVEL_NORMAL
2343 || debug_info_level == DINFO_LEVEL_VERBOSE
2344 || write_symbols == DWARF2_DEBUG
2345 || write_symbols == VMS_AND_DWARF2_DEBUG
2346 || write_symbols == VMS_DEBUG)
2348 int n = BLOCK_NUMBER (NOTE_BLOCK (insn));
2350 app_disable ();
2352 /* End of a symbol-block. */
2353 --block_depth;
2354 gcc_assert (block_depth >= 0);
2356 if (!DECL_IGNORED_P (current_function_decl))
2357 debug_hooks->end_block (high_block_linenum, n);
2359 if (write_symbols == DBX_DEBUG
2360 || write_symbols == SDB_DEBUG)
2362 tree outer_block = BLOCK_SUPERCONTEXT (NOTE_BLOCK (insn));
2363 location_t *locus_ptr
2364 = block_nonartificial_location (outer_block);
2366 if (locus_ptr != NULL)
2368 override_filename = LOCATION_FILE (*locus_ptr);
2369 override_linenum = LOCATION_LINE (*locus_ptr);
2371 else
2373 override_filename = NULL;
2374 override_linenum = 0;
2377 break;
2379 case NOTE_INSN_DELETED_LABEL:
2380 /* Emit the label. We may have deleted the CODE_LABEL because
2381 the label could be proved to be unreachable, though still
2382 referenced (in the form of having its address taken. */
2383 ASM_OUTPUT_DEBUG_LABEL (file, "L", CODE_LABEL_NUMBER (insn));
2384 break;
2386 case NOTE_INSN_DELETED_DEBUG_LABEL:
2387 /* Similarly, but need to use different namespace for it. */
2388 if (CODE_LABEL_NUMBER (insn) != -1)
2389 ASM_OUTPUT_DEBUG_LABEL (file, "LDL", CODE_LABEL_NUMBER (insn));
2390 break;
2392 case NOTE_INSN_VAR_LOCATION:
2393 case NOTE_INSN_CALL_ARG_LOCATION:
2394 if (!DECL_IGNORED_P (current_function_decl))
2395 debug_hooks->var_location (insn);
2396 break;
2398 default:
2399 gcc_unreachable ();
2400 break;
2402 break;
2404 case BARRIER:
2405 break;
2407 case CODE_LABEL:
2408 /* The target port might emit labels in the output function for
2409 some insn, e.g. sh.c output_branchy_insn. */
2410 if (CODE_LABEL_NUMBER (insn) <= max_labelno)
2412 int align = LABEL_TO_ALIGNMENT (insn);
2413 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
2414 int max_skip = LABEL_TO_MAX_SKIP (insn);
2415 #endif
2417 if (align && NEXT_INSN (insn))
2419 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
2420 ASM_OUTPUT_MAX_SKIP_ALIGN (file, align, max_skip);
2421 #else
2422 #ifdef ASM_OUTPUT_ALIGN_WITH_NOP
2423 ASM_OUTPUT_ALIGN_WITH_NOP (file, align);
2424 #else
2425 ASM_OUTPUT_ALIGN (file, align);
2426 #endif
2427 #endif
2430 CC_STATUS_INIT;
2432 if (!DECL_IGNORED_P (current_function_decl) && LABEL_NAME (insn))
2433 debug_hooks->label (as_a <rtx_code_label *> (insn));
2435 app_disable ();
2437 next = next_nonnote_insn (insn);
2438 /* If this label is followed by a jump-table, make sure we put
2439 the label in the read-only section. Also possibly write the
2440 label and jump table together. */
2441 if (next != 0 && JUMP_TABLE_DATA_P (next))
2443 #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
2444 /* In this case, the case vector is being moved by the
2445 target, so don't output the label at all. Leave that
2446 to the back end macros. */
2447 #else
2448 if (! JUMP_TABLES_IN_TEXT_SECTION)
2450 int log_align;
2452 switch_to_section (targetm.asm_out.function_rodata_section
2453 (current_function_decl));
2455 #ifdef ADDR_VEC_ALIGN
2456 log_align = ADDR_VEC_ALIGN (next);
2457 #else
2458 log_align = exact_log2 (BIGGEST_ALIGNMENT / BITS_PER_UNIT);
2459 #endif
2460 ASM_OUTPUT_ALIGN (file, log_align);
2462 else
2463 switch_to_section (current_function_section ());
2465 #ifdef ASM_OUTPUT_CASE_LABEL
2466 ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn),
2467 next);
2468 #else
2469 targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn));
2470 #endif
2471 #endif
2472 break;
2474 if (LABEL_ALT_ENTRY_P (insn))
2475 output_alternate_entry_point (file, insn);
2476 else
2477 targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn));
2478 break;
2480 default:
2482 rtx body = PATTERN (insn);
2483 int insn_code_number;
2484 const char *templ;
2485 bool is_stmt;
2487 /* Reset this early so it is correct for ASM statements. */
2488 current_insn_predicate = NULL_RTX;
2490 /* An INSN, JUMP_INSN or CALL_INSN.
2491 First check for special kinds that recog doesn't recognize. */
2493 if (GET_CODE (body) == USE /* These are just declarations. */
2494 || GET_CODE (body) == CLOBBER)
2495 break;
2497 #if HAVE_cc0
2499 /* If there is a REG_CC_SETTER note on this insn, it means that
2500 the setting of the condition code was done in the delay slot
2501 of the insn that branched here. So recover the cc status
2502 from the insn that set it. */
2504 rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
2505 if (note)
2507 rtx_insn *other = as_a <rtx_insn *> (XEXP (note, 0));
2508 NOTICE_UPDATE_CC (PATTERN (other), other);
2509 cc_prev_status = cc_status;
2512 #endif
2514 /* Detect insns that are really jump-tables
2515 and output them as such. */
2517 if (JUMP_TABLE_DATA_P (insn))
2519 #if !(defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC))
2520 int vlen, idx;
2521 #endif
2523 if (! JUMP_TABLES_IN_TEXT_SECTION)
2524 switch_to_section (targetm.asm_out.function_rodata_section
2525 (current_function_decl));
2526 else
2527 switch_to_section (current_function_section ());
2529 app_disable ();
2531 #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
2532 if (GET_CODE (body) == ADDR_VEC)
2534 #ifdef ASM_OUTPUT_ADDR_VEC
2535 ASM_OUTPUT_ADDR_VEC (PREV_INSN (insn), body);
2536 #else
2537 gcc_unreachable ();
2538 #endif
2540 else
2542 #ifdef ASM_OUTPUT_ADDR_DIFF_VEC
2543 ASM_OUTPUT_ADDR_DIFF_VEC (PREV_INSN (insn), body);
2544 #else
2545 gcc_unreachable ();
2546 #endif
2548 #else
2549 vlen = XVECLEN (body, GET_CODE (body) == ADDR_DIFF_VEC);
2550 for (idx = 0; idx < vlen; idx++)
2552 if (GET_CODE (body) == ADDR_VEC)
2554 #ifdef ASM_OUTPUT_ADDR_VEC_ELT
2555 ASM_OUTPUT_ADDR_VEC_ELT
2556 (file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
2557 #else
2558 gcc_unreachable ();
2559 #endif
2561 else
2563 #ifdef ASM_OUTPUT_ADDR_DIFF_ELT
2564 ASM_OUTPUT_ADDR_DIFF_ELT
2565 (file,
2566 body,
2567 CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
2568 CODE_LABEL_NUMBER (XEXP (XEXP (body, 0), 0)));
2569 #else
2570 gcc_unreachable ();
2571 #endif
2574 #ifdef ASM_OUTPUT_CASE_END
2575 ASM_OUTPUT_CASE_END (file,
2576 CODE_LABEL_NUMBER (PREV_INSN (insn)),
2577 insn);
2578 #endif
2579 #endif
2581 switch_to_section (current_function_section ());
2583 break;
2585 /* Output this line note if it is the first or the last line
2586 note in a row. */
2587 if (!DECL_IGNORED_P (current_function_decl)
2588 && notice_source_line (insn, &is_stmt))
2590 if (flag_verbose_asm)
2591 asm_show_source (last_filename, last_linenum);
2592 (*debug_hooks->source_line) (last_linenum, last_filename,
2593 last_discriminator, is_stmt);
2596 if (GET_CODE (body) == PARALLEL
2597 && GET_CODE (XVECEXP (body, 0, 0)) == ASM_INPUT)
2598 body = XVECEXP (body, 0, 0);
2600 if (GET_CODE (body) == ASM_INPUT)
2602 const char *string = XSTR (body, 0);
2604 /* There's no telling what that did to the condition codes. */
2605 CC_STATUS_INIT;
2607 if (string[0])
2609 expanded_location loc;
2611 app_enable ();
2612 loc = expand_location (ASM_INPUT_SOURCE_LOCATION (body));
2613 if (*loc.file && loc.line)
2614 fprintf (asm_out_file, "%s %i \"%s\" 1\n",
2615 ASM_COMMENT_START, loc.line, loc.file);
2616 fprintf (asm_out_file, "\t%s\n", string);
2617 #if HAVE_AS_LINE_ZERO
2618 if (*loc.file && loc.line)
2619 fprintf (asm_out_file, "%s 0 \"\" 2\n", ASM_COMMENT_START);
2620 #endif
2622 break;
2625 /* Detect `asm' construct with operands. */
2626 if (asm_noperands (body) >= 0)
2628 unsigned int noperands = asm_noperands (body);
2629 rtx *ops = XALLOCAVEC (rtx, noperands);
2630 const char *string;
2631 location_t loc;
2632 expanded_location expanded;
2634 /* There's no telling what that did to the condition codes. */
2635 CC_STATUS_INIT;
2637 /* Get out the operand values. */
2638 string = decode_asm_operands (body, ops, NULL, NULL, NULL, &loc);
2639 /* Inhibit dying on what would otherwise be compiler bugs. */
2640 insn_noperands = noperands;
2641 this_is_asm_operands = insn;
2642 expanded = expand_location (loc);
2644 #ifdef FINAL_PRESCAN_INSN
2645 FINAL_PRESCAN_INSN (insn, ops, insn_noperands);
2646 #endif
2648 /* Output the insn using them. */
2649 if (string[0])
2651 app_enable ();
2652 if (expanded.file && expanded.line)
2653 fprintf (asm_out_file, "%s %i \"%s\" 1\n",
2654 ASM_COMMENT_START, expanded.line, expanded.file);
2655 output_asm_insn (string, ops);
2656 #if HAVE_AS_LINE_ZERO
2657 if (expanded.file && expanded.line)
2658 fprintf (asm_out_file, "%s 0 \"\" 2\n", ASM_COMMENT_START);
2659 #endif
2662 if (targetm.asm_out.final_postscan_insn)
2663 targetm.asm_out.final_postscan_insn (file, insn, ops,
2664 insn_noperands);
2666 this_is_asm_operands = 0;
2667 break;
2670 app_disable ();
2672 if (rtx_sequence *seq = dyn_cast <rtx_sequence *> (body))
2674 /* A delayed-branch sequence */
2675 int i;
2677 final_sequence = seq;
2679 /* The first insn in this SEQUENCE might be a JUMP_INSN that will
2680 force the restoration of a comparison that was previously
2681 thought unnecessary. If that happens, cancel this sequence
2682 and cause that insn to be restored. */
2684 next = final_scan_insn (seq->insn (0), file, 0, 1, seen);
2685 if (next != seq->insn (1))
2687 final_sequence = 0;
2688 return next;
2691 for (i = 1; i < seq->len (); i++)
2693 rtx_insn *insn = seq->insn (i);
2694 rtx_insn *next = NEXT_INSN (insn);
2695 /* We loop in case any instruction in a delay slot gets
2696 split. */
2698 insn = final_scan_insn (insn, file, 0, 1, seen);
2699 while (insn != next);
2701 #ifdef DBR_OUTPUT_SEQEND
2702 DBR_OUTPUT_SEQEND (file);
2703 #endif
2704 final_sequence = 0;
2706 /* If the insn requiring the delay slot was a CALL_INSN, the
2707 insns in the delay slot are actually executed before the
2708 called function. Hence we don't preserve any CC-setting
2709 actions in these insns and the CC must be marked as being
2710 clobbered by the function. */
2711 if (CALL_P (seq->insn (0)))
2713 CC_STATUS_INIT;
2715 break;
2718 /* We have a real machine instruction as rtl. */
2720 body = PATTERN (insn);
2722 #if HAVE_cc0
2723 set = single_set (insn);
2725 /* Check for redundant test and compare instructions
2726 (when the condition codes are already set up as desired).
2727 This is done only when optimizing; if not optimizing,
2728 it should be possible for the user to alter a variable
2729 with the debugger in between statements
2730 and the next statement should reexamine the variable
2731 to compute the condition codes. */
2733 if (optimize_p)
2735 if (set
2736 && GET_CODE (SET_DEST (set)) == CC0
2737 && insn != last_ignored_compare)
2739 rtx src1, src2;
2740 if (GET_CODE (SET_SRC (set)) == SUBREG)
2741 SET_SRC (set) = alter_subreg (&SET_SRC (set), true);
2743 src1 = SET_SRC (set);
2744 src2 = NULL_RTX;
2745 if (GET_CODE (SET_SRC (set)) == COMPARE)
2747 if (GET_CODE (XEXP (SET_SRC (set), 0)) == SUBREG)
2748 XEXP (SET_SRC (set), 0)
2749 = alter_subreg (&XEXP (SET_SRC (set), 0), true);
2750 if (GET_CODE (XEXP (SET_SRC (set), 1)) == SUBREG)
2751 XEXP (SET_SRC (set), 1)
2752 = alter_subreg (&XEXP (SET_SRC (set), 1), true);
2753 if (XEXP (SET_SRC (set), 1)
2754 == CONST0_RTX (GET_MODE (XEXP (SET_SRC (set), 0))))
2755 src2 = XEXP (SET_SRC (set), 0);
2757 if ((cc_status.value1 != 0
2758 && rtx_equal_p (src1, cc_status.value1))
2759 || (cc_status.value2 != 0
2760 && rtx_equal_p (src1, cc_status.value2))
2761 || (src2 != 0 && cc_status.value1 != 0
2762 && rtx_equal_p (src2, cc_status.value1))
2763 || (src2 != 0 && cc_status.value2 != 0
2764 && rtx_equal_p (src2, cc_status.value2)))
2766 /* Don't delete insn if it has an addressing side-effect. */
2767 if (! FIND_REG_INC_NOTE (insn, NULL_RTX)
2768 /* or if anything in it is volatile. */
2769 && ! volatile_refs_p (PATTERN (insn)))
2771 /* We don't really delete the insn; just ignore it. */
2772 last_ignored_compare = insn;
2773 break;
2779 /* If this is a conditional branch, maybe modify it
2780 if the cc's are in a nonstandard state
2781 so that it accomplishes the same thing that it would
2782 do straightforwardly if the cc's were set up normally. */
2784 if (cc_status.flags != 0
2785 && JUMP_P (insn)
2786 && GET_CODE (body) == SET
2787 && SET_DEST (body) == pc_rtx
2788 && GET_CODE (SET_SRC (body)) == IF_THEN_ELSE
2789 && COMPARISON_P (XEXP (SET_SRC (body), 0))
2790 && XEXP (XEXP (SET_SRC (body), 0), 0) == cc0_rtx)
2792 /* This function may alter the contents of its argument
2793 and clear some of the cc_status.flags bits.
2794 It may also return 1 meaning condition now always true
2795 or -1 meaning condition now always false
2796 or 2 meaning condition nontrivial but altered. */
2797 int result = alter_cond (XEXP (SET_SRC (body), 0));
2798 /* If condition now has fixed value, replace the IF_THEN_ELSE
2799 with its then-operand or its else-operand. */
2800 if (result == 1)
2801 SET_SRC (body) = XEXP (SET_SRC (body), 1);
2802 if (result == -1)
2803 SET_SRC (body) = XEXP (SET_SRC (body), 2);
2805 /* The jump is now either unconditional or a no-op.
2806 If it has become a no-op, don't try to output it.
2807 (It would not be recognized.) */
2808 if (SET_SRC (body) == pc_rtx)
2810 delete_insn (insn);
2811 break;
2813 else if (ANY_RETURN_P (SET_SRC (body)))
2814 /* Replace (set (pc) (return)) with (return). */
2815 PATTERN (insn) = body = SET_SRC (body);
2817 /* Rerecognize the instruction if it has changed. */
2818 if (result != 0)
2819 INSN_CODE (insn) = -1;
2822 /* If this is a conditional trap, maybe modify it if the cc's
2823 are in a nonstandard state so that it accomplishes the same
2824 thing that it would do straightforwardly if the cc's were
2825 set up normally. */
2826 if (cc_status.flags != 0
2827 && NONJUMP_INSN_P (insn)
2828 && GET_CODE (body) == TRAP_IF
2829 && COMPARISON_P (TRAP_CONDITION (body))
2830 && XEXP (TRAP_CONDITION (body), 0) == cc0_rtx)
2832 /* This function may alter the contents of its argument
2833 and clear some of the cc_status.flags bits.
2834 It may also return 1 meaning condition now always true
2835 or -1 meaning condition now always false
2836 or 2 meaning condition nontrivial but altered. */
2837 int result = alter_cond (TRAP_CONDITION (body));
2839 /* If TRAP_CONDITION has become always false, delete the
2840 instruction. */
2841 if (result == -1)
2843 delete_insn (insn);
2844 break;
2847 /* If TRAP_CONDITION has become always true, replace
2848 TRAP_CONDITION with const_true_rtx. */
2849 if (result == 1)
2850 TRAP_CONDITION (body) = const_true_rtx;
2852 /* Rerecognize the instruction if it has changed. */
2853 if (result != 0)
2854 INSN_CODE (insn) = -1;
2857 /* Make same adjustments to instructions that examine the
2858 condition codes without jumping and instructions that
2859 handle conditional moves (if this machine has either one). */
2861 if (cc_status.flags != 0
2862 && set != 0)
2864 rtx cond_rtx, then_rtx, else_rtx;
2866 if (!JUMP_P (insn)
2867 && GET_CODE (SET_SRC (set)) == IF_THEN_ELSE)
2869 cond_rtx = XEXP (SET_SRC (set), 0);
2870 then_rtx = XEXP (SET_SRC (set), 1);
2871 else_rtx = XEXP (SET_SRC (set), 2);
2873 else
2875 cond_rtx = SET_SRC (set);
2876 then_rtx = const_true_rtx;
2877 else_rtx = const0_rtx;
2880 if (COMPARISON_P (cond_rtx)
2881 && XEXP (cond_rtx, 0) == cc0_rtx)
2883 int result;
2884 result = alter_cond (cond_rtx);
2885 if (result == 1)
2886 validate_change (insn, &SET_SRC (set), then_rtx, 0);
2887 else if (result == -1)
2888 validate_change (insn, &SET_SRC (set), else_rtx, 0);
2889 else if (result == 2)
2890 INSN_CODE (insn) = -1;
2891 if (SET_DEST (set) == SET_SRC (set))
2892 delete_insn (insn);
2896 #endif
2898 /* Do machine-specific peephole optimizations if desired. */
2900 if (HAVE_peephole && optimize_p && !flag_no_peephole && !nopeepholes)
2902 rtx_insn *next = peephole (insn);
2903 /* When peepholing, if there were notes within the peephole,
2904 emit them before the peephole. */
2905 if (next != 0 && next != NEXT_INSN (insn))
2907 rtx_insn *note, *prev = PREV_INSN (insn);
2909 for (note = NEXT_INSN (insn); note != next;
2910 note = NEXT_INSN (note))
2911 final_scan_insn (note, file, optimize_p, nopeepholes, seen);
2913 /* Put the notes in the proper position for a later
2914 rescan. For example, the SH target can do this
2915 when generating a far jump in a delayed branch
2916 sequence. */
2917 note = NEXT_INSN (insn);
2918 SET_PREV_INSN (note) = prev;
2919 SET_NEXT_INSN (prev) = note;
2920 SET_NEXT_INSN (PREV_INSN (next)) = insn;
2921 SET_PREV_INSN (insn) = PREV_INSN (next);
2922 SET_NEXT_INSN (insn) = next;
2923 SET_PREV_INSN (next) = insn;
2926 /* PEEPHOLE might have changed this. */
2927 body = PATTERN (insn);
2930 /* Try to recognize the instruction.
2931 If successful, verify that the operands satisfy the
2932 constraints for the instruction. Crash if they don't,
2933 since `reload' should have changed them so that they do. */
2935 insn_code_number = recog_memoized (insn);
2936 cleanup_subreg_operands (insn);
2938 /* Dump the insn in the assembly for debugging (-dAP).
2939 If the final dump is requested as slim RTL, dump slim
2940 RTL to the assembly file also. */
2941 if (flag_dump_rtl_in_asm)
2943 print_rtx_head = ASM_COMMENT_START;
2944 if (! (dump_flags & TDF_SLIM))
2945 print_rtl_single (asm_out_file, insn);
2946 else
2947 dump_insn_slim (asm_out_file, insn);
2948 print_rtx_head = "";
2951 if (! constrain_operands_cached (insn, 1))
2952 fatal_insn_not_found (insn);
2954 /* Some target machines need to prescan each insn before
2955 it is output. */
2957 #ifdef FINAL_PRESCAN_INSN
2958 FINAL_PRESCAN_INSN (insn, recog_data.operand, recog_data.n_operands);
2959 #endif
2961 if (targetm.have_conditional_execution ()
2962 && GET_CODE (PATTERN (insn)) == COND_EXEC)
2963 current_insn_predicate = COND_EXEC_TEST (PATTERN (insn));
2965 #if HAVE_cc0
2966 cc_prev_status = cc_status;
2968 /* Update `cc_status' for this instruction.
2969 The instruction's output routine may change it further.
2970 If the output routine for a jump insn needs to depend
2971 on the cc status, it should look at cc_prev_status. */
2973 NOTICE_UPDATE_CC (body, insn);
2974 #endif
2976 current_output_insn = debug_insn = insn;
2978 /* Find the proper template for this insn. */
2979 templ = get_insn_template (insn_code_number, insn);
2981 /* If the C code returns 0, it means that it is a jump insn
2982 which follows a deleted test insn, and that test insn
2983 needs to be reinserted. */
2984 if (templ == 0)
2986 rtx_insn *prev;
2988 gcc_assert (prev_nonnote_insn (insn) == last_ignored_compare);
2990 /* We have already processed the notes between the setter and
2991 the user. Make sure we don't process them again, this is
2992 particularly important if one of the notes is a block
2993 scope note or an EH note. */
2994 for (prev = insn;
2995 prev != last_ignored_compare;
2996 prev = PREV_INSN (prev))
2998 if (NOTE_P (prev))
2999 delete_insn (prev); /* Use delete_note. */
3002 return prev;
3005 /* If the template is the string "#", it means that this insn must
3006 be split. */
3007 if (templ[0] == '#' && templ[1] == '\0')
3009 rtx_insn *new_rtx = try_split (body, insn, 0);
3011 /* If we didn't split the insn, go away. */
3012 if (new_rtx == insn && PATTERN (new_rtx) == body)
3013 fatal_insn ("could not split insn", insn);
3015 /* If we have a length attribute, this instruction should have
3016 been split in shorten_branches, to ensure that we would have
3017 valid length info for the splitees. */
3018 gcc_assert (!HAVE_ATTR_length);
3020 return new_rtx;
3023 /* ??? This will put the directives in the wrong place if
3024 get_insn_template outputs assembly directly. However calling it
3025 before get_insn_template breaks if the insns is split. */
3026 if (targetm.asm_out.unwind_emit_before_insn
3027 && targetm.asm_out.unwind_emit)
3028 targetm.asm_out.unwind_emit (asm_out_file, insn);
3030 rtx_call_insn *call_insn = dyn_cast <rtx_call_insn *> (insn);
3031 if (call_insn != NULL)
3033 rtx x = call_from_call_insn (call_insn);
3034 x = XEXP (x, 0);
3035 if (x && MEM_P (x) && GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
3037 tree t;
3038 x = XEXP (x, 0);
3039 t = SYMBOL_REF_DECL (x);
3040 if (t)
3041 assemble_external (t);
3045 /* Output assembler code from the template. */
3046 output_asm_insn (templ, recog_data.operand);
3048 /* Some target machines need to postscan each insn after
3049 it is output. */
3050 if (targetm.asm_out.final_postscan_insn)
3051 targetm.asm_out.final_postscan_insn (file, insn, recog_data.operand,
3052 recog_data.n_operands);
3054 if (!targetm.asm_out.unwind_emit_before_insn
3055 && targetm.asm_out.unwind_emit)
3056 targetm.asm_out.unwind_emit (asm_out_file, insn);
3058 /* Let the debug info back-end know about this call. We do this only
3059 after the instruction has been emitted because labels that may be
3060 created to reference the call instruction must appear after it. */
3061 if (call_insn != NULL && !DECL_IGNORED_P (current_function_decl))
3062 debug_hooks->var_location (insn);
3064 current_output_insn = debug_insn = 0;
3067 return NEXT_INSN (insn);
3070 /* Return whether a source line note needs to be emitted before INSN.
3071 Sets IS_STMT to TRUE if the line should be marked as a possible
3072 breakpoint location. */
3074 static bool
3075 notice_source_line (rtx_insn *insn, bool *is_stmt)
3077 const char *filename;
3078 int linenum;
3080 if (override_filename)
3082 filename = override_filename;
3083 linenum = override_linenum;
3085 else if (INSN_HAS_LOCATION (insn))
3087 expanded_location xloc = insn_location (insn);
3088 filename = xloc.file;
3089 linenum = xloc.line;
3091 else
3093 filename = NULL;
3094 linenum = 0;
3097 if (filename == NULL)
3098 return false;
3100 if (force_source_line
3101 || filename != last_filename
3102 || last_linenum != linenum)
3104 force_source_line = false;
3105 last_filename = filename;
3106 last_linenum = linenum;
3107 last_discriminator = discriminator;
3108 *is_stmt = true;
3109 high_block_linenum = MAX (last_linenum, high_block_linenum);
3110 high_function_linenum = MAX (last_linenum, high_function_linenum);
3111 return true;
3114 if (SUPPORTS_DISCRIMINATOR && last_discriminator != discriminator)
3116 /* If the discriminator changed, but the line number did not,
3117 output the line table entry with is_stmt false so the
3118 debugger does not treat this as a breakpoint location. */
3119 last_discriminator = discriminator;
3120 *is_stmt = false;
3121 return true;
3124 return false;
3127 /* For each operand in INSN, simplify (subreg (reg)) so that it refers
3128 directly to the desired hard register. */
3130 void
3131 cleanup_subreg_operands (rtx_insn *insn)
3133 int i;
3134 bool changed = false;
3135 extract_insn_cached (insn);
3136 for (i = 0; i < recog_data.n_operands; i++)
3138 /* The following test cannot use recog_data.operand when testing
3139 for a SUBREG: the underlying object might have been changed
3140 already if we are inside a match_operator expression that
3141 matches the else clause. Instead we test the underlying
3142 expression directly. */
3143 if (GET_CODE (*recog_data.operand_loc[i]) == SUBREG)
3145 recog_data.operand[i] = alter_subreg (recog_data.operand_loc[i], true);
3146 changed = true;
3148 else if (GET_CODE (recog_data.operand[i]) == PLUS
3149 || GET_CODE (recog_data.operand[i]) == MULT
3150 || MEM_P (recog_data.operand[i]))
3151 recog_data.operand[i] = walk_alter_subreg (recog_data.operand_loc[i], &changed);
3154 for (i = 0; i < recog_data.n_dups; i++)
3156 if (GET_CODE (*recog_data.dup_loc[i]) == SUBREG)
3158 *recog_data.dup_loc[i] = alter_subreg (recog_data.dup_loc[i], true);
3159 changed = true;
3161 else if (GET_CODE (*recog_data.dup_loc[i]) == PLUS
3162 || GET_CODE (*recog_data.dup_loc[i]) == MULT
3163 || MEM_P (*recog_data.dup_loc[i]))
3164 *recog_data.dup_loc[i] = walk_alter_subreg (recog_data.dup_loc[i], &changed);
3166 if (changed)
3167 df_insn_rescan (insn);
3170 /* If X is a SUBREG, try to replace it with a REG or a MEM, based on
3171 the thing it is a subreg of. Do it anyway if FINAL_P. */
3174 alter_subreg (rtx *xp, bool final_p)
3176 rtx x = *xp;
3177 rtx y = SUBREG_REG (x);
3179 /* simplify_subreg does not remove subreg from volatile references.
3180 We are required to. */
3181 if (MEM_P (y))
3183 int offset = SUBREG_BYTE (x);
3185 /* For paradoxical subregs on big-endian machines, SUBREG_BYTE
3186 contains 0 instead of the proper offset. See simplify_subreg. */
3187 if (offset == 0
3188 && GET_MODE_SIZE (GET_MODE (y)) < GET_MODE_SIZE (GET_MODE (x)))
3190 int difference = GET_MODE_SIZE (GET_MODE (y))
3191 - GET_MODE_SIZE (GET_MODE (x));
3192 if (WORDS_BIG_ENDIAN)
3193 offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
3194 if (BYTES_BIG_ENDIAN)
3195 offset += difference % UNITS_PER_WORD;
3198 if (final_p)
3199 *xp = adjust_address (y, GET_MODE (x), offset);
3200 else
3201 *xp = adjust_address_nv (y, GET_MODE (x), offset);
3203 else if (REG_P (y) && HARD_REGISTER_P (y))
3205 rtx new_rtx = simplify_subreg (GET_MODE (x), y, GET_MODE (y),
3206 SUBREG_BYTE (x));
3208 if (new_rtx != 0)
3209 *xp = new_rtx;
3210 else if (final_p && REG_P (y))
3212 /* Simplify_subreg can't handle some REG cases, but we have to. */
3213 unsigned int regno;
3214 HOST_WIDE_INT offset;
3216 regno = subreg_regno (x);
3217 if (subreg_lowpart_p (x))
3218 offset = byte_lowpart_offset (GET_MODE (x), GET_MODE (y));
3219 else
3220 offset = SUBREG_BYTE (x);
3221 *xp = gen_rtx_REG_offset (y, GET_MODE (x), regno, offset);
3225 return *xp;
3228 /* Do alter_subreg on all the SUBREGs contained in X. */
3230 static rtx
3231 walk_alter_subreg (rtx *xp, bool *changed)
3233 rtx x = *xp;
3234 switch (GET_CODE (x))
3236 case PLUS:
3237 case MULT:
3238 case AND:
3239 XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0), changed);
3240 XEXP (x, 1) = walk_alter_subreg (&XEXP (x, 1), changed);
3241 break;
3243 case MEM:
3244 case ZERO_EXTEND:
3245 XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0), changed);
3246 break;
3248 case SUBREG:
3249 *changed = true;
3250 return alter_subreg (xp, true);
3252 default:
3253 break;
3256 return *xp;
3259 #if HAVE_cc0
3261 /* Given BODY, the body of a jump instruction, alter the jump condition
3262 as required by the bits that are set in cc_status.flags.
3263 Not all of the bits there can be handled at this level in all cases.
3265 The value is normally 0.
3266 1 means that the condition has become always true.
3267 -1 means that the condition has become always false.
3268 2 means that COND has been altered. */
3270 static int
3271 alter_cond (rtx cond)
3273 int value = 0;
3275 if (cc_status.flags & CC_REVERSED)
3277 value = 2;
3278 PUT_CODE (cond, swap_condition (GET_CODE (cond)));
3281 if (cc_status.flags & CC_INVERTED)
3283 value = 2;
3284 PUT_CODE (cond, reverse_condition (GET_CODE (cond)));
3287 if (cc_status.flags & CC_NOT_POSITIVE)
3288 switch (GET_CODE (cond))
3290 case LE:
3291 case LEU:
3292 case GEU:
3293 /* Jump becomes unconditional. */
3294 return 1;
3296 case GT:
3297 case GTU:
3298 case LTU:
3299 /* Jump becomes no-op. */
3300 return -1;
3302 case GE:
3303 PUT_CODE (cond, EQ);
3304 value = 2;
3305 break;
3307 case LT:
3308 PUT_CODE (cond, NE);
3309 value = 2;
3310 break;
3312 default:
3313 break;
3316 if (cc_status.flags & CC_NOT_NEGATIVE)
3317 switch (GET_CODE (cond))
3319 case GE:
3320 case GEU:
3321 /* Jump becomes unconditional. */
3322 return 1;
3324 case LT:
3325 case LTU:
3326 /* Jump becomes no-op. */
3327 return -1;
3329 case LE:
3330 case LEU:
3331 PUT_CODE (cond, EQ);
3332 value = 2;
3333 break;
3335 case GT:
3336 case GTU:
3337 PUT_CODE (cond, NE);
3338 value = 2;
3339 break;
3341 default:
3342 break;
3345 if (cc_status.flags & CC_NO_OVERFLOW)
3346 switch (GET_CODE (cond))
3348 case GEU:
3349 /* Jump becomes unconditional. */
3350 return 1;
3352 case LEU:
3353 PUT_CODE (cond, EQ);
3354 value = 2;
3355 break;
3357 case GTU:
3358 PUT_CODE (cond, NE);
3359 value = 2;
3360 break;
3362 case LTU:
3363 /* Jump becomes no-op. */
3364 return -1;
3366 default:
3367 break;
3370 if (cc_status.flags & (CC_Z_IN_NOT_N | CC_Z_IN_N))
3371 switch (GET_CODE (cond))
3373 default:
3374 gcc_unreachable ();
3376 case NE:
3377 PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? GE : LT);
3378 value = 2;
3379 break;
3381 case EQ:
3382 PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? LT : GE);
3383 value = 2;
3384 break;
3387 if (cc_status.flags & CC_NOT_SIGNED)
3388 /* The flags are valid if signed condition operators are converted
3389 to unsigned. */
3390 switch (GET_CODE (cond))
3392 case LE:
3393 PUT_CODE (cond, LEU);
3394 value = 2;
3395 break;
3397 case LT:
3398 PUT_CODE (cond, LTU);
3399 value = 2;
3400 break;
3402 case GT:
3403 PUT_CODE (cond, GTU);
3404 value = 2;
3405 break;
3407 case GE:
3408 PUT_CODE (cond, GEU);
3409 value = 2;
3410 break;
3412 default:
3413 break;
3416 return value;
3418 #endif
3420 /* Report inconsistency between the assembler template and the operands.
3421 In an `asm', it's the user's fault; otherwise, the compiler's fault. */
3423 void
3424 output_operand_lossage (const char *cmsgid, ...)
3426 char *fmt_string;
3427 char *new_message;
3428 const char *pfx_str;
3429 va_list ap;
3431 va_start (ap, cmsgid);
3433 pfx_str = this_is_asm_operands ? _("invalid 'asm': ") : "output_operand: ";
3434 fmt_string = xasprintf ("%s%s", pfx_str, _(cmsgid));
3435 new_message = xvasprintf (fmt_string, ap);
3437 if (this_is_asm_operands)
3438 error_for_asm (this_is_asm_operands, "%s", new_message);
3439 else
3440 internal_error ("%s", new_message);
3442 free (fmt_string);
3443 free (new_message);
3444 va_end (ap);
3447 /* Output of assembler code from a template, and its subroutines. */
3449 /* Annotate the assembly with a comment describing the pattern and
3450 alternative used. */
3452 static void
3453 output_asm_name (void)
3455 if (debug_insn)
3457 int num = INSN_CODE (debug_insn);
3458 fprintf (asm_out_file, "\t%s %d\t%s",
3459 ASM_COMMENT_START, INSN_UID (debug_insn),
3460 insn_data[num].name);
3461 if (insn_data[num].n_alternatives > 1)
3462 fprintf (asm_out_file, "/%d", which_alternative + 1);
3464 if (HAVE_ATTR_length)
3465 fprintf (asm_out_file, "\t[length = %d]",
3466 get_attr_length (debug_insn));
3468 /* Clear this so only the first assembler insn
3469 of any rtl insn will get the special comment for -dp. */
3470 debug_insn = 0;
3474 /* If OP is a REG or MEM and we can find a MEM_EXPR corresponding to it
3475 or its address, return that expr . Set *PADDRESSP to 1 if the expr
3476 corresponds to the address of the object and 0 if to the object. */
3478 static tree
3479 get_mem_expr_from_op (rtx op, int *paddressp)
3481 tree expr;
3482 int inner_addressp;
3484 *paddressp = 0;
3486 if (REG_P (op))
3487 return REG_EXPR (op);
3488 else if (!MEM_P (op))
3489 return 0;
3491 if (MEM_EXPR (op) != 0)
3492 return MEM_EXPR (op);
3494 /* Otherwise we have an address, so indicate it and look at the address. */
3495 *paddressp = 1;
3496 op = XEXP (op, 0);
3498 /* First check if we have a decl for the address, then look at the right side
3499 if it is a PLUS. Otherwise, strip off arithmetic and keep looking.
3500 But don't allow the address to itself be indirect. */
3501 if ((expr = get_mem_expr_from_op (op, &inner_addressp)) && ! inner_addressp)
3502 return expr;
3503 else if (GET_CODE (op) == PLUS
3504 && (expr = get_mem_expr_from_op (XEXP (op, 1), &inner_addressp)))
3505 return expr;
3507 while (UNARY_P (op)
3508 || GET_RTX_CLASS (GET_CODE (op)) == RTX_BIN_ARITH)
3509 op = XEXP (op, 0);
3511 expr = get_mem_expr_from_op (op, &inner_addressp);
3512 return inner_addressp ? 0 : expr;
3515 /* Output operand names for assembler instructions. OPERANDS is the
3516 operand vector, OPORDER is the order to write the operands, and NOPS
3517 is the number of operands to write. */
3519 static void
3520 output_asm_operand_names (rtx *operands, int *oporder, int nops)
3522 int wrote = 0;
3523 int i;
3525 for (i = 0; i < nops; i++)
3527 int addressp;
3528 rtx op = operands[oporder[i]];
3529 tree expr = get_mem_expr_from_op (op, &addressp);
3531 fprintf (asm_out_file, "%c%s",
3532 wrote ? ',' : '\t', wrote ? "" : ASM_COMMENT_START);
3533 wrote = 1;
3534 if (expr)
3536 fprintf (asm_out_file, "%s",
3537 addressp ? "*" : "");
3538 print_mem_expr (asm_out_file, expr);
3539 wrote = 1;
3541 else if (REG_P (op) && ORIGINAL_REGNO (op)
3542 && ORIGINAL_REGNO (op) != REGNO (op))
3543 fprintf (asm_out_file, " tmp%i", ORIGINAL_REGNO (op));
3547 #ifdef ASSEMBLER_DIALECT
3548 /* Helper function to parse assembler dialects in the asm string.
3549 This is called from output_asm_insn and asm_fprintf. */
3550 static const char *
3551 do_assembler_dialects (const char *p, int *dialect)
3553 char c = *(p - 1);
3555 switch (c)
3557 case '{':
3559 int i;
3561 if (*dialect)
3562 output_operand_lossage ("nested assembly dialect alternatives");
3563 else
3564 *dialect = 1;
3566 /* If we want the first dialect, do nothing. Otherwise, skip
3567 DIALECT_NUMBER of strings ending with '|'. */
3568 for (i = 0; i < dialect_number; i++)
3570 while (*p && *p != '}')
3572 if (*p == '|')
3574 p++;
3575 break;
3578 /* Skip over any character after a percent sign. */
3579 if (*p == '%')
3580 p++;
3581 if (*p)
3582 p++;
3585 if (*p == '}')
3586 break;
3589 if (*p == '\0')
3590 output_operand_lossage ("unterminated assembly dialect alternative");
3592 break;
3594 case '|':
3595 if (*dialect)
3597 /* Skip to close brace. */
3600 if (*p == '\0')
3602 output_operand_lossage ("unterminated assembly dialect alternative");
3603 break;
3606 /* Skip over any character after a percent sign. */
3607 if (*p == '%' && p[1])
3609 p += 2;
3610 continue;
3613 if (*p++ == '}')
3614 break;
3616 while (1);
3618 *dialect = 0;
3620 else
3621 putc (c, asm_out_file);
3622 break;
3624 case '}':
3625 if (! *dialect)
3626 putc (c, asm_out_file);
3627 *dialect = 0;
3628 break;
3629 default:
3630 gcc_unreachable ();
3633 return p;
3635 #endif
3637 /* Output text from TEMPLATE to the assembler output file,
3638 obeying %-directions to substitute operands taken from
3639 the vector OPERANDS.
3641 %N (for N a digit) means print operand N in usual manner.
3642 %lN means require operand N to be a CODE_LABEL or LABEL_REF
3643 and print the label name with no punctuation.
3644 %cN means require operand N to be a constant
3645 and print the constant expression with no punctuation.
3646 %aN means expect operand N to be a memory address
3647 (not a memory reference!) and print a reference
3648 to that address.
3649 %nN means expect operand N to be a constant
3650 and print a constant expression for minus the value
3651 of the operand, with no other punctuation. */
3653 void
3654 output_asm_insn (const char *templ, rtx *operands)
3656 const char *p;
3657 int c;
3658 #ifdef ASSEMBLER_DIALECT
3659 int dialect = 0;
3660 #endif
3661 int oporder[MAX_RECOG_OPERANDS];
3662 char opoutput[MAX_RECOG_OPERANDS];
3663 int ops = 0;
3665 /* An insn may return a null string template
3666 in a case where no assembler code is needed. */
3667 if (*templ == 0)
3668 return;
3670 memset (opoutput, 0, sizeof opoutput);
3671 p = templ;
3672 putc ('\t', asm_out_file);
3674 #ifdef ASM_OUTPUT_OPCODE
3675 ASM_OUTPUT_OPCODE (asm_out_file, p);
3676 #endif
3678 while ((c = *p++))
3679 switch (c)
3681 case '\n':
3682 if (flag_verbose_asm)
3683 output_asm_operand_names (operands, oporder, ops);
3684 if (flag_print_asm_name)
3685 output_asm_name ();
3687 ops = 0;
3688 memset (opoutput, 0, sizeof opoutput);
3690 putc (c, asm_out_file);
3691 #ifdef ASM_OUTPUT_OPCODE
3692 while ((c = *p) == '\t')
3694 putc (c, asm_out_file);
3695 p++;
3697 ASM_OUTPUT_OPCODE (asm_out_file, p);
3698 #endif
3699 break;
3701 #ifdef ASSEMBLER_DIALECT
3702 case '{':
3703 case '}':
3704 case '|':
3705 p = do_assembler_dialects (p, &dialect);
3706 break;
3707 #endif
3709 case '%':
3710 /* %% outputs a single %. %{, %} and %| print {, } and | respectively
3711 if ASSEMBLER_DIALECT defined and these characters have a special
3712 meaning as dialect delimiters.*/
3713 if (*p == '%'
3714 #ifdef ASSEMBLER_DIALECT
3715 || *p == '{' || *p == '}' || *p == '|'
3716 #endif
3719 putc (*p, asm_out_file);
3720 p++;
3722 /* %= outputs a number which is unique to each insn in the entire
3723 compilation. This is useful for making local labels that are
3724 referred to more than once in a given insn. */
3725 else if (*p == '=')
3727 p++;
3728 fprintf (asm_out_file, "%d", insn_counter);
3730 /* % followed by a letter and some digits
3731 outputs an operand in a special way depending on the letter.
3732 Letters `acln' are implemented directly.
3733 Other letters are passed to `output_operand' so that
3734 the TARGET_PRINT_OPERAND hook can define them. */
3735 else if (ISALPHA (*p))
3737 int letter = *p++;
3738 unsigned long opnum;
3739 char *endptr;
3741 opnum = strtoul (p, &endptr, 10);
3743 if (endptr == p)
3744 output_operand_lossage ("operand number missing "
3745 "after %%-letter");
3746 else if (this_is_asm_operands && opnum >= insn_noperands)
3747 output_operand_lossage ("operand number out of range");
3748 else if (letter == 'l')
3749 output_asm_label (operands[opnum]);
3750 else if (letter == 'a')
3751 output_address (VOIDmode, operands[opnum]);
3752 else if (letter == 'c')
3754 if (CONSTANT_ADDRESS_P (operands[opnum]))
3755 output_addr_const (asm_out_file, operands[opnum]);
3756 else
3757 output_operand (operands[opnum], 'c');
3759 else if (letter == 'n')
3761 if (CONST_INT_P (operands[opnum]))
3762 fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC,
3763 - INTVAL (operands[opnum]));
3764 else
3766 putc ('-', asm_out_file);
3767 output_addr_const (asm_out_file, operands[opnum]);
3770 else
3771 output_operand (operands[opnum], letter);
3773 if (!opoutput[opnum])
3774 oporder[ops++] = opnum;
3775 opoutput[opnum] = 1;
3777 p = endptr;
3778 c = *p;
3780 /* % followed by a digit outputs an operand the default way. */
3781 else if (ISDIGIT (*p))
3783 unsigned long opnum;
3784 char *endptr;
3786 opnum = strtoul (p, &endptr, 10);
3787 if (this_is_asm_operands && opnum >= insn_noperands)
3788 output_operand_lossage ("operand number out of range");
3789 else
3790 output_operand (operands[opnum], 0);
3792 if (!opoutput[opnum])
3793 oporder[ops++] = opnum;
3794 opoutput[opnum] = 1;
3796 p = endptr;
3797 c = *p;
3799 /* % followed by punctuation: output something for that
3800 punctuation character alone, with no operand. The
3801 TARGET_PRINT_OPERAND hook decides what is actually done. */
3802 else if (targetm.asm_out.print_operand_punct_valid_p ((unsigned char) *p))
3803 output_operand (NULL_RTX, *p++);
3804 else
3805 output_operand_lossage ("invalid %%-code");
3806 break;
3808 default:
3809 putc (c, asm_out_file);
3812 /* Write out the variable names for operands, if we know them. */
3813 if (flag_verbose_asm)
3814 output_asm_operand_names (operands, oporder, ops);
3815 if (flag_print_asm_name)
3816 output_asm_name ();
3818 putc ('\n', asm_out_file);
3821 /* Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol. */
3823 void
3824 output_asm_label (rtx x)
3826 char buf[256];
3828 if (GET_CODE (x) == LABEL_REF)
3829 x = LABEL_REF_LABEL (x);
3830 if (LABEL_P (x)
3831 || (NOTE_P (x)
3832 && NOTE_KIND (x) == NOTE_INSN_DELETED_LABEL))
3833 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3834 else
3835 output_operand_lossage ("'%%l' operand isn't a label");
3837 assemble_name (asm_out_file, buf);
3840 /* Marks SYMBOL_REFs in x as referenced through use of assemble_external. */
3842 void
3843 mark_symbol_refs_as_used (rtx x)
3845 subrtx_iterator::array_type array;
3846 FOR_EACH_SUBRTX (iter, array, x, ALL)
3848 const_rtx x = *iter;
3849 if (GET_CODE (x) == SYMBOL_REF)
3850 if (tree t = SYMBOL_REF_DECL (x))
3851 assemble_external (t);
3855 /* Print operand X using machine-dependent assembler syntax.
3856 CODE is a non-digit that preceded the operand-number in the % spec,
3857 such as 'z' if the spec was `%z3'. CODE is 0 if there was no char
3858 between the % and the digits.
3859 When CODE is a non-letter, X is 0.
3861 The meanings of the letters are machine-dependent and controlled
3862 by TARGET_PRINT_OPERAND. */
3864 void
3865 output_operand (rtx x, int code ATTRIBUTE_UNUSED)
3867 if (x && GET_CODE (x) == SUBREG)
3868 x = alter_subreg (&x, true);
3870 /* X must not be a pseudo reg. */
3871 if (!targetm.no_register_allocation)
3872 gcc_assert (!x || !REG_P (x) || REGNO (x) < FIRST_PSEUDO_REGISTER);
3874 targetm.asm_out.print_operand (asm_out_file, x, code);
3876 if (x == NULL_RTX)
3877 return;
3879 mark_symbol_refs_as_used (x);
3882 /* Print a memory reference operand for address X using
3883 machine-dependent assembler syntax. */
3885 void
3886 output_address (machine_mode mode, rtx x)
3888 bool changed = false;
3889 walk_alter_subreg (&x, &changed);
3890 targetm.asm_out.print_operand_address (asm_out_file, mode, x);
3893 /* Print an integer constant expression in assembler syntax.
3894 Addition and subtraction are the only arithmetic
3895 that may appear in these expressions. */
3897 void
3898 output_addr_const (FILE *file, rtx x)
3900 char buf[256];
3902 restart:
3903 switch (GET_CODE (x))
3905 case PC:
3906 putc ('.', file);
3907 break;
3909 case SYMBOL_REF:
3910 if (SYMBOL_REF_DECL (x))
3911 assemble_external (SYMBOL_REF_DECL (x));
3912 #ifdef ASM_OUTPUT_SYMBOL_REF
3913 ASM_OUTPUT_SYMBOL_REF (file, x);
3914 #else
3915 assemble_name (file, XSTR (x, 0));
3916 #endif
3917 break;
3919 case LABEL_REF:
3920 x = LABEL_REF_LABEL (x);
3921 /* Fall through. */
3922 case CODE_LABEL:
3923 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3924 #ifdef ASM_OUTPUT_LABEL_REF
3925 ASM_OUTPUT_LABEL_REF (file, buf);
3926 #else
3927 assemble_name (file, buf);
3928 #endif
3929 break;
3931 case CONST_INT:
3932 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
3933 break;
3935 case CONST:
3936 /* This used to output parentheses around the expression,
3937 but that does not work on the 386 (either ATT or BSD assembler). */
3938 output_addr_const (file, XEXP (x, 0));
3939 break;
3941 case CONST_WIDE_INT:
3942 /* We do not know the mode here so we have to use a round about
3943 way to build a wide-int to get it printed properly. */
3945 wide_int w = wide_int::from_array (&CONST_WIDE_INT_ELT (x, 0),
3946 CONST_WIDE_INT_NUNITS (x),
3947 CONST_WIDE_INT_NUNITS (x)
3948 * HOST_BITS_PER_WIDE_INT,
3949 false);
3950 print_decs (w, file);
3952 break;
3954 case CONST_DOUBLE:
3955 if (CONST_DOUBLE_AS_INT_P (x))
3957 /* We can use %d if the number is one word and positive. */
3958 if (CONST_DOUBLE_HIGH (x))
3959 fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
3960 (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (x),
3961 (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (x));
3962 else if (CONST_DOUBLE_LOW (x) < 0)
3963 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
3964 (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (x));
3965 else
3966 fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
3968 else
3969 /* We can't handle floating point constants;
3970 PRINT_OPERAND must handle them. */
3971 output_operand_lossage ("floating constant misused");
3972 break;
3974 case CONST_FIXED:
3975 fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_FIXED_VALUE_LOW (x));
3976 break;
3978 case PLUS:
3979 /* Some assemblers need integer constants to appear last (eg masm). */
3980 if (CONST_INT_P (XEXP (x, 0)))
3982 output_addr_const (file, XEXP (x, 1));
3983 if (INTVAL (XEXP (x, 0)) >= 0)
3984 fprintf (file, "+");
3985 output_addr_const (file, XEXP (x, 0));
3987 else
3989 output_addr_const (file, XEXP (x, 0));
3990 if (!CONST_INT_P (XEXP (x, 1))
3991 || INTVAL (XEXP (x, 1)) >= 0)
3992 fprintf (file, "+");
3993 output_addr_const (file, XEXP (x, 1));
3995 break;
3997 case MINUS:
3998 /* Avoid outputting things like x-x or x+5-x,
3999 since some assemblers can't handle that. */
4000 x = simplify_subtraction (x);
4001 if (GET_CODE (x) != MINUS)
4002 goto restart;
4004 output_addr_const (file, XEXP (x, 0));
4005 fprintf (file, "-");
4006 if ((CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) >= 0)
4007 || GET_CODE (XEXP (x, 1)) == PC
4008 || GET_CODE (XEXP (x, 1)) == SYMBOL_REF)
4009 output_addr_const (file, XEXP (x, 1));
4010 else
4012 fputs (targetm.asm_out.open_paren, file);
4013 output_addr_const (file, XEXP (x, 1));
4014 fputs (targetm.asm_out.close_paren, file);
4016 break;
4018 case ZERO_EXTEND:
4019 case SIGN_EXTEND:
4020 case SUBREG:
4021 case TRUNCATE:
4022 output_addr_const (file, XEXP (x, 0));
4023 break;
4025 default:
4026 if (targetm.asm_out.output_addr_const_extra (file, x))
4027 break;
4029 output_operand_lossage ("invalid expression as operand");
4033 /* Output a quoted string. */
4035 void
4036 output_quoted_string (FILE *asm_file, const char *string)
4038 #ifdef OUTPUT_QUOTED_STRING
4039 OUTPUT_QUOTED_STRING (asm_file, string);
4040 #else
4041 char c;
4043 putc ('\"', asm_file);
4044 while ((c = *string++) != 0)
4046 if (ISPRINT (c))
4048 if (c == '\"' || c == '\\')
4049 putc ('\\', asm_file);
4050 putc (c, asm_file);
4052 else
4053 fprintf (asm_file, "\\%03o", (unsigned char) c);
4055 putc ('\"', asm_file);
4056 #endif
4059 /* Write a HOST_WIDE_INT number in hex form 0x1234, fast. */
4061 void
4062 fprint_whex (FILE *f, unsigned HOST_WIDE_INT value)
4064 char buf[2 + CHAR_BIT * sizeof (value) / 4];
4065 if (value == 0)
4066 putc ('0', f);
4067 else
4069 char *p = buf + sizeof (buf);
4071 *--p = "0123456789abcdef"[value % 16];
4072 while ((value /= 16) != 0);
4073 *--p = 'x';
4074 *--p = '0';
4075 fwrite (p, 1, buf + sizeof (buf) - p, f);
4079 /* Internal function that prints an unsigned long in decimal in reverse.
4080 The output string IS NOT null-terminated. */
4082 static int
4083 sprint_ul_rev (char *s, unsigned long value)
4085 int i = 0;
4088 s[i] = "0123456789"[value % 10];
4089 value /= 10;
4090 i++;
4091 /* alternate version, without modulo */
4092 /* oldval = value; */
4093 /* value /= 10; */
4094 /* s[i] = "0123456789" [oldval - 10*value]; */
4095 /* i++ */
4097 while (value != 0);
4098 return i;
4101 /* Write an unsigned long as decimal to a file, fast. */
4103 void
4104 fprint_ul (FILE *f, unsigned long value)
4106 /* python says: len(str(2**64)) == 20 */
4107 char s[20];
4108 int i;
4110 i = sprint_ul_rev (s, value);
4112 /* It's probably too small to bother with string reversal and fputs. */
4115 i--;
4116 putc (s[i], f);
4118 while (i != 0);
4121 /* Write an unsigned long as decimal to a string, fast.
4122 s must be wide enough to not overflow, at least 21 chars.
4123 Returns the length of the string (without terminating '\0'). */
4126 sprint_ul (char *s, unsigned long value)
4128 int len = sprint_ul_rev (s, value);
4129 s[len] = '\0';
4131 std::reverse (s, s + len);
4132 return len;
4135 /* A poor man's fprintf, with the added features of %I, %R, %L, and %U.
4136 %R prints the value of REGISTER_PREFIX.
4137 %L prints the value of LOCAL_LABEL_PREFIX.
4138 %U prints the value of USER_LABEL_PREFIX.
4139 %I prints the value of IMMEDIATE_PREFIX.
4140 %O runs ASM_OUTPUT_OPCODE to transform what follows in the string.
4141 Also supported are %d, %i, %u, %x, %X, %o, %c, %s and %%.
4143 We handle alternate assembler dialects here, just like output_asm_insn. */
4145 void
4146 asm_fprintf (FILE *file, const char *p, ...)
4148 char buf[10];
4149 char *q, c;
4150 #ifdef ASSEMBLER_DIALECT
4151 int dialect = 0;
4152 #endif
4153 va_list argptr;
4155 va_start (argptr, p);
4157 buf[0] = '%';
4159 while ((c = *p++))
4160 switch (c)
4162 #ifdef ASSEMBLER_DIALECT
4163 case '{':
4164 case '}':
4165 case '|':
4166 p = do_assembler_dialects (p, &dialect);
4167 break;
4168 #endif
4170 case '%':
4171 c = *p++;
4172 q = &buf[1];
4173 while (strchr ("-+ #0", c))
4175 *q++ = c;
4176 c = *p++;
4178 while (ISDIGIT (c) || c == '.')
4180 *q++ = c;
4181 c = *p++;
4183 switch (c)
4185 case '%':
4186 putc ('%', file);
4187 break;
4189 case 'd': case 'i': case 'u':
4190 case 'x': case 'X': case 'o':
4191 case 'c':
4192 *q++ = c;
4193 *q = 0;
4194 fprintf (file, buf, va_arg (argptr, int));
4195 break;
4197 case 'w':
4198 /* This is a prefix to the 'd', 'i', 'u', 'x', 'X', and
4199 'o' cases, but we do not check for those cases. It
4200 means that the value is a HOST_WIDE_INT, which may be
4201 either `long' or `long long'. */
4202 memcpy (q, HOST_WIDE_INT_PRINT, strlen (HOST_WIDE_INT_PRINT));
4203 q += strlen (HOST_WIDE_INT_PRINT);
4204 *q++ = *p++;
4205 *q = 0;
4206 fprintf (file, buf, va_arg (argptr, HOST_WIDE_INT));
4207 break;
4209 case 'l':
4210 *q++ = c;
4211 #ifdef HAVE_LONG_LONG
4212 if (*p == 'l')
4214 *q++ = *p++;
4215 *q++ = *p++;
4216 *q = 0;
4217 fprintf (file, buf, va_arg (argptr, long long));
4219 else
4220 #endif
4222 *q++ = *p++;
4223 *q = 0;
4224 fprintf (file, buf, va_arg (argptr, long));
4227 break;
4229 case 's':
4230 *q++ = c;
4231 *q = 0;
4232 fprintf (file, buf, va_arg (argptr, char *));
4233 break;
4235 case 'O':
4236 #ifdef ASM_OUTPUT_OPCODE
4237 ASM_OUTPUT_OPCODE (asm_out_file, p);
4238 #endif
4239 break;
4241 case 'R':
4242 #ifdef REGISTER_PREFIX
4243 fprintf (file, "%s", REGISTER_PREFIX);
4244 #endif
4245 break;
4247 case 'I':
4248 #ifdef IMMEDIATE_PREFIX
4249 fprintf (file, "%s", IMMEDIATE_PREFIX);
4250 #endif
4251 break;
4253 case 'L':
4254 #ifdef LOCAL_LABEL_PREFIX
4255 fprintf (file, "%s", LOCAL_LABEL_PREFIX);
4256 #endif
4257 break;
4259 case 'U':
4260 fputs (user_label_prefix, file);
4261 break;
4263 #ifdef ASM_FPRINTF_EXTENSIONS
4264 /* Uppercase letters are reserved for general use by asm_fprintf
4265 and so are not available to target specific code. In order to
4266 prevent the ASM_FPRINTF_EXTENSIONS macro from using them then,
4267 they are defined here. As they get turned into real extensions
4268 to asm_fprintf they should be removed from this list. */
4269 case 'A': case 'B': case 'C': case 'D': case 'E':
4270 case 'F': case 'G': case 'H': case 'J': case 'K':
4271 case 'M': case 'N': case 'P': case 'Q': case 'S':
4272 case 'T': case 'V': case 'W': case 'Y': case 'Z':
4273 break;
4275 ASM_FPRINTF_EXTENSIONS (file, argptr, p)
4276 #endif
4277 default:
4278 gcc_unreachable ();
4280 break;
4282 default:
4283 putc (c, file);
4285 va_end (argptr);
4288 /* Return nonzero if this function has no function calls. */
4291 leaf_function_p (void)
4293 rtx_insn *insn;
4295 /* Some back-ends (e.g. s390) want leaf functions to stay leaf
4296 functions even if they call mcount. */
4297 if (crtl->profile && !targetm.keep_leaf_when_profiled ())
4298 return 0;
4300 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4302 if (CALL_P (insn)
4303 && ! SIBLING_CALL_P (insn))
4304 return 0;
4305 if (NONJUMP_INSN_P (insn)
4306 && GET_CODE (PATTERN (insn)) == SEQUENCE
4307 && CALL_P (XVECEXP (PATTERN (insn), 0, 0))
4308 && ! SIBLING_CALL_P (XVECEXP (PATTERN (insn), 0, 0)))
4309 return 0;
4312 return 1;
4315 /* Return 1 if branch is a forward branch.
4316 Uses insn_shuid array, so it works only in the final pass. May be used by
4317 output templates to customary add branch prediction hints.
4320 final_forward_branch_p (rtx_insn *insn)
4322 int insn_id, label_id;
4324 gcc_assert (uid_shuid);
4325 insn_id = INSN_SHUID (insn);
4326 label_id = INSN_SHUID (JUMP_LABEL (insn));
4327 /* We've hit some insns that does not have id information available. */
4328 gcc_assert (insn_id && label_id);
4329 return insn_id < label_id;
4332 /* On some machines, a function with no call insns
4333 can run faster if it doesn't create its own register window.
4334 When output, the leaf function should use only the "output"
4335 registers. Ordinarily, the function would be compiled to use
4336 the "input" registers to find its arguments; it is a candidate
4337 for leaf treatment if it uses only the "input" registers.
4338 Leaf function treatment means renumbering so the function
4339 uses the "output" registers instead. */
4341 #ifdef LEAF_REGISTERS
4343 /* Return 1 if this function uses only the registers that can be
4344 safely renumbered. */
4347 only_leaf_regs_used (void)
4349 int i;
4350 const char *const permitted_reg_in_leaf_functions = LEAF_REGISTERS;
4352 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4353 if ((df_regs_ever_live_p (i) || global_regs[i])
4354 && ! permitted_reg_in_leaf_functions[i])
4355 return 0;
4357 if (crtl->uses_pic_offset_table
4358 && pic_offset_table_rtx != 0
4359 && REG_P (pic_offset_table_rtx)
4360 && ! permitted_reg_in_leaf_functions[REGNO (pic_offset_table_rtx)])
4361 return 0;
4363 return 1;
4366 /* Scan all instructions and renumber all registers into those
4367 available in leaf functions. */
4369 static void
4370 leaf_renumber_regs (rtx_insn *first)
4372 rtx_insn *insn;
4374 /* Renumber only the actual patterns.
4375 The reg-notes can contain frame pointer refs,
4376 and renumbering them could crash, and should not be needed. */
4377 for (insn = first; insn; insn = NEXT_INSN (insn))
4378 if (INSN_P (insn))
4379 leaf_renumber_regs_insn (PATTERN (insn));
4382 /* Scan IN_RTX and its subexpressions, and renumber all regs into those
4383 available in leaf functions. */
4385 void
4386 leaf_renumber_regs_insn (rtx in_rtx)
4388 int i, j;
4389 const char *format_ptr;
4391 if (in_rtx == 0)
4392 return;
4394 /* Renumber all input-registers into output-registers.
4395 renumbered_regs would be 1 for an output-register;
4396 they */
4398 if (REG_P (in_rtx))
4400 int newreg;
4402 /* Don't renumber the same reg twice. */
4403 if (in_rtx->used)
4404 return;
4406 newreg = REGNO (in_rtx);
4407 /* Don't try to renumber pseudo regs. It is possible for a pseudo reg
4408 to reach here as part of a REG_NOTE. */
4409 if (newreg >= FIRST_PSEUDO_REGISTER)
4411 in_rtx->used = 1;
4412 return;
4414 newreg = LEAF_REG_REMAP (newreg);
4415 gcc_assert (newreg >= 0);
4416 df_set_regs_ever_live (REGNO (in_rtx), false);
4417 df_set_regs_ever_live (newreg, true);
4418 SET_REGNO (in_rtx, newreg);
4419 in_rtx->used = 1;
4420 return;
4423 if (INSN_P (in_rtx))
4425 /* Inside a SEQUENCE, we find insns.
4426 Renumber just the patterns of these insns,
4427 just as we do for the top-level insns. */
4428 leaf_renumber_regs_insn (PATTERN (in_rtx));
4429 return;
4432 format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
4434 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
4435 switch (*format_ptr++)
4437 case 'e':
4438 leaf_renumber_regs_insn (XEXP (in_rtx, i));
4439 break;
4441 case 'E':
4442 if (NULL != XVEC (in_rtx, i))
4444 for (j = 0; j < XVECLEN (in_rtx, i); j++)
4445 leaf_renumber_regs_insn (XVECEXP (in_rtx, i, j));
4447 break;
4449 case 'S':
4450 case 's':
4451 case '0':
4452 case 'i':
4453 case 'w':
4454 case 'n':
4455 case 'u':
4456 break;
4458 default:
4459 gcc_unreachable ();
4462 #endif
4464 /* Turn the RTL into assembly. */
4465 static unsigned int
4466 rest_of_handle_final (void)
4468 const char *fnname = get_fnname_from_decl (current_function_decl);
4470 assemble_start_function (current_function_decl, fnname);
4471 final_start_function (get_insns (), asm_out_file, optimize);
4472 final (get_insns (), asm_out_file, optimize);
4473 if (flag_ipa_ra)
4474 collect_fn_hard_reg_usage ();
4475 final_end_function ();
4477 /* The IA-64 ".handlerdata" directive must be issued before the ".endp"
4478 directive that closes the procedure descriptor. Similarly, for x64 SEH.
4479 Otherwise it's not strictly necessary, but it doesn't hurt either. */
4480 output_function_exception_table (fnname);
4482 assemble_end_function (current_function_decl, fnname);
4484 user_defined_section_attribute = false;
4486 /* Free up reg info memory. */
4487 free_reg_info ();
4489 if (! quiet_flag)
4490 fflush (asm_out_file);
4492 /* Write DBX symbols if requested. */
4494 /* Note that for those inline functions where we don't initially
4495 know for certain that we will be generating an out-of-line copy,
4496 the first invocation of this routine (rest_of_compilation) will
4497 skip over this code by doing a `goto exit_rest_of_compilation;'.
4498 Later on, wrapup_global_declarations will (indirectly) call
4499 rest_of_compilation again for those inline functions that need
4500 to have out-of-line copies generated. During that call, we
4501 *will* be routed past here. */
4503 timevar_push (TV_SYMOUT);
4504 if (!DECL_IGNORED_P (current_function_decl))
4505 debug_hooks->function_decl (current_function_decl);
4506 timevar_pop (TV_SYMOUT);
4508 /* Release the blocks that are linked to DECL_INITIAL() to free the memory. */
4509 DECL_INITIAL (current_function_decl) = error_mark_node;
4511 if (DECL_STATIC_CONSTRUCTOR (current_function_decl)
4512 && targetm.have_ctors_dtors)
4513 targetm.asm_out.constructor (XEXP (DECL_RTL (current_function_decl), 0),
4514 decl_init_priority_lookup
4515 (current_function_decl));
4516 if (DECL_STATIC_DESTRUCTOR (current_function_decl)
4517 && targetm.have_ctors_dtors)
4518 targetm.asm_out.destructor (XEXP (DECL_RTL (current_function_decl), 0),
4519 decl_fini_priority_lookup
4520 (current_function_decl));
4521 return 0;
4524 namespace {
4526 const pass_data pass_data_final =
4528 RTL_PASS, /* type */
4529 "final", /* name */
4530 OPTGROUP_NONE, /* optinfo_flags */
4531 TV_FINAL, /* tv_id */
4532 0, /* properties_required */
4533 0, /* properties_provided */
4534 0, /* properties_destroyed */
4535 0, /* todo_flags_start */
4536 0, /* todo_flags_finish */
4539 class pass_final : public rtl_opt_pass
4541 public:
4542 pass_final (gcc::context *ctxt)
4543 : rtl_opt_pass (pass_data_final, ctxt)
4546 /* opt_pass methods: */
4547 virtual unsigned int execute (function *) { return rest_of_handle_final (); }
4549 }; // class pass_final
4551 } // anon namespace
4553 rtl_opt_pass *
4554 make_pass_final (gcc::context *ctxt)
4556 return new pass_final (ctxt);
4560 static unsigned int
4561 rest_of_handle_shorten_branches (void)
4563 /* Shorten branches. */
4564 shorten_branches (get_insns ());
4565 return 0;
4568 namespace {
4570 const pass_data pass_data_shorten_branches =
4572 RTL_PASS, /* type */
4573 "shorten", /* name */
4574 OPTGROUP_NONE, /* optinfo_flags */
4575 TV_SHORTEN_BRANCH, /* tv_id */
4576 0, /* properties_required */
4577 0, /* properties_provided */
4578 0, /* properties_destroyed */
4579 0, /* todo_flags_start */
4580 0, /* todo_flags_finish */
4583 class pass_shorten_branches : public rtl_opt_pass
4585 public:
4586 pass_shorten_branches (gcc::context *ctxt)
4587 : rtl_opt_pass (pass_data_shorten_branches, ctxt)
4590 /* opt_pass methods: */
4591 virtual unsigned int execute (function *)
4593 return rest_of_handle_shorten_branches ();
4596 }; // class pass_shorten_branches
4598 } // anon namespace
4600 rtl_opt_pass *
4601 make_pass_shorten_branches (gcc::context *ctxt)
4603 return new pass_shorten_branches (ctxt);
4607 static unsigned int
4608 rest_of_clean_state (void)
4610 rtx_insn *insn, *next;
4611 FILE *final_output = NULL;
4612 int save_unnumbered = flag_dump_unnumbered;
4613 int save_noaddr = flag_dump_noaddr;
4615 if (flag_dump_final_insns)
4617 final_output = fopen (flag_dump_final_insns, "a");
4618 if (!final_output)
4620 error ("could not open final insn dump file %qs: %m",
4621 flag_dump_final_insns);
4622 flag_dump_final_insns = NULL;
4624 else
4626 flag_dump_noaddr = flag_dump_unnumbered = 1;
4627 if (flag_compare_debug_opt || flag_compare_debug)
4628 dump_flags |= TDF_NOUID;
4629 dump_function_header (final_output, current_function_decl,
4630 dump_flags);
4631 final_insns_dump_p = true;
4633 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4634 if (LABEL_P (insn))
4635 INSN_UID (insn) = CODE_LABEL_NUMBER (insn);
4636 else
4638 if (NOTE_P (insn))
4639 set_block_for_insn (insn, NULL);
4640 INSN_UID (insn) = 0;
4645 /* It is very important to decompose the RTL instruction chain here:
4646 debug information keeps pointing into CODE_LABEL insns inside the function
4647 body. If these remain pointing to the other insns, we end up preserving
4648 whole RTL chain and attached detailed debug info in memory. */
4649 for (insn = get_insns (); insn; insn = next)
4651 next = NEXT_INSN (insn);
4652 SET_NEXT_INSN (insn) = NULL;
4653 SET_PREV_INSN (insn) = NULL;
4655 if (final_output
4656 && (!NOTE_P (insn) ||
4657 (NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION
4658 && NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION
4659 && NOTE_KIND (insn) != NOTE_INSN_BLOCK_BEG
4660 && NOTE_KIND (insn) != NOTE_INSN_BLOCK_END
4661 && NOTE_KIND (insn) != NOTE_INSN_DELETED_DEBUG_LABEL)))
4662 print_rtl_single (final_output, insn);
4665 if (final_output)
4667 flag_dump_noaddr = save_noaddr;
4668 flag_dump_unnumbered = save_unnumbered;
4669 final_insns_dump_p = false;
4671 if (fclose (final_output))
4673 error ("could not close final insn dump file %qs: %m",
4674 flag_dump_final_insns);
4675 flag_dump_final_insns = NULL;
4679 /* In case the function was not output,
4680 don't leave any temporary anonymous types
4681 queued up for sdb output. */
4682 if (SDB_DEBUGGING_INFO && write_symbols == SDB_DEBUG)
4683 sdbout_types (NULL_TREE);
4685 flag_rerun_cse_after_global_opts = 0;
4686 reload_completed = 0;
4687 epilogue_completed = 0;
4688 #ifdef STACK_REGS
4689 regstack_completed = 0;
4690 #endif
4692 /* Clear out the insn_length contents now that they are no
4693 longer valid. */
4694 init_insn_lengths ();
4696 /* Show no temporary slots allocated. */
4697 init_temp_slots ();
4699 free_bb_for_insn ();
4701 delete_tree_ssa (cfun);
4703 /* We can reduce stack alignment on call site only when we are sure that
4704 the function body just produced will be actually used in the final
4705 executable. */
4706 if (decl_binds_to_current_def_p (current_function_decl))
4708 unsigned int pref = crtl->preferred_stack_boundary;
4709 if (crtl->stack_alignment_needed > crtl->preferred_stack_boundary)
4710 pref = crtl->stack_alignment_needed;
4711 cgraph_node::rtl_info (current_function_decl)
4712 ->preferred_incoming_stack_boundary = pref;
4715 /* Make sure volatile mem refs aren't considered valid operands for
4716 arithmetic insns. We must call this here if this is a nested inline
4717 function, since the above code leaves us in the init_recog state,
4718 and the function context push/pop code does not save/restore volatile_ok.
4720 ??? Maybe it isn't necessary for expand_start_function to call this
4721 anymore if we do it here? */
4723 init_recog_no_volatile ();
4725 /* We're done with this function. Free up memory if we can. */
4726 free_after_parsing (cfun);
4727 free_after_compilation (cfun);
4728 return 0;
4731 namespace {
4733 const pass_data pass_data_clean_state =
4735 RTL_PASS, /* type */
4736 "*clean_state", /* name */
4737 OPTGROUP_NONE, /* optinfo_flags */
4738 TV_FINAL, /* tv_id */
4739 0, /* properties_required */
4740 0, /* properties_provided */
4741 PROP_rtl, /* properties_destroyed */
4742 0, /* todo_flags_start */
4743 0, /* todo_flags_finish */
4746 class pass_clean_state : public rtl_opt_pass
4748 public:
4749 pass_clean_state (gcc::context *ctxt)
4750 : rtl_opt_pass (pass_data_clean_state, ctxt)
4753 /* opt_pass methods: */
4754 virtual unsigned int execute (function *)
4756 return rest_of_clean_state ();
4759 }; // class pass_clean_state
4761 } // anon namespace
4763 rtl_opt_pass *
4764 make_pass_clean_state (gcc::context *ctxt)
4766 return new pass_clean_state (ctxt);
4769 /* Return true if INSN is a call to the current function. */
4771 static bool
4772 self_recursive_call_p (rtx_insn *insn)
4774 tree fndecl = get_call_fndecl (insn);
4775 return (fndecl == current_function_decl
4776 && decl_binds_to_current_def_p (fndecl));
4779 /* Collect hard register usage for the current function. */
4781 static void
4782 collect_fn_hard_reg_usage (void)
4784 rtx_insn *insn;
4785 #ifdef STACK_REGS
4786 int i;
4787 #endif
4788 struct cgraph_rtl_info *node;
4789 HARD_REG_SET function_used_regs;
4791 /* ??? To be removed when all the ports have been fixed. */
4792 if (!targetm.call_fusage_contains_non_callee_clobbers)
4793 return;
4795 CLEAR_HARD_REG_SET (function_used_regs);
4797 for (insn = get_insns (); insn != NULL_RTX; insn = next_insn (insn))
4799 HARD_REG_SET insn_used_regs;
4801 if (!NONDEBUG_INSN_P (insn))
4802 continue;
4804 if (CALL_P (insn)
4805 && !self_recursive_call_p (insn))
4807 if (!get_call_reg_set_usage (insn, &insn_used_regs,
4808 call_used_reg_set))
4809 return;
4811 IOR_HARD_REG_SET (function_used_regs, insn_used_regs);
4814 find_all_hard_reg_sets (insn, &insn_used_regs, false);
4815 IOR_HARD_REG_SET (function_used_regs, insn_used_regs);
4818 /* Be conservative - mark fixed and global registers as used. */
4819 IOR_HARD_REG_SET (function_used_regs, fixed_reg_set);
4821 #ifdef STACK_REGS
4822 /* Handle STACK_REGS conservatively, since the df-framework does not
4823 provide accurate information for them. */
4825 for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
4826 SET_HARD_REG_BIT (function_used_regs, i);
4827 #endif
4829 /* The information we have gathered is only interesting if it exposes a
4830 register from the call_used_regs that is not used in this function. */
4831 if (hard_reg_set_subset_p (call_used_reg_set, function_used_regs))
4832 return;
4834 node = cgraph_node::rtl_info (current_function_decl);
4835 gcc_assert (node != NULL);
4837 COPY_HARD_REG_SET (node->function_used_regs, function_used_regs);
4838 node->function_used_regs_valid = 1;
4841 /* Get the declaration of the function called by INSN. */
4843 static tree
4844 get_call_fndecl (rtx_insn *insn)
4846 rtx note, datum;
4848 note = find_reg_note (insn, REG_CALL_DECL, NULL_RTX);
4849 if (note == NULL_RTX)
4850 return NULL_TREE;
4852 datum = XEXP (note, 0);
4853 if (datum != NULL_RTX)
4854 return SYMBOL_REF_DECL (datum);
4856 return NULL_TREE;
4859 /* Return the cgraph_rtl_info of the function called by INSN. Returns NULL for
4860 call targets that can be overwritten. */
4862 static struct cgraph_rtl_info *
4863 get_call_cgraph_rtl_info (rtx_insn *insn)
4865 tree fndecl;
4867 if (insn == NULL_RTX)
4868 return NULL;
4870 fndecl = get_call_fndecl (insn);
4871 if (fndecl == NULL_TREE
4872 || !decl_binds_to_current_def_p (fndecl))
4873 return NULL;
4875 return cgraph_node::rtl_info (fndecl);
4878 /* Find hard registers used by function call instruction INSN, and return them
4879 in REG_SET. Return DEFAULT_SET in REG_SET if not found. */
4881 bool
4882 get_call_reg_set_usage (rtx_insn *insn, HARD_REG_SET *reg_set,
4883 HARD_REG_SET default_set)
4885 if (flag_ipa_ra)
4887 struct cgraph_rtl_info *node = get_call_cgraph_rtl_info (insn);
4888 if (node != NULL
4889 && node->function_used_regs_valid)
4891 COPY_HARD_REG_SET (*reg_set, node->function_used_regs);
4892 AND_HARD_REG_SET (*reg_set, default_set);
4893 return true;
4897 COPY_HARD_REG_SET (*reg_set, default_set);
4898 return false;