]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/rtl.c
Remove trailing white spaces.
[thirdparty/gcc.git] / gcc / rtl.c
CommitLineData
0f40f9f7 1/* RTL utility routines.
187515f5 2 Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
b5b8b0ac 3 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
6f29feb1 4
1322177d 5This file is part of GCC.
6f29feb1 6
1322177d
LB
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9dcd6f09 9Software Foundation; either version 3, or (at your option) any later
1322177d 10version.
6f29feb1 11
1322177d
LB
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
6f29feb1
JW
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
6f29feb1 20
45c8116d
ZW
21/* This file is compiled twice: once for the generator programs
22 once for the compiler. */
23#ifdef GENERATOR_FILE
24#include "bconfig.h"
25#else
6f29feb1 26#include "config.h"
45c8116d
ZW
27#endif
28
670ee920 29#include "system.h"
4977bab6
ZW
30#include "coretypes.h"
31#include "tm.h"
6f29feb1 32#include "rtl.h"
a19a1b5d 33#include "real.h"
a3770a81 34#include "ggc.h"
4c714dd4
KG
35#ifdef GENERATOR_FILE
36# include "errors.h"
37#else
38# include "toplev.h"
39#endif
6f29feb1 40
6f29feb1
JW
41\f
42/* Indexed by rtx code, gives number of operands for an rtx with that code.
aa0b4465 43 Does NOT include rtx header data (code and links). */
6f29feb1 44
aa0b4465
ZW
45#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) sizeof FORMAT - 1 ,
46
86460bab 47const unsigned char rtx_length[NUM_RTX_CODE] = {
aa0b4465
ZW
48#include "rtl.def"
49};
50
51#undef DEF_RTL_EXPR
6f29feb1
JW
52
53/* Indexed by rtx code, gives the name of that kind of rtx, as a C string. */
54
55#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
56
86460bab 57const char * const rtx_name[NUM_RTX_CODE] = {
6f29feb1
JW
58#include "rtl.def" /* rtl expressions are documented here */
59};
60
61#undef DEF_RTL_EXPR
62
6f29feb1
JW
63/* Indexed by rtx code, gives a sequence of operand-types for
64 rtx's of that code. The sequence is a C string in which
6dc42e49 65 each character describes one operand. */
6f29feb1 66
86460bab 67const char * const rtx_format[NUM_RTX_CODE] = {
6f29feb1
JW
68 /* "*" undefined.
69 can cause a warning message
70 "0" field is unused (or used in a phase-dependent manner)
71 prints nothing
72 "i" an integer
73 prints the integer
74 "n" like "i", but prints entries from `note_insn_name'
c166a311
CH
75 "w" an integer of width HOST_BITS_PER_WIDE_INT
76 prints the integer
6f29feb1
JW
77 "s" a pointer to a string
78 prints the string
79 "S" like "s", but optional:
80 the containing rtx may end before this operand
1f3b37a3
ZW
81 "T" like "s", but treated specially by the RTL reader;
82 only found in machine description patterns.
6f29feb1
JW
83 "e" a pointer to an rtl expression
84 prints the expression
85 "E" a pointer to a vector that points to a number of rtl expressions
86 prints a list of the rtl expressions
87 "V" like "E", but optional:
88 the containing rtx may end before this operand
89 "u" a pointer to another insn
0dfa1860
MM
90 prints the uid of the insn.
91 "b" is a pointer to a bitmap header.
36a5eadd 92 "B" is a basic block pointer.
dc297297 93 "t" is a tree pointer. */
6f29feb1
JW
94
95#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
96#include "rtl.def" /* rtl expressions are defined here */
97#undef DEF_RTL_EXPR
98};
99
100/* Indexed by rtx code, gives a character representing the "class" of
101 that rtx code. See rtl.def for documentation on the defined classes. */
102
ec8e098d 103const enum rtx_class rtx_class[NUM_RTX_CODE] = {
f590cca1 104#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) CLASS,
6f29feb1
JW
105#include "rtl.def" /* rtl expressions are defined here */
106#undef DEF_RTL_EXPR
107};
108
e1de1560
RS
109/* Indexed by rtx code, gives the size of the rtx in bytes. */
110
aacd3885 111const unsigned char rtx_code_size[NUM_RTX_CODE] = {
e1de1560 112#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) \
091a3ac7 113 ((ENUM) == CONST_INT || (ENUM) == CONST_DOUBLE || (ENUM) == CONST_FIXED\
e1de1560
RS
114 ? RTX_HDR_SIZE + (sizeof FORMAT - 1) * sizeof (HOST_WIDE_INT) \
115 : RTX_HDR_SIZE + (sizeof FORMAT - 1) * sizeof (rtunion)),
116
117#include "rtl.def"
118#undef DEF_RTL_EXPR
119};
120
6f29feb1
JW
121/* Names for kinds of NOTEs and REG_NOTEs. */
122
a38e7aa5 123const char * const note_insn_name[NOTE_INSN_MAX] =
f590cca1 124{
826c9564
ZW
125#define DEF_INSN_NOTE(NAME) #NAME,
126#include "insn-notes.def"
127#undef DEF_INSN_NOTE
f590cca1
RH
128};
129
826c9564 130const char * const reg_note_name[REG_NOTE_MAX] =
f590cca1 131{
826c9564
ZW
132#define DEF_REG_NOTE(NAME) #NAME,
133#include "reg-notes.def"
134#undef DEF_REG_NOTE
f590cca1 135};
6f29feb1 136
439a7e54
DN
137#ifdef GATHER_STATISTICS
138static int rtx_alloc_counts[(int) LAST_AND_UNUSED_RTX_CODE];
139static int rtx_alloc_sizes[(int) LAST_AND_UNUSED_RTX_CODE];
140static int rtvec_alloc_counts;
141static int rtvec_alloc_sizes;
142#endif
143
956d6950 144\f
6f29feb1
JW
145/* Allocate an rtx vector of N elements.
146 Store the length, and initialize all elements to zero. */
147
148rtvec
0c20a65f 149rtvec_alloc (int n)
6f29feb1
JW
150{
151 rtvec rt;
f590cca1 152
1f8f4a0b 153 rt = ggc_alloc_rtvec (n);
a1105617 154 /* Clear out the vector. */
f8a83ee3 155 memset (&rt->elem[0], 0, n * sizeof (rtx));
6f29feb1 156
395d53bb 157 PUT_NUM_ELEM (rt, n);
439a7e54
DN
158
159#ifdef GATHER_STATISTICS
160 rtvec_alloc_counts++;
161 rtvec_alloc_sizes += n * sizeof (rtx);
162#endif
163
6f29feb1
JW
164 return rt;
165}
166
bd7960b1
RS
167/* Create a bitwise copy of VEC. */
168
169rtvec
170shallow_copy_rtvec (rtvec vec)
171{
172 rtvec newvec;
173 int n;
174
175 n = GET_NUM_ELEM (vec);
176 newvec = rtvec_alloc (n);
177 memcpy (&newvec->elem[0], &vec->elem[0], sizeof (rtx) * n);
178 return newvec;
179}
180
aacd3885
RS
181/* Return the number of bytes occupied by rtx value X. */
182
183unsigned int
f7d504c2 184rtx_size (const_rtx x)
aacd3885 185{
3fa9c136 186 if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_HAS_BLOCK_INFO_P (x))
aacd3885
RS
187 return RTX_HDR_SIZE + sizeof (struct block_symbol);
188 return RTX_CODE_SIZE (GET_CODE (x));
189}
190
6f29feb1
JW
191/* Allocate an rtx of code CODE. The CODE is stored in the rtx;
192 all the rest is initialized to zero. */
193
194rtx
b9dcdee4 195rtx_alloc_stat (RTX_CODE code MEM_STAT_DECL)
6f29feb1
JW
196{
197 rtx rt;
6f29feb1 198
aacd3885 199 rt = (rtx) ggc_alloc_zone_pass_stat (RTX_CODE_SIZE (code), &rtl_zone);
a3770a81 200
f8a83ee3
ZW
201 /* We want to clear everything up to the FLD array. Normally, this
202 is one int, but we don't want to assume that and it isn't very
203 portable anyway; this is. */
2151a093 204
e1de1560 205 memset (rt, 0, RTX_HDR_SIZE);
6f29feb1 206 PUT_CODE (rt, code);
439a7e54
DN
207
208#ifdef GATHER_STATISTICS
209 rtx_alloc_counts[code]++;
aacd3885 210 rtx_alloc_sizes[code] += RTX_CODE_SIZE (code);
439a7e54
DN
211#endif
212
6f29feb1
JW
213 return rt;
214}
9b404774 215
6f29feb1 216\f
6fb5fa3c
DB
217/* Return true if ORIG is a sharable CONST. */
218
219bool
f7d504c2 220shared_const_p (const_rtx orig)
6fb5fa3c
DB
221{
222 gcc_assert (GET_CODE (orig) == CONST);
b8698a0f 223
6fb5fa3c
DB
224 /* CONST can be shared if it contains a SYMBOL_REF. If it contains
225 a LABEL_REF, it isn't sharable. */
226 return (GET_CODE (XEXP (orig, 0)) == PLUS
227 && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
481683e1 228 && CONST_INT_P(XEXP (XEXP (orig, 0), 1)));
6fb5fa3c
DB
229}
230
231
6f29feb1
JW
232/* Create a new copy of an rtx.
233 Recursively copies the operands of the rtx,
234 except for those few rtx codes that are sharable. */
235
236rtx
0c20a65f 237copy_rtx (rtx orig)
6f29feb1 238{
b3694847
SS
239 rtx copy;
240 int i, j;
241 RTX_CODE code;
242 const char *format_ptr;
6f29feb1
JW
243
244 code = GET_CODE (orig);
245
246 switch (code)
247 {
248 case REG:
0ca5af51
AO
249 case DEBUG_EXPR:
250 case VALUE:
6f29feb1
JW
251 case CONST_INT:
252 case CONST_DOUBLE:
091a3ac7 253 case CONST_FIXED:
69ef87e2 254 case CONST_VECTOR:
6f29feb1
JW
255 case SYMBOL_REF:
256 case CODE_LABEL:
257 case PC:
258 case CC0:
cf526dcc 259 case SCRATCH:
0f41302f 260 /* SCRATCH must be shared because they represent distinct values. */
6f29feb1 261 return orig;
3e89ed8d
JH
262 case CLOBBER:
263 if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER)
264 return orig;
265 break;
cf526dcc
RK
266
267 case CONST:
6fb5fa3c 268 if (shared_const_p (orig))
cf526dcc
RK
269 return orig;
270 break;
271
cc81e625
JW
272 /* A MEM with a constant address is not sharable. The problem is that
273 the constant address may need to be reloaded. If the mem is shared,
274 then reloading one copy of this mem will cause all copies to appear
275 to have been reloaded. */
e9a25f70
JL
276
277 default:
278 break;
6f29feb1
JW
279 }
280
aacd3885
RS
281 /* Copy the various flags, fields, and other information. We assume
282 that all fields need copying, and then clear the fields that should
a4c6502a
MM
283 not be copied. That is the sensible default behavior, and forces
284 us to explicitly document why we are *not* copying a flag. */
aacd3885 285 copy = shallow_copy_rtx (orig);
a4c6502a
MM
286
287 /* We do not copy the USED flag, which is used as a mark bit during
288 walks over the RTL. */
5a63e069 289 RTX_FLAG (copy, used) = 0;
a4c6502a 290
0a1c58a2 291 /* We do not copy FRAME_RELATED for INSNs. */
ec8e098d 292 if (INSN_P (orig))
5a63e069
JJ
293 RTX_FLAG (copy, frame_related) = 0;
294 RTX_FLAG (copy, jump) = RTX_FLAG (orig, jump);
295 RTX_FLAG (copy, call) = RTX_FLAG (orig, call);
0a1c58a2 296
6f29feb1
JW
297 format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
298
299 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
aacd3885
RS
300 switch (*format_ptr++)
301 {
302 case 'e':
303 if (XEXP (orig, i) != NULL)
304 XEXP (copy, i) = copy_rtx (XEXP (orig, i));
305 break;
306
307 case 'E':
308 case 'V':
309 if (XVEC (orig, i) != NULL)
310 {
311 XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
312 for (j = 0; j < XVECLEN (copy, i); j++)
313 XVECEXP (copy, i, j) = copy_rtx (XVECEXP (orig, i, j));
314 }
315 break;
316
317 case 't':
318 case 'w':
319 case 'i':
320 case 's':
321 case 'S':
322 case 'T':
323 case 'u':
324 case 'B':
325 case '0':
326 /* These are left unchanged. */
327 break;
328
329 default:
330 gcc_unreachable ();
331 }
6f29feb1 332 return copy;
6f29feb1 333}
ce9d4c6d
R
334
335/* Create a new copy of an rtx. Only copy just one level. */
8ac61af7 336
ce9d4c6d 337rtx
f7d504c2 338shallow_copy_rtx_stat (const_rtx orig MEM_STAT_DECL)
ce9d4c6d 339{
f7d504c2
KG
340 const unsigned int size = rtx_size (orig);
341 rtx const copy = (rtx) ggc_alloc_zone_pass_stat (size, &rtl_zone);
1634b18f 342 return (rtx) memcpy (copy, orig, size);
ce9d4c6d 343}
6f29feb1 344\f
1b3d8f8a
GK
345/* Nonzero when we are generating CONCATs. */
346int generating_concat_p;
4586b4ca
SB
347
348/* Nonzero when we are expanding trees to RTL. */
349int currently_expanding_to_rtl;
350
b5ee7789 351\f
e855c69d 352
b8698a0f 353/* Same as rtx_equal_p, but call CB on each pair of rtx if CB is not NULL.
7eb3f1f7
JJ
354 When the callback returns true, we continue with the new pair.
355 Whenever changing this function check if rtx_equal_p below doesn't need
356 changing as well. */
b5ee7789
CM
357
358int
e855c69d 359rtx_equal_p_cb (const_rtx x, const_rtx y, rtx_equal_p_callback_function cb)
b5ee7789 360{
b3694847
SS
361 int i;
362 int j;
363 enum rtx_code code;
364 const char *fmt;
e855c69d 365 rtx nx, ny;
b5ee7789
CM
366
367 if (x == y)
368 return 1;
369 if (x == 0 || y == 0)
370 return 0;
371
e855c69d
AB
372 /* Invoke the callback first. */
373 if (cb != NULL
374 && ((*cb) (&x, &y, &nx, &ny)))
375 return rtx_equal_p_cb (nx, ny, cb);
376
b5ee7789
CM
377 code = GET_CODE (x);
378 /* Rtx's of different codes cannot be equal. */
379 if (code != GET_CODE (y))
380 return 0;
381
382 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
383 (REG:SI x) and (REG:HI x) are NOT equivalent. */
384
385 if (GET_MODE (x) != GET_MODE (y))
386 return 0;
387
09e881c9
BE
388 /* MEMs refering to different address space are not equivalent. */
389 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
390 return 0;
391
c13e8210
MM
392 /* Some RTL can be compared nonrecursively. */
393 switch (code)
394 {
395 case REG:
3fbd86b1 396 return (REGNO (x) == REGNO (y));
c13e8210
MM
397
398 case LABEL_REF:
399 return XEXP (x, 0) == XEXP (y, 0);
400
401 case SYMBOL_REF:
402 return XSTR (x, 0) == XSTR (y, 0);
403
0ca5af51 404 case DEBUG_EXPR:
b5b8b0ac 405 case VALUE:
c13e8210
MM
406 case SCRATCH:
407 case CONST_DOUBLE:
408 case CONST_INT:
091a3ac7 409 case CONST_FIXED:
c13e8210
MM
410 return 0;
411
412 default:
413 break;
414 }
b5ee7789
CM
415
416 /* Compare the elements. If any pair of corresponding elements
ce6e2d90 417 fail to match, return 0 for the whole thing. */
b5ee7789
CM
418
419 fmt = GET_RTX_FORMAT (code);
420 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
421 {
422 switch (fmt[i])
423 {
424 case 'w':
425 if (XWINT (x, i) != XWINT (y, i))
426 return 0;
427 break;
428
429 case 'n':
430 case 'i':
431 if (XINT (x, i) != XINT (y, i))
432 return 0;
433 break;
434
435 case 'V':
436 case 'E':
437 /* Two vectors must have the same length. */
438 if (XVECLEN (x, i) != XVECLEN (y, i))
439 return 0;
440
441 /* And the corresponding elements must match. */
442 for (j = 0; j < XVECLEN (x, i); j++)
b8698a0f 443 if (rtx_equal_p_cb (XVECEXP (x, i, j),
e855c69d 444 XVECEXP (y, i, j), cb) == 0)
b5ee7789
CM
445 return 0;
446 break;
447
448 case 'e':
e855c69d 449 if (rtx_equal_p_cb (XEXP (x, i), XEXP (y, i), cb) == 0)
b5ee7789
CM
450 return 0;
451 break;
452
453 case 'S':
454 case 's':
be006382
JDA
455 if ((XSTR (x, i) || XSTR (y, i))
456 && (! XSTR (x, i) || ! XSTR (y, i)
457 || strcmp (XSTR (x, i), XSTR (y, i))))
b5ee7789
CM
458 return 0;
459 break;
460
461 case 'u':
462 /* These are just backpointers, so they don't matter. */
463 break;
464
465 case '0':
466 case 't':
467 break;
468
469 /* It is believed that rtx's at this level will never
470 contain anything but integers and other rtx's,
471 except for within LABEL_REFs and SYMBOL_REFs. */
472 default:
41374e13 473 gcc_unreachable ();
b5ee7789
CM
474 }
475 }
476 return 1;
477}
439a7e54 478
e855c69d 479/* Return 1 if X and Y are identical-looking rtx's.
7eb3f1f7
JJ
480 This is the Lisp function EQUAL for rtx arguments.
481 Whenever changing this function check if rtx_equal_p_cb above doesn't need
482 changing as well. */
e855c69d
AB
483
484int
485rtx_equal_p (const_rtx x, const_rtx y)
486{
7eb3f1f7
JJ
487 int i;
488 int j;
489 enum rtx_code code;
490 const char *fmt;
491
492 if (x == y)
493 return 1;
494 if (x == 0 || y == 0)
495 return 0;
496
497 code = GET_CODE (x);
498 /* Rtx's of different codes cannot be equal. */
499 if (code != GET_CODE (y))
500 return 0;
501
502 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
503 (REG:SI x) and (REG:HI x) are NOT equivalent. */
504
505 if (GET_MODE (x) != GET_MODE (y))
506 return 0;
507
09e881c9
BE
508 /* MEMs refering to different address space are not equivalent. */
509 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
510 return 0;
511
7eb3f1f7
JJ
512 /* Some RTL can be compared nonrecursively. */
513 switch (code)
514 {
515 case REG:
516 return (REGNO (x) == REGNO (y));
517
518 case LABEL_REF:
519 return XEXP (x, 0) == XEXP (y, 0);
520
521 case SYMBOL_REF:
522 return XSTR (x, 0) == XSTR (y, 0);
523
0ca5af51 524 case DEBUG_EXPR:
b5b8b0ac 525 case VALUE:
7eb3f1f7
JJ
526 case SCRATCH:
527 case CONST_DOUBLE:
528 case CONST_INT:
529 case CONST_FIXED:
530 return 0;
531
532 default:
533 break;
534 }
535
536 /* Compare the elements. If any pair of corresponding elements
537 fail to match, return 0 for the whole thing. */
538
539 fmt = GET_RTX_FORMAT (code);
540 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
541 {
542 switch (fmt[i])
543 {
544 case 'w':
545 if (XWINT (x, i) != XWINT (y, i))
546 return 0;
547 break;
548
549 case 'n':
550 case 'i':
551 if (XINT (x, i) != XINT (y, i))
552 return 0;
553 break;
554
555 case 'V':
556 case 'E':
557 /* Two vectors must have the same length. */
558 if (XVECLEN (x, i) != XVECLEN (y, i))
559 return 0;
560
561 /* And the corresponding elements must match. */
562 for (j = 0; j < XVECLEN (x, i); j++)
563 if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
564 return 0;
565 break;
566
567 case 'e':
568 if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
569 return 0;
570 break;
571
572 case 'S':
573 case 's':
574 if ((XSTR (x, i) || XSTR (y, i))
575 && (! XSTR (x, i) || ! XSTR (y, i)
576 || strcmp (XSTR (x, i), XSTR (y, i))))
577 return 0;
578 break;
579
580 case 'u':
581 /* These are just backpointers, so they don't matter. */
582 break;
583
584 case '0':
585 case 't':
586 break;
587
588 /* It is believed that rtx's at this level will never
589 contain anything but integers and other rtx's,
590 except for within LABEL_REFs and SYMBOL_REFs. */
591 default:
592 gcc_unreachable ();
593 }
594 }
595 return 1;
e855c69d
AB
596}
597
83f676b3
RS
598void
599dump_rtx_statistics (void)
439a7e54
DN
600{
601#ifdef GATHER_STATISTICS
602 int i;
603 int total_counts = 0;
604 int total_sizes = 0;
605 fprintf (stderr, "\nRTX Kind Count Bytes\n");
606 fprintf (stderr, "---------------------------------------\n");
607 for (i = 0; i < LAST_AND_UNUSED_RTX_CODE; i++)
608 if (rtx_alloc_counts[i])
609 {
610 fprintf (stderr, "%-20s %7d %10d\n", GET_RTX_NAME (i),
611 rtx_alloc_counts[i], rtx_alloc_sizes[i]);
612 total_counts += rtx_alloc_counts[i];
613 total_sizes += rtx_alloc_sizes[i];
614 }
615 if (rtvec_alloc_counts)
616 {
617 fprintf (stderr, "%-20s %7d %10d\n", "rtvec",
618 rtvec_alloc_counts, rtvec_alloc_sizes);
619 total_counts += rtvec_alloc_counts;
620 total_sizes += rtvec_alloc_sizes;
621 }
622 fprintf (stderr, "---------------------------------------\n");
623 fprintf (stderr, "%-20s %7d %10d\n",
624 "Total", total_counts, total_sizes);
625 fprintf (stderr, "---------------------------------------\n");
b8698a0f 626#endif
439a7e54 627}
b5ee7789 628\f
f4524c9e 629#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
ef178af3 630void
f7d504c2 631rtl_check_failed_bounds (const_rtx r, int n, const char *file, int line,
0c20a65f 632 const char *func)
ef178af3 633{
fce687f8 634 internal_error
9e637a26 635 ("RTL check: access of elt %d of '%s' with last elt %d in %s, at %s:%d",
fce687f8
RK
636 n, GET_RTX_NAME (GET_CODE (r)), GET_RTX_LENGTH (GET_CODE (r)) - 1,
637 func, trim_filename (file), line);
ef178af3
ZW
638}
639
640void
f7d504c2 641rtl_check_failed_type1 (const_rtx r, int n, int c1, const char *file, int line,
0c20a65f 642 const char *func)
ef178af3 643{
fce687f8
RK
644 internal_error
645 ("RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d",
646 n, c1, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
647 func, trim_filename (file), line);
ef178af3
ZW
648}
649
650void
f7d504c2 651rtl_check_failed_type2 (const_rtx r, int n, int c1, int c2, const char *file,
0c20a65f 652 int line, const char *func)
ef178af3 653{
fce687f8
RK
654 internal_error
655 ("RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d",
656 n, c1, c2, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
657 func, trim_filename (file), line);
ef178af3
ZW
658}
659
83ab3839 660void
f7d504c2 661rtl_check_failed_code1 (const_rtx r, enum rtx_code code, const char *file,
0c20a65f 662 int line, const char *func)
83ab3839 663{
9e637a26 664 internal_error ("RTL check: expected code '%s', have '%s' in %s, at %s:%d",
fce687f8
RK
665 GET_RTX_NAME (code), GET_RTX_NAME (GET_CODE (r)), func,
666 trim_filename (file), line);
83ab3839
RH
667}
668
669void
f7d504c2 670rtl_check_failed_code2 (const_rtx r, enum rtx_code code1, enum rtx_code code2,
0c20a65f 671 const char *file, int line, const char *func)
83ab3839 672{
fce687f8 673 internal_error
9e637a26 674 ("RTL check: expected code '%s' or '%s', have '%s' in %s, at %s:%d",
fce687f8 675 GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (GET_CODE (r)),
5ea1bc0e 676 func, trim_filename (file), line);
83ab3839
RH
677}
678
9e254451 679void
f7d504c2 680rtl_check_failed_code_mode (const_rtx r, enum rtx_code code, enum machine_mode mode,
9e254451
ILT
681 bool not_mode, const char *file, int line,
682 const char *func)
683{
684 internal_error ((not_mode
685 ? ("RTL check: expected code '%s' and not mode '%s', "
686 "have code '%s' and mode '%s' in %s, at %s:%d")
687 : ("RTL check: expected code '%s' and mode '%s', "
688 "have code '%s' and mode '%s' in %s, at %s:%d")),
689 GET_RTX_NAME (code), GET_MODE_NAME (mode),
690 GET_RTX_NAME (GET_CODE (r)), GET_MODE_NAME (GET_MODE (r)),
691 func, trim_filename (file), line);
692}
693
aacd3885
RS
694/* Report that line LINE of FILE tried to access the block symbol fields
695 of a non-block symbol. FUNC is the function that contains the line. */
696
697void
698rtl_check_failed_block_symbol (const char *file, int line, const char *func)
699{
700 internal_error
701 ("RTL check: attempt to treat non-block symbol as a block symbol "
702 "in %s, at %s:%d", func, trim_filename (file), line);
703}
704
ef178af3
ZW
705/* XXX Maybe print the vector? */
706void
f7d504c2 707rtvec_check_failed_bounds (const_rtvec r, int n, const char *file, int line,
0c20a65f 708 const char *func)
ef178af3 709{
fce687f8
RK
710 internal_error
711 ("RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d",
712 n, GET_NUM_ELEM (r) - 1, func, trim_filename (file), line);
ef178af3 713}
f4524c9e 714#endif /* ENABLE_RTL_CHECKING */
5a63e069
JJ
715
716#if defined ENABLE_RTL_FLAG_CHECKING
717void
f7d504c2 718rtl_check_failed_flag (const char *name, const_rtx r, const char *file,
0c20a65f 719 int line, const char *func)
5a63e069
JJ
720{
721 internal_error
9e637a26 722 ("RTL flag check: %s used with unexpected rtx code '%s' in %s, at %s:%d",
2d4cc6a7 723 name, GET_RTX_NAME (GET_CODE (r)), func, trim_filename (file), line);
5a63e069
JJ
724}
725#endif /* ENABLE_RTL_FLAG_CHECKING */