rtl.c 17.3 KB
Newer Older
1
/* RTL utility routines.
2
   Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002
Jeff Law committed
3
   Free Software Foundation, Inc.
Jim Wilson committed
4

5
This file is part of GCC.
Jim Wilson committed
6

7 8 9 10
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
Jim Wilson committed
11

12 13 14 15
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
Jim Wilson committed
16 17

You should have received a copy of the GNU General Public License
18 19 20
along with GCC; see the file COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */
Jim Wilson committed
21 22

#include "config.h"
23
#include "system.h"
Jim Wilson committed
24
#include "rtl.h"
25
#include "real.h"
26
#include "ggc.h"
27
#include "errors.h"
Jim Wilson committed
28 29 30


/* Indexed by rtx code, gives number of operands for an rtx with that code.
31
   Does NOT include rtx header data (code and links).  */
Jim Wilson committed
32

33 34
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   sizeof FORMAT - 1 ,

35
const unsigned char rtx_length[NUM_RTX_CODE] = {
36 37 38 39
#include "rtl.def"
};

#undef DEF_RTL_EXPR
Jim Wilson committed
40 41 42 43 44

/* Indexed by rtx code, gives the name of that kind of rtx, as a C string.  */

#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   NAME ,

45
const char * const rtx_name[NUM_RTX_CODE] = {
Jim Wilson committed
46 47 48 49 50 51 52 53
#include "rtl.def"		/* rtl expressions are documented here */
};

#undef DEF_RTL_EXPR

/* Indexed by machine mode, gives the name of that machine mode.
   This name does not include the letters "mode".  */

54
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  NAME,
Jim Wilson committed
55

56
const char * const mode_name[NUM_MACHINE_MODES] = {
Jim Wilson committed
57 58 59 60 61
#include "machmode.def"
};

#undef DEF_MACHMODE

62
/* Indexed by machine mode, gives the class mode for GET_MODE_CLASS.  */
Jim Wilson committed
63

64
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  CLASS,
Jim Wilson committed
65

66
const enum mode_class mode_class[NUM_MACHINE_MODES] = {
Jim Wilson committed
67 68 69 70 71
#include "machmode.def"
};

#undef DEF_MACHMODE

72 73 74
/* Indexed by machine mode, gives the length of the mode, in bits.
   GET_MODE_BITSIZE uses this.  */

75
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  BITSIZE,
76

77
const unsigned short mode_bitsize[NUM_MACHINE_MODES] = {
78 79 80 81 82
#include "machmode.def"
};

#undef DEF_MACHMODE

Jim Wilson committed
83 84 85
/* Indexed by machine mode, gives the length of the mode, in bytes.
   GET_MODE_SIZE uses this.  */

86
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  SIZE,
Jim Wilson committed
87

88
const unsigned char mode_size[NUM_MACHINE_MODES] = {
Jim Wilson committed
89 90 91 92 93 94 95 96
#include "machmode.def"
};

#undef DEF_MACHMODE

/* Indexed by machine mode, gives the length of the mode's subunit.
   GET_MODE_UNIT_SIZE uses this.  */

97
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  UNIT,
Jim Wilson committed
98

99
const unsigned char mode_unit_size[NUM_MACHINE_MODES] = {
Jim Wilson committed
100 101 102 103 104 105 106 107 108
#include "machmode.def"		/* machine modes are documented here */
};

#undef DEF_MACHMODE

/* Indexed by machine mode, gives next wider natural mode
   (QI -> HI -> SI -> DI, etc.)  Widening multiply instructions
   use this.  */

109
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  \
110
  (unsigned char) WIDER,
Jim Wilson committed
111

112
const unsigned char mode_wider_mode[NUM_MACHINE_MODES] = {
Jim Wilson committed
113 114 115 116 117
#include "machmode.def"		/* machine modes are documented here */
};

#undef DEF_MACHMODE

118
#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  \
119
  ((BITSIZE) >= HOST_BITS_PER_WIDE_INT) ? ~(unsigned HOST_WIDE_INT) 0 : ((unsigned HOST_WIDE_INT) 1 << (BITSIZE)) - 1,
120 121 122

/* Indexed by machine mode, gives mask of significant bits in mode.  */

123
const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES] = {
124 125 126
#include "machmode.def"
};

127 128 129 130 131 132 133 134 135 136 137
#undef DEF_MACHMODE

#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) INNER,

/* Indexed by machine mode, gives the mode of the inner elements in a
   vector type.  */

const enum machine_mode inner_mode_array[NUM_MACHINE_MODES] = {
#include "machmode.def"
};

138 139
/* Indexed by mode class, gives the narrowest mode for each class.
   The Q modes are always of width 1 (2 for complex) - it is impossible
140 141 142 143 144 145
   for any mode to be narrower.

   Note that we use QImode instead of BImode for MODE_INT, since
   otherwise the middle end will try to use it for bitfields in
   structures and the like, which we do not want.  Only the target
   md file should generate BImode widgets.  */
146 147 148 149 150 151 152 153

const enum machine_mode class_narrowest_mode[(int) MAX_MODE_CLASS] = {
    /* MODE_RANDOM */		VOIDmode,
    /* MODE_INT */		QImode,
    /* MODE_FLOAT */		QFmode,
    /* MODE_PARTIAL_INT */	PQImode,
    /* MODE_CC */		CCmode,
    /* MODE_COMPLEX_INT */	CQImode,
Bernd Schmidt committed
154 155 156
    /* MODE_COMPLEX_FLOAT */	QCmode,
    /* MODE_VECTOR_INT */	V2QImode,
    /* MODE_VECTOR_FLOAT */	V2SFmode
157
};
158

159

Jim Wilson committed
160 161
/* Indexed by rtx code, gives a sequence of operand-types for
   rtx's of that code.  The sequence is a C string in which
162
   each character describes one operand.  */
Jim Wilson committed
163

164
const char * const rtx_format[NUM_RTX_CODE] = {
Jim Wilson committed
165 166 167 168 169 170 171
  /* "*" undefined.
         can cause a warning message
     "0" field is unused (or used in a phase-dependent manner)
         prints nothing
     "i" an integer
         prints the integer
     "n" like "i", but prints entries from `note_insn_name'
Charles Hannum committed
172 173
     "w" an integer of width HOST_BITS_PER_WIDE_INT
         prints the integer
Jim Wilson committed
174 175 176 177
     "s" a pointer to a string
         prints the string
     "S" like "s", but optional:
	 the containing rtx may end before this operand
178 179
     "T" like "s", but treated specially by the RTL reader;
         only found in machine description patterns.
Jim Wilson committed
180 181 182 183 184 185 186
     "e" a pointer to an rtl expression
         prints the expression
     "E" a pointer to a vector that points to a number of rtl expressions
         prints a list of the rtl expressions
     "V" like "E", but optional:
	 the containing rtx may end before this operand
     "u" a pointer to another insn
187 188
         prints the uid of the insn.
     "b" is a pointer to a bitmap header.
189
     "t" is a tree pointer.  */
Jim Wilson committed
190 191 192 193 194 195 196 197 198

#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   FORMAT ,
#include "rtl.def"		/* rtl expressions are defined here */
#undef DEF_RTL_EXPR
};

/* Indexed by rtx code, gives a character representing the "class" of
   that rtx code.  See rtl.def for documentation on the defined classes.  */

199
const char rtx_class[NUM_RTX_CODE] = {
200
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   CLASS,
Jim Wilson committed
201 202 203 204 205 206
#include "rtl.def"		/* rtl expressions are defined here */
#undef DEF_RTL_EXPR
};

/* Names for kinds of NOTEs and REG_NOTEs.  */

207
const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS] =
208
{
209
  "", "NOTE_INSN_DELETED",
210 211 212
  "NOTE_INSN_BLOCK_BEG", "NOTE_INSN_BLOCK_END",
  "NOTE_INSN_LOOP_BEG", "NOTE_INSN_LOOP_END",
  "NOTE_INSN_LOOP_CONT", "NOTE_INSN_LOOP_VTOP",
213
  "NOTE_INSN_LOOP_END_TOP_COND", "NOTE_INSN_FUNCTION_END",
214 215 216
  "NOTE_INSN_PROLOGUE_END", "NOTE_INSN_EPILOGUE_BEG",
  "NOTE_INSN_DELETED_LABEL", "NOTE_INSN_FUNCTION_BEG",
  "NOTE_INSN_EH_REGION_BEG", "NOTE_INSN_EH_REGION_END",
217
  "NOTE_INSN_REPEATED_LINE_NUMBER",
218 219
  "NOTE_INSN_BASIC_BLOCK", "NOTE_INSN_EXPECTED_VALUE",
  "NOTE_INSN_PREDICTION"
220 221 222 223 224 225 226 227 228 229
};

const char * const reg_note_name[] =
{
  "", "REG_DEAD", "REG_INC", "REG_EQUIV", "REG_EQUAL",
  "REG_WAS_0", "REG_RETVAL", "REG_LIBCALL", "REG_NONNEG",
  "REG_NO_CONFLICT", "REG_UNUSED", "REG_CC_SETTER", "REG_CC_USER",
  "REG_LABEL", "REG_DEP_ANTI", "REG_DEP_OUTPUT", "REG_BR_PROB",
  "REG_EXEC_COUNT", "REG_NOALIAS", "REG_SAVE_AREA", "REG_BR_PRED",
  "REG_FRAME_RELATED_EXPR", "REG_EH_CONTEXT", "REG_EH_REGION",
230
  "REG_SAVE_NOTE", "REG_MAYBE_DEAD", "REG_NORETURN",
231 232
  "REG_NON_LOCAL_GOTO", "REG_SETJMP", "REG_ALWAYS_RETURN",
  "REG_VTABLE_REF"
233
};
Jim Wilson committed
234

Jeff Law committed
235

Jim Wilson committed
236 237 238 239 240 241 242 243
/* Allocate an rtx vector of N elements.
   Store the length, and initialize all elements to zero.  */

rtvec
rtvec_alloc (n)
     int n;
{
  rtvec rt;
244

Mark Mitchell committed
245
  rt = ggc_alloc_rtvec (n);
246 247
  /* clear out the vector */
  memset (&rt->elem[0], 0, n * sizeof (rtx));
Jim Wilson committed
248

249
  PUT_NUM_ELEM (rt, n);
Jim Wilson committed
250 251 252 253 254 255 256 257 258 259 260
  return rt;
}

/* Allocate an rtx of code CODE.  The CODE is stored in the rtx;
   all the rest is initialized to zero.  */

rtx
rtx_alloc (code)
  RTX_CODE code;
{
  rtx rt;
261
  int n = GET_RTX_LENGTH (code);
Jim Wilson committed
262

Mark Mitchell committed
263
  rt = ggc_alloc_rtx (n);
264

265 266 267
  /* We want to clear everything up to the FLD array.  Normally, this
     is one int, but we don't want to assume that and it isn't very
     portable anyway; this is.  */
268

269
  memset (rt, 0, sizeof (struct rtx_def) - sizeof (rtunion));
Jim Wilson committed
270 271 272
  PUT_CODE (rt, code);
  return rt;
}
273

Jim Wilson committed
274 275 276 277 278 279 280

/* Create a new copy of an rtx.
   Recursively copies the operands of the rtx,
   except for those few rtx codes that are sharable.  */

rtx
copy_rtx (orig)
281
     rtx orig;
Jim Wilson committed
282
{
283 284 285 286
  rtx copy;
  int i, j;
  RTX_CODE code;
  const char *format_ptr;
Jim Wilson committed
287 288 289 290 291 292 293 294 295

  code = GET_CODE (orig);

  switch (code)
    {
    case REG:
    case QUEUED:
    case CONST_INT:
    case CONST_DOUBLE:
296
    case CONST_VECTOR:
Jim Wilson committed
297 298 299 300
    case SYMBOL_REF:
    case CODE_LABEL:
    case PC:
    case CC0:
301
    case SCRATCH:
Mike Stump committed
302
      /* SCRATCH must be shared because they represent distinct values.  */
303
    case ADDRESSOF:
Jim Wilson committed
304
      return orig;
305 306 307 308 309 310 311 312 313 314

    case CONST:
      /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
	 a LABEL_REF, it isn't sharable.  */
      if (GET_CODE (XEXP (orig, 0)) == PLUS
	  && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
	  && GET_CODE (XEXP (XEXP (orig, 0), 1)) == CONST_INT)
	return orig;
      break;

315 316 317 318
      /* A MEM with a constant address is not sharable.  The problem is that
	 the constant address may need to be reloaded.  If the mem is shared,
	 then reloading one copy of this mem will cause all copies to appear
	 to have been reloaded.  */
319 320 321

    default:
      break;
Jim Wilson committed
322 323 324
    }

  copy = rtx_alloc (code);
325 326 327 328 329

  /* Copy the various flags, and other information.  We assume that
     all fields need copying, and then clear the fields that should
     not be copied.  That is the sensible default behavior, and forces
     us to explicitly document why we are *not* copying a flag.  */
Kaveh R. Ghazi committed
330
  memcpy (copy, orig, sizeof (struct rtx_def) - sizeof (rtunion));
331 332 333

  /* We do not copy the USED flag, which is used as a mark bit during
     walks over the RTL.  */
334
  RTX_FLAG (copy, used) = 0;
335

336
  /* We do not copy FRAME_RELATED for INSNs.  */
337
  if (GET_RTX_CLASS (code) == 'i')
338 339 340
    RTX_FLAG (copy, frame_related) = 0;
  RTX_FLAG (copy, jump) = RTX_FLAG (orig, jump);
  RTX_FLAG (copy, call) = RTX_FLAG (orig, call);
341

Jim Wilson committed
342 343 344 345
  format_ptr = GET_RTX_FORMAT (GET_CODE (copy));

  for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
    {
346
      copy->fld[i] = orig->fld[i];
Jim Wilson committed
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
      switch (*format_ptr++)
	{
	case 'e':
	  if (XEXP (orig, i) != NULL)
	    XEXP (copy, i) = copy_rtx (XEXP (orig, i));
	  break;

	case 'E':
	case 'V':
	  if (XVEC (orig, i) != NULL)
	    {
	      XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
	      for (j = 0; j < XVECLEN (copy, i); j++)
		XVECEXP (copy, i, j) = copy_rtx (XVECEXP (orig, i, j));
	    }
	  break;

364
	case 't':
Charles Hannum committed
365 366 367 368
	case 'w':
	case 'i':
	case 's':
	case 'S':
369
	case 'T':
370
	case 'u':
371
	case 'B':
372
	case '0':
373
	  /* These are left unchanged.  */
374
	  break;
375

Charles Hannum committed
376 377
	default:
	  abort ();
Jim Wilson committed
378 379 380 381
	}
    }
  return copy;
}
382 383

/* Create a new copy of an rtx.  Only copy just one level.  */
384

385 386 387 388
rtx
shallow_copy_rtx (orig)
     rtx orig;
{
389 390 391
  int i;
  RTX_CODE code = GET_CODE (orig);
  rtx copy = rtx_alloc (code);
392 393

  PUT_MODE (copy, GET_MODE (orig));
394 395 396 397 398
  RTX_FLAG (copy, in_struct) = RTX_FLAG (orig, in_struct);
  RTX_FLAG (copy, volatil) = RTX_FLAG (orig, volatil);
  RTX_FLAG (copy, unchanging) = RTX_FLAG (orig, unchanging);
  RTX_FLAG (copy, integrated) = RTX_FLAG (orig, integrated);
  RTX_FLAG (copy, frame_related) = RTX_FLAG (orig, frame_related);
399 400 401 402 403 404

  for (i = 0; i < GET_RTX_LENGTH (code); i++)
    copy->fld[i] = orig->fld[i];

  return copy;
}
405 406 407 408 409 410 411 412

/* Return the alignment of MODE. This will be bounded by 1 and
   BIGGEST_ALIGNMENT.  */

unsigned int
get_mode_alignment (mode)
     enum machine_mode mode;
{
413 414 415 416 417 418 419
  unsigned int alignment;

  if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
      || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
    alignment = GET_MODE_UNIT_SIZE (mode);
  else
    alignment = GET_MODE_SIZE (mode);
420

421 422 423 424 425 426 427
  /* Extract the LSB of the size.  */
  alignment = alignment & -alignment;
  alignment *= BITS_PER_UNIT;

  alignment = MIN (BIGGEST_ALIGNMENT, MAX (1, alignment));
  return alignment;
}
Jim Wilson committed
428

429 430
/* This is 1 until after the rtl generation pass.  */
int rtx_equal_function_value_matters;
431 432 433

/* Nonzero when we are generating CONCATs.  */
int generating_concat_p;
434 435 436 437 438 439 440 441

/* Return 1 if X and Y are identical-looking rtx's.
   This is the Lisp function EQUAL for rtx arguments.  */

int
rtx_equal_p (x, y)
     rtx x, y;
{
442 443 444 445
  int i;
  int j;
  enum rtx_code code;
  const char *fmt;
446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462

  if (x == y)
    return 1;
  if (x == 0 || y == 0)
    return 0;

  code = GET_CODE (x);
  /* Rtx's of different codes cannot be equal.  */
  if (code != GET_CODE (y))
    return 0;

  /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
     (REG:SI x) and (REG:HI x) are NOT equivalent.  */

  if (GET_MODE (x) != GET_MODE (y))
    return 0;

463 464 465 466
  /* Some RTL can be compared nonrecursively.  */
  switch (code)
    {
    case REG:
467 468 469 470 471
      /* Until rtl generation is complete, don't consider a reference
	 to the return register of the current function the same as
	 the return from a called function.  This eases the job of
	 function integration.  Once the distinction is no longer
	 needed, they can be considered equivalent.  */
472 473 474 475 476 477 478 479 480 481 482 483 484
      return (REGNO (x) == REGNO (y)
	      && (! rtx_equal_function_value_matters
		  || REG_FUNCTION_VALUE_P (x) == REG_FUNCTION_VALUE_P (y)));

    case LABEL_REF:
      return XEXP (x, 0) == XEXP (y, 0);

    case SYMBOL_REF:
      return XSTR (x, 0) == XSTR (y, 0);

    case SCRATCH:
    case CONST_DOUBLE:
    case CONST_INT:
485
    case CONST_VECTOR:
486 487 488 489 490
      return 0;

    default:
      break;
    }
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529

  /* Compare the elements.  If any pair of corresponding elements
     fail to match, return 0 for the whole things.  */

  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      switch (fmt[i])
	{
	case 'w':
	  if (XWINT (x, i) != XWINT (y, i))
	    return 0;
	  break;

	case 'n':
	case 'i':
	  if (XINT (x, i) != XINT (y, i))
	    return 0;
	  break;

	case 'V':
	case 'E':
	  /* Two vectors must have the same length.  */
	  if (XVECLEN (x, i) != XVECLEN (y, i))
	    return 0;

	  /* And the corresponding elements must match.  */
	  for (j = 0; j < XVECLEN (x, i); j++)
	    if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
	      return 0;
	  break;

	case 'e':
	  if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
	    return 0;
	  break;

	case 'S':
	case 's':
530 531 532
	  if ((XSTR (x, i) || XSTR (y, i))
	      && (! XSTR (x, i) || ! XSTR (y, i)
		  || strcmp (XSTR (x, i), XSTR (y, i))))
533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553
	    return 0;
	  break;

	case 'u':
	  /* These are just backpointers, so they don't matter.  */
	  break;

	case '0':
	case 't':
	  break;

	  /* It is believed that rtx's at this level will never
	     contain anything but integers and other rtx's,
	     except for within LABEL_REFs and SYMBOL_REFs.  */
	default:
	  abort ();
	}
    }
  return 1;
}

554
#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
555 556 557 558 559 560 561 562
void
rtl_check_failed_bounds (r, n, file, line, func)
    rtx r;
    int n;
    const char *file;
    int line;
    const char *func;
{
563 564 565 566
  internal_error
    ("RTL check: access of elt %d of `%s' with last elt %d in %s, at %s:%d",
     n, GET_RTX_NAME (GET_CODE (r)), GET_RTX_LENGTH (GET_CODE (r)) - 1,
     func, trim_filename (file), line);
567 568 569 570 571 572 573 574 575 576 577
}

void
rtl_check_failed_type1 (r, n, c1, file, line, func)
    rtx r;
    int n;
    int c1;
    const char *file;
    int line;
    const char *func;
{
578 579 580 581
  internal_error
    ("RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d",
     n, c1, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
     func, trim_filename (file), line);
582 583 584 585 586 587 588 589 590 591 592 593
}

void
rtl_check_failed_type2 (r, n, c1, c2, file, line, func)
    rtx r;
    int n;
    int c1;
    int c2;
    const char *file;
    int line;
    const char *func;
{
594 595 596 597
  internal_error
    ("RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d",
     n, c1, c2, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
     func, trim_filename (file), line);
598 599
}

600 601 602 603 604 605 606 607
void
rtl_check_failed_code1 (r, code, file, line, func)
    rtx r;
    enum rtx_code code;
    const char *file;
    int line;
    const char *func;
{
608 609 610
  internal_error ("RTL check: expected code `%s', have `%s' in %s, at %s:%d",
		  GET_RTX_NAME (code), GET_RTX_NAME (GET_CODE (r)), func,
		  trim_filename (file), line);
611 612 613 614 615 616 617 618 619 620
}

void
rtl_check_failed_code2 (r, code1, code2, file, line, func)
    rtx r;
    enum rtx_code code1, code2;
    const char *file;
    int line;
    const char *func;
{
621 622 623
  internal_error
    ("RTL check: expected code `%s' or `%s', have `%s' in %s, at %s:%d",
     GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (GET_CODE (r)),
624
     func, trim_filename (file), line);
625 626
}

627 628 629 630 631 632 633 634 635
/* XXX Maybe print the vector?  */
void
rtvec_check_failed_bounds (r, n, file, line, func)
    rtvec r;
    int n;
    const char *file;
    int line;
    const char *func;
{
636 637 638
  internal_error
    ("RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d",
     n, GET_NUM_ELEM (r) - 1, func, trim_filename (file), line);
639
}
640
#endif /* ENABLE_RTL_CHECKING */
641 642 643

#if defined ENABLE_RTL_FLAG_CHECKING
void
644 645
rtl_check_failed_flag (name, r, file, line, func)
    const char *name;
646 647 648 649 650 651
    rtx r;
    const char *file;
    int line;
    const char *func;
{
  internal_error
652 653
    ("RTL flag check: %s used with unexpected rtx code `%s' in %s, at %s:%d",
     name, GET_RTX_NAME (GET_CODE (r)), func, trim_filename (file), line);
654 655
}
#endif /* ENABLE_RTL_FLAG_CHECKING */