OSDN Git Service

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