OSDN Git Service

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