OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [final.c] - Blame information for rev 20

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.