discriminator support. Ported from google/gcc-4_9 branch
[platform/upstream/gcc49.git] / gcc / final.c
1 /* Convert RTL to assembler code and output it, for GNU compiler.
2    Copyright (C) 1987-2014 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 /* This is the final pass of the compiler.
21    It looks at the rtl code for a function and outputs assembler code.
22
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'.
28
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.)
33
34    Instructions to set the condition codes are omitted when it can be
35    seen that the condition codes already had the desired values.
36
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.
40
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.  */
44
45 #include "config.h"
46 #include "system.h"
47 #include "coretypes.h"
48 #include "tm.h"
49
50 #include "tree.h"
51 #include "varasm.h"
52 #include "rtl.h"
53 #include "tm_p.h"
54 #include "regs.h"
55 #include "insn-config.h"
56 #include "insn-attr.h"
57 #include "recog.h"
58 #include "conditions.h"
59 #include "flags.h"
60 #include "hard-reg-set.h"
61 #include "output.h"
62 #include "except.h"
63 #include "function.h"
64 #include "rtl-error.h"
65 #include "toplev.h" /* exact_log2, floor_log2 */
66 #include "reload.h"
67 #include "intl.h"
68 #include "basic-block.h"
69 #include "target.h"
70 #include "targhooks.h"
71 #include "debug.h"
72 #include "expr.h"
73 #include "tree-pass.h"
74 #include "cgraph.h"
75 #include "tree-ssa.h"
76 #include "coverage.h"
77 #include "df.h"
78 #include "ggc.h"
79 #include "cfgloop.h"
80 #include "params.h"
81 #include "tree-pretty-print.h" /* for dump_function_header */
82 #include "asan.h"
83
84 #ifdef XCOFF_DEBUGGING_INFO
85 #include "xcoffout.h"           /* Needed for external data
86                                    declarations for e.g. AIX 4.x.  */
87 #endif
88
89 #include "dwarf2out.h"
90
91 #ifdef DBX_DEBUGGING_INFO
92 #include "dbxout.h"
93 #endif
94
95 #ifdef SDB_DEBUGGING_INFO
96 #include "sdbout.h"
97 #endif
98
99 /* Most ports that aren't using cc0 don't need to define CC_STATUS_INIT.
100    So define a null default for it to save conditionalization later.  */
101 #ifndef CC_STATUS_INIT
102 #define CC_STATUS_INIT
103 #endif
104
105 /* Is the given character a logical line separator for the assembler?  */
106 #ifndef IS_ASM_LOGICAL_LINE_SEPARATOR
107 #define IS_ASM_LOGICAL_LINE_SEPARATOR(C, STR) ((C) == ';')
108 #endif
109
110 #ifndef JUMP_TABLES_IN_TEXT_SECTION
111 #define JUMP_TABLES_IN_TEXT_SECTION 0
112 #endif
113
114 /* Bitflags used by final_scan_insn.  */
115 #define SEEN_NOTE       1
116 #define SEEN_EMITTED    2
117
118 /* Last insn processed by final_scan_insn.  */
119 static rtx debug_insn;
120 rtx current_output_insn;
121
122 /* Line number of last NOTE.  */
123 static int last_linenum;
124
125 /* Last discriminator written to assembly.  */
126 static int last_discriminator;
127
128 /* Highest line number in current block.  */
129 static int high_block_linenum;
130
131 /* Likewise for function.  */
132 static int high_function_linenum;
133
134 /* Filename of last NOTE.  */
135 static const char *last_filename;
136
137 /* Override filename, line number, and discriminator.  */
138 static const char *override_filename;
139 static int override_linenum;
140 static int override_discriminator;
141
142 /* Whether to force emission of a line note before the next insn.  */
143 static bool force_source_line = false;
144
145 extern const int length_unit_log; /* This is defined in insn-attrtab.c.  */
146
147 /* Nonzero while outputting an `asm' with operands.
148    This means that inconsistencies are the user's fault, so don't die.
149    The precise value is the insn being output, to pass to error_for_asm.  */
150 rtx this_is_asm_operands;
151
152 /* Number of operands of this insn, for an `asm' with operands.  */
153 static unsigned int insn_noperands;
154
155 /* Compare optimization flag.  */
156
157 static rtx last_ignored_compare = 0;
158
159 /* Assign a unique number to each insn that is output.
160    This can be used to generate unique local labels.  */
161
162 static int insn_counter = 0;
163
164 #ifdef HAVE_cc0
165 /* This variable contains machine-dependent flags (defined in tm.h)
166    set and examined by output routines
167    that describe how to interpret the condition codes properly.  */
168
169 CC_STATUS cc_status;
170
171 /* During output of an insn, this contains a copy of cc_status
172    from before the insn.  */
173
174 CC_STATUS cc_prev_status;
175 #endif
176
177 /* Number of unmatched NOTE_INSN_BLOCK_BEG notes we have seen.  */
178
179 static int block_depth;
180
181 /* Nonzero if have enabled APP processing of our assembler output.  */
182
183 static int app_on;
184
185 /* If we are outputting an insn sequence, this contains the sequence rtx.
186    Zero otherwise.  */
187
188 rtx final_sequence;
189
190 #ifdef ASSEMBLER_DIALECT
191
192 /* Number of the assembler dialect to use, starting at 0.  */
193 static int dialect_number;
194 #endif
195
196 /* Nonnull if the insn currently being emitted was a COND_EXEC pattern.  */
197 rtx current_insn_predicate;
198
199 /* True if printing into -fdump-final-insns= dump.  */   
200 bool final_insns_dump_p;
201
202 /* True if profile_function should be called, but hasn't been called yet.  */
203 static bool need_profile_function;
204
205 static int asm_insn_count (rtx);
206 static void profile_function (FILE *);
207 static void profile_after_prologue (FILE *);
208 static bool notice_source_line (rtx, bool *);
209 static rtx walk_alter_subreg (rtx *, bool *);
210 static void output_asm_name (void);
211 static void output_alternate_entry_point (FILE *, rtx);
212 static tree get_mem_expr_from_op (rtx, int *);
213 static void output_asm_operand_names (rtx *, int *, int);
214 #ifdef LEAF_REGISTERS
215 static void leaf_renumber_regs (rtx);
216 #endif
217 #ifdef HAVE_cc0
218 static int alter_cond (rtx);
219 #endif
220 #ifndef ADDR_VEC_ALIGN
221 static int final_addr_vec_align (rtx);
222 #endif
223 static int align_fuzz (rtx, rtx, int, unsigned);
224 \f
225 /* Initialize data in final at the beginning of a compilation.  */
226
227 void
228 init_final (const char *filename ATTRIBUTE_UNUSED)
229 {
230   app_on = 0;
231   final_sequence = 0;
232
233 #ifdef ASSEMBLER_DIALECT
234   dialect_number = ASSEMBLER_DIALECT;
235 #endif
236 }
237
238 /* Default target function prologue and epilogue assembler output.
239
240    If not overridden for epilogue code, then the function body itself
241    contains return instructions wherever needed.  */
242 void
243 default_function_pro_epilogue (FILE *file ATTRIBUTE_UNUSED,
244                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
245 {
246 }
247
248 void
249 default_function_switched_text_sections (FILE *file ATTRIBUTE_UNUSED,
250                                          tree decl ATTRIBUTE_UNUSED,
251                                          bool new_is_cold ATTRIBUTE_UNUSED)
252 {
253 }
254
255 /* Default target hook that outputs nothing to a stream.  */
256 void
257 no_asm_to_stream (FILE *file ATTRIBUTE_UNUSED)
258 {
259 }
260
261 /* Enable APP processing of subsequent output.
262    Used before the output from an `asm' statement.  */
263
264 void
265 app_enable (void)
266 {
267   if (! app_on)
268     {
269       fputs (ASM_APP_ON, asm_out_file);
270       app_on = 1;
271     }
272 }
273
274 /* Disable APP processing of subsequent output.
275    Called from varasm.c before most kinds of output.  */
276
277 void
278 app_disable (void)
279 {
280   if (app_on)
281     {
282       fputs (ASM_APP_OFF, asm_out_file);
283       app_on = 0;
284     }
285 }
286 \f
287 /* Return the number of slots filled in the current
288    delayed branch sequence (we don't count the insn needing the
289    delay slot).   Zero if not in a delayed branch sequence.  */
290
291 #ifdef DELAY_SLOTS
292 int
293 dbr_sequence_length (void)
294 {
295   if (final_sequence != 0)
296     return XVECLEN (final_sequence, 0) - 1;
297   else
298     return 0;
299 }
300 #endif
301 \f
302 /* The next two pages contain routines used to compute the length of an insn
303    and to shorten branches.  */
304
305 /* Arrays for insn lengths, and addresses.  The latter is referenced by
306    `insn_current_length'.  */
307
308 static int *insn_lengths;
309
310 vec<int> insn_addresses_;
311
312 /* Max uid for which the above arrays are valid.  */
313 static int insn_lengths_max_uid;
314
315 /* Address of insn being processed.  Used by `insn_current_length'.  */
316 int insn_current_address;
317
318 /* Address of insn being processed in previous iteration.  */
319 int insn_last_address;
320
321 /* known invariant alignment of insn being processed.  */
322 int insn_current_align;
323
324 /* After shorten_branches, for any insn, uid_align[INSN_UID (insn)]
325    gives the next following alignment insn that increases the known
326    alignment, or NULL_RTX if there is no such insn.
327    For any alignment obtained this way, we can again index uid_align with
328    its uid to obtain the next following align that in turn increases the
329    alignment, till we reach NULL_RTX; the sequence obtained this way
330    for each insn we'll call the alignment chain of this insn in the following
331    comments.  */
332
333 struct label_alignment
334 {
335   short alignment;
336   short max_skip;
337 };
338
339 static rtx *uid_align;
340 static int *uid_shuid;
341 static struct label_alignment *label_align;
342
343 /* Indicate that branch shortening hasn't yet been done.  */
344
345 void
346 init_insn_lengths (void)
347 {
348   if (uid_shuid)
349     {
350       free (uid_shuid);
351       uid_shuid = 0;
352     }
353   if (insn_lengths)
354     {
355       free (insn_lengths);
356       insn_lengths = 0;
357       insn_lengths_max_uid = 0;
358     }
359   if (HAVE_ATTR_length)
360     INSN_ADDRESSES_FREE ();
361   if (uid_align)
362     {
363       free (uid_align);
364       uid_align = 0;
365     }
366 }
367
368 /* Obtain the current length of an insn.  If branch shortening has been done,
369    get its actual length.  Otherwise, use FALLBACK_FN to calculate the
370    length.  */
371 static inline int
372 get_attr_length_1 (rtx insn, int (*fallback_fn) (rtx))
373 {
374   rtx body;
375   int i;
376   int length = 0;
377
378   if (!HAVE_ATTR_length)
379     return 0;
380
381   if (insn_lengths_max_uid > INSN_UID (insn))
382     return insn_lengths[INSN_UID (insn)];
383   else
384     switch (GET_CODE (insn))
385       {
386       case NOTE:
387       case BARRIER:
388       case CODE_LABEL:
389       case DEBUG_INSN:
390         return 0;
391
392       case CALL_INSN:
393       case JUMP_INSN:
394         length = fallback_fn (insn);
395         break;
396
397       case INSN:
398         body = PATTERN (insn);
399         if (GET_CODE (body) == USE || GET_CODE (body) == CLOBBER)
400           return 0;
401
402         else if (GET_CODE (body) == ASM_INPUT || asm_noperands (body) >= 0)
403           length = asm_insn_count (body) * fallback_fn (insn);
404         else if (GET_CODE (body) == SEQUENCE)
405           for (i = 0; i < XVECLEN (body, 0); i++)
406             length += get_attr_length_1 (XVECEXP (body, 0, i), fallback_fn);
407         else
408           length = fallback_fn (insn);
409         break;
410
411       default:
412         break;
413       }
414
415 #ifdef ADJUST_INSN_LENGTH
416   ADJUST_INSN_LENGTH (insn, length);
417 #endif
418   return length;
419 }
420
421 /* Obtain the current length of an insn.  If branch shortening has been done,
422    get its actual length.  Otherwise, get its maximum length.  */
423 int
424 get_attr_length (rtx insn)
425 {
426   return get_attr_length_1 (insn, insn_default_length);
427 }
428
429 /* Obtain the current length of an insn.  If branch shortening has been done,
430    get its actual length.  Otherwise, get its minimum length.  */
431 int
432 get_attr_min_length (rtx insn)
433 {
434   return get_attr_length_1 (insn, insn_min_length);
435 }
436 \f
437 /* Code to handle alignment inside shorten_branches.  */
438
439 /* Here is an explanation how the algorithm in align_fuzz can give
440    proper results:
441
442    Call a sequence of instructions beginning with alignment point X
443    and continuing until the next alignment point `block X'.  When `X'
444    is used in an expression, it means the alignment value of the
445    alignment point.
446
447    Call the distance between the start of the first insn of block X, and
448    the end of the last insn of block X `IX', for the `inner size of X'.
449    This is clearly the sum of the instruction lengths.
450
451    Likewise with the next alignment-delimited block following X, which we
452    shall call block Y.
453
454    Call the distance between the start of the first insn of block X, and
455    the start of the first insn of block Y `OX', for the `outer size of X'.
456
457    The estimated padding is then OX - IX.
458
459    OX can be safely estimated as
460
461            if (X >= Y)
462                    OX = round_up(IX, Y)
463            else
464                    OX = round_up(IX, X) + Y - X
465
466    Clearly est(IX) >= real(IX), because that only depends on the
467    instruction lengths, and those being overestimated is a given.
468
469    Clearly round_up(foo, Z) >= round_up(bar, Z) if foo >= bar, so
470    we needn't worry about that when thinking about OX.
471
472    When X >= Y, the alignment provided by Y adds no uncertainty factor
473    for branch ranges starting before X, so we can just round what we have.
474    But when X < Y, we don't know anything about the, so to speak,
475    `middle bits', so we have to assume the worst when aligning up from an
476    address mod X to one mod Y, which is Y - X.  */
477
478 #ifndef LABEL_ALIGN
479 #define LABEL_ALIGN(LABEL) align_labels_log
480 #endif
481
482 #ifndef LOOP_ALIGN
483 #define LOOP_ALIGN(LABEL) align_loops_log
484 #endif
485
486 #ifndef LABEL_ALIGN_AFTER_BARRIER
487 #define LABEL_ALIGN_AFTER_BARRIER(LABEL) 0
488 #endif
489
490 #ifndef JUMP_ALIGN
491 #define JUMP_ALIGN(LABEL) align_jumps_log
492 #endif
493
494 int
495 default_label_align_after_barrier_max_skip (rtx insn ATTRIBUTE_UNUSED)
496 {
497   return 0;
498 }
499
500 int
501 default_loop_align_max_skip (rtx insn ATTRIBUTE_UNUSED)
502 {
503   return align_loops_max_skip;
504 }
505
506 int
507 default_label_align_max_skip (rtx insn ATTRIBUTE_UNUSED)
508 {
509   return align_labels_max_skip;
510 }
511
512 int
513 default_jump_align_max_skip (rtx insn ATTRIBUTE_UNUSED)
514 {
515   return align_jumps_max_skip;
516 }
517
518 #ifndef ADDR_VEC_ALIGN
519 static int
520 final_addr_vec_align (rtx addr_vec)
521 {
522   int align = GET_MODE_SIZE (GET_MODE (PATTERN (addr_vec)));
523
524   if (align > BIGGEST_ALIGNMENT / BITS_PER_UNIT)
525     align = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
526   return exact_log2 (align);
527
528 }
529
530 #define ADDR_VEC_ALIGN(ADDR_VEC) final_addr_vec_align (ADDR_VEC)
531 #endif
532
533 #ifndef INSN_LENGTH_ALIGNMENT
534 #define INSN_LENGTH_ALIGNMENT(INSN) length_unit_log
535 #endif
536
537 #define INSN_SHUID(INSN) (uid_shuid[INSN_UID (INSN)])
538
539 static int min_labelno, max_labelno;
540
541 #define LABEL_TO_ALIGNMENT(LABEL) \
542   (label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].alignment)
543
544 #define LABEL_TO_MAX_SKIP(LABEL) \
545   (label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].max_skip)
546
547 /* For the benefit of port specific code do this also as a function.  */
548
549 int
550 label_to_alignment (rtx label)
551 {
552   if (CODE_LABEL_NUMBER (label) <= max_labelno)
553     return LABEL_TO_ALIGNMENT (label);
554   return 0;
555 }
556
557 int
558 label_to_max_skip (rtx label)
559 {
560   if (CODE_LABEL_NUMBER (label) <= max_labelno)
561     return LABEL_TO_MAX_SKIP (label);
562   return 0;
563 }
564
565 /* The differences in addresses
566    between a branch and its target might grow or shrink depending on
567    the alignment the start insn of the range (the branch for a forward
568    branch or the label for a backward branch) starts out on; if these
569    differences are used naively, they can even oscillate infinitely.
570    We therefore want to compute a 'worst case' address difference that
571    is independent of the alignment the start insn of the range end
572    up on, and that is at least as large as the actual difference.
573    The function align_fuzz calculates the amount we have to add to the
574    naively computed difference, by traversing the part of the alignment
575    chain of the start insn of the range that is in front of the end insn
576    of the range, and considering for each alignment the maximum amount
577    that it might contribute to a size increase.
578
579    For casesi tables, we also want to know worst case minimum amounts of
580    address difference, in case a machine description wants to introduce
581    some common offset that is added to all offsets in a table.
582    For this purpose, align_fuzz with a growth argument of 0 computes the
583    appropriate adjustment.  */
584
585 /* Compute the maximum delta by which the difference of the addresses of
586    START and END might grow / shrink due to a different address for start
587    which changes the size of alignment insns between START and END.
588    KNOWN_ALIGN_LOG is the alignment known for START.
589    GROWTH should be ~0 if the objective is to compute potential code size
590    increase, and 0 if the objective is to compute potential shrink.
591    The return value is undefined for any other value of GROWTH.  */
592
593 static int
594 align_fuzz (rtx start, rtx end, int known_align_log, unsigned int growth)
595 {
596   int uid = INSN_UID (start);
597   rtx align_label;
598   int known_align = 1 << known_align_log;
599   int end_shuid = INSN_SHUID (end);
600   int fuzz = 0;
601
602   for (align_label = uid_align[uid]; align_label; align_label = uid_align[uid])
603     {
604       int align_addr, new_align;
605
606       uid = INSN_UID (align_label);
607       align_addr = INSN_ADDRESSES (uid) - insn_lengths[uid];
608       if (uid_shuid[uid] > end_shuid)
609         break;
610       known_align_log = LABEL_TO_ALIGNMENT (align_label);
611       new_align = 1 << known_align_log;
612       if (new_align < known_align)
613         continue;
614       fuzz += (-align_addr ^ growth) & (new_align - known_align);
615       known_align = new_align;
616     }
617   return fuzz;
618 }
619
620 /* Compute a worst-case reference address of a branch so that it
621    can be safely used in the presence of aligned labels.  Since the
622    size of the branch itself is unknown, the size of the branch is
623    not included in the range.  I.e. for a forward branch, the reference
624    address is the end address of the branch as known from the previous
625    branch shortening pass, minus a value to account for possible size
626    increase due to alignment.  For a backward branch, it is the start
627    address of the branch as known from the current pass, plus a value
628    to account for possible size increase due to alignment.
629    NB.: Therefore, the maximum offset allowed for backward branches needs
630    to exclude the branch size.  */
631
632 int
633 insn_current_reference_address (rtx branch)
634 {
635   rtx dest, seq;
636   int seq_uid;
637
638   if (! INSN_ADDRESSES_SET_P ())
639     return 0;
640
641   seq = NEXT_INSN (PREV_INSN (branch));
642   seq_uid = INSN_UID (seq);
643   if (!JUMP_P (branch))
644     /* This can happen for example on the PA; the objective is to know the
645        offset to address something in front of the start of the function.
646        Thus, we can treat it like a backward branch.
647        We assume here that FUNCTION_BOUNDARY / BITS_PER_UNIT is larger than
648        any alignment we'd encounter, so we skip the call to align_fuzz.  */
649     return insn_current_address;
650   dest = JUMP_LABEL (branch);
651
652   /* BRANCH has no proper alignment chain set, so use SEQ.
653      BRANCH also has no INSN_SHUID.  */
654   if (INSN_SHUID (seq) < INSN_SHUID (dest))
655     {
656       /* Forward branch.  */
657       return (insn_last_address + insn_lengths[seq_uid]
658               - align_fuzz (seq, dest, length_unit_log, ~0));
659     }
660   else
661     {
662       /* Backward branch.  */
663       return (insn_current_address
664               + align_fuzz (dest, seq, length_unit_log, ~0));
665     }
666 }
667 \f
668 /* Compute branch alignments based on frequency information in the
669    CFG.  */
670
671 unsigned int
672 compute_alignments (void)
673 {
674   int log, max_skip, max_log;
675   basic_block bb;
676   int freq_max = 0;
677   int freq_threshold = 0;
678
679   if (label_align)
680     {
681       free (label_align);
682       label_align = 0;
683     }
684
685   max_labelno = max_label_num ();
686   min_labelno = get_first_label_num ();
687   label_align = XCNEWVEC (struct label_alignment, max_labelno - min_labelno + 1);
688
689   /* If not optimizing or optimizing for size, don't assign any alignments.  */
690   if (! optimize || optimize_function_for_size_p (cfun))
691     return 0;
692
693   if (dump_file)
694     {
695       dump_reg_info (dump_file);
696       dump_flow_info (dump_file, TDF_DETAILS);
697       flow_loops_dump (dump_file, NULL, 1);
698     }
699   loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
700   FOR_EACH_BB_FN (bb, cfun)
701     if (bb->frequency > freq_max)
702       freq_max = bb->frequency;
703   freq_threshold = freq_max / PARAM_VALUE (PARAM_ALIGN_THRESHOLD);
704
705   if (dump_file)
706     fprintf (dump_file, "freq_max: %i\n",freq_max);
707   FOR_EACH_BB_FN (bb, cfun)
708     {
709       rtx label = BB_HEAD (bb);
710       int fallthru_frequency = 0, branch_frequency = 0, has_fallthru = 0;
711       edge e;
712       edge_iterator ei;
713
714       if (!LABEL_P (label)
715           || optimize_bb_for_size_p (bb))
716         {
717           if (dump_file)
718             fprintf (dump_file,
719                      "BB %4i freq %4i loop %2i loop_depth %2i skipped.\n",
720                      bb->index, bb->frequency, bb->loop_father->num,
721                      bb_loop_depth (bb));
722           continue;
723         }
724       max_log = LABEL_ALIGN (label);
725       max_skip = targetm.asm_out.label_align_max_skip (label);
726
727       FOR_EACH_EDGE (e, ei, bb->preds)
728         {
729           if (e->flags & EDGE_FALLTHRU)
730             has_fallthru = 1, fallthru_frequency += EDGE_FREQUENCY (e);
731           else
732             branch_frequency += EDGE_FREQUENCY (e);
733         }
734       if (dump_file)
735         {
736           fprintf (dump_file, "BB %4i freq %4i loop %2i loop_depth"
737                    " %2i fall %4i branch %4i",
738                    bb->index, bb->frequency, bb->loop_father->num,
739                    bb_loop_depth (bb),
740                    fallthru_frequency, branch_frequency);
741           if (!bb->loop_father->inner && bb->loop_father->num)
742             fprintf (dump_file, " inner_loop");
743           if (bb->loop_father->header == bb)
744             fprintf (dump_file, " loop_header");
745           fprintf (dump_file, "\n");
746         }
747
748       /* There are two purposes to align block with no fallthru incoming edge:
749          1) to avoid fetch stalls when branch destination is near cache boundary
750          2) to improve cache efficiency in case the previous block is not executed
751             (so it does not need to be in the cache).
752
753          We to catch first case, we align frequently executed blocks.
754          To catch the second, we align blocks that are executed more frequently
755          than the predecessor and the predecessor is likely to not be executed
756          when function is called.  */
757
758       if (!has_fallthru
759           && (branch_frequency > freq_threshold
760               || (bb->frequency > bb->prev_bb->frequency * 10
761                   && (bb->prev_bb->frequency
762                       <= ENTRY_BLOCK_PTR_FOR_FN (cfun)->frequency / 2))))
763         {
764           log = JUMP_ALIGN (label);
765           if (dump_file)
766             fprintf (dump_file, "  jump alignment added.\n");
767           if (max_log < log)
768             {
769               max_log = log;
770               max_skip = targetm.asm_out.jump_align_max_skip (label);
771             }
772         }
773       /* In case block is frequent and reached mostly by non-fallthru edge,
774          align it.  It is most likely a first block of loop.  */
775       if (has_fallthru
776           && optimize_bb_for_speed_p (bb)
777           && branch_frequency + fallthru_frequency > freq_threshold
778           && (branch_frequency
779               > fallthru_frequency * PARAM_VALUE (PARAM_ALIGN_LOOP_ITERATIONS)))
780         {
781           log = LOOP_ALIGN (label);
782           if (dump_file)
783             fprintf (dump_file, "  internal loop alignment added.\n");
784           if (max_log < log)
785             {
786               max_log = log;
787               max_skip = targetm.asm_out.loop_align_max_skip (label);
788             }
789         }
790       LABEL_TO_ALIGNMENT (label) = max_log;
791       LABEL_TO_MAX_SKIP (label) = max_skip;
792     }
793
794   loop_optimizer_finalize ();
795   free_dominance_info (CDI_DOMINATORS);
796   return 0;
797 }
798
799 /* Grow the LABEL_ALIGN array after new labels are created.  */
800
801 static void 
802 grow_label_align (void)
803 {
804   int old = max_labelno;
805   int n_labels;
806   int n_old_labels;
807
808   max_labelno = max_label_num ();
809
810   n_labels = max_labelno - min_labelno + 1;
811   n_old_labels = old - min_labelno + 1;
812
813   label_align = XRESIZEVEC (struct label_alignment, label_align, n_labels);
814
815   /* Range of labels grows monotonically in the function.  Failing here
816      means that the initialization of array got lost.  */
817   gcc_assert (n_old_labels <= n_labels);
818
819   memset (label_align + n_old_labels, 0,
820           (n_labels - n_old_labels) * sizeof (struct label_alignment));
821 }
822
823 /* Update the already computed alignment information.  LABEL_PAIRS is a vector
824    made up of pairs of labels for which the alignment information of the first
825    element will be copied from that of the second element.  */
826
827 void
828 update_alignments (vec<rtx> &label_pairs)
829 {
830   unsigned int i = 0;
831   rtx iter, label = NULL_RTX;
832
833   if (max_labelno != max_label_num ())
834     grow_label_align ();
835
836   FOR_EACH_VEC_ELT (label_pairs, i, iter)
837     if (i & 1)
838       {
839         LABEL_TO_ALIGNMENT (label) = LABEL_TO_ALIGNMENT (iter);
840         LABEL_TO_MAX_SKIP (label) = LABEL_TO_MAX_SKIP (iter);
841       }
842     else
843       label = iter;
844 }
845
846 namespace {
847
848 const pass_data pass_data_compute_alignments =
849 {
850   RTL_PASS, /* type */
851   "alignments", /* name */
852   OPTGROUP_NONE, /* optinfo_flags */
853   false, /* has_gate */
854   true, /* has_execute */
855   TV_NONE, /* tv_id */
856   0, /* properties_required */
857   0, /* properties_provided */
858   0, /* properties_destroyed */
859   0, /* todo_flags_start */
860   TODO_verify_rtl_sharing, /* todo_flags_finish */
861 };
862
863 class pass_compute_alignments : public rtl_opt_pass
864 {
865 public:
866   pass_compute_alignments (gcc::context *ctxt)
867     : rtl_opt_pass (pass_data_compute_alignments, ctxt)
868   {}
869
870   /* opt_pass methods: */
871   unsigned int execute () { return compute_alignments (); }
872
873 }; // class pass_compute_alignments
874
875 } // anon namespace
876
877 rtl_opt_pass *
878 make_pass_compute_alignments (gcc::context *ctxt)
879 {
880   return new pass_compute_alignments (ctxt);
881 }
882
883 \f
884 /* Make a pass over all insns and compute their actual lengths by shortening
885    any branches of variable length if possible.  */
886
887 /* shorten_branches might be called multiple times:  for example, the SH
888    port splits out-of-range conditional branches in MACHINE_DEPENDENT_REORG.
889    In order to do this, it needs proper length information, which it obtains
890    by calling shorten_branches.  This cannot be collapsed with
891    shorten_branches itself into a single pass unless we also want to integrate
892    reorg.c, since the branch splitting exposes new instructions with delay
893    slots.  */
894
895 void
896 shorten_branches (rtx first)
897 {
898   rtx insn;
899   int max_uid;
900   int i;
901   int max_log;
902   int max_skip;
903 #define MAX_CODE_ALIGN 16
904   rtx seq;
905   int something_changed = 1;
906   char *varying_length;
907   rtx body;
908   int uid;
909   rtx align_tab[MAX_CODE_ALIGN];
910
911   /* Compute maximum UID and allocate label_align / uid_shuid.  */
912   max_uid = get_max_uid ();
913
914   /* Free uid_shuid before reallocating it.  */
915   free (uid_shuid);
916
917   uid_shuid = XNEWVEC (int, max_uid);
918
919   if (max_labelno != max_label_num ())
920     grow_label_align ();
921
922   /* Initialize label_align and set up uid_shuid to be strictly
923      monotonically rising with insn order.  */
924   /* We use max_log here to keep track of the maximum alignment we want to
925      impose on the next CODE_LABEL (or the current one if we are processing
926      the CODE_LABEL itself).  */
927
928   max_log = 0;
929   max_skip = 0;
930
931   for (insn = get_insns (), i = 1; insn; insn = NEXT_INSN (insn))
932     {
933       int log;
934
935       INSN_SHUID (insn) = i++;
936       if (INSN_P (insn))
937         continue;
938
939       if (LABEL_P (insn))
940         {
941           rtx next;
942           bool next_is_jumptable;
943
944           /* Merge in alignments computed by compute_alignments.  */
945           log = LABEL_TO_ALIGNMENT (insn);
946           if (max_log < log)
947             {
948               max_log = log;
949               max_skip = LABEL_TO_MAX_SKIP (insn);
950             }
951
952           next = next_nonnote_insn (insn);
953           next_is_jumptable = next && JUMP_TABLE_DATA_P (next);
954           if (!next_is_jumptable)
955             {
956               log = LABEL_ALIGN (insn);
957               if (max_log < log)
958                 {
959                   max_log = log;
960                   max_skip = targetm.asm_out.label_align_max_skip (insn);
961                 }
962             }
963           /* ADDR_VECs only take room if read-only data goes into the text
964              section.  */
965           if ((JUMP_TABLES_IN_TEXT_SECTION
966                || readonly_data_section == text_section)
967               && next_is_jumptable)
968             {
969               log = ADDR_VEC_ALIGN (next);
970               if (max_log < log)
971                 {
972                   max_log = log;
973                   max_skip = targetm.asm_out.label_align_max_skip (insn);
974                 }
975             }
976           LABEL_TO_ALIGNMENT (insn) = max_log;
977           LABEL_TO_MAX_SKIP (insn) = max_skip;
978           max_log = 0;
979           max_skip = 0;
980         }
981       else if (BARRIER_P (insn))
982         {
983           rtx label;
984
985           for (label = insn; label && ! INSN_P (label);
986                label = NEXT_INSN (label))
987             if (LABEL_P (label))
988               {
989                 log = LABEL_ALIGN_AFTER_BARRIER (insn);
990                 if (max_log < log)
991                   {
992                     max_log = log;
993                     max_skip = targetm.asm_out.label_align_after_barrier_max_skip (label);
994                   }
995                 break;
996               }
997         }
998     }
999   if (!HAVE_ATTR_length)
1000     return;
1001
1002   /* Allocate the rest of the arrays.  */
1003   insn_lengths = XNEWVEC (int, max_uid);
1004   insn_lengths_max_uid = max_uid;
1005   /* Syntax errors can lead to labels being outside of the main insn stream.
1006      Initialize insn_addresses, so that we get reproducible results.  */
1007   INSN_ADDRESSES_ALLOC (max_uid);
1008
1009   varying_length = XCNEWVEC (char, max_uid);
1010
1011   /* Initialize uid_align.  We scan instructions
1012      from end to start, and keep in align_tab[n] the last seen insn
1013      that does an alignment of at least n+1, i.e. the successor
1014      in the alignment chain for an insn that does / has a known
1015      alignment of n.  */
1016   uid_align = XCNEWVEC (rtx, max_uid);
1017
1018   for (i = MAX_CODE_ALIGN; --i >= 0;)
1019     align_tab[i] = NULL_RTX;
1020   seq = get_last_insn ();
1021   for (; seq; seq = PREV_INSN (seq))
1022     {
1023       int uid = INSN_UID (seq);
1024       int log;
1025       log = (LABEL_P (seq) ? LABEL_TO_ALIGNMENT (seq) : 0);
1026       uid_align[uid] = align_tab[0];
1027       if (log)
1028         {
1029           /* Found an alignment label.  */
1030           uid_align[uid] = align_tab[log];
1031           for (i = log - 1; i >= 0; i--)
1032             align_tab[i] = seq;
1033         }
1034     }
1035
1036   /* When optimizing, we start assuming minimum length, and keep increasing
1037      lengths as we find the need for this, till nothing changes.
1038      When not optimizing, we start assuming maximum lengths, and
1039      do a single pass to update the lengths.  */
1040   bool increasing = optimize != 0;
1041
1042 #ifdef CASE_VECTOR_SHORTEN_MODE
1043   if (optimize)
1044     {
1045       /* Look for ADDR_DIFF_VECs, and initialize their minimum and maximum
1046          label fields.  */
1047
1048       int min_shuid = INSN_SHUID (get_insns ()) - 1;
1049       int max_shuid = INSN_SHUID (get_last_insn ()) + 1;
1050       int rel;
1051
1052       for (insn = first; insn != 0; insn = NEXT_INSN (insn))
1053         {
1054           rtx min_lab = NULL_RTX, max_lab = NULL_RTX, pat;
1055           int len, i, min, max, insn_shuid;
1056           int min_align;
1057           addr_diff_vec_flags flags;
1058
1059           if (! JUMP_TABLE_DATA_P (insn)
1060               || GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
1061             continue;
1062           pat = PATTERN (insn);
1063           len = XVECLEN (pat, 1);
1064           gcc_assert (len > 0);
1065           min_align = MAX_CODE_ALIGN;
1066           for (min = max_shuid, max = min_shuid, i = len - 1; i >= 0; i--)
1067             {
1068               rtx lab = XEXP (XVECEXP (pat, 1, i), 0);
1069               int shuid = INSN_SHUID (lab);
1070               if (shuid < min)
1071                 {
1072                   min = shuid;
1073                   min_lab = lab;
1074                 }
1075               if (shuid > max)
1076                 {
1077                   max = shuid;
1078                   max_lab = lab;
1079                 }
1080               if (min_align > LABEL_TO_ALIGNMENT (lab))
1081                 min_align = LABEL_TO_ALIGNMENT (lab);
1082             }
1083           XEXP (pat, 2) = gen_rtx_LABEL_REF (Pmode, min_lab);
1084           XEXP (pat, 3) = gen_rtx_LABEL_REF (Pmode, max_lab);
1085           insn_shuid = INSN_SHUID (insn);
1086           rel = INSN_SHUID (XEXP (XEXP (pat, 0), 0));
1087           memset (&flags, 0, sizeof (flags));
1088           flags.min_align = min_align;
1089           flags.base_after_vec = rel > insn_shuid;
1090           flags.min_after_vec  = min > insn_shuid;
1091           flags.max_after_vec  = max > insn_shuid;
1092           flags.min_after_base = min > rel;
1093           flags.max_after_base = max > rel;
1094           ADDR_DIFF_VEC_FLAGS (pat) = flags;
1095
1096           if (increasing)
1097             PUT_MODE (pat, CASE_VECTOR_SHORTEN_MODE (0, 0, pat));
1098         }
1099     }
1100 #endif /* CASE_VECTOR_SHORTEN_MODE */
1101
1102   /* Compute initial lengths, addresses, and varying flags for each insn.  */
1103   int (*length_fun) (rtx) = increasing ? insn_min_length : insn_default_length;
1104
1105   for (insn_current_address = 0, insn = first;
1106        insn != 0;
1107        insn_current_address += insn_lengths[uid], insn = NEXT_INSN (insn))
1108     {
1109       uid = INSN_UID (insn);
1110
1111       insn_lengths[uid] = 0;
1112
1113       if (LABEL_P (insn))
1114         {
1115           int log = LABEL_TO_ALIGNMENT (insn);
1116           if (log)
1117             {
1118               int align = 1 << log;
1119               int new_address = (insn_current_address + align - 1) & -align;
1120               insn_lengths[uid] = new_address - insn_current_address;
1121             }
1122         }
1123
1124       INSN_ADDRESSES (uid) = insn_current_address + insn_lengths[uid];
1125
1126       if (NOTE_P (insn) || BARRIER_P (insn)
1127           || LABEL_P (insn) || DEBUG_INSN_P (insn))
1128         continue;
1129       if (INSN_DELETED_P (insn))
1130         continue;
1131
1132       body = PATTERN (insn);
1133       if (JUMP_TABLE_DATA_P (insn))
1134         {
1135           /* This only takes room if read-only data goes into the text
1136              section.  */
1137           if (JUMP_TABLES_IN_TEXT_SECTION
1138               || readonly_data_section == text_section)
1139             insn_lengths[uid] = (XVECLEN (body,
1140                                           GET_CODE (body) == ADDR_DIFF_VEC)
1141                                  * GET_MODE_SIZE (GET_MODE (body)));
1142           /* Alignment is handled by ADDR_VEC_ALIGN.  */
1143         }
1144       else if (GET_CODE (body) == ASM_INPUT || asm_noperands (body) >= 0)
1145         insn_lengths[uid] = asm_insn_count (body) * insn_default_length (insn);
1146       else if (GET_CODE (body) == SEQUENCE)
1147         {
1148           int i;
1149           int const_delay_slots;
1150 #ifdef DELAY_SLOTS
1151           const_delay_slots = const_num_delay_slots (XVECEXP (body, 0, 0));
1152 #else
1153           const_delay_slots = 0;
1154 #endif
1155           int (*inner_length_fun) (rtx)
1156             = const_delay_slots ? length_fun : insn_default_length;
1157           /* Inside a delay slot sequence, we do not do any branch shortening
1158              if the shortening could change the number of delay slots
1159              of the branch.  */
1160           for (i = 0; i < XVECLEN (body, 0); i++)
1161             {
1162               rtx inner_insn = XVECEXP (body, 0, i);
1163               int inner_uid = INSN_UID (inner_insn);
1164               int inner_length;
1165
1166               if (GET_CODE (body) == ASM_INPUT
1167                   || asm_noperands (PATTERN (XVECEXP (body, 0, i))) >= 0)
1168                 inner_length = (asm_insn_count (PATTERN (inner_insn))
1169                                 * insn_default_length (inner_insn));
1170               else
1171                 inner_length = inner_length_fun (inner_insn);
1172
1173               insn_lengths[inner_uid] = inner_length;
1174               if (const_delay_slots)
1175                 {
1176                   if ((varying_length[inner_uid]
1177                        = insn_variable_length_p (inner_insn)) != 0)
1178                     varying_length[uid] = 1;
1179                   INSN_ADDRESSES (inner_uid) = (insn_current_address
1180                                                 + insn_lengths[uid]);
1181                 }
1182               else
1183                 varying_length[inner_uid] = 0;
1184               insn_lengths[uid] += inner_length;
1185             }
1186         }
1187       else if (GET_CODE (body) != USE && GET_CODE (body) != CLOBBER)
1188         {
1189           insn_lengths[uid] = length_fun (insn);
1190           varying_length[uid] = insn_variable_length_p (insn);
1191         }
1192
1193       /* If needed, do any adjustment.  */
1194 #ifdef ADJUST_INSN_LENGTH
1195       ADJUST_INSN_LENGTH (insn, insn_lengths[uid]);
1196       if (insn_lengths[uid] < 0)
1197         fatal_insn ("negative insn length", insn);
1198 #endif
1199     }
1200
1201   /* Now loop over all the insns finding varying length insns.  For each,
1202      get the current insn length.  If it has changed, reflect the change.
1203      When nothing changes for a full pass, we are done.  */
1204
1205   while (something_changed)
1206     {
1207       something_changed = 0;
1208       insn_current_align = MAX_CODE_ALIGN - 1;
1209       for (insn_current_address = 0, insn = first;
1210            insn != 0;
1211            insn = NEXT_INSN (insn))
1212         {
1213           int new_length;
1214 #ifdef ADJUST_INSN_LENGTH
1215           int tmp_length;
1216 #endif
1217           int length_align;
1218
1219           uid = INSN_UID (insn);
1220
1221           if (LABEL_P (insn))
1222             {
1223               int log = LABEL_TO_ALIGNMENT (insn);
1224
1225 #ifdef CASE_VECTOR_SHORTEN_MODE
1226               /* If the mode of a following jump table was changed, we
1227                  may need to update the alignment of this label.  */
1228               rtx next;
1229               bool next_is_jumptable;
1230
1231               next = next_nonnote_insn (insn);
1232               next_is_jumptable = next && JUMP_TABLE_DATA_P (next);
1233               if ((JUMP_TABLES_IN_TEXT_SECTION
1234                    || readonly_data_section == text_section)
1235                   && next_is_jumptable)
1236                 {
1237                   int newlog = ADDR_VEC_ALIGN (next);
1238                   if (newlog != log)
1239                     {
1240                       log = newlog;
1241                       LABEL_TO_ALIGNMENT (insn) = log;
1242                       something_changed = 1;
1243                     }
1244                 }
1245 #endif
1246
1247               if (log > insn_current_align)
1248                 {
1249                   int align = 1 << log;
1250                   int new_address= (insn_current_address + align - 1) & -align;
1251                   insn_lengths[uid] = new_address - insn_current_address;
1252                   insn_current_align = log;
1253                   insn_current_address = new_address;
1254                 }
1255               else
1256                 insn_lengths[uid] = 0;
1257               INSN_ADDRESSES (uid) = insn_current_address;
1258               continue;
1259             }
1260
1261           length_align = INSN_LENGTH_ALIGNMENT (insn);
1262           if (length_align < insn_current_align)
1263             insn_current_align = length_align;
1264
1265           insn_last_address = INSN_ADDRESSES (uid);
1266           INSN_ADDRESSES (uid) = insn_current_address;
1267
1268 #ifdef CASE_VECTOR_SHORTEN_MODE
1269           if (optimize
1270               && JUMP_TABLE_DATA_P (insn)
1271               && GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
1272             {
1273               rtx body = PATTERN (insn);
1274               int old_length = insn_lengths[uid];
1275               rtx rel_lab = XEXP (XEXP (body, 0), 0);
1276               rtx min_lab = XEXP (XEXP (body, 2), 0);
1277               rtx max_lab = XEXP (XEXP (body, 3), 0);
1278               int rel_addr = INSN_ADDRESSES (INSN_UID (rel_lab));
1279               int min_addr = INSN_ADDRESSES (INSN_UID (min_lab));
1280               int max_addr = INSN_ADDRESSES (INSN_UID (max_lab));
1281               rtx prev;
1282               int rel_align = 0;
1283               addr_diff_vec_flags flags;
1284               enum machine_mode vec_mode;
1285
1286               /* Avoid automatic aggregate initialization.  */
1287               flags = ADDR_DIFF_VEC_FLAGS (body);
1288
1289               /* Try to find a known alignment for rel_lab.  */
1290               for (prev = rel_lab;
1291                    prev
1292                    && ! insn_lengths[INSN_UID (prev)]
1293                    && ! (varying_length[INSN_UID (prev)] & 1);
1294                    prev = PREV_INSN (prev))
1295                 if (varying_length[INSN_UID (prev)] & 2)
1296                   {
1297                     rel_align = LABEL_TO_ALIGNMENT (prev);
1298                     break;
1299                   }
1300
1301               /* See the comment on addr_diff_vec_flags in rtl.h for the
1302                  meaning of the flags values.  base: REL_LAB   vec: INSN  */
1303               /* Anything after INSN has still addresses from the last
1304                  pass; adjust these so that they reflect our current
1305                  estimate for this pass.  */
1306               if (flags.base_after_vec)
1307                 rel_addr += insn_current_address - insn_last_address;
1308               if (flags.min_after_vec)
1309                 min_addr += insn_current_address - insn_last_address;
1310               if (flags.max_after_vec)
1311                 max_addr += insn_current_address - insn_last_address;
1312               /* We want to know the worst case, i.e. lowest possible value
1313                  for the offset of MIN_LAB.  If MIN_LAB is after REL_LAB,
1314                  its offset is positive, and we have to be wary of code shrink;
1315                  otherwise, it is negative, and we have to be vary of code
1316                  size increase.  */
1317               if (flags.min_after_base)
1318                 {
1319                   /* If INSN is between REL_LAB and MIN_LAB, the size
1320                      changes we are about to make can change the alignment
1321                      within the observed offset, therefore we have to break
1322                      it up into two parts that are independent.  */
1323                   if (! flags.base_after_vec && flags.min_after_vec)
1324                     {
1325                       min_addr -= align_fuzz (rel_lab, insn, rel_align, 0);
1326                       min_addr -= align_fuzz (insn, min_lab, 0, 0);
1327                     }
1328                   else
1329                     min_addr -= align_fuzz (rel_lab, min_lab, rel_align, 0);
1330                 }
1331               else
1332                 {
1333                   if (flags.base_after_vec && ! flags.min_after_vec)
1334                     {
1335                       min_addr -= align_fuzz (min_lab, insn, 0, ~0);
1336                       min_addr -= align_fuzz (insn, rel_lab, 0, ~0);
1337                     }
1338                   else
1339                     min_addr -= align_fuzz (min_lab, rel_lab, 0, ~0);
1340                 }
1341               /* Likewise, determine the highest lowest possible value
1342                  for the offset of MAX_LAB.  */
1343               if (flags.max_after_base)
1344                 {
1345                   if (! flags.base_after_vec && flags.max_after_vec)
1346                     {
1347                       max_addr += align_fuzz (rel_lab, insn, rel_align, ~0);
1348                       max_addr += align_fuzz (insn, max_lab, 0, ~0);
1349                     }
1350                   else
1351                     max_addr += align_fuzz (rel_lab, max_lab, rel_align, ~0);
1352                 }
1353               else
1354                 {
1355                   if (flags.base_after_vec && ! flags.max_after_vec)
1356                     {
1357                       max_addr += align_fuzz (max_lab, insn, 0, 0);
1358                       max_addr += align_fuzz (insn, rel_lab, 0, 0);
1359                     }
1360                   else
1361                     max_addr += align_fuzz (max_lab, rel_lab, 0, 0);
1362                 }
1363               vec_mode = CASE_VECTOR_SHORTEN_MODE (min_addr - rel_addr,
1364                                                    max_addr - rel_addr, body);
1365               if (!increasing
1366                   || (GET_MODE_SIZE (vec_mode)
1367                       >= GET_MODE_SIZE (GET_MODE (body))))
1368                 PUT_MODE (body, vec_mode);
1369               if (JUMP_TABLES_IN_TEXT_SECTION
1370                   || readonly_data_section == text_section)
1371                 {
1372                   insn_lengths[uid]
1373                     = (XVECLEN (body, 1) * GET_MODE_SIZE (GET_MODE (body)));
1374                   insn_current_address += insn_lengths[uid];
1375                   if (insn_lengths[uid] != old_length)
1376                     something_changed = 1;
1377                 }
1378
1379               continue;
1380             }
1381 #endif /* CASE_VECTOR_SHORTEN_MODE */
1382
1383           if (! (varying_length[uid]))
1384             {
1385               if (NONJUMP_INSN_P (insn)
1386                   && GET_CODE (PATTERN (insn)) == SEQUENCE)
1387                 {
1388                   int i;
1389
1390                   body = PATTERN (insn);
1391                   for (i = 0; i < XVECLEN (body, 0); i++)
1392                     {
1393                       rtx inner_insn = XVECEXP (body, 0, i);
1394                       int inner_uid = INSN_UID (inner_insn);
1395
1396                       INSN_ADDRESSES (inner_uid) = insn_current_address;
1397
1398                       insn_current_address += insn_lengths[inner_uid];
1399                     }
1400                 }
1401               else
1402                 insn_current_address += insn_lengths[uid];
1403
1404               continue;
1405             }
1406
1407           if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
1408             {
1409               int i;
1410
1411               body = PATTERN (insn);
1412               new_length = 0;
1413               for (i = 0; i < XVECLEN (body, 0); i++)
1414                 {
1415                   rtx inner_insn = XVECEXP (body, 0, i);
1416                   int inner_uid = INSN_UID (inner_insn);
1417                   int inner_length;
1418
1419                   INSN_ADDRESSES (inner_uid) = insn_current_address;
1420
1421                   /* insn_current_length returns 0 for insns with a
1422                      non-varying length.  */
1423                   if (! varying_length[inner_uid])
1424                     inner_length = insn_lengths[inner_uid];
1425                   else
1426                     inner_length = insn_current_length (inner_insn);
1427
1428                   if (inner_length != insn_lengths[inner_uid])
1429                     {
1430                       if (!increasing || inner_length > insn_lengths[inner_uid])
1431                         {
1432                           insn_lengths[inner_uid] = inner_length;
1433                           something_changed = 1;
1434                         }
1435                       else
1436                         inner_length = insn_lengths[inner_uid];
1437                     }
1438                   insn_current_address += inner_length;
1439                   new_length += inner_length;
1440                 }
1441             }
1442           else
1443             {
1444               new_length = insn_current_length (insn);
1445               insn_current_address += new_length;
1446             }
1447
1448 #ifdef ADJUST_INSN_LENGTH
1449           /* If needed, do any adjustment.  */
1450           tmp_length = new_length;
1451           ADJUST_INSN_LENGTH (insn, new_length);
1452           insn_current_address += (new_length - tmp_length);
1453 #endif
1454
1455           if (new_length != insn_lengths[uid]
1456               && (!increasing || new_length > insn_lengths[uid]))
1457             {
1458               insn_lengths[uid] = new_length;
1459               something_changed = 1;
1460             }
1461           else
1462             insn_current_address += insn_lengths[uid] - new_length;
1463         }
1464       /* For a non-optimizing compile, do only a single pass.  */
1465       if (!increasing)
1466         break;
1467     }
1468
1469   free (varying_length);
1470 }
1471
1472 /* Given the body of an INSN known to be generated by an ASM statement, return
1473    the number of machine instructions likely to be generated for this insn.
1474    This is used to compute its length.  */
1475
1476 static int
1477 asm_insn_count (rtx body)
1478 {
1479   const char *templ;
1480
1481   if (GET_CODE (body) == ASM_INPUT)
1482     templ = XSTR (body, 0);
1483   else
1484     templ = decode_asm_operands (body, NULL, NULL, NULL, NULL, NULL);
1485
1486   return asm_str_count (templ);
1487 }
1488
1489 /* Return the number of machine instructions likely to be generated for the
1490    inline-asm template. */
1491 int
1492 asm_str_count (const char *templ)
1493 {
1494   int count = 1;
1495
1496   if (!*templ)
1497     return 0;
1498
1499   for (; *templ; templ++)
1500     if (IS_ASM_LOGICAL_LINE_SEPARATOR (*templ, templ)
1501         || *templ == '\n')
1502       count++;
1503
1504   return count;
1505 }
1506 \f
1507 /* ??? This is probably the wrong place for these.  */
1508 /* Structure recording the mapping from source file and directory
1509    names at compile time to those to be embedded in debug
1510    information.  */
1511 typedef struct debug_prefix_map
1512 {
1513   const char *old_prefix;
1514   const char *new_prefix;
1515   size_t old_len;
1516   size_t new_len;
1517   struct debug_prefix_map *next;
1518 } debug_prefix_map;
1519
1520 /* Linked list of such structures.  */
1521 static debug_prefix_map *debug_prefix_maps;
1522
1523
1524 /* Record a debug file prefix mapping.  ARG is the argument to
1525    -fdebug-prefix-map and must be of the form OLD=NEW.  */
1526
1527 void
1528 add_debug_prefix_map (const char *arg)
1529 {
1530   debug_prefix_map *map;
1531   const char *p;
1532
1533   p = strchr (arg, '=');
1534   if (!p)
1535     {
1536       error ("invalid argument %qs to -fdebug-prefix-map", arg);
1537       return;
1538     }
1539   map = XNEW (debug_prefix_map);
1540   map->old_prefix = xstrndup (arg, p - arg);
1541   map->old_len = p - arg;
1542   p++;
1543   map->new_prefix = xstrdup (p);
1544   map->new_len = strlen (p);
1545   map->next = debug_prefix_maps;
1546   debug_prefix_maps = map;
1547 }
1548
1549 /* Perform user-specified mapping of debug filename prefixes.  Return
1550    the new name corresponding to FILENAME.  */
1551
1552 const char *
1553 remap_debug_filename (const char *filename)
1554 {
1555   debug_prefix_map *map;
1556   char *s;
1557   const char *name;
1558   size_t name_len;
1559
1560   for (map = debug_prefix_maps; map; map = map->next)
1561     if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0)
1562       break;
1563   if (!map)
1564     return filename;
1565   name = filename + map->old_len;
1566   name_len = strlen (name) + 1;
1567   s = (char *) alloca (name_len + map->new_len);
1568   memcpy (s, map->new_prefix, map->new_len);
1569   memcpy (s + map->new_len, name, name_len);
1570   return ggc_strdup (s);
1571 }
1572 \f
1573 /* Return true if DWARF2 debug info can be emitted for DECL.  */
1574
1575 static bool
1576 dwarf2_debug_info_emitted_p (tree decl)
1577 {
1578   if (write_symbols != DWARF2_DEBUG && write_symbols != VMS_AND_DWARF2_DEBUG)
1579     return false;
1580
1581   if (DECL_IGNORED_P (decl))
1582     return false;
1583
1584   return true;
1585 }
1586
1587 /* Return scope resulting from combination of S1 and S2.  */
1588 static tree
1589 choose_inner_scope (tree s1, tree s2)
1590 {
1591    if (!s1)
1592      return s2;
1593    if (!s2)
1594      return s1;
1595    if (BLOCK_NUMBER (s1) > BLOCK_NUMBER (s2))
1596      return s1;
1597    return s2;
1598 }
1599
1600 /* Emit lexical block notes needed to change scope from S1 to S2.  */
1601
1602 static void
1603 change_scope (rtx orig_insn, tree s1, tree s2)
1604 {
1605   rtx insn = orig_insn;
1606   tree com = NULL_TREE;
1607   tree ts1 = s1, ts2 = s2;
1608   tree s;
1609
1610   while (ts1 != ts2)
1611     {
1612       gcc_assert (ts1 && ts2);
1613       if (BLOCK_NUMBER (ts1) > BLOCK_NUMBER (ts2))
1614         ts1 = BLOCK_SUPERCONTEXT (ts1);
1615       else if (BLOCK_NUMBER (ts1) < BLOCK_NUMBER (ts2))
1616         ts2 = BLOCK_SUPERCONTEXT (ts2);
1617       else
1618         {
1619           ts1 = BLOCK_SUPERCONTEXT (ts1);
1620           ts2 = BLOCK_SUPERCONTEXT (ts2);
1621         }
1622     }
1623   com = ts1;
1624
1625   /* Close scopes.  */
1626   s = s1;
1627   while (s != com)
1628     {
1629       rtx note = emit_note_before (NOTE_INSN_BLOCK_END, insn);
1630       NOTE_BLOCK (note) = s;
1631       s = BLOCK_SUPERCONTEXT (s);
1632     }
1633
1634   /* Open scopes.  */
1635   s = s2;
1636   while (s != com)
1637     {
1638       insn = emit_note_before (NOTE_INSN_BLOCK_BEG, insn);
1639       NOTE_BLOCK (insn) = s;
1640       s = BLOCK_SUPERCONTEXT (s);
1641     }
1642 }
1643
1644 /* Rebuild all the NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes based
1645    on the scope tree and the newly reordered instructions.  */
1646
1647 static void
1648 reemit_insn_block_notes (void)
1649 {
1650   tree cur_block = DECL_INITIAL (cfun->decl);
1651   rtx insn, note;
1652
1653   insn = get_insns ();
1654   for (; insn; insn = NEXT_INSN (insn))
1655     {
1656       tree this_block;
1657
1658       /* Prevent lexical blocks from straddling section boundaries.  */
1659       if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
1660         {
1661           for (tree s = cur_block; s != DECL_INITIAL (cfun->decl);
1662                s = BLOCK_SUPERCONTEXT (s))
1663             {
1664               rtx note = emit_note_before (NOTE_INSN_BLOCK_END, insn);
1665               NOTE_BLOCK (note) = s;
1666               note = emit_note_after (NOTE_INSN_BLOCK_BEG, insn);
1667               NOTE_BLOCK (note) = s;
1668             }
1669         }
1670
1671       if (!active_insn_p (insn))
1672         continue;
1673
1674       /* Avoid putting scope notes between jump table and its label.  */
1675       if (JUMP_TABLE_DATA_P (insn))
1676         continue;
1677
1678       this_block = insn_scope (insn);
1679       /* For sequences compute scope resulting from merging all scopes
1680          of instructions nested inside.  */
1681       if (GET_CODE (PATTERN (insn)) == SEQUENCE)
1682         {
1683           int i;
1684           rtx body = PATTERN (insn);
1685
1686           this_block = NULL;
1687           for (i = 0; i < XVECLEN (body, 0); i++)
1688             this_block = choose_inner_scope (this_block,
1689                                              insn_scope (XVECEXP (body, 0, i)));
1690         }
1691       if (! this_block)
1692         {
1693           if (INSN_LOCATION (insn) == UNKNOWN_LOCATION)
1694             continue;
1695           else
1696             this_block = DECL_INITIAL (cfun->decl);
1697         }
1698
1699       if (this_block != cur_block)
1700         {
1701           change_scope (insn, cur_block, this_block);
1702           cur_block = this_block;
1703         }
1704     }
1705
1706   /* change_scope emits before the insn, not after.  */
1707   note = emit_note (NOTE_INSN_DELETED);
1708   change_scope (note, cur_block, DECL_INITIAL (cfun->decl));
1709   delete_insn (note);
1710
1711   reorder_blocks ();
1712 }
1713
1714 /* Output assembler code for the start of a function,
1715    and initialize some of the variables in this file
1716    for the new function.  The label for the function and associated
1717    assembler pseudo-ops have already been output in `assemble_start_function'.
1718
1719    FIRST is the first insn of the rtl for the function being compiled.
1720    FILE is the file to write assembler code to.
1721    OPTIMIZE_P is nonzero if we should eliminate redundant
1722      test and compare insns.  */
1723
1724 void
1725 final_start_function (rtx first, FILE *file,
1726                       int optimize_p ATTRIBUTE_UNUSED)
1727 {
1728   block_depth = 0;
1729
1730   this_is_asm_operands = 0;
1731
1732   need_profile_function = false;
1733
1734   last_filename = LOCATION_FILE (prologue_location);
1735   last_linenum = LOCATION_LINE (prologue_location);
1736   last_discriminator = 0;
1737
1738   high_block_linenum = high_function_linenum = last_linenum;
1739
1740   if (flag_sanitize & SANITIZE_ADDRESS)
1741     asan_function_start ();
1742
1743   if (!DECL_IGNORED_P (current_function_decl))
1744     debug_hooks->begin_prologue (last_linenum, last_filename);
1745
1746   if (!dwarf2_debug_info_emitted_p (current_function_decl))
1747     dwarf2out_begin_prologue (0, NULL);
1748
1749 #ifdef LEAF_REG_REMAP
1750   if (crtl->uses_only_leaf_regs)
1751     leaf_renumber_regs (first);
1752 #endif
1753
1754   /* The Sun386i and perhaps other machines don't work right
1755      if the profiling code comes after the prologue.  */
1756   if (targetm.profile_before_prologue () && crtl->profile)
1757     {
1758       if (targetm.asm_out.function_prologue
1759           == default_function_pro_epilogue
1760 #ifdef HAVE_prologue
1761           && HAVE_prologue
1762 #endif
1763          )
1764         {
1765           rtx insn;
1766           for (insn = first; insn; insn = NEXT_INSN (insn))
1767             if (!NOTE_P (insn))
1768               {
1769                 insn = NULL_RTX;
1770                 break;
1771               }
1772             else if (NOTE_KIND (insn) == NOTE_INSN_BASIC_BLOCK
1773                      || NOTE_KIND (insn) == NOTE_INSN_FUNCTION_BEG)
1774               break;
1775             else if (NOTE_KIND (insn) == NOTE_INSN_DELETED
1776                      || NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION)
1777               continue;
1778             else
1779               {
1780                 insn = NULL_RTX;
1781                 break;
1782               }
1783
1784           if (insn)
1785             need_profile_function = true;
1786           else
1787             profile_function (file);
1788         }
1789       else
1790         profile_function (file);
1791     }
1792
1793   /* If debugging, assign block numbers to all of the blocks in this
1794      function.  */
1795   if (write_symbols)
1796     {
1797       reemit_insn_block_notes ();
1798       number_blocks (current_function_decl);
1799       /* We never actually put out begin/end notes for the top-level
1800          block in the function.  But, conceptually, that block is
1801          always needed.  */
1802       TREE_ASM_WRITTEN (DECL_INITIAL (current_function_decl)) = 1;
1803     }
1804
1805   if (warn_frame_larger_than
1806     && get_frame_size () > frame_larger_than_size)
1807   {
1808       /* Issue a warning */
1809       warning (OPT_Wframe_larger_than_,
1810                "the frame size of %wd bytes is larger than %wd bytes",
1811                get_frame_size (), frame_larger_than_size);
1812   }
1813
1814   /* First output the function prologue: code to set up the stack frame.  */
1815   targetm.asm_out.function_prologue (file, get_frame_size ());
1816
1817   /* If the machine represents the prologue as RTL, the profiling code must
1818      be emitted when NOTE_INSN_PROLOGUE_END is scanned.  */
1819 #ifdef HAVE_prologue
1820   if (! HAVE_prologue)
1821 #endif
1822     profile_after_prologue (file);
1823 }
1824
1825 static void
1826 profile_after_prologue (FILE *file ATTRIBUTE_UNUSED)
1827 {
1828   if (!targetm.profile_before_prologue () && crtl->profile)
1829     profile_function (file);
1830 }
1831
1832 static void
1833 profile_function (FILE *file ATTRIBUTE_UNUSED)
1834 {
1835 #ifndef NO_PROFILE_COUNTERS
1836 # define NO_PROFILE_COUNTERS    0
1837 #endif
1838 #ifdef ASM_OUTPUT_REG_PUSH
1839   rtx sval = NULL, chain = NULL;
1840
1841   if (cfun->returns_struct)
1842     sval = targetm.calls.struct_value_rtx (TREE_TYPE (current_function_decl),
1843                                            true);
1844   if (cfun->static_chain_decl)
1845     chain = targetm.calls.static_chain (current_function_decl, true);
1846 #endif /* ASM_OUTPUT_REG_PUSH */
1847
1848   if (! NO_PROFILE_COUNTERS)
1849     {
1850       int align = MIN (BIGGEST_ALIGNMENT, LONG_TYPE_SIZE);
1851       switch_to_section (data_section);
1852       ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
1853       targetm.asm_out.internal_label (file, "LP", current_function_funcdef_no);
1854       assemble_integer (const0_rtx, LONG_TYPE_SIZE / BITS_PER_UNIT, align, 1);
1855     }
1856
1857   switch_to_section (current_function_section ());
1858
1859 #ifdef ASM_OUTPUT_REG_PUSH
1860   if (sval && REG_P (sval))
1861     ASM_OUTPUT_REG_PUSH (file, REGNO (sval));
1862   if (chain && REG_P (chain))
1863     ASM_OUTPUT_REG_PUSH (file, REGNO (chain));
1864 #endif
1865
1866   FUNCTION_PROFILER (file, current_function_funcdef_no);
1867
1868 #ifdef ASM_OUTPUT_REG_PUSH
1869   if (chain && REG_P (chain))
1870     ASM_OUTPUT_REG_POP (file, REGNO (chain));
1871   if (sval && REG_P (sval))
1872     ASM_OUTPUT_REG_POP (file, REGNO (sval));
1873 #endif
1874 }
1875
1876 /* Output assembler code for the end of a function.
1877    For clarity, args are same as those of `final_start_function'
1878    even though not all of them are needed.  */
1879
1880 void
1881 final_end_function (void)
1882 {
1883   app_disable ();
1884
1885   if (!DECL_IGNORED_P (current_function_decl))
1886     debug_hooks->end_function (high_function_linenum);
1887
1888   /* Finally, output the function epilogue:
1889      code to restore the stack frame and return to the caller.  */
1890   targetm.asm_out.function_epilogue (asm_out_file, get_frame_size ());
1891
1892   /* And debug output.  */
1893   if (!DECL_IGNORED_P (current_function_decl))
1894     debug_hooks->end_epilogue (last_linenum, last_filename);
1895
1896   if (!dwarf2_debug_info_emitted_p (current_function_decl)
1897       && dwarf2out_do_frame ())
1898     dwarf2out_end_epilogue (last_linenum, last_filename);
1899 }
1900 \f
1901
1902 /* Dumper helper for basic block information. FILE is the assembly
1903    output file, and INSN is the instruction being emitted.  */
1904
1905 static void
1906 dump_basic_block_info (FILE *file, rtx insn, basic_block *start_to_bb,
1907                        basic_block *end_to_bb, int bb_map_size, int *bb_seqn)
1908 {
1909   basic_block bb;
1910
1911   if (!flag_debug_asm)
1912     return;
1913
1914   if (INSN_UID (insn) < bb_map_size
1915       && (bb = start_to_bb[INSN_UID (insn)]) != NULL)
1916     {
1917       edge e;
1918       edge_iterator ei;
1919
1920       fprintf (file, "%s BLOCK %d", ASM_COMMENT_START, bb->index);
1921       if (bb->frequency)
1922         fprintf (file, " freq:%d", bb->frequency);
1923       if (bb->count)
1924         fprintf (file, " count:" HOST_WIDEST_INT_PRINT_DEC,
1925                  bb->count);
1926       fprintf (file, " seq:%d", (*bb_seqn)++);
1927       fprintf (file, "\n%s PRED:", ASM_COMMENT_START);
1928       FOR_EACH_EDGE (e, ei, bb->preds)
1929         {
1930           dump_edge_info (file, e, TDF_DETAILS, 0);
1931         }
1932       fprintf (file, "\n");
1933     }
1934   if (INSN_UID (insn) < bb_map_size
1935       && (bb = end_to_bb[INSN_UID (insn)]) != NULL)
1936     {
1937       edge e;
1938       edge_iterator ei;
1939
1940       fprintf (asm_out_file, "%s SUCC:", ASM_COMMENT_START);
1941       FOR_EACH_EDGE (e, ei, bb->succs)
1942        {
1943          dump_edge_info (asm_out_file, e, TDF_DETAILS, 1);
1944        }
1945       fprintf (file, "\n");
1946     }
1947 }
1948
1949 /* Output assembler code for some insns: all or part of a function.
1950    For description of args, see `final_start_function', above.  */
1951
1952 void
1953 final (rtx first, FILE *file, int optimize_p)
1954 {
1955   rtx insn, next;
1956   int seen = 0;
1957
1958   /* Used for -dA dump.  */
1959   basic_block *start_to_bb = NULL;
1960   basic_block *end_to_bb = NULL;
1961   int bb_map_size = 0;
1962   int bb_seqn = 0;
1963
1964   last_ignored_compare = 0;
1965
1966 #ifdef HAVE_cc0
1967   for (insn = first; insn; insn = NEXT_INSN (insn))
1968     {
1969       /* If CC tracking across branches is enabled, record the insn which
1970          jumps to each branch only reached from one place.  */
1971       if (optimize_p && JUMP_P (insn))
1972         {
1973           rtx lab = JUMP_LABEL (insn);
1974           if (lab && LABEL_P (lab) && LABEL_NUSES (lab) == 1)
1975             {
1976               LABEL_REFS (lab) = insn;
1977             }
1978         }
1979     }
1980 #endif
1981
1982   init_recog ();
1983
1984   CC_STATUS_INIT;
1985
1986   if (flag_debug_asm)
1987     {
1988       basic_block bb;
1989
1990       bb_map_size = get_max_uid () + 1;
1991       start_to_bb = XCNEWVEC (basic_block, bb_map_size);
1992       end_to_bb = XCNEWVEC (basic_block, bb_map_size);
1993
1994       /* There is no cfg for a thunk.  */
1995       if (!cfun->is_thunk)
1996         FOR_EACH_BB_REVERSE_FN (bb, cfun)
1997           {
1998             start_to_bb[INSN_UID (BB_HEAD (bb))] = bb;
1999             end_to_bb[INSN_UID (BB_END (bb))] = bb;
2000           }
2001     }
2002
2003   /* Output the insns.  */
2004   for (insn = first; insn;)
2005     {
2006       if (HAVE_ATTR_length)
2007         {
2008           if ((unsigned) INSN_UID (insn) >= INSN_ADDRESSES_SIZE ())
2009             {
2010               /* This can be triggered by bugs elsewhere in the compiler if
2011                  new insns are created after init_insn_lengths is called.  */
2012               gcc_assert (NOTE_P (insn));
2013               insn_current_address = -1;
2014             }
2015           else
2016             insn_current_address = INSN_ADDRESSES (INSN_UID (insn));
2017         }
2018
2019       dump_basic_block_info (file, insn, start_to_bb, end_to_bb,
2020                              bb_map_size, &bb_seqn);
2021       insn = final_scan_insn (insn, file, optimize_p, 0, &seen);
2022     }
2023
2024   if (flag_debug_asm)
2025     {
2026       free (start_to_bb);
2027       free (end_to_bb);
2028     }
2029
2030   /* Remove CFI notes, to avoid compare-debug failures.  */
2031   for (insn = first; insn; insn = next)
2032     {
2033       next = NEXT_INSN (insn);
2034       if (NOTE_P (insn)
2035           && (NOTE_KIND (insn) == NOTE_INSN_CFI
2036               || NOTE_KIND (insn) == NOTE_INSN_CFI_LABEL))
2037         delete_insn (insn);
2038     }
2039 }
2040 \f
2041 const char *
2042 get_insn_template (int code, rtx insn)
2043 {
2044   switch (insn_data[code].output_format)
2045     {
2046     case INSN_OUTPUT_FORMAT_SINGLE:
2047       return insn_data[code].output.single;
2048     case INSN_OUTPUT_FORMAT_MULTI:
2049       return insn_data[code].output.multi[which_alternative];
2050     case INSN_OUTPUT_FORMAT_FUNCTION:
2051       gcc_assert (insn);
2052       return (*insn_data[code].output.function) (recog_data.operand, insn);
2053
2054     default:
2055       gcc_unreachable ();
2056     }
2057 }
2058
2059 /* Emit the appropriate declaration for an alternate-entry-point
2060    symbol represented by INSN, to FILE.  INSN is a CODE_LABEL with
2061    LABEL_KIND != LABEL_NORMAL.
2062
2063    The case fall-through in this function is intentional.  */
2064 static void
2065 output_alternate_entry_point (FILE *file, rtx insn)
2066 {
2067   const char *name = LABEL_NAME (insn);
2068
2069   switch (LABEL_KIND (insn))
2070     {
2071     case LABEL_WEAK_ENTRY:
2072 #ifdef ASM_WEAKEN_LABEL
2073       ASM_WEAKEN_LABEL (file, name);
2074 #endif
2075     case LABEL_GLOBAL_ENTRY:
2076       targetm.asm_out.globalize_label (file, name);
2077     case LABEL_STATIC_ENTRY:
2078 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
2079       ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
2080 #endif
2081       ASM_OUTPUT_LABEL (file, name);
2082       break;
2083
2084     case LABEL_NORMAL:
2085     default:
2086       gcc_unreachable ();
2087     }
2088 }
2089
2090 /* Given a CALL_INSN, find and return the nested CALL. */
2091 static rtx
2092 call_from_call_insn (rtx insn)
2093 {
2094   rtx x;
2095   gcc_assert (CALL_P (insn));
2096   x = PATTERN (insn);
2097
2098   while (GET_CODE (x) != CALL)
2099     {
2100       switch (GET_CODE (x))
2101         {
2102         default:
2103           gcc_unreachable ();
2104         case COND_EXEC:
2105           x = COND_EXEC_CODE (x);
2106           break;
2107         case PARALLEL:
2108           x = XVECEXP (x, 0, 0);
2109           break;
2110         case SET:
2111           x = XEXP (x, 1);
2112           break;
2113         }
2114     }
2115   return x;
2116 }
2117
2118 /* The final scan for one insn, INSN.
2119    Args are same as in `final', except that INSN
2120    is the insn being scanned.
2121    Value returned is the next insn to be scanned.
2122
2123    NOPEEPHOLES is the flag to disallow peephole processing (currently
2124    used for within delayed branch sequence output).
2125
2126    SEEN is used to track the end of the prologue, for emitting
2127    debug information.  We force the emission of a line note after
2128    both NOTE_INSN_PROLOGUE_END and NOTE_INSN_FUNCTION_BEG.  */
2129
2130 rtx
2131 final_scan_insn (rtx insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED,
2132                  int nopeepholes ATTRIBUTE_UNUSED, int *seen)
2133 {
2134 #ifdef HAVE_cc0
2135   rtx set;
2136 #endif
2137   rtx next;
2138
2139   insn_counter++;
2140
2141   /* Ignore deleted insns.  These can occur when we split insns (due to a
2142      template of "#") while not optimizing.  */
2143   if (INSN_DELETED_P (insn))
2144     return NEXT_INSN (insn);
2145
2146   switch (GET_CODE (insn))
2147     {
2148     case NOTE:
2149       switch (NOTE_KIND (insn))
2150         {
2151         case NOTE_INSN_DELETED:
2152           break;
2153
2154         case NOTE_INSN_SWITCH_TEXT_SECTIONS:
2155           in_cold_section_p = !in_cold_section_p;
2156
2157           if (dwarf2out_do_frame ())
2158             dwarf2out_switch_text_section ();
2159           else if (!DECL_IGNORED_P (current_function_decl))
2160             debug_hooks->switch_text_section ();
2161
2162           switch_to_section (current_function_section ());
2163           targetm.asm_out.function_switched_text_sections (asm_out_file,
2164                                                            current_function_decl,
2165                                                            in_cold_section_p);
2166           /* Emit a label for the split cold section.  Form label name by
2167              suffixing "cold" to the original function's name.  */
2168           if (in_cold_section_p)
2169             {
2170               tree cold_function_name
2171                 = clone_function_name (current_function_decl, "cold");
2172               ASM_OUTPUT_LABEL (asm_out_file,
2173                                 IDENTIFIER_POINTER (cold_function_name));
2174             }
2175           break;
2176
2177         case NOTE_INSN_BASIC_BLOCK:
2178           if (need_profile_function)
2179             {
2180               profile_function (asm_out_file);
2181               need_profile_function = false;
2182             }
2183
2184           if (targetm.asm_out.unwind_emit)
2185             targetm.asm_out.unwind_emit (asm_out_file, insn);
2186
2187           break;
2188
2189         case NOTE_INSN_EH_REGION_BEG:
2190           ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LEHB",
2191                                   NOTE_EH_HANDLER (insn));
2192           break;
2193
2194         case NOTE_INSN_EH_REGION_END:
2195           ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LEHE",
2196                                   NOTE_EH_HANDLER (insn));
2197           break;
2198
2199         case NOTE_INSN_PROLOGUE_END:
2200           targetm.asm_out.function_end_prologue (file);
2201           profile_after_prologue (file);
2202
2203           if ((*seen & (SEEN_EMITTED | SEEN_NOTE)) == SEEN_NOTE)
2204             {
2205               *seen |= SEEN_EMITTED;
2206               force_source_line = true;
2207             }
2208           else
2209             *seen |= SEEN_NOTE;
2210
2211           break;
2212
2213         case NOTE_INSN_EPILOGUE_BEG:
2214           if (!DECL_IGNORED_P (current_function_decl))
2215             (*debug_hooks->begin_epilogue) (last_linenum, last_filename);
2216           targetm.asm_out.function_begin_epilogue (file);
2217           break;
2218
2219         case NOTE_INSN_CFI:
2220           dwarf2out_emit_cfi (NOTE_CFI (insn));
2221           break;
2222
2223         case NOTE_INSN_CFI_LABEL:
2224           ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LCFI",
2225                                   NOTE_LABEL_NUMBER (insn));
2226           break;
2227
2228         case NOTE_INSN_FUNCTION_BEG:
2229           if (need_profile_function)
2230             {
2231               profile_function (asm_out_file);
2232               need_profile_function = false;
2233             }
2234
2235           app_disable ();
2236           if (!DECL_IGNORED_P (current_function_decl))
2237             debug_hooks->end_prologue (last_linenum, last_filename);
2238
2239           if ((*seen & (SEEN_EMITTED | SEEN_NOTE)) == SEEN_NOTE)
2240             {
2241               *seen |= SEEN_EMITTED;
2242               force_source_line = true;
2243             }
2244           else
2245             *seen |= SEEN_NOTE;
2246
2247           break;
2248
2249         case NOTE_INSN_BLOCK_BEG:
2250           if (debug_info_level == DINFO_LEVEL_NORMAL
2251               || debug_info_level == DINFO_LEVEL_VERBOSE
2252               || write_symbols == DWARF2_DEBUG
2253               || write_symbols == VMS_AND_DWARF2_DEBUG
2254               || write_symbols == VMS_DEBUG)
2255             {
2256               int n = BLOCK_NUMBER (NOTE_BLOCK (insn));
2257
2258               app_disable ();
2259               ++block_depth;
2260               high_block_linenum = last_linenum;
2261
2262               /* Output debugging info about the symbol-block beginning.  */
2263               if (!DECL_IGNORED_P (current_function_decl))
2264                 debug_hooks->begin_block (last_linenum, n);
2265
2266               /* Mark this block as output.  */
2267               TREE_ASM_WRITTEN (NOTE_BLOCK (insn)) = 1;
2268             }
2269           if (write_symbols == DBX_DEBUG
2270               || write_symbols == SDB_DEBUG)
2271             {
2272               location_t *locus_ptr
2273                 = block_nonartificial_location (NOTE_BLOCK (insn));
2274
2275               if (locus_ptr != NULL)
2276                 {
2277                   override_filename = LOCATION_FILE (*locus_ptr);
2278                   override_linenum = LOCATION_LINE (*locus_ptr);
2279                   override_discriminator =
2280                       get_discriminator_from_locus (*locus_ptr);
2281                 }
2282             }
2283           break;
2284
2285         case NOTE_INSN_BLOCK_END:
2286           if (debug_info_level == DINFO_LEVEL_NORMAL
2287               || debug_info_level == DINFO_LEVEL_VERBOSE
2288               || write_symbols == DWARF2_DEBUG
2289               || write_symbols == VMS_AND_DWARF2_DEBUG
2290               || write_symbols == VMS_DEBUG)
2291             {
2292               int n = BLOCK_NUMBER (NOTE_BLOCK (insn));
2293
2294               app_disable ();
2295
2296               /* End of a symbol-block.  */
2297               --block_depth;
2298               gcc_assert (block_depth >= 0);
2299
2300               if (!DECL_IGNORED_P (current_function_decl))
2301                 debug_hooks->end_block (high_block_linenum, n);
2302             }
2303           if (write_symbols == DBX_DEBUG
2304               || write_symbols == SDB_DEBUG)
2305             {
2306               tree outer_block = BLOCK_SUPERCONTEXT (NOTE_BLOCK (insn));
2307               location_t *locus_ptr
2308                 = block_nonartificial_location (outer_block);
2309
2310               if (locus_ptr != NULL)
2311                 {
2312                   override_filename = LOCATION_FILE (*locus_ptr);
2313                   override_linenum = LOCATION_LINE (*locus_ptr);
2314                   override_discriminator =
2315                       get_discriminator_from_locus (*locus_ptr);
2316                 }
2317               else
2318                 {
2319                   override_filename = NULL;
2320                   override_linenum = 0;
2321                   override_discriminator = 0;
2322                 }
2323             }
2324           break;
2325
2326         case NOTE_INSN_DELETED_LABEL:
2327           /* Emit the label.  We may have deleted the CODE_LABEL because
2328              the label could be proved to be unreachable, though still
2329              referenced (in the form of having its address taken.  */
2330           ASM_OUTPUT_DEBUG_LABEL (file, "L", CODE_LABEL_NUMBER (insn));
2331           break;
2332
2333         case NOTE_INSN_DELETED_DEBUG_LABEL:
2334           /* Similarly, but need to use different namespace for it.  */
2335           if (CODE_LABEL_NUMBER (insn) != -1)
2336             ASM_OUTPUT_DEBUG_LABEL (file, "LDL", CODE_LABEL_NUMBER (insn));
2337           break;
2338
2339         case NOTE_INSN_VAR_LOCATION:
2340         case NOTE_INSN_CALL_ARG_LOCATION:
2341           if (!DECL_IGNORED_P (current_function_decl))
2342             debug_hooks->var_location (insn);
2343           break;
2344
2345         default:
2346           gcc_unreachable ();
2347           break;
2348         }
2349       break;
2350
2351     case BARRIER:
2352       break;
2353
2354     case CODE_LABEL:
2355       /* The target port might emit labels in the output function for
2356          some insn, e.g. sh.c output_branchy_insn.  */
2357       if (CODE_LABEL_NUMBER (insn) <= max_labelno)
2358         {
2359           int align = LABEL_TO_ALIGNMENT (insn);
2360 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
2361           int max_skip = LABEL_TO_MAX_SKIP (insn);
2362 #endif
2363
2364           if (align && NEXT_INSN (insn))
2365             {
2366 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
2367               ASM_OUTPUT_MAX_SKIP_ALIGN (file, align, max_skip);
2368 #else
2369 #ifdef ASM_OUTPUT_ALIGN_WITH_NOP
2370               ASM_OUTPUT_ALIGN_WITH_NOP (file, align);
2371 #else
2372               ASM_OUTPUT_ALIGN (file, align);
2373 #endif
2374 #endif
2375             }
2376         }
2377       CC_STATUS_INIT;
2378
2379       if (!DECL_IGNORED_P (current_function_decl) && LABEL_NAME (insn))
2380         debug_hooks->label (insn);
2381
2382       app_disable ();
2383
2384       next = next_nonnote_insn (insn);
2385       /* If this label is followed by a jump-table, make sure we put
2386          the label in the read-only section.  Also possibly write the
2387          label and jump table together.  */
2388       if (next != 0 && JUMP_TABLE_DATA_P (next))
2389         {
2390 #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
2391           /* In this case, the case vector is being moved by the
2392              target, so don't output the label at all.  Leave that
2393              to the back end macros.  */
2394 #else
2395           if (! JUMP_TABLES_IN_TEXT_SECTION)
2396             {
2397               int log_align;
2398
2399               switch_to_section (targetm.asm_out.function_rodata_section
2400                                  (current_function_decl));
2401
2402 #ifdef ADDR_VEC_ALIGN
2403               log_align = ADDR_VEC_ALIGN (next);
2404 #else
2405               log_align = exact_log2 (BIGGEST_ALIGNMENT / BITS_PER_UNIT);
2406 #endif
2407               ASM_OUTPUT_ALIGN (file, log_align);
2408             }
2409           else
2410             switch_to_section (current_function_section ());
2411
2412 #ifdef ASM_OUTPUT_CASE_LABEL
2413           ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn),
2414                                  next);
2415 #else
2416           targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn));
2417 #endif
2418 #endif
2419           break;
2420         }
2421       if (LABEL_ALT_ENTRY_P (insn))
2422         output_alternate_entry_point (file, insn);
2423       else
2424         targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn));
2425       break;
2426
2427     default:
2428       {
2429         rtx body = PATTERN (insn);
2430         int insn_code_number;
2431         const char *templ;
2432         bool is_stmt;
2433
2434         /* Reset this early so it is correct for ASM statements.  */
2435         current_insn_predicate = NULL_RTX;
2436
2437         /* An INSN, JUMP_INSN or CALL_INSN.
2438            First check for special kinds that recog doesn't recognize.  */
2439
2440         if (GET_CODE (body) == USE /* These are just declarations.  */
2441             || GET_CODE (body) == CLOBBER)
2442           break;
2443
2444 #ifdef HAVE_cc0
2445         {
2446           /* If there is a REG_CC_SETTER note on this insn, it means that
2447              the setting of the condition code was done in the delay slot
2448              of the insn that branched here.  So recover the cc status
2449              from the insn that set it.  */
2450
2451           rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
2452           if (note)
2453             {
2454               NOTICE_UPDATE_CC (PATTERN (XEXP (note, 0)), XEXP (note, 0));
2455               cc_prev_status = cc_status;
2456             }
2457         }
2458 #endif
2459
2460         /* Detect insns that are really jump-tables
2461            and output them as such.  */
2462
2463         if (JUMP_TABLE_DATA_P (insn))
2464           {
2465 #if !(defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC))
2466             int vlen, idx;
2467 #endif
2468
2469             if (! JUMP_TABLES_IN_TEXT_SECTION)
2470               switch_to_section (targetm.asm_out.function_rodata_section
2471                                  (current_function_decl));
2472             else
2473               switch_to_section (current_function_section ());
2474
2475             app_disable ();
2476
2477 #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
2478             if (GET_CODE (body) == ADDR_VEC)
2479               {
2480 #ifdef ASM_OUTPUT_ADDR_VEC
2481                 ASM_OUTPUT_ADDR_VEC (PREV_INSN (insn), body);
2482 #else
2483                 gcc_unreachable ();
2484 #endif
2485               }
2486             else
2487               {
2488 #ifdef ASM_OUTPUT_ADDR_DIFF_VEC
2489                 ASM_OUTPUT_ADDR_DIFF_VEC (PREV_INSN (insn), body);
2490 #else
2491                 gcc_unreachable ();
2492 #endif
2493               }
2494 #else
2495             vlen = XVECLEN (body, GET_CODE (body) == ADDR_DIFF_VEC);
2496             for (idx = 0; idx < vlen; idx++)
2497               {
2498                 if (GET_CODE (body) == ADDR_VEC)
2499                   {
2500 #ifdef ASM_OUTPUT_ADDR_VEC_ELT
2501                     ASM_OUTPUT_ADDR_VEC_ELT
2502                       (file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
2503 #else
2504                     gcc_unreachable ();
2505 #endif
2506                   }
2507                 else
2508                   {
2509 #ifdef ASM_OUTPUT_ADDR_DIFF_ELT
2510                     ASM_OUTPUT_ADDR_DIFF_ELT
2511                       (file,
2512                        body,
2513                        CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
2514                        CODE_LABEL_NUMBER (XEXP (XEXP (body, 0), 0)));
2515 #else
2516                     gcc_unreachable ();
2517 #endif
2518                   }
2519               }
2520 #ifdef ASM_OUTPUT_CASE_END
2521             ASM_OUTPUT_CASE_END (file,
2522                                  CODE_LABEL_NUMBER (PREV_INSN (insn)),
2523                                  insn);
2524 #endif
2525 #endif
2526
2527             switch_to_section (current_function_section ());
2528
2529             break;
2530           }
2531         /* Output this line note if it is the first or the last line
2532            note in a row.  */
2533         if (!DECL_IGNORED_P (current_function_decl)
2534             && notice_source_line (insn, &is_stmt))
2535           (*debug_hooks->source_line) (last_linenum, last_filename,
2536                                        last_discriminator, is_stmt);
2537
2538         if (GET_CODE (body) == ASM_INPUT)
2539           {
2540             const char *string = XSTR (body, 0);
2541
2542             /* There's no telling what that did to the condition codes.  */
2543             CC_STATUS_INIT;
2544
2545             if (string[0])
2546               {
2547                 expanded_location loc;
2548
2549                 app_enable ();
2550                 loc = expand_location (ASM_INPUT_SOURCE_LOCATION (body));
2551                 if (*loc.file && loc.line)
2552                   fprintf (asm_out_file, "%s %i \"%s\" 1\n",
2553                            ASM_COMMENT_START, loc.line, loc.file);
2554                 fprintf (asm_out_file, "\t%s\n", string);
2555 #if HAVE_AS_LINE_ZERO
2556                 if (*loc.file && loc.line)
2557                   fprintf (asm_out_file, "%s 0 \"\" 2\n", ASM_COMMENT_START);
2558 #endif
2559               }
2560             break;
2561           }
2562
2563         /* Detect `asm' construct with operands.  */
2564         if (asm_noperands (body) >= 0)
2565           {
2566             unsigned int noperands = asm_noperands (body);
2567             rtx *ops = XALLOCAVEC (rtx, noperands);
2568             const char *string;
2569             location_t loc;
2570             expanded_location expanded;
2571
2572             /* There's no telling what that did to the condition codes.  */
2573             CC_STATUS_INIT;
2574
2575             /* Get out the operand values.  */
2576             string = decode_asm_operands (body, ops, NULL, NULL, NULL, &loc);
2577             /* Inhibit dying on what would otherwise be compiler bugs.  */
2578             insn_noperands = noperands;
2579             this_is_asm_operands = insn;
2580             expanded = expand_location (loc);
2581
2582 #ifdef FINAL_PRESCAN_INSN
2583             FINAL_PRESCAN_INSN (insn, ops, insn_noperands);
2584 #endif
2585
2586             /* Output the insn using them.  */
2587             if (string[0])
2588               {
2589                 app_enable ();
2590                 if (expanded.file && expanded.line)
2591                   fprintf (asm_out_file, "%s %i \"%s\" 1\n",
2592                            ASM_COMMENT_START, expanded.line, expanded.file);
2593                 output_asm_insn (string, ops);
2594 #if HAVE_AS_LINE_ZERO
2595                 if (expanded.file && expanded.line)
2596                   fprintf (asm_out_file, "%s 0 \"\" 2\n", ASM_COMMENT_START);
2597 #endif
2598               }
2599
2600             if (targetm.asm_out.final_postscan_insn)
2601               targetm.asm_out.final_postscan_insn (file, insn, ops,
2602                                                    insn_noperands);
2603
2604             this_is_asm_operands = 0;
2605             break;
2606           }
2607
2608         app_disable ();
2609
2610         if (GET_CODE (body) == SEQUENCE)
2611           {
2612             /* A delayed-branch sequence */
2613             int i;
2614
2615             final_sequence = body;
2616
2617             /* The first insn in this SEQUENCE might be a JUMP_INSN that will
2618                force the restoration of a comparison that was previously
2619                thought unnecessary.  If that happens, cancel this sequence
2620                and cause that insn to be restored.  */
2621
2622             next = final_scan_insn (XVECEXP (body, 0, 0), file, 0, 1, seen);
2623             if (next != XVECEXP (body, 0, 1))
2624               {
2625                 final_sequence = 0;
2626                 return next;
2627               }
2628
2629             for (i = 1; i < XVECLEN (body, 0); i++)
2630               {
2631                 rtx insn = XVECEXP (body, 0, i);
2632                 rtx next = NEXT_INSN (insn);
2633                 /* We loop in case any instruction in a delay slot gets
2634                    split.  */
2635                 do
2636                   insn = final_scan_insn (insn, file, 0, 1, seen);
2637                 while (insn != next);
2638               }
2639 #ifdef DBR_OUTPUT_SEQEND
2640             DBR_OUTPUT_SEQEND (file);
2641 #endif
2642             final_sequence = 0;
2643
2644             /* If the insn requiring the delay slot was a CALL_INSN, the
2645                insns in the delay slot are actually executed before the
2646                called function.  Hence we don't preserve any CC-setting
2647                actions in these insns and the CC must be marked as being
2648                clobbered by the function.  */
2649             if (CALL_P (XVECEXP (body, 0, 0)))
2650               {
2651                 CC_STATUS_INIT;
2652               }
2653             break;
2654           }
2655
2656         /* We have a real machine instruction as rtl.  */
2657
2658         body = PATTERN (insn);
2659
2660 #ifdef HAVE_cc0
2661         set = single_set (insn);
2662
2663         /* Check for redundant test and compare instructions
2664            (when the condition codes are already set up as desired).
2665            This is done only when optimizing; if not optimizing,
2666            it should be possible for the user to alter a variable
2667            with the debugger in between statements
2668            and the next statement should reexamine the variable
2669            to compute the condition codes.  */
2670
2671         if (optimize_p)
2672           {
2673             if (set
2674                 && GET_CODE (SET_DEST (set)) == CC0
2675                 && insn != last_ignored_compare)
2676               {
2677                 rtx src1, src2;
2678                 if (GET_CODE (SET_SRC (set)) == SUBREG)
2679                   SET_SRC (set) = alter_subreg (&SET_SRC (set), true);
2680
2681                 src1 = SET_SRC (set);
2682                 src2 = NULL_RTX;
2683                 if (GET_CODE (SET_SRC (set)) == COMPARE)
2684                   {
2685                     if (GET_CODE (XEXP (SET_SRC (set), 0)) == SUBREG)
2686                       XEXP (SET_SRC (set), 0)
2687                         = alter_subreg (&XEXP (SET_SRC (set), 0), true);
2688                     if (GET_CODE (XEXP (SET_SRC (set), 1)) == SUBREG)
2689                       XEXP (SET_SRC (set), 1)
2690                         = alter_subreg (&XEXP (SET_SRC (set), 1), true);
2691                     if (XEXP (SET_SRC (set), 1)
2692                         == CONST0_RTX (GET_MODE (XEXP (SET_SRC (set), 0))))
2693                       src2 = XEXP (SET_SRC (set), 0);
2694                   }
2695                 if ((cc_status.value1 != 0
2696                      && rtx_equal_p (src1, cc_status.value1))
2697                     || (cc_status.value2 != 0
2698                         && rtx_equal_p (src1, cc_status.value2))
2699                     || (src2 != 0 && cc_status.value1 != 0
2700                         && rtx_equal_p (src2, cc_status.value1))
2701                     || (src2 != 0 && cc_status.value2 != 0
2702                         && rtx_equal_p (src2, cc_status.value2)))
2703                   {
2704                     /* Don't delete insn if it has an addressing side-effect.  */
2705                     if (! FIND_REG_INC_NOTE (insn, NULL_RTX)
2706                         /* or if anything in it is volatile.  */
2707                         && ! volatile_refs_p (PATTERN (insn)))
2708                       {
2709                         /* We don't really delete the insn; just ignore it.  */
2710                         last_ignored_compare = insn;
2711                         break;
2712                       }
2713                   }
2714               }
2715           }
2716
2717         /* If this is a conditional branch, maybe modify it
2718            if the cc's are in a nonstandard state
2719            so that it accomplishes the same thing that it would
2720            do straightforwardly if the cc's were set up normally.  */
2721
2722         if (cc_status.flags != 0
2723             && JUMP_P (insn)
2724             && GET_CODE (body) == SET
2725             && SET_DEST (body) == pc_rtx
2726             && GET_CODE (SET_SRC (body)) == IF_THEN_ELSE
2727             && COMPARISON_P (XEXP (SET_SRC (body), 0))
2728             && XEXP (XEXP (SET_SRC (body), 0), 0) == cc0_rtx)
2729           {
2730             /* This function may alter the contents of its argument
2731                and clear some of the cc_status.flags bits.
2732                It may also return 1 meaning condition now always true
2733                or -1 meaning condition now always false
2734                or 2 meaning condition nontrivial but altered.  */
2735             int result = alter_cond (XEXP (SET_SRC (body), 0));
2736             /* If condition now has fixed value, replace the IF_THEN_ELSE
2737                with its then-operand or its else-operand.  */
2738             if (result == 1)
2739               SET_SRC (body) = XEXP (SET_SRC (body), 1);
2740             if (result == -1)
2741               SET_SRC (body) = XEXP (SET_SRC (body), 2);
2742
2743             /* The jump is now either unconditional or a no-op.
2744                If it has become a no-op, don't try to output it.
2745                (It would not be recognized.)  */
2746             if (SET_SRC (body) == pc_rtx)
2747               {
2748                 delete_insn (insn);
2749                 break;
2750               }
2751             else if (ANY_RETURN_P (SET_SRC (body)))
2752               /* Replace (set (pc) (return)) with (return).  */
2753               PATTERN (insn) = body = SET_SRC (body);
2754
2755             /* Rerecognize the instruction if it has changed.  */
2756             if (result != 0)
2757               INSN_CODE (insn) = -1;
2758           }
2759
2760         /* If this is a conditional trap, maybe modify it if the cc's
2761            are in a nonstandard state so that it accomplishes the same
2762            thing that it would do straightforwardly if the cc's were
2763            set up normally.  */
2764         if (cc_status.flags != 0
2765             && NONJUMP_INSN_P (insn)
2766             && GET_CODE (body) == TRAP_IF
2767             && COMPARISON_P (TRAP_CONDITION (body))
2768             && XEXP (TRAP_CONDITION (body), 0) == cc0_rtx)
2769           {
2770             /* This function may alter the contents of its argument
2771                and clear some of the cc_status.flags bits.
2772                It may also return 1 meaning condition now always true
2773                or -1 meaning condition now always false
2774                or 2 meaning condition nontrivial but altered.  */
2775             int result = alter_cond (TRAP_CONDITION (body));
2776
2777             /* If TRAP_CONDITION has become always false, delete the
2778                instruction.  */
2779             if (result == -1)
2780               {
2781                 delete_insn (insn);
2782                 break;
2783               }
2784
2785             /* If TRAP_CONDITION has become always true, replace
2786                TRAP_CONDITION with const_true_rtx.  */
2787             if (result == 1)
2788               TRAP_CONDITION (body) = const_true_rtx;
2789
2790             /* Rerecognize the instruction if it has changed.  */
2791             if (result != 0)
2792               INSN_CODE (insn) = -1;
2793           }
2794
2795         /* Make same adjustments to instructions that examine the
2796            condition codes without jumping and instructions that
2797            handle conditional moves (if this machine has either one).  */
2798
2799         if (cc_status.flags != 0
2800             && set != 0)
2801           {
2802             rtx cond_rtx, then_rtx, else_rtx;
2803
2804             if (!JUMP_P (insn)
2805                 && GET_CODE (SET_SRC (set)) == IF_THEN_ELSE)
2806               {
2807                 cond_rtx = XEXP (SET_SRC (set), 0);
2808                 then_rtx = XEXP (SET_SRC (set), 1);
2809                 else_rtx = XEXP (SET_SRC (set), 2);
2810               }
2811             else
2812               {
2813                 cond_rtx = SET_SRC (set);
2814                 then_rtx = const_true_rtx;
2815                 else_rtx = const0_rtx;
2816               }
2817
2818             if (COMPARISON_P (cond_rtx)
2819                 && XEXP (cond_rtx, 0) == cc0_rtx)
2820               {
2821                 int result;
2822                 result = alter_cond (cond_rtx);
2823                 if (result == 1)
2824                   validate_change (insn, &SET_SRC (set), then_rtx, 0);
2825                 else if (result == -1)
2826                   validate_change (insn, &SET_SRC (set), else_rtx, 0);
2827                 else if (result == 2)
2828                   INSN_CODE (insn) = -1;
2829                 if (SET_DEST (set) == SET_SRC (set))
2830                   delete_insn (insn);
2831               }
2832           }
2833
2834 #endif
2835
2836 #ifdef HAVE_peephole
2837         /* Do machine-specific peephole optimizations if desired.  */
2838
2839         if (optimize_p && !flag_no_peephole && !nopeepholes)
2840           {
2841             rtx next = peephole (insn);
2842             /* When peepholing, if there were notes within the peephole,
2843                emit them before the peephole.  */
2844             if (next != 0 && next != NEXT_INSN (insn))
2845               {
2846                 rtx note, prev = PREV_INSN (insn);
2847
2848                 for (note = NEXT_INSN (insn); note != next;
2849                      note = NEXT_INSN (note))
2850                   final_scan_insn (note, file, optimize_p, nopeepholes, seen);
2851
2852                 /* Put the notes in the proper position for a later
2853                    rescan.  For example, the SH target can do this
2854                    when generating a far jump in a delayed branch
2855                    sequence.  */
2856                 note = NEXT_INSN (insn);
2857                 PREV_INSN (note) = prev;
2858                 NEXT_INSN (prev) = note;
2859                 NEXT_INSN (PREV_INSN (next)) = insn;
2860                 PREV_INSN (insn) = PREV_INSN (next);
2861                 NEXT_INSN (insn) = next;
2862                 PREV_INSN (next) = insn;
2863               }
2864
2865             /* PEEPHOLE might have changed this.  */
2866             body = PATTERN (insn);
2867           }
2868 #endif
2869
2870         /* Try to recognize the instruction.
2871            If successful, verify that the operands satisfy the
2872            constraints for the instruction.  Crash if they don't,
2873            since `reload' should have changed them so that they do.  */
2874
2875         insn_code_number = recog_memoized (insn);
2876         cleanup_subreg_operands (insn);
2877
2878         /* Dump the insn in the assembly for debugging (-dAP).
2879            If the final dump is requested as slim RTL, dump slim
2880            RTL to the assembly file also.  */
2881         if (flag_dump_rtl_in_asm)
2882           {
2883             print_rtx_head = ASM_COMMENT_START;
2884             if (! (dump_flags & TDF_SLIM))
2885               print_rtl_single (asm_out_file, insn);
2886             else
2887               dump_insn_slim (asm_out_file, insn);
2888             print_rtx_head = "";
2889           }
2890
2891         if (! constrain_operands_cached (1))
2892           fatal_insn_not_found (insn);
2893
2894         /* Some target machines need to prescan each insn before
2895            it is output.  */
2896
2897 #ifdef FINAL_PRESCAN_INSN
2898         FINAL_PRESCAN_INSN (insn, recog_data.operand, recog_data.n_operands);
2899 #endif
2900
2901         if (targetm.have_conditional_execution ()
2902             && GET_CODE (PATTERN (insn)) == COND_EXEC)
2903           current_insn_predicate = COND_EXEC_TEST (PATTERN (insn));
2904
2905 #ifdef HAVE_cc0
2906         cc_prev_status = cc_status;
2907
2908         /* Update `cc_status' for this instruction.
2909            The instruction's output routine may change it further.
2910            If the output routine for a jump insn needs to depend
2911            on the cc status, it should look at cc_prev_status.  */
2912
2913         NOTICE_UPDATE_CC (body, insn);
2914 #endif
2915
2916         current_output_insn = debug_insn = insn;
2917
2918         /* Find the proper template for this insn.  */
2919         templ = get_insn_template (insn_code_number, insn);
2920
2921         /* If the C code returns 0, it means that it is a jump insn
2922            which follows a deleted test insn, and that test insn
2923            needs to be reinserted.  */
2924         if (templ == 0)
2925           {
2926             rtx prev;
2927
2928             gcc_assert (prev_nonnote_insn (insn) == last_ignored_compare);
2929
2930             /* We have already processed the notes between the setter and
2931                the user.  Make sure we don't process them again, this is
2932                particularly important if one of the notes is a block
2933                scope note or an EH note.  */
2934             for (prev = insn;
2935                  prev != last_ignored_compare;
2936                  prev = PREV_INSN (prev))
2937               {
2938                 if (NOTE_P (prev))
2939                   delete_insn (prev);   /* Use delete_note.  */
2940               }
2941
2942             return prev;
2943           }
2944
2945         /* If the template is the string "#", it means that this insn must
2946            be split.  */
2947         if (templ[0] == '#' && templ[1] == '\0')
2948           {
2949             rtx new_rtx = try_split (body, insn, 0);
2950
2951             /* If we didn't split the insn, go away.  */
2952             if (new_rtx == insn && PATTERN (new_rtx) == body)
2953               fatal_insn ("could not split insn", insn);
2954
2955             /* If we have a length attribute, this instruction should have
2956                been split in shorten_branches, to ensure that we would have
2957                valid length info for the splitees.  */
2958             gcc_assert (!HAVE_ATTR_length);
2959
2960             return new_rtx;
2961           }
2962
2963         /* ??? This will put the directives in the wrong place if
2964            get_insn_template outputs assembly directly.  However calling it
2965            before get_insn_template breaks if the insns is split.  */
2966         if (targetm.asm_out.unwind_emit_before_insn
2967             && targetm.asm_out.unwind_emit)
2968           targetm.asm_out.unwind_emit (asm_out_file, insn);
2969
2970         if (CALL_P (insn))
2971           {
2972             rtx x = call_from_call_insn (insn);
2973             x = XEXP (x, 0);
2974             if (x && MEM_P (x) && GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
2975               {
2976                 tree t;
2977                 x = XEXP (x, 0);
2978                 t = SYMBOL_REF_DECL (x);
2979                 if (t)
2980                   assemble_external (t);
2981               }
2982             if (!DECL_IGNORED_P (current_function_decl))
2983               debug_hooks->var_location (insn);
2984           }
2985
2986         /* Output assembler code from the template.  */
2987         output_asm_insn (templ, recog_data.operand);
2988
2989         /* Some target machines need to postscan each insn after
2990            it is output.  */
2991         if (targetm.asm_out.final_postscan_insn)
2992           targetm.asm_out.final_postscan_insn (file, insn, recog_data.operand,
2993                                                recog_data.n_operands);
2994
2995         if (!targetm.asm_out.unwind_emit_before_insn
2996             && targetm.asm_out.unwind_emit)
2997           targetm.asm_out.unwind_emit (asm_out_file, insn);
2998
2999         current_output_insn = debug_insn = 0;
3000       }
3001     }
3002   return NEXT_INSN (insn);
3003 }
3004
3005 /* Return discriminator of the statement that produced this insn.  */
3006 int
3007 insn_discriminator (const_rtx insn)
3008 {
3009   location_t loc = INSN_LOCATION (insn);
3010   if (!loc)
3011     return 0;
3012   return get_discriminator_from_locus (loc);
3013 }
3014
3015 \f
3016 /* Return whether a source line note needs to be emitted before INSN.
3017    Sets IS_STMT to TRUE if the line should be marked as a possible
3018    breakpoint location.  */
3019
3020 static bool
3021 notice_source_line (rtx insn, bool *is_stmt)
3022 {
3023   const char *filename;
3024   int linenum;
3025   int discriminator;
3026
3027   if (override_filename)
3028     {
3029       filename = override_filename;
3030       linenum = override_linenum;
3031       discriminator = override_discriminator;
3032     }
3033   else
3034     {
3035       filename = insn_file (insn);
3036       linenum = insn_line (insn);
3037       discriminator = insn_discriminator (insn);
3038     }
3039
3040   if (filename == NULL)
3041     return false;
3042
3043   if (force_source_line
3044       || filename != last_filename
3045       || last_linenum != linenum)
3046     {
3047       force_source_line = false;
3048       last_filename = filename;
3049       last_linenum = linenum;
3050       last_discriminator = discriminator;
3051       *is_stmt = true;
3052       high_block_linenum = MAX (last_linenum, high_block_linenum);
3053       high_function_linenum = MAX (last_linenum, high_function_linenum);
3054       return true;
3055     }
3056
3057   if (SUPPORTS_DISCRIMINATOR && last_discriminator != discriminator)
3058     {
3059       /* If the discriminator changed, but the line number did not,
3060          output the line table entry with is_stmt false so the
3061          debugger does not treat this as a breakpoint location.  */
3062       last_discriminator = discriminator;
3063       *is_stmt = false;
3064       return true;
3065     }
3066
3067   return false;
3068 }
3069 \f
3070 /* For each operand in INSN, simplify (subreg (reg)) so that it refers
3071    directly to the desired hard register.  */
3072
3073 void
3074 cleanup_subreg_operands (rtx insn)
3075 {
3076   int i;
3077   bool changed = false;
3078   extract_insn_cached (insn);
3079   for (i = 0; i < recog_data.n_operands; i++)
3080     {
3081       /* The following test cannot use recog_data.operand when testing
3082          for a SUBREG: the underlying object might have been changed
3083          already if we are inside a match_operator expression that
3084          matches the else clause.  Instead we test the underlying
3085          expression directly.  */
3086       if (GET_CODE (*recog_data.operand_loc[i]) == SUBREG)
3087         {
3088           recog_data.operand[i] = alter_subreg (recog_data.operand_loc[i], true);
3089           changed = true;
3090         }
3091       else if (GET_CODE (recog_data.operand[i]) == PLUS
3092                || GET_CODE (recog_data.operand[i]) == MULT
3093                || MEM_P (recog_data.operand[i]))
3094         recog_data.operand[i] = walk_alter_subreg (recog_data.operand_loc[i], &changed);
3095     }
3096
3097   for (i = 0; i < recog_data.n_dups; i++)
3098     {
3099       if (GET_CODE (*recog_data.dup_loc[i]) == SUBREG)
3100         {
3101           *recog_data.dup_loc[i] = alter_subreg (recog_data.dup_loc[i], true);
3102           changed = true;
3103         }
3104       else if (GET_CODE (*recog_data.dup_loc[i]) == PLUS
3105                || GET_CODE (*recog_data.dup_loc[i]) == MULT
3106                || MEM_P (*recog_data.dup_loc[i]))
3107         *recog_data.dup_loc[i] = walk_alter_subreg (recog_data.dup_loc[i], &changed);
3108     }
3109   if (changed)
3110     df_insn_rescan (insn);
3111 }
3112
3113 /* If X is a SUBREG, try to replace it with a REG or a MEM, based on
3114    the thing it is a subreg of.  Do it anyway if FINAL_P.  */
3115
3116 rtx
3117 alter_subreg (rtx *xp, bool final_p)
3118 {
3119   rtx x = *xp;
3120   rtx y = SUBREG_REG (x);
3121
3122   /* simplify_subreg does not remove subreg from volatile references.
3123      We are required to.  */
3124   if (MEM_P (y))
3125     {
3126       int offset = SUBREG_BYTE (x);
3127
3128       /* For paradoxical subregs on big-endian machines, SUBREG_BYTE
3129          contains 0 instead of the proper offset.  See simplify_subreg.  */
3130       if (offset == 0
3131           && GET_MODE_SIZE (GET_MODE (y)) < GET_MODE_SIZE (GET_MODE (x)))
3132         {
3133           int difference = GET_MODE_SIZE (GET_MODE (y))
3134                            - GET_MODE_SIZE (GET_MODE (x));
3135           if (WORDS_BIG_ENDIAN)
3136             offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
3137           if (BYTES_BIG_ENDIAN)
3138             offset += difference % UNITS_PER_WORD;
3139         }
3140
3141       if (final_p)
3142         *xp = adjust_address (y, GET_MODE (x), offset);
3143       else
3144         *xp = adjust_address_nv (y, GET_MODE (x), offset);
3145     }
3146   else
3147     {
3148       rtx new_rtx = simplify_subreg (GET_MODE (x), y, GET_MODE (y),
3149                                      SUBREG_BYTE (x));
3150
3151       if (new_rtx != 0)
3152         *xp = new_rtx;
3153       else if (final_p && REG_P (y))
3154         {
3155           /* Simplify_subreg can't handle some REG cases, but we have to.  */
3156           unsigned int regno;
3157           HOST_WIDE_INT offset;
3158
3159           regno = subreg_regno (x);
3160           if (subreg_lowpart_p (x))
3161             offset = byte_lowpart_offset (GET_MODE (x), GET_MODE (y));
3162           else
3163             offset = SUBREG_BYTE (x);
3164           *xp = gen_rtx_REG_offset (y, GET_MODE (x), regno, offset);
3165         }
3166     }
3167
3168   return *xp;
3169 }
3170
3171 /* Do alter_subreg on all the SUBREGs contained in X.  */
3172
3173 static rtx
3174 walk_alter_subreg (rtx *xp, bool *changed)
3175 {
3176   rtx x = *xp;
3177   switch (GET_CODE (x))
3178     {
3179     case PLUS:
3180     case MULT:
3181     case AND:
3182       XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0), changed);
3183       XEXP (x, 1) = walk_alter_subreg (&XEXP (x, 1), changed);
3184       break;
3185
3186     case MEM:
3187     case ZERO_EXTEND:
3188       XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0), changed);
3189       break;
3190
3191     case SUBREG:
3192       *changed = true;
3193       return alter_subreg (xp, true);
3194
3195     default:
3196       break;
3197     }
3198
3199   return *xp;
3200 }
3201 \f
3202 #ifdef HAVE_cc0
3203
3204 /* Given BODY, the body of a jump instruction, alter the jump condition
3205    as required by the bits that are set in cc_status.flags.
3206    Not all of the bits there can be handled at this level in all cases.
3207
3208    The value is normally 0.
3209    1 means that the condition has become always true.
3210    -1 means that the condition has become always false.
3211    2 means that COND has been altered.  */
3212
3213 static int
3214 alter_cond (rtx cond)
3215 {
3216   int value = 0;
3217
3218   if (cc_status.flags & CC_REVERSED)
3219     {
3220       value = 2;
3221       PUT_CODE (cond, swap_condition (GET_CODE (cond)));
3222     }
3223
3224   if (cc_status.flags & CC_INVERTED)
3225     {
3226       value = 2;
3227       PUT_CODE (cond, reverse_condition (GET_CODE (cond)));
3228     }
3229
3230   if (cc_status.flags & CC_NOT_POSITIVE)
3231     switch (GET_CODE (cond))
3232       {
3233       case LE:
3234       case LEU:
3235       case GEU:
3236         /* Jump becomes unconditional.  */
3237         return 1;
3238
3239       case GT:
3240       case GTU:
3241       case LTU:
3242         /* Jump becomes no-op.  */
3243         return -1;
3244
3245       case GE:
3246         PUT_CODE (cond, EQ);
3247         value = 2;
3248         break;
3249
3250       case LT:
3251         PUT_CODE (cond, NE);
3252         value = 2;
3253         break;
3254
3255       default:
3256         break;
3257       }
3258
3259   if (cc_status.flags & CC_NOT_NEGATIVE)
3260     switch (GET_CODE (cond))
3261       {
3262       case GE:
3263       case GEU:
3264         /* Jump becomes unconditional.  */
3265         return 1;
3266
3267       case LT:
3268       case LTU:
3269         /* Jump becomes no-op.  */
3270         return -1;
3271
3272       case LE:
3273       case LEU:
3274         PUT_CODE (cond, EQ);
3275         value = 2;
3276         break;
3277
3278       case GT:
3279       case GTU:
3280         PUT_CODE (cond, NE);
3281         value = 2;
3282         break;
3283
3284       default:
3285         break;
3286       }
3287
3288   if (cc_status.flags & CC_NO_OVERFLOW)
3289     switch (GET_CODE (cond))
3290       {
3291       case GEU:
3292         /* Jump becomes unconditional.  */
3293         return 1;
3294
3295       case LEU:
3296         PUT_CODE (cond, EQ);
3297         value = 2;
3298         break;
3299
3300       case GTU:
3301         PUT_CODE (cond, NE);
3302         value = 2;
3303         break;
3304
3305       case LTU:
3306         /* Jump becomes no-op.  */
3307         return -1;
3308
3309       default:
3310         break;
3311       }
3312
3313   if (cc_status.flags & (CC_Z_IN_NOT_N | CC_Z_IN_N))
3314     switch (GET_CODE (cond))
3315       {
3316       default:
3317         gcc_unreachable ();
3318
3319       case NE:
3320         PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? GE : LT);
3321         value = 2;
3322         break;
3323
3324       case EQ:
3325         PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? LT : GE);
3326         value = 2;
3327         break;
3328       }
3329
3330   if (cc_status.flags & CC_NOT_SIGNED)
3331     /* The flags are valid if signed condition operators are converted
3332        to unsigned.  */
3333     switch (GET_CODE (cond))
3334       {
3335       case LE:
3336         PUT_CODE (cond, LEU);
3337         value = 2;
3338         break;
3339
3340       case LT:
3341         PUT_CODE (cond, LTU);
3342         value = 2;
3343         break;
3344
3345       case GT:
3346         PUT_CODE (cond, GTU);
3347         value = 2;
3348         break;
3349
3350       case GE:
3351         PUT_CODE (cond, GEU);
3352         value = 2;
3353         break;
3354
3355       default:
3356         break;
3357       }
3358
3359   return value;
3360 }
3361 #endif
3362 \f
3363 /* Report inconsistency between the assembler template and the operands.
3364    In an `asm', it's the user's fault; otherwise, the compiler's fault.  */
3365
3366 void
3367 output_operand_lossage (const char *cmsgid, ...)
3368 {
3369   char *fmt_string;
3370   char *new_message;
3371   const char *pfx_str;
3372   va_list ap;
3373
3374   va_start (ap, cmsgid);
3375
3376   pfx_str = this_is_asm_operands ? _("invalid 'asm': ") : "output_operand: ";
3377   asprintf (&fmt_string, "%s%s", pfx_str, _(cmsgid));
3378   vasprintf (&new_message, fmt_string, ap);
3379
3380   if (this_is_asm_operands)
3381     error_for_asm (this_is_asm_operands, "%s", new_message);
3382   else
3383     internal_error ("%s", new_message);
3384
3385   free (fmt_string);
3386   free (new_message);
3387   va_end (ap);
3388 }
3389 \f
3390 /* Output of assembler code from a template, and its subroutines.  */
3391
3392 /* Annotate the assembly with a comment describing the pattern and
3393    alternative used.  */
3394
3395 static void
3396 output_asm_name (void)
3397 {
3398   if (debug_insn)
3399     {
3400       int num = INSN_CODE (debug_insn);
3401       fprintf (asm_out_file, "\t%s %d\t%s",
3402                ASM_COMMENT_START, INSN_UID (debug_insn),
3403                insn_data[num].name);
3404       if (insn_data[num].n_alternatives > 1)
3405         fprintf (asm_out_file, "/%d", which_alternative + 1);
3406
3407       if (HAVE_ATTR_length)
3408         fprintf (asm_out_file, "\t[length = %d]",
3409                  get_attr_length (debug_insn));
3410
3411       /* Clear this so only the first assembler insn
3412          of any rtl insn will get the special comment for -dp.  */
3413       debug_insn = 0;
3414     }
3415 }
3416
3417 /* If OP is a REG or MEM and we can find a MEM_EXPR corresponding to it
3418    or its address, return that expr .  Set *PADDRESSP to 1 if the expr
3419    corresponds to the address of the object and 0 if to the object.  */
3420
3421 static tree
3422 get_mem_expr_from_op (rtx op, int *paddressp)
3423 {
3424   tree expr;
3425   int inner_addressp;
3426
3427   *paddressp = 0;
3428
3429   if (REG_P (op))
3430     return REG_EXPR (op);
3431   else if (!MEM_P (op))
3432     return 0;
3433
3434   if (MEM_EXPR (op) != 0)
3435     return MEM_EXPR (op);
3436
3437   /* Otherwise we have an address, so indicate it and look at the address.  */
3438   *paddressp = 1;
3439   op = XEXP (op, 0);
3440
3441   /* First check if we have a decl for the address, then look at the right side
3442      if it is a PLUS.  Otherwise, strip off arithmetic and keep looking.
3443      But don't allow the address to itself be indirect.  */
3444   if ((expr = get_mem_expr_from_op (op, &inner_addressp)) && ! inner_addressp)
3445     return expr;
3446   else if (GET_CODE (op) == PLUS
3447            && (expr = get_mem_expr_from_op (XEXP (op, 1), &inner_addressp)))
3448     return expr;
3449
3450   while (UNARY_P (op)
3451          || GET_RTX_CLASS (GET_CODE (op)) == RTX_BIN_ARITH)
3452     op = XEXP (op, 0);
3453
3454   expr = get_mem_expr_from_op (op, &inner_addressp);
3455   return inner_addressp ? 0 : expr;
3456 }
3457
3458 /* Output operand names for assembler instructions.  OPERANDS is the
3459    operand vector, OPORDER is the order to write the operands, and NOPS
3460    is the number of operands to write.  */
3461
3462 static void
3463 output_asm_operand_names (rtx *operands, int *oporder, int nops)
3464 {
3465   int wrote = 0;
3466   int i;
3467
3468   for (i = 0; i < nops; i++)
3469     {
3470       int addressp;
3471       rtx op = operands[oporder[i]];
3472       tree expr = get_mem_expr_from_op (op, &addressp);
3473
3474       fprintf (asm_out_file, "%c%s",
3475                wrote ? ',' : '\t', wrote ? "" : ASM_COMMENT_START);
3476       wrote = 1;
3477       if (expr)
3478         {
3479           fprintf (asm_out_file, "%s",
3480                    addressp ? "*" : "");
3481           print_mem_expr (asm_out_file, expr);
3482           wrote = 1;
3483         }
3484       else if (REG_P (op) && ORIGINAL_REGNO (op)
3485                && ORIGINAL_REGNO (op) != REGNO (op))
3486         fprintf (asm_out_file, " tmp%i", ORIGINAL_REGNO (op));
3487     }
3488 }
3489
3490 #ifdef ASSEMBLER_DIALECT
3491 /* Helper function to parse assembler dialects in the asm string.
3492    This is called from output_asm_insn and asm_fprintf.  */
3493 static const char *
3494 do_assembler_dialects (const char *p, int *dialect)
3495 {
3496   char c = *(p - 1);
3497
3498   switch (c)
3499     {
3500     case '{':
3501       {
3502         int i;
3503
3504         if (*dialect)
3505           output_operand_lossage ("nested assembly dialect alternatives");
3506         else
3507           *dialect = 1;
3508
3509         /* If we want the first dialect, do nothing.  Otherwise, skip
3510            DIALECT_NUMBER of strings ending with '|'.  */
3511         for (i = 0; i < dialect_number; i++)
3512           {
3513             while (*p && *p != '}')
3514               {
3515                 if (*p == '|')
3516                   {
3517                     p++;
3518                     break;
3519                   }
3520
3521                 /* Skip over any character after a percent sign.  */
3522                 if (*p == '%')
3523                   p++;
3524                 if (*p)
3525                   p++;
3526               }
3527
3528             if (*p == '}')
3529               break;
3530           }
3531
3532         if (*p == '\0')
3533           output_operand_lossage ("unterminated assembly dialect alternative");
3534       }
3535       break;
3536
3537     case '|':
3538       if (*dialect)
3539         {
3540           /* Skip to close brace.  */
3541           do
3542             {
3543               if (*p == '\0')
3544                 {
3545                   output_operand_lossage ("unterminated assembly dialect alternative");
3546                   break;
3547                 }
3548
3549               /* Skip over any character after a percent sign.  */
3550               if (*p == '%' && p[1])
3551                 {
3552                   p += 2;
3553                   continue;
3554                 }
3555
3556               if (*p++ == '}')
3557                 break;
3558             }
3559           while (1);
3560
3561           *dialect = 0;
3562         }
3563       else
3564         putc (c, asm_out_file);
3565       break;
3566
3567     case '}':
3568       if (! *dialect)
3569         putc (c, asm_out_file);
3570       *dialect = 0;
3571       break;
3572     default:
3573       gcc_unreachable ();
3574     }
3575
3576   return p;
3577 }
3578 #endif
3579
3580 /* Output text from TEMPLATE to the assembler output file,
3581    obeying %-directions to substitute operands taken from
3582    the vector OPERANDS.
3583
3584    %N (for N a digit) means print operand N in usual manner.
3585    %lN means require operand N to be a CODE_LABEL or LABEL_REF
3586       and print the label name with no punctuation.
3587    %cN means require operand N to be a constant
3588       and print the constant expression with no punctuation.
3589    %aN means expect operand N to be a memory address
3590       (not a memory reference!) and print a reference
3591       to that address.
3592    %nN means expect operand N to be a constant
3593       and print a constant expression for minus the value
3594       of the operand, with no other punctuation.  */
3595
3596 void
3597 output_asm_insn (const char *templ, rtx *operands)
3598 {
3599   const char *p;
3600   int c;
3601 #ifdef ASSEMBLER_DIALECT
3602   int dialect = 0;
3603 #endif
3604   int oporder[MAX_RECOG_OPERANDS];
3605   char opoutput[MAX_RECOG_OPERANDS];
3606   int ops = 0;
3607
3608   /* An insn may return a null string template
3609      in a case where no assembler code is needed.  */
3610   if (*templ == 0)
3611     return;
3612
3613   memset (opoutput, 0, sizeof opoutput);
3614   p = templ;
3615   putc ('\t', asm_out_file);
3616
3617 #ifdef ASM_OUTPUT_OPCODE
3618   ASM_OUTPUT_OPCODE (asm_out_file, p);
3619 #endif
3620
3621   while ((c = *p++))
3622     switch (c)
3623       {
3624       case '\n':
3625         if (flag_verbose_asm)
3626           output_asm_operand_names (operands, oporder, ops);
3627         if (flag_print_asm_name)
3628           output_asm_name ();
3629
3630         ops = 0;
3631         memset (opoutput, 0, sizeof opoutput);
3632
3633         putc (c, asm_out_file);
3634 #ifdef ASM_OUTPUT_OPCODE
3635         while ((c = *p) == '\t')
3636           {
3637             putc (c, asm_out_file);
3638             p++;
3639           }
3640         ASM_OUTPUT_OPCODE (asm_out_file, p);
3641 #endif
3642         break;
3643
3644 #ifdef ASSEMBLER_DIALECT
3645       case '{':
3646       case '}':
3647       case '|':
3648         p = do_assembler_dialects (p, &dialect);
3649         break;
3650 #endif
3651
3652       case '%':
3653         /* %% outputs a single %.  %{, %} and %| print {, } and | respectively
3654            if ASSEMBLER_DIALECT defined and these characters have a special
3655            meaning as dialect delimiters.*/
3656         if (*p == '%'
3657 #ifdef ASSEMBLER_DIALECT
3658             || *p == '{' || *p == '}' || *p == '|'
3659 #endif
3660             )
3661           {
3662             putc (*p, asm_out_file);
3663             p++;
3664           }
3665         /* %= outputs a number which is unique to each insn in the entire
3666            compilation.  This is useful for making local labels that are
3667            referred to more than once in a given insn.  */
3668         else if (*p == '=')
3669           {
3670             p++;
3671             fprintf (asm_out_file, "%d", insn_counter);
3672           }
3673         /* % followed by a letter and some digits
3674            outputs an operand in a special way depending on the letter.
3675            Letters `acln' are implemented directly.
3676            Other letters are passed to `output_operand' so that
3677            the TARGET_PRINT_OPERAND hook can define them.  */
3678         else if (ISALPHA (*p))
3679           {
3680             int letter = *p++;
3681             unsigned long opnum;
3682             char *endptr;
3683
3684             opnum = strtoul (p, &endptr, 10);
3685
3686             if (endptr == p)
3687               output_operand_lossage ("operand number missing "
3688                                       "after %%-letter");
3689             else if (this_is_asm_operands && opnum >= insn_noperands)
3690               output_operand_lossage ("operand number out of range");
3691             else if (letter == 'l')
3692               output_asm_label (operands[opnum]);
3693             else if (letter == 'a')
3694               output_address (operands[opnum]);
3695             else if (letter == 'c')
3696               {
3697                 if (CONSTANT_ADDRESS_P (operands[opnum]))
3698                   output_addr_const (asm_out_file, operands[opnum]);
3699                 else
3700                   output_operand (operands[opnum], 'c');
3701               }
3702             else if (letter == 'n')
3703               {
3704                 if (CONST_INT_P (operands[opnum]))
3705                   fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC,
3706                            - INTVAL (operands[opnum]));
3707                 else
3708                   {
3709                     putc ('-', asm_out_file);
3710                     output_addr_const (asm_out_file, operands[opnum]);
3711                   }
3712               }
3713             else
3714               output_operand (operands[opnum], letter);
3715
3716             if (!opoutput[opnum])
3717               oporder[ops++] = opnum;
3718             opoutput[opnum] = 1;
3719
3720             p = endptr;
3721             c = *p;
3722           }
3723         /* % followed by a digit outputs an operand the default way.  */
3724         else if (ISDIGIT (*p))
3725           {
3726             unsigned long opnum;
3727             char *endptr;
3728
3729             opnum = strtoul (p, &endptr, 10);
3730             if (this_is_asm_operands && opnum >= insn_noperands)
3731               output_operand_lossage ("operand number out of range");
3732             else
3733               output_operand (operands[opnum], 0);
3734
3735             if (!opoutput[opnum])
3736               oporder[ops++] = opnum;
3737             opoutput[opnum] = 1;
3738
3739             p = endptr;
3740             c = *p;
3741           }
3742         /* % followed by punctuation: output something for that
3743            punctuation character alone, with no operand.  The
3744            TARGET_PRINT_OPERAND hook decides what is actually done.  */
3745         else if (targetm.asm_out.print_operand_punct_valid_p ((unsigned char) *p))
3746           output_operand (NULL_RTX, *p++);
3747         else
3748           output_operand_lossage ("invalid %%-code");
3749         break;
3750
3751       default:
3752         putc (c, asm_out_file);
3753       }
3754
3755   /* Write out the variable names for operands, if we know them.  */
3756   if (flag_verbose_asm)
3757     output_asm_operand_names (operands, oporder, ops);
3758   if (flag_print_asm_name)
3759     output_asm_name ();
3760
3761   putc ('\n', asm_out_file);
3762 }
3763 \f
3764 /* Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol.  */
3765
3766 void
3767 output_asm_label (rtx x)
3768 {
3769   char buf[256];
3770
3771   if (GET_CODE (x) == LABEL_REF)
3772     x = XEXP (x, 0);
3773   if (LABEL_P (x)
3774       || (NOTE_P (x)
3775           && NOTE_KIND (x) == NOTE_INSN_DELETED_LABEL))
3776     ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3777   else
3778     output_operand_lossage ("'%%l' operand isn't a label");
3779
3780   assemble_name (asm_out_file, buf);
3781 }
3782
3783 /* Helper rtx-iteration-function for mark_symbol_refs_as_used and
3784    output_operand.  Marks SYMBOL_REFs as referenced through use of
3785    assemble_external.  */
3786
3787 static int
3788 mark_symbol_ref_as_used (rtx *xp, void *dummy ATTRIBUTE_UNUSED)
3789 {
3790   rtx x = *xp;
3791
3792   /* If we have a used symbol, we may have to emit assembly
3793      annotations corresponding to whether the symbol is external, weak
3794      or has non-default visibility.  */
3795   if (GET_CODE (x) == SYMBOL_REF)
3796     {
3797       tree t;
3798
3799       t = SYMBOL_REF_DECL (x);
3800       if (t)
3801         assemble_external (t);
3802
3803       return -1;
3804     }
3805
3806   return 0;
3807 }
3808
3809 /* Marks SYMBOL_REFs in x as referenced through use of assemble_external.  */
3810
3811 void
3812 mark_symbol_refs_as_used (rtx x)
3813 {
3814   for_each_rtx (&x, mark_symbol_ref_as_used, NULL);
3815 }
3816
3817 /* Print operand X using machine-dependent assembler syntax.
3818    CODE is a non-digit that preceded the operand-number in the % spec,
3819    such as 'z' if the spec was `%z3'.  CODE is 0 if there was no char
3820    between the % and the digits.
3821    When CODE is a non-letter, X is 0.
3822
3823    The meanings of the letters are machine-dependent and controlled
3824    by TARGET_PRINT_OPERAND.  */
3825
3826 void
3827 output_operand (rtx x, int code ATTRIBUTE_UNUSED)
3828 {
3829   if (x && GET_CODE (x) == SUBREG)
3830     x = alter_subreg (&x, true);
3831
3832   /* X must not be a pseudo reg.  */
3833   gcc_assert (!x || !REG_P (x) || REGNO (x) < FIRST_PSEUDO_REGISTER);
3834
3835   targetm.asm_out.print_operand (asm_out_file, x, code);
3836
3837   if (x == NULL_RTX)
3838     return;
3839
3840   for_each_rtx (&x, mark_symbol_ref_as_used, NULL);
3841 }
3842
3843 /* Print a memory reference operand for address X using
3844    machine-dependent assembler syntax.  */
3845
3846 void
3847 output_address (rtx x)
3848 {
3849   bool changed = false;
3850   walk_alter_subreg (&x, &changed);
3851   targetm.asm_out.print_operand_address (asm_out_file, x);
3852 }
3853 \f
3854 /* Print an integer constant expression in assembler syntax.
3855    Addition and subtraction are the only arithmetic
3856    that may appear in these expressions.  */
3857
3858 void
3859 output_addr_const (FILE *file, rtx x)
3860 {
3861   char buf[256];
3862
3863  restart:
3864   switch (GET_CODE (x))
3865     {
3866     case PC:
3867       putc ('.', file);
3868       break;
3869
3870     case SYMBOL_REF:
3871       if (SYMBOL_REF_DECL (x))
3872         assemble_external (SYMBOL_REF_DECL (x));
3873 #ifdef ASM_OUTPUT_SYMBOL_REF
3874       ASM_OUTPUT_SYMBOL_REF (file, x);
3875 #else
3876       assemble_name (file, XSTR (x, 0));
3877 #endif
3878       break;
3879
3880     case LABEL_REF:
3881       x = XEXP (x, 0);
3882       /* Fall through.  */
3883     case CODE_LABEL:
3884       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3885 #ifdef ASM_OUTPUT_LABEL_REF
3886       ASM_OUTPUT_LABEL_REF (file, buf);
3887 #else
3888       assemble_name (file, buf);
3889 #endif
3890       break;
3891
3892     case CONST_INT:
3893       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
3894       break;
3895
3896     case CONST:
3897       /* This used to output parentheses around the expression,
3898          but that does not work on the 386 (either ATT or BSD assembler).  */
3899       output_addr_const (file, XEXP (x, 0));
3900       break;
3901
3902     case CONST_DOUBLE:
3903       if (GET_MODE (x) == VOIDmode)
3904         {
3905           /* We can use %d if the number is one word and positive.  */
3906           if (CONST_DOUBLE_HIGH (x))
3907             fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
3908                      (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (x),
3909                      (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (x));
3910           else if (CONST_DOUBLE_LOW (x) < 0)
3911             fprintf (file, HOST_WIDE_INT_PRINT_HEX,
3912                      (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (x));
3913           else
3914             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
3915         }
3916       else
3917         /* We can't handle floating point constants;
3918            PRINT_OPERAND must handle them.  */
3919         output_operand_lossage ("floating constant misused");
3920       break;
3921
3922     case CONST_FIXED:
3923       fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_FIXED_VALUE_LOW (x));
3924       break;
3925
3926     case PLUS:
3927       /* Some assemblers need integer constants to appear last (eg masm).  */
3928       if (CONST_INT_P (XEXP (x, 0)))
3929         {
3930           output_addr_const (file, XEXP (x, 1));
3931           if (INTVAL (XEXP (x, 0)) >= 0)
3932             fprintf (file, "+");
3933           output_addr_const (file, XEXP (x, 0));
3934         }
3935       else
3936         {
3937           output_addr_const (file, XEXP (x, 0));
3938           if (!CONST_INT_P (XEXP (x, 1))
3939               || INTVAL (XEXP (x, 1)) >= 0)
3940             fprintf (file, "+");
3941           output_addr_const (file, XEXP (x, 1));
3942         }
3943       break;
3944
3945     case MINUS:
3946       /* Avoid outputting things like x-x or x+5-x,
3947          since some assemblers can't handle that.  */
3948       x = simplify_subtraction (x);
3949       if (GET_CODE (x) != MINUS)
3950         goto restart;
3951
3952       output_addr_const (file, XEXP (x, 0));
3953       fprintf (file, "-");
3954       if ((CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) >= 0)
3955           || GET_CODE (XEXP (x, 1)) == PC
3956           || GET_CODE (XEXP (x, 1)) == SYMBOL_REF)
3957         output_addr_const (file, XEXP (x, 1));
3958       else
3959         {
3960           fputs (targetm.asm_out.open_paren, file);
3961           output_addr_const (file, XEXP (x, 1));
3962           fputs (targetm.asm_out.close_paren, file);
3963         }
3964       break;
3965
3966     case ZERO_EXTEND:
3967     case SIGN_EXTEND:
3968     case SUBREG:
3969     case TRUNCATE:
3970       output_addr_const (file, XEXP (x, 0));
3971       break;
3972
3973     default:
3974       if (targetm.asm_out.output_addr_const_extra (file, x))
3975         break;
3976
3977       output_operand_lossage ("invalid expression as operand");
3978     }
3979 }
3980 \f
3981 /* Output a quoted string.  */
3982
3983 void
3984 output_quoted_string (FILE *asm_file, const char *string)
3985 {
3986 #ifdef OUTPUT_QUOTED_STRING
3987   OUTPUT_QUOTED_STRING (asm_file, string);
3988 #else
3989   char c;
3990
3991   putc ('\"', asm_file);
3992   while ((c = *string++) != 0)
3993     {
3994       if (ISPRINT (c))
3995         {
3996           if (c == '\"' || c == '\\')
3997             putc ('\\', asm_file);
3998           putc (c, asm_file);
3999         }
4000       else
4001         fprintf (asm_file, "\\%03o", (unsigned char) c);
4002     }
4003   putc ('\"', asm_file);
4004 #endif
4005 }
4006 \f
4007 /* Write a HOST_WIDE_INT number in hex form 0x1234, fast. */
4008
4009 void
4010 fprint_whex (FILE *f, unsigned HOST_WIDE_INT value)
4011 {
4012   char buf[2 + CHAR_BIT * sizeof (value) / 4];
4013   if (value == 0)
4014     putc ('0', f);
4015   else
4016     {
4017       char *p = buf + sizeof (buf);
4018       do
4019         *--p = "0123456789abcdef"[value % 16];
4020       while ((value /= 16) != 0);
4021       *--p = 'x';
4022       *--p = '0';
4023       fwrite (p, 1, buf + sizeof (buf) - p, f);
4024     }
4025 }
4026
4027 /* Internal function that prints an unsigned long in decimal in reverse.
4028    The output string IS NOT null-terminated. */
4029
4030 static int
4031 sprint_ul_rev (char *s, unsigned long value)
4032 {
4033   int i = 0;
4034   do
4035     {
4036       s[i] = "0123456789"[value % 10];
4037       value /= 10;
4038       i++;
4039       /* alternate version, without modulo */
4040       /* oldval = value; */
4041       /* value /= 10; */
4042       /* s[i] = "0123456789" [oldval - 10*value]; */
4043       /* i++ */
4044     }
4045   while (value != 0);
4046   return i;
4047 }
4048
4049 /* Write an unsigned long as decimal to a file, fast. */
4050
4051 void
4052 fprint_ul (FILE *f, unsigned long value)
4053 {
4054   /* python says: len(str(2**64)) == 20 */
4055   char s[20];
4056   int i;
4057
4058   i = sprint_ul_rev (s, value);
4059
4060   /* It's probably too small to bother with string reversal and fputs. */
4061   do
4062     {
4063       i--;
4064       putc (s[i], f);
4065     }
4066   while (i != 0);
4067 }
4068
4069 /* Write an unsigned long as decimal to a string, fast.
4070    s must be wide enough to not overflow, at least 21 chars.
4071    Returns the length of the string (without terminating '\0'). */
4072
4073 int
4074 sprint_ul (char *s, unsigned long value)
4075 {
4076   int len;
4077   char tmp_c;
4078   int i;
4079   int j;
4080
4081   len = sprint_ul_rev (s, value);
4082   s[len] = '\0';
4083
4084   /* Reverse the string. */
4085   i = 0;
4086   j = len - 1;
4087   while (i < j)
4088     {
4089       tmp_c = s[i];
4090       s[i] = s[j];
4091       s[j] = tmp_c;
4092       i++; j--;
4093     }
4094
4095   return len;
4096 }
4097
4098 /* A poor man's fprintf, with the added features of %I, %R, %L, and %U.
4099    %R prints the value of REGISTER_PREFIX.
4100    %L prints the value of LOCAL_LABEL_PREFIX.
4101    %U prints the value of USER_LABEL_PREFIX.
4102    %I prints the value of IMMEDIATE_PREFIX.
4103    %O runs ASM_OUTPUT_OPCODE to transform what follows in the string.
4104    Also supported are %d, %i, %u, %x, %X, %o, %c, %s and %%.
4105
4106    We handle alternate assembler dialects here, just like output_asm_insn.  */
4107
4108 void
4109 asm_fprintf (FILE *file, const char *p, ...)
4110 {
4111   char buf[10];
4112   char *q, c;
4113 #ifdef ASSEMBLER_DIALECT
4114   int dialect = 0;
4115 #endif
4116   va_list argptr;
4117
4118   va_start (argptr, p);
4119
4120   buf[0] = '%';
4121
4122   while ((c = *p++))
4123     switch (c)
4124       {
4125 #ifdef ASSEMBLER_DIALECT
4126       case '{':
4127       case '}':
4128       case '|':
4129         p = do_assembler_dialects (p, &dialect);
4130         break;
4131 #endif
4132
4133       case '%':
4134         c = *p++;
4135         q = &buf[1];
4136         while (strchr ("-+ #0", c))
4137           {
4138             *q++ = c;
4139             c = *p++;
4140           }
4141         while (ISDIGIT (c) || c == '.')
4142           {
4143             *q++ = c;
4144             c = *p++;
4145           }
4146         switch (c)
4147           {
4148           case '%':
4149             putc ('%', file);
4150             break;
4151
4152           case 'd':  case 'i':  case 'u':
4153           case 'x':  case 'X':  case 'o':
4154           case 'c':
4155             *q++ = c;
4156             *q = 0;
4157             fprintf (file, buf, va_arg (argptr, int));
4158             break;
4159
4160           case 'w':
4161             /* This is a prefix to the 'd', 'i', 'u', 'x', 'X', and
4162                'o' cases, but we do not check for those cases.  It
4163                means that the value is a HOST_WIDE_INT, which may be
4164                either `long' or `long long'.  */
4165             memcpy (q, HOST_WIDE_INT_PRINT, strlen (HOST_WIDE_INT_PRINT));
4166             q += strlen (HOST_WIDE_INT_PRINT);
4167             *q++ = *p++;
4168             *q = 0;
4169             fprintf (file, buf, va_arg (argptr, HOST_WIDE_INT));
4170             break;
4171
4172           case 'l':
4173             *q++ = c;
4174 #ifdef HAVE_LONG_LONG
4175             if (*p == 'l')
4176               {
4177                 *q++ = *p++;
4178                 *q++ = *p++;
4179                 *q = 0;
4180                 fprintf (file, buf, va_arg (argptr, long long));
4181               }
4182             else
4183 #endif
4184               {
4185                 *q++ = *p++;
4186                 *q = 0;
4187                 fprintf (file, buf, va_arg (argptr, long));
4188               }
4189
4190             break;
4191
4192           case 's':
4193             *q++ = c;
4194             *q = 0;
4195             fprintf (file, buf, va_arg (argptr, char *));
4196             break;
4197
4198           case 'O':
4199 #ifdef ASM_OUTPUT_OPCODE
4200             ASM_OUTPUT_OPCODE (asm_out_file, p);
4201 #endif
4202             break;
4203
4204           case 'R':
4205 #ifdef REGISTER_PREFIX
4206             fprintf (file, "%s", REGISTER_PREFIX);
4207 #endif
4208             break;
4209
4210           case 'I':
4211 #ifdef IMMEDIATE_PREFIX
4212             fprintf (file, "%s", IMMEDIATE_PREFIX);
4213 #endif
4214             break;
4215
4216           case 'L':
4217 #ifdef LOCAL_LABEL_PREFIX
4218             fprintf (file, "%s", LOCAL_LABEL_PREFIX);
4219 #endif
4220             break;
4221
4222           case 'U':
4223             fputs (user_label_prefix, file);
4224             break;
4225
4226 #ifdef ASM_FPRINTF_EXTENSIONS
4227             /* Uppercase letters are reserved for general use by asm_fprintf
4228                and so are not available to target specific code.  In order to
4229                prevent the ASM_FPRINTF_EXTENSIONS macro from using them then,
4230                they are defined here.  As they get turned into real extensions
4231                to asm_fprintf they should be removed from this list.  */
4232           case 'A': case 'B': case 'C': case 'D': case 'E':
4233           case 'F': case 'G': case 'H': case 'J': case 'K':
4234           case 'M': case 'N': case 'P': case 'Q': case 'S':
4235           case 'T': case 'V': case 'W': case 'Y': case 'Z':
4236             break;
4237
4238           ASM_FPRINTF_EXTENSIONS (file, argptr, p)
4239 #endif
4240           default:
4241             gcc_unreachable ();
4242           }
4243         break;
4244
4245       default:
4246         putc (c, file);
4247       }
4248   va_end (argptr);
4249 }
4250 \f
4251 /* Return nonzero if this function has no function calls.  */
4252
4253 int
4254 leaf_function_p (void)
4255 {
4256   rtx insn;
4257
4258   if (crtl->profile || profile_arc_flag)
4259     return 0;
4260
4261   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4262     {
4263       if (CALL_P (insn)
4264           && ! SIBLING_CALL_P (insn))
4265         return 0;
4266       if (NONJUMP_INSN_P (insn)
4267           && GET_CODE (PATTERN (insn)) == SEQUENCE
4268           && CALL_P (XVECEXP (PATTERN (insn), 0, 0))
4269           && ! SIBLING_CALL_P (XVECEXP (PATTERN (insn), 0, 0)))
4270         return 0;
4271     }
4272
4273   return 1;
4274 }
4275
4276 /* Return 1 if branch is a forward branch.
4277    Uses insn_shuid array, so it works only in the final pass.  May be used by
4278    output templates to customary add branch prediction hints.
4279  */
4280 int
4281 final_forward_branch_p (rtx insn)
4282 {
4283   int insn_id, label_id;
4284
4285   gcc_assert (uid_shuid);
4286   insn_id = INSN_SHUID (insn);
4287   label_id = INSN_SHUID (JUMP_LABEL (insn));
4288   /* We've hit some insns that does not have id information available.  */
4289   gcc_assert (insn_id && label_id);
4290   return insn_id < label_id;
4291 }
4292
4293 /* On some machines, a function with no call insns
4294    can run faster if it doesn't create its own register window.
4295    When output, the leaf function should use only the "output"
4296    registers.  Ordinarily, the function would be compiled to use
4297    the "input" registers to find its arguments; it is a candidate
4298    for leaf treatment if it uses only the "input" registers.
4299    Leaf function treatment means renumbering so the function
4300    uses the "output" registers instead.  */
4301
4302 #ifdef LEAF_REGISTERS
4303
4304 /* Return 1 if this function uses only the registers that can be
4305    safely renumbered.  */
4306
4307 int
4308 only_leaf_regs_used (void)
4309 {
4310   int i;
4311   const char *const permitted_reg_in_leaf_functions = LEAF_REGISTERS;
4312
4313   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4314     if ((df_regs_ever_live_p (i) || global_regs[i])
4315         && ! permitted_reg_in_leaf_functions[i])
4316       return 0;
4317
4318   if (crtl->uses_pic_offset_table
4319       && pic_offset_table_rtx != 0
4320       && REG_P (pic_offset_table_rtx)
4321       && ! permitted_reg_in_leaf_functions[REGNO (pic_offset_table_rtx)])
4322     return 0;
4323
4324   return 1;
4325 }
4326
4327 /* Scan all instructions and renumber all registers into those
4328    available in leaf functions.  */
4329
4330 static void
4331 leaf_renumber_regs (rtx first)
4332 {
4333   rtx insn;
4334
4335   /* Renumber only the actual patterns.
4336      The reg-notes can contain frame pointer refs,
4337      and renumbering them could crash, and should not be needed.  */
4338   for (insn = first; insn; insn = NEXT_INSN (insn))
4339     if (INSN_P (insn))
4340       leaf_renumber_regs_insn (PATTERN (insn));
4341 }
4342
4343 /* Scan IN_RTX and its subexpressions, and renumber all regs into those
4344    available in leaf functions.  */
4345
4346 void
4347 leaf_renumber_regs_insn (rtx in_rtx)
4348 {
4349   int i, j;
4350   const char *format_ptr;
4351
4352   if (in_rtx == 0)
4353     return;
4354
4355   /* Renumber all input-registers into output-registers.
4356      renumbered_regs would be 1 for an output-register;
4357      they  */
4358
4359   if (REG_P (in_rtx))
4360     {
4361       int newreg;
4362
4363       /* Don't renumber the same reg twice.  */
4364       if (in_rtx->used)
4365         return;
4366
4367       newreg = REGNO (in_rtx);
4368       /* Don't try to renumber pseudo regs.  It is possible for a pseudo reg
4369          to reach here as part of a REG_NOTE.  */
4370       if (newreg >= FIRST_PSEUDO_REGISTER)
4371         {
4372           in_rtx->used = 1;
4373           return;
4374         }
4375       newreg = LEAF_REG_REMAP (newreg);
4376       gcc_assert (newreg >= 0);
4377       df_set_regs_ever_live (REGNO (in_rtx), false);
4378       df_set_regs_ever_live (newreg, true);
4379       SET_REGNO (in_rtx, newreg);
4380       in_rtx->used = 1;
4381     }
4382
4383   if (INSN_P (in_rtx))
4384     {
4385       /* Inside a SEQUENCE, we find insns.
4386          Renumber just the patterns of these insns,
4387          just as we do for the top-level insns.  */
4388       leaf_renumber_regs_insn (PATTERN (in_rtx));
4389       return;
4390     }
4391
4392   format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
4393
4394   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
4395     switch (*format_ptr++)
4396       {
4397       case 'e':
4398         leaf_renumber_regs_insn (XEXP (in_rtx, i));
4399         break;
4400
4401       case 'E':
4402         if (NULL != XVEC (in_rtx, i))
4403           {
4404             for (j = 0; j < XVECLEN (in_rtx, i); j++)
4405               leaf_renumber_regs_insn (XVECEXP (in_rtx, i, j));
4406           }
4407         break;
4408
4409       case 'S':
4410       case 's':
4411       case '0':
4412       case 'i':
4413       case 'w':
4414       case 'n':
4415       case 'u':
4416         break;
4417
4418       default:
4419         gcc_unreachable ();
4420       }
4421 }
4422 #endif
4423 \f
4424 /* Turn the RTL into assembly.  */
4425 static unsigned int
4426 rest_of_handle_final (void)
4427 {
4428   rtx x;
4429   const char *fnname;
4430
4431   /* Get the function's name, as described by its RTL.  This may be
4432      different from the DECL_NAME name used in the source file.  */
4433
4434   x = DECL_RTL (current_function_decl);
4435   gcc_assert (MEM_P (x));
4436   x = XEXP (x, 0);
4437   gcc_assert (GET_CODE (x) == SYMBOL_REF);
4438   fnname = XSTR (x, 0);
4439
4440   assemble_start_function (current_function_decl, fnname);
4441   final_start_function (get_insns (), asm_out_file, optimize);
4442   final (get_insns (), asm_out_file, optimize);
4443   final_end_function ();
4444
4445   /* The IA-64 ".handlerdata" directive must be issued before the ".endp"
4446      directive that closes the procedure descriptor.  Similarly, for x64 SEH.
4447      Otherwise it's not strictly necessary, but it doesn't hurt either.  */
4448   output_function_exception_table (fnname);
4449
4450   assemble_end_function (current_function_decl, fnname);
4451
4452   user_defined_section_attribute = false;
4453
4454   /* Free up reg info memory.  */
4455   free_reg_info ();
4456
4457   if (! quiet_flag)
4458     fflush (asm_out_file);
4459
4460   /* Write DBX symbols if requested.  */
4461
4462   /* Note that for those inline functions where we don't initially
4463      know for certain that we will be generating an out-of-line copy,
4464      the first invocation of this routine (rest_of_compilation) will
4465      skip over this code by doing a `goto exit_rest_of_compilation;'.
4466      Later on, wrapup_global_declarations will (indirectly) call
4467      rest_of_compilation again for those inline functions that need
4468      to have out-of-line copies generated.  During that call, we
4469      *will* be routed past here.  */
4470
4471   timevar_push (TV_SYMOUT);
4472   if (!DECL_IGNORED_P (current_function_decl))
4473     debug_hooks->function_decl (current_function_decl);
4474   timevar_pop (TV_SYMOUT);
4475
4476   /* Release the blocks that are linked to DECL_INITIAL() to free the memory.  */
4477   DECL_INITIAL (current_function_decl) = error_mark_node;
4478
4479   if (DECL_STATIC_CONSTRUCTOR (current_function_decl)
4480       && targetm.have_ctors_dtors)
4481     targetm.asm_out.constructor (XEXP (DECL_RTL (current_function_decl), 0),
4482                                  decl_init_priority_lookup
4483                                    (current_function_decl));
4484   if (DECL_STATIC_DESTRUCTOR (current_function_decl)
4485       && targetm.have_ctors_dtors)
4486     targetm.asm_out.destructor (XEXP (DECL_RTL (current_function_decl), 0),
4487                                 decl_fini_priority_lookup
4488                                   (current_function_decl));
4489   return 0;
4490 }
4491
4492 namespace {
4493
4494 const pass_data pass_data_final =
4495 {
4496   RTL_PASS, /* type */
4497   "final", /* name */
4498   OPTGROUP_NONE, /* optinfo_flags */
4499   false, /* has_gate */
4500   true, /* has_execute */
4501   TV_FINAL, /* tv_id */
4502   0, /* properties_required */
4503   0, /* properties_provided */
4504   0, /* properties_destroyed */
4505   0, /* todo_flags_start */
4506   0, /* todo_flags_finish */
4507 };
4508
4509 class pass_final : public rtl_opt_pass
4510 {
4511 public:
4512   pass_final (gcc::context *ctxt)
4513     : rtl_opt_pass (pass_data_final, ctxt)
4514   {}
4515
4516   /* opt_pass methods: */
4517   unsigned int execute () { return rest_of_handle_final (); }
4518
4519 }; // class pass_final
4520
4521 } // anon namespace
4522
4523 rtl_opt_pass *
4524 make_pass_final (gcc::context *ctxt)
4525 {
4526   return new pass_final (ctxt);
4527 }
4528
4529
4530 static unsigned int
4531 rest_of_handle_shorten_branches (void)
4532 {
4533   /* Shorten branches.  */
4534   shorten_branches (get_insns ());
4535   return 0;
4536 }
4537
4538 namespace {
4539
4540 const pass_data pass_data_shorten_branches =
4541 {
4542   RTL_PASS, /* type */
4543   "shorten", /* name */
4544   OPTGROUP_NONE, /* optinfo_flags */
4545   false, /* has_gate */
4546   true, /* has_execute */
4547   TV_SHORTEN_BRANCH, /* tv_id */
4548   0, /* properties_required */
4549   0, /* properties_provided */
4550   0, /* properties_destroyed */
4551   0, /* todo_flags_start */
4552   0, /* todo_flags_finish */
4553 };
4554
4555 class pass_shorten_branches : public rtl_opt_pass
4556 {
4557 public:
4558   pass_shorten_branches (gcc::context *ctxt)
4559     : rtl_opt_pass (pass_data_shorten_branches, ctxt)
4560   {}
4561
4562   /* opt_pass methods: */
4563   unsigned int execute () { return rest_of_handle_shorten_branches (); }
4564
4565 }; // class pass_shorten_branches
4566
4567 } // anon namespace
4568
4569 rtl_opt_pass *
4570 make_pass_shorten_branches (gcc::context *ctxt)
4571 {
4572   return new pass_shorten_branches (ctxt);
4573 }
4574
4575
4576 static unsigned int
4577 rest_of_clean_state (void)
4578 {
4579   rtx insn, next;
4580   FILE *final_output = NULL;
4581   int save_unnumbered = flag_dump_unnumbered;
4582   int save_noaddr = flag_dump_noaddr;
4583
4584   if (flag_dump_final_insns)
4585     {
4586       final_output = fopen (flag_dump_final_insns, "a");
4587       if (!final_output)
4588         {
4589           error ("could not open final insn dump file %qs: %m",
4590                  flag_dump_final_insns);
4591           flag_dump_final_insns = NULL;
4592         }
4593       else
4594         {
4595           flag_dump_noaddr = flag_dump_unnumbered = 1;
4596           if (flag_compare_debug_opt || flag_compare_debug)
4597             dump_flags |= TDF_NOUID;
4598           dump_function_header (final_output, current_function_decl,
4599                                 dump_flags);
4600           final_insns_dump_p = true;
4601
4602           for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4603             if (LABEL_P (insn))
4604               INSN_UID (insn) = CODE_LABEL_NUMBER (insn);
4605             else
4606               {
4607                 if (NOTE_P (insn))
4608                   set_block_for_insn (insn, NULL);
4609                 INSN_UID (insn) = 0;
4610               }
4611         }
4612     }
4613
4614   /* It is very important to decompose the RTL instruction chain here:
4615      debug information keeps pointing into CODE_LABEL insns inside the function
4616      body.  If these remain pointing to the other insns, we end up preserving
4617      whole RTL chain and attached detailed debug info in memory.  */
4618   for (insn = get_insns (); insn; insn = next)
4619     {
4620       next = NEXT_INSN (insn);
4621       NEXT_INSN (insn) = NULL;
4622       PREV_INSN (insn) = NULL;
4623
4624       if (final_output
4625           && (!NOTE_P (insn) ||
4626               (NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION
4627                && NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION
4628                && NOTE_KIND (insn) != NOTE_INSN_BLOCK_BEG
4629                && NOTE_KIND (insn) != NOTE_INSN_BLOCK_END
4630                && NOTE_KIND (insn) != NOTE_INSN_DELETED_DEBUG_LABEL)))
4631         print_rtl_single (final_output, insn);
4632     }
4633
4634   if (final_output)
4635     {
4636       flag_dump_noaddr = save_noaddr;
4637       flag_dump_unnumbered = save_unnumbered;
4638       final_insns_dump_p = false;
4639
4640       if (fclose (final_output))
4641         {
4642           error ("could not close final insn dump file %qs: %m",
4643                  flag_dump_final_insns);
4644           flag_dump_final_insns = NULL;
4645         }
4646     }
4647
4648   /* In case the function was not output,
4649      don't leave any temporary anonymous types
4650      queued up for sdb output.  */
4651 #ifdef SDB_DEBUGGING_INFO
4652   if (write_symbols == SDB_DEBUG)
4653     sdbout_types (NULL_TREE);
4654 #endif
4655
4656   flag_rerun_cse_after_global_opts = 0;
4657   reload_completed = 0;
4658   epilogue_completed = 0;
4659 #ifdef STACK_REGS
4660   regstack_completed = 0;
4661 #endif
4662
4663   /* Clear out the insn_length contents now that they are no
4664      longer valid.  */
4665   init_insn_lengths ();
4666
4667   /* Show no temporary slots allocated.  */
4668   init_temp_slots ();
4669
4670   free_bb_for_insn ();
4671
4672   delete_tree_ssa ();
4673
4674   /* We can reduce stack alignment on call site only when we are sure that
4675      the function body just produced will be actually used in the final
4676      executable.  */
4677   if (decl_binds_to_current_def_p (current_function_decl))
4678     {
4679       unsigned int pref = crtl->preferred_stack_boundary;
4680       if (crtl->stack_alignment_needed > crtl->preferred_stack_boundary)
4681         pref = crtl->stack_alignment_needed;
4682       cgraph_rtl_info (current_function_decl)->preferred_incoming_stack_boundary
4683         = pref;
4684     }
4685
4686   /* Make sure volatile mem refs aren't considered valid operands for
4687      arithmetic insns.  We must call this here if this is a nested inline
4688      function, since the above code leaves us in the init_recog state,
4689      and the function context push/pop code does not save/restore volatile_ok.
4690
4691      ??? Maybe it isn't necessary for expand_start_function to call this
4692      anymore if we do it here?  */
4693
4694   init_recog_no_volatile ();
4695
4696   /* We're done with this function.  Free up memory if we can.  */
4697   free_after_parsing (cfun);
4698   free_after_compilation (cfun);
4699   return 0;
4700 }
4701
4702 namespace {
4703
4704 const pass_data pass_data_clean_state =
4705 {
4706   RTL_PASS, /* type */
4707   "*clean_state", /* name */
4708   OPTGROUP_NONE, /* optinfo_flags */
4709   false, /* has_gate */
4710   true, /* has_execute */
4711   TV_FINAL, /* tv_id */
4712   0, /* properties_required */
4713   0, /* properties_provided */
4714   PROP_rtl, /* properties_destroyed */
4715   0, /* todo_flags_start */
4716   0, /* todo_flags_finish */
4717 };
4718
4719 class pass_clean_state : public rtl_opt_pass
4720 {
4721 public:
4722   pass_clean_state (gcc::context *ctxt)
4723     : rtl_opt_pass (pass_data_clean_state, ctxt)
4724   {}
4725
4726   /* opt_pass methods: */
4727   unsigned int execute () { return rest_of_clean_state (); }
4728
4729 }; // class pass_clean_state
4730
4731 } // anon namespace
4732
4733 rtl_opt_pass *
4734 make_pass_clean_state (gcc::context *ctxt)
4735 {
4736   return new pass_clean_state (ctxt);
4737 }