OSDN Git Service

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