rtl.h 84.6 KB
Newer Older
1
/* Register Transfer Language (RTL) definitions for GCC
2
   Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 4
   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
   Free Software Foundation, Inc.
Jim Wilson committed
5

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

8 9
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
10
Software Foundation; either version 3, or (at your option) any later
11
version.
Jim Wilson committed
12

13 14 15 16
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
17 18

You should have received a copy of the GNU General Public License
19 20
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
Jim Wilson committed
21

22 23
#ifndef GCC_RTL_H
#define GCC_RTL_H
24

25
#include "statistics.h"
Jim Wilson committed
26
#include "machmode.h"
27
#include "input.h"
28
#include "real.h"
29
#include "vec.h"
Jim Wilson committed
30 31

#undef FFS  /* Some systems predefine this symbol; don't let it interfere.  */
32
#undef FLOAT /* Likewise.  */
33
#undef ABS /* Likewise.  */
Richard Stallman committed
34
#undef PC /* Likewise.  */
Jim Wilson committed
35

36
/* Value used by some passes to "recognize" noop moves as valid
Kazu Hirata committed
37
 instructions.  */
38 39
#define NOOP_MOVE_INSN_CODE	INT_MAX

Jim Wilson committed
40 41 42 43 44 45 46 47 48
/* Register Transfer Language EXPRESSIONS CODES */

#define RTX_CODE	enum rtx_code
enum rtx_code  {

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

49
  LAST_AND_UNUSED_RTX_CODE};	/* A convenient way to get a value for
Jim Wilson committed
50
				   NUM_RTX_CODE.
51
				   Assumes default enum value assignment.  */
Jim Wilson committed
52

Kazu Hirata committed
53
#define NUM_RTX_CODE ((int) LAST_AND_UNUSED_RTX_CODE)
Jim Wilson committed
54 55
				/* The cast here, saves many elsewhere.  */

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
/* Register Transfer Language EXPRESSIONS CODE CLASSES */

enum rtx_class  {
  /* We check bit 0-1 of some rtx class codes in the predicates below.  */

  /* Bit 0 = comparison if 0, arithmetic is 1
     Bit 1 = 1 if commutative.  */
  RTX_COMPARE,		/* 0 */
  RTX_COMM_COMPARE,
  RTX_BIN_ARITH,
  RTX_COMM_ARITH,

  /* Must follow the four preceding values.  */
  RTX_UNARY,		/* 4 */

  RTX_EXTRA,
  RTX_MATCH,
  RTX_INSN,

  /* Bit 0 = 1 if constant.  */
  RTX_OBJ,		/* 8 */
  RTX_CONST_OBJ,

  RTX_TERNARY,
  RTX_BITFIELD_OPS,
  RTX_AUTOINC
};

#define RTX_OBJ_MASK (~1)
#define RTX_OBJ_RESULT (RTX_OBJ & RTX_OBJ_MASK)
#define RTX_COMPARE_MASK (~1)
#define RTX_COMPARE_RESULT (RTX_COMPARE & RTX_COMPARE_MASK)
#define RTX_ARITHMETIC_MASK (~1)
#define RTX_ARITHMETIC_RESULT (RTX_COMM_ARITH & RTX_ARITHMETIC_MASK)
#define RTX_BINARY_MASK (~3)
#define RTX_BINARY_RESULT (RTX_COMPARE & RTX_BINARY_MASK)
#define RTX_COMMUTATIVE_MASK (~2)
#define RTX_COMMUTATIVE_RESULT (RTX_COMM_COMPARE & RTX_COMMUTATIVE_MASK)
#define RTX_NON_COMMUTATIVE_RESULT (RTX_COMPARE & RTX_COMMUTATIVE_MASK)

96
extern const unsigned char rtx_length[NUM_RTX_CODE];
Mike Stump committed
97
#define GET_RTX_LENGTH(CODE)		(rtx_length[(int) (CODE)])
Jim Wilson committed
98

99
extern const char * const rtx_name[NUM_RTX_CODE];
Mike Stump committed
100
#define GET_RTX_NAME(CODE)		(rtx_name[(int) (CODE)])
Jim Wilson committed
101

102
extern const char * const rtx_format[NUM_RTX_CODE];
Mike Stump committed
103
#define GET_RTX_FORMAT(CODE)		(rtx_format[(int) (CODE)])
Jim Wilson committed
104

105
extern const enum rtx_class rtx_class[NUM_RTX_CODE];
Mike Stump committed
106
#define GET_RTX_CLASS(CODE)		(rtx_class[(int) (CODE)])
Geoffrey Keating committed
107

108
extern const unsigned char rtx_code_size[NUM_RTX_CODE];
Geoffrey Keating committed
109
extern const unsigned char rtx_next[NUM_RTX_CODE];
Jim Wilson committed
110

111 112 113 114 115 116 117 118
/* The flags and bitfields of an ADDR_DIFF_VEC.  BASE is the base label
   relative to which the offsets are calculated, as explained in rtl.def.  */
typedef struct
{
  /* Set at the start of shorten_branches - ONLY WHEN OPTIMIZING - : */
  unsigned min_align: 8;
  /* Flags: */
  unsigned base_after_vec: 1; /* BASE is after the ADDR_DIFF_VEC.  */
119 120 121 122 123 124 125 126
  unsigned min_after_vec: 1;  /* minimum address target label is
				 after the ADDR_DIFF_VEC.  */
  unsigned max_after_vec: 1;  /* maximum address target label is
				 after the ADDR_DIFF_VEC.  */
  unsigned min_after_base: 1; /* minimum address target label is
				 after BASE.  */
  unsigned max_after_base: 1; /* maximum address target label is
				 after BASE.  */
127 128 129 130 131 132
  /* Set by the actual branch shortening process - ONLY WHEN OPTIMIZING - : */
  unsigned offset_unsigned: 1; /* offsets have to be treated as unsigned.  */
  unsigned : 2;
  unsigned scale : 8;
} addr_diff_vec_flags;

133 134 135 136
/* Structure used to describe the attributes of a MEM.  These are hashed
   so MEMs that the same attributes share a data structure.  This means
   they cannot be modified in place.  If any element is nonzero, it means
   the value of the corresponding attribute is unknown.  */
137 138 139
/* ALIGN and SIZE are the alignment and size of the MEM itself,
   while EXPR can describe a larger underlying object, which might have a
   stricter alignment; OFFSET is the offset of the MEM within that object.  */
140
typedef struct mem_attrs GTY(())
141
{
Kazu Hirata committed
142
  HOST_WIDE_INT alias;		/* Memory alias set.  */
143
  tree expr;			/* expr corresponding to MEM.  */
Kazu Hirata committed
144
  rtx offset;			/* Offset from start of DECL, as CONST_INT.  */
145
  rtx size;			/* Size in bytes, as a CONST_INT.  */
146
  unsigned int align;		/* Alignment of MEM in bits.  */
147 148
} mem_attrs;

149 150 151 152 153 154 155 156 157
/* Structure used to describe the attributes of a REG in similar way as
   mem_attrs does for MEM above.  */

typedef struct reg_attrs GTY(())
{
  tree decl;			/* decl corresponding to REG.  */
  HOST_WIDE_INT offset;		/* Offset from start of DECL.  */
} reg_attrs;

Jim Wilson committed
158 159
/* Common union for an element of an rtx.  */

Geoffrey Keating committed
160
union rtunion_def
Jim Wilson committed
161
{
162 163 164 165 166 167
  int rt_int;
  unsigned int rt_uint;
  const char *rt_str;
  rtx rt_rtx;
  rtvec rt_rtvec;
  enum machine_mode rt_type;
168
  addr_diff_vec_flags rt_addr_diff_vec_flags;
169
  struct cselib_val_struct *rt_cselib;
170 171 172 173 174
  struct bitmap_head_def *rt_bit;
  tree rt_tree;
  struct basic_block_def *rt_bb;
  mem_attrs *rt_mem;
  reg_attrs *rt_reg;
175
  struct constant_descriptor_rtx *rt_constant;
Geoffrey Keating committed
176 177
};
typedef union rtunion_def rtunion;
Jim Wilson committed
178

179 180
/* This structure remembers the position of a SYMBOL_REF within an
   object_block structure.  A SYMBOL_REF only provides this information
181
   if SYMBOL_REF_HAS_BLOCK_INFO_P is true.  */
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
struct block_symbol GTY(()) {
  /* The usual SYMBOL_REF fields.  */
  rtunion GTY ((skip)) fld[3];

  /* The block that contains this object.  */
  struct object_block *block;

  /* The offset of this object from the start of its block.  It is negative
     if the symbol has not yet been assigned an offset.  */
  HOST_WIDE_INT offset;
};

DEF_VEC_P(rtx);
DEF_VEC_ALLOC_P(rtx,heap);
DEF_VEC_ALLOC_P(rtx,gc);

/* Describes a group of objects that are to be placed together in such
   a way that their relative positions are known.  */
struct object_block GTY(())
{
  /* The section in which these objects should be placed.  */
  section *sect;

  /* The alignment of the first object, measured in bits.  */
  unsigned int alignment;

  /* The total size of the objects, measured in bytes.  */
  HOST_WIDE_INT size;

  /* The SYMBOL_REFs for each object.  The vector is sorted in
     order of increasing offset and the following conditions will
     hold for each element X:

215
	 SYMBOL_REF_HAS_BLOCK_INFO_P (X)
216 217 218 219 220 221 222 223 224
	 !SYMBOL_REF_ANCHOR_P (X)
	 SYMBOL_REF_BLOCK (X) == [address of this structure]
	 SYMBOL_REF_BLOCK_OFFSET (X) >= 0.  */
  VEC(rtx,gc) *objects;

  /* All the anchor SYMBOL_REFs used to address these objects, sorted
     in order of increasing offset, and then increasing TLS model.
     The following conditions will hold for each element X in this vector:

225
	 SYMBOL_REF_HAS_BLOCK_INFO_P (X)
226 227 228 229 230 231
	 SYMBOL_REF_ANCHOR_P (X)
	 SYMBOL_REF_BLOCK (X) == [address of this structure]
	 SYMBOL_REF_BLOCK_OFFSET (X) >= 0.  */
  VEC(rtx,gc) *anchors;
};

Jim Wilson committed
232 233
/* RTL expression ("rtx").  */

234
struct rtx_def GTY((chain_next ("RTX_NEXT (&%h)"),
Geoffrey Keating committed
235
		    chain_prev ("RTX_PREV (&%h)")))
Jim Wilson committed
236 237
{
  /* The kind of expression this is.  */
238
  ENUM_BITFIELD(rtx_code) code: 16;
239

Jim Wilson committed
240
  /* The kind of value the expression has.  */
241 242
  ENUM_BITFIELD(machine_mode) mode : 8;

243 244 245
  /* 1 in a MEM if we should keep the alias set for this mem unchanged
     when we access a component.
     1 in a CALL_INSN if it is a sibling call.
246 247
     1 in a SET that is for a return.
     In a CODE_LABEL, part of the two-bit alternate entry field.  */
Jim Wilson committed
248
  unsigned int jump : 1;
249 250
  /* In a CODE_LABEL, part of the two-bit alternate entry field.
     1 in a MEM if it cannot trap.  */
Jim Wilson committed
251
  unsigned int call : 1;
252 253 254
  /* 1 in a REG, MEM, or CONCAT if the value is set at most once, anywhere.
     1 in a SUBREG if it references an unsigned object whose mode has been
     from a promoted to a wider mode.
Jim Wilson committed
255 256
     1 in a SYMBOL_REF if it addresses something in the per-function
     constants pool.
257
     1 in a CALL_INSN, NOTE, or EXPR_LIST for a const or pure call.
258
     1 in a JUMP_INSN, CALL_INSN, or INSN of an annulling branch.  */
Jim Wilson committed
259
  unsigned int unchanging : 1;
260 261 262 263
  /* 1 in a MEM or ASM_OPERANDS expression if the memory reference is volatile.
     1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL, BARRIER, or NOTE
     if it has been deleted.
     1 in a REG expression if corresponds to a variable declared by the user,
Jim Wilson committed
264
     0 for an internally generated temporary.
265 266 267
     1 in a SUBREG with a negative value.
     1 in a LABEL_REF or in a REG_LABEL note for a non-local label.
     In a SYMBOL_REF, this flag is used for machine-specific purposes.  */
Jim Wilson committed
268
  unsigned int volatil : 1;
269
  /* 1 in a MEM referring to a field of an aggregate.
Jim Wilson committed
270 271 272
     0 if the MEM was a variable or the result of a * operator in C;
     1 if it was the result of a . or -> operator (on a struct) in C.
     1 in a REG if the register is used only in exit code a loop.
273
     1 in a SUBREG expression if was generated from a variable with a
274
     promoted mode.
Jim Wilson committed
275 276
     1 in a CODE_LABEL if the label is used for nonlocal gotos
     and must not be deleted even if its count is zero.
277 278
     1 in an INSN, JUMP_INSN or CALL_INSN if this insn must be scheduled
     together with the preceding insn.  Valid only within sched.
Jim Wilson committed
279 280
     1 in an INSN, JUMP_INSN, or CALL_INSN if insn is in a delay slot and
     from the target of a branch.  Valid from reorg until end of compilation;
281
     cleared before used.  */
Jim Wilson committed
282
  unsigned int in_struct : 1;
283 284
  /* At the end of RTL generation, 1 if this rtx is used.  This is used for
     copying shared structure.  See `unshare_all_rtl'.
285
     In a REG, this is not needed for that purpose, and used instead
Jim Wilson committed
286
     in `leaf_renumber_regs_insn'.
287
     1 in a SYMBOL_REF, means that emit_library_call
Jim Wilson committed
288 289
     has used it as the function.  */
  unsigned int used : 1;
290
  /* 1 in an INSN or a SET if this rtx is related to the call frame,
291
     either changing how we compute the frame address or saving and
292
     restoring registers in the prologue and epilogue.
293
     1 in a REG or MEM if it is a pointer.
294 295
     1 in a SYMBOL_REF if it addresses something in the per-function
     constant string pool.  */
x  
Jason Merrill committed
296
  unsigned frame_related : 1;
297
  /* 1 in a REG or PARALLEL that is the current function's return value.
298
     1 in a MEM if it refers to a scalar.
299 300
     1 in a SYMBOL_REF for a weak symbol.  */
  unsigned return_val : 1;
301

Jim Wilson committed
302 303 304
  /* The first element of the operands of this rtx.
     The number of operands and their types are controlled
     by the `code' field, according to rtl.def.  */
305 306 307
  union u {
    rtunion fld[1];
    HOST_WIDE_INT hwint[1];
308
    struct block_symbol block_sym;
309
    struct real_value rv;
310
  } GTY ((special ("rtx_def"), desc ("GET_CODE (&%0)"))) u;
311
};
Jim Wilson committed
312

313 314 315 316
/* The size in bytes of an rtx header (code, mode and flags).  */
#define RTX_HDR_SIZE offsetof (struct rtx_def, u)

/* The size in bytes of an rtx with code CODE.  */
317
#define RTX_CODE_SIZE(CODE) rtx_code_size[CODE]
318

Jim Wilson committed
319 320
#define NULL_RTX (rtx) 0

Geoffrey Keating committed
321 322 323 324 325 326 327
/* The "next" and "previous" RTX, relative to this one.  */

#define RTX_NEXT(X) (rtx_next[GET_CODE (X)] == 0 ? NULL			\
		     : *(rtx *)(((char *)X) + rtx_next[GET_CODE (X)]))

/* FIXME: the "NEXT_INSN (PREV_INSN (X)) == X" condition shouldn't be needed.
 */
328 329 330 331
#define RTX_PREV(X) ((INSN_P (X)       			\
                      || NOTE_P (X)       		\
                      || BARRIER_P (X)        		\
                      || LABEL_P (X))    		\
Geoffrey Keating committed
332 333 334 335
                     && PREV_INSN (X) != NULL           \
                     && NEXT_INSN (PREV_INSN (X)) == X  \
                     ? PREV_INSN (X) : NULL)

Jim Wilson committed
336 337
/* Define macros to access the `code' field of the rtx.  */

338
#define GET_CODE(RTX)	    ((enum rtx_code) (RTX)->code)
339
#define PUT_CODE(RTX, CODE) ((RTX)->code = (CODE))
Jim Wilson committed
340

341
#define GET_MODE(RTX)	    ((enum machine_mode) (RTX)->mode)
342
#define PUT_MODE(RTX, MODE) ((RTX)->mode = (MODE))
Jim Wilson committed
343 344 345 346 347

/* RTL vector.  These appear inside RTX's when there is a need
   for a variable number of things.  The principle use is inside
   PARALLEL expressions.  */

348
struct rtvec_def GTY(()) {
349
  int num_elem;		/* number of elements */
350
  rtx GTY ((length ("%h.num_elem"))) elem[1];
351
};
Jim Wilson committed
352 353 354 355

#define NULL_RTVEC (rtvec) 0

#define GET_NUM_ELEM(RTVEC)		((RTVEC)->num_elem)
356
#define PUT_NUM_ELEM(RTVEC, NUM)	((RTVEC)->num_elem = (NUM))
Jim Wilson committed
357

358
/* Predicate yielding nonzero iff X is an rtx for a register.  */
Jim Wilson committed
359 360
#define REG_P(X) (GET_CODE (X) == REG)

361 362 363
/* Predicate yielding nonzero iff X is an rtx for a memory location.  */
#define MEM_P(X) (GET_CODE (X) == MEM)

364
/* Predicate yielding nonzero iff X is an rtx for a constant integer.  */
365 366
#define CONST_INT_P(X) (GET_CODE (X) == CONST_INT)

367 368 369 370 371 372
/* Predicate yielding nonzero iff X is a label insn.  */
#define LABEL_P(X) (GET_CODE (X) == CODE_LABEL)

/* Predicate yielding nonzero iff X is a jump insn.  */
#define JUMP_P(X) (GET_CODE (X) == JUMP_INSN)

373 374 375 376 377 378 379 380 381 382
/* Predicate yielding nonzero iff X is a call insn.  */
#define CALL_P(X) (GET_CODE (X) == CALL_INSN)

/* Predicate yielding nonzero iff X is an insn that cannot jump.  */
#define NONJUMP_INSN_P(X) (GET_CODE (X) == INSN)

/* Predicate yielding nonzero iff X is a real insn.  */
#define INSN_P(X) \
  (NONJUMP_INSN_P (X) || JUMP_P (X) || CALL_P (X))

383 384 385 386 387 388 389 390 391 392 393
/* Predicate yielding nonzero iff X is a note insn.  */
#define NOTE_P(X) (GET_CODE (X) == NOTE)

/* Predicate yielding nonzero iff X is a barrier insn.  */
#define BARRIER_P(X) (GET_CODE (X) == BARRIER)

/* Predicate yielding nonzero iff X is a data for a jump table.  */
#define JUMP_TABLE_DATA_P(INSN) \
  (JUMP_P (INSN) && (GET_CODE (PATTERN (INSN)) == ADDR_VEC || \
		     GET_CODE (PATTERN (INSN)) == ADDR_DIFF_VEC))

394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440
/* 1 if X is a unary operator.  */

#define UNARY_P(X)   \
  (GET_RTX_CLASS (GET_CODE (X)) == RTX_UNARY)

/* 1 if X is a binary operator.  */

#define BINARY_P(X)   \
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_BINARY_MASK) == RTX_BINARY_RESULT)

/* 1 if X is an arithmetic operator.  */

#define ARITHMETIC_P(X)   \
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_ARITHMETIC_MASK)			\
    == RTX_ARITHMETIC_RESULT)

/* 1 if X is an arithmetic operator.  */

#define COMMUTATIVE_ARITH_P(X)   \
  (GET_RTX_CLASS (GET_CODE (X)) == RTX_COMM_ARITH)

/* 1 if X is a commutative arithmetic operator or a comparison operator.
   These two are sometimes selected together because it is possible to
   swap the two operands.  */

#define SWAPPABLE_OPERANDS_P(X)   \
  ((1 << GET_RTX_CLASS (GET_CODE (X)))					\
    & ((1 << RTX_COMM_ARITH) | (1 << RTX_COMM_COMPARE)			\
       | (1 << RTX_COMPARE)))

/* 1 if X is a non-commutative operator.  */

#define NON_COMMUTATIVE_P(X)   \
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMMUTATIVE_MASK)		\
    == RTX_NON_COMMUTATIVE_RESULT)

/* 1 if X is a commutative operator on integers.  */

#define COMMUTATIVE_P(X)   \
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMMUTATIVE_MASK)		\
    == RTX_COMMUTATIVE_RESULT)

/* 1 if X is a relational operator.  */

#define COMPARISON_P(X)   \
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMPARE_MASK) == RTX_COMPARE_RESULT)

Jim Wilson committed
441 442 443
/* 1 if X is a constant value that is an integer.  */

#define CONSTANT_P(X)   \
444
  (GET_RTX_CLASS (GET_CODE (X)) == RTX_CONST_OBJ)
Jim Wilson committed
445

446 447 448 449
/* 1 if X can be used to represent an object.  */
#define OBJECT_P(X)							\
  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_OBJ_MASK) == RTX_OBJ_RESULT)

Jim Wilson committed
450 451
/* General accessor macros for accessing the fields of an rtx.  */

452
#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
453 454
/* The bit with a star outside the statement expr and an & inside is
   so that N can be evaluated only once.  */
455
#define RTL_CHECK1(RTX, N, C1) __extension__				\
456
(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
457
     const enum rtx_code _code = GET_CODE (_rtx);			\
458
     if (_n < 0 || _n >= GET_RTX_LENGTH (_code))			\
459 460
       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__,		\
				__FUNCTION__);				\
461
     if (GET_RTX_FORMAT(_code)[_n] != C1)				\
462 463
       rtl_check_failed_type1 (_rtx, _n, C1, __FILE__, __LINE__,	\
			       __FUNCTION__);				\
464
     &_rtx->u.fld[_n]; }))
465

466
#define RTL_CHECK2(RTX, N, C1, C2) __extension__			\
467
(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
468
     const enum rtx_code _code = GET_CODE (_rtx);			\
469
     if (_n < 0 || _n >= GET_RTX_LENGTH (_code))			\
470 471
       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__,		\
				__FUNCTION__);				\
472 473 474
     if (GET_RTX_FORMAT(_code)[_n] != C1				\
	 && GET_RTX_FORMAT(_code)[_n] != C2)				\
       rtl_check_failed_type2 (_rtx, _n, C1, C2, __FILE__, __LINE__,	\
475
			       __FUNCTION__);				\
476
     &_rtx->u.fld[_n]; }))
477

478
#define RTL_CHECKC1(RTX, N, C) __extension__				\
479
(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
480 481 482
     if (GET_CODE (_rtx) != (C))					\
       rtl_check_failed_code1 (_rtx, (C), __FILE__, __LINE__,		\
			       __FUNCTION__);				\
483
     &_rtx->u.fld[_n]; }))
484

485
#define RTL_CHECKC2(RTX, N, C1, C2) __extension__			\
486
(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
487
     const enum rtx_code _code = GET_CODE (_rtx);			\
488 489 490
     if (_code != (C1) && _code != (C2))				\
       rtl_check_failed_code2 (_rtx, (C1), (C2), __FILE__, __LINE__,	\
			       __FUNCTION__); \
491
     &_rtx->u.fld[_n]; }))
492

493
#define RTVEC_ELT(RTVEC, I) __extension__				\
494
(*({ __typeof (RTVEC) const _rtvec = (RTVEC); const int _i = (I);	\
495 496
     if (_i < 0 || _i >= GET_NUM_ELEM (_rtvec))				\
       rtvec_check_failed_bounds (_rtvec, _i, __FILE__, __LINE__,	\
497
				  __FUNCTION__);			\
498 499
     &_rtvec->elem[_i]; }))

500
#define XWINT(RTX, N) __extension__					\
501
(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
502 503 504 505 506 507 508 509 510 511
     const enum rtx_code _code = GET_CODE (_rtx);			\
     if (_n < 0 || _n >= GET_RTX_LENGTH (_code))			\
       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__,		\
				__FUNCTION__);				\
     if (GET_RTX_FORMAT(_code)[_n] != 'w')				\
       rtl_check_failed_type1 (_rtx, _n, 'w', __FILE__, __LINE__,	\
			       __FUNCTION__);				\
     &_rtx->u.hwint[_n]; }))

#define XCWINT(RTX, N, C) __extension__					\
512
(*({ __typeof (RTX) const _rtx = (RTX);					\
513 514 515 516 517
     if (GET_CODE (_rtx) != (C))					\
       rtl_check_failed_code1 (_rtx, (C), __FILE__, __LINE__,		\
			       __FUNCTION__);				\
     &_rtx->u.hwint[N]; }))

518
#define XCMWINT(RTX, N, C, M) __extension__				\
519
(*({ __typeof (RTX) const _rtx = (RTX);					\
520 521 522 523 524 525
     if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) != (M))		\
       rtl_check_failed_code_mode (_rtx, (C), (M), false, __FILE__,	\
				   __LINE__, __FUNCTION__);		\
     &_rtx->u.hwint[N]; }))

#define XCNMPRV(RTX, C, M) __extension__				\
526
({ __typeof (RTX) const _rtx = (RTX);					\
527 528 529 530 531
   if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) == (M))		\
     rtl_check_failed_code_mode (_rtx, (C), (M), true, __FILE__,	\
				 __LINE__, __FUNCTION__);		\
   &_rtx->u.rv; })

532
#define BLOCK_SYMBOL_CHECK(RTX) __extension__				\
533 534
({ __typeof (RTX) const _symbol = (RTX);				\
   const unsigned int flags = RTL_CHECKC1 (_symbol, 1, SYMBOL_REF).rt_int; \
535
   if ((flags & SYMBOL_FLAG_HAS_BLOCK_INFO) == 0)			\
536 537 538 539
     rtl_check_failed_block_symbol (__FILE__, __LINE__,			\
				    __FUNCTION__);			\
   &_symbol->u.block_sym; })

540
extern void rtl_check_failed_bounds (const_rtx, int, const char *, int,
541
				     const char *)
542
    ATTRIBUTE_NORETURN;
543
extern void rtl_check_failed_type1 (const_rtx, int, int, const char *, int,
544
				    const char *)
545
    ATTRIBUTE_NORETURN;
546
extern void rtl_check_failed_type2 (const_rtx, int, int, int, const char *,
547
				    int, const char *)
548
    ATTRIBUTE_NORETURN;
549
extern void rtl_check_failed_code1 (const_rtx, enum rtx_code, const char *,
550
				    int, const char *)
551
    ATTRIBUTE_NORETURN;
552
extern void rtl_check_failed_code2 (const_rtx, enum rtx_code, enum rtx_code,
553
				    const char *, int, const char *)
554
    ATTRIBUTE_NORETURN;
555
extern void rtl_check_failed_code_mode (const_rtx, enum rtx_code, enum machine_mode,
556 557
					bool, const char *, int, const char *)
    ATTRIBUTE_NORETURN;
558 559
extern void rtl_check_failed_block_symbol (const char *, int, const char *)
    ATTRIBUTE_NORETURN;
560
extern void rtvec_check_failed_bounds (const_rtvec, int, const char *, int,
561
				       const char *)
562 563
    ATTRIBUTE_NORETURN;

564
#else   /* not ENABLE_RTL_CHECKING */
565

566 567 568 569
#define RTL_CHECK1(RTX, N, C1)      ((RTX)->u.fld[N])
#define RTL_CHECK2(RTX, N, C1, C2)  ((RTX)->u.fld[N])
#define RTL_CHECKC1(RTX, N, C)	    ((RTX)->u.fld[N])
#define RTL_CHECKC2(RTX, N, C1, C2) ((RTX)->u.fld[N])
570
#define RTVEC_ELT(RTVEC, I)	    ((RTVEC)->elem[I])
571 572
#define XWINT(RTX, N)		    ((RTX)->u.hwint[N])
#define XCWINT(RTX, N, C)	    ((RTX)->u.hwint[N])
573 574 575
#define XCMWINT(RTX, N, C, M)	    ((RTX)->u.hwint[N])
#define XCNMWINT(RTX, N, C, M)	    ((RTX)->u.hwint[N])
#define XCNMPRV(RTX, C, M)	    (&(RTX)->u.rv)
576
#define BLOCK_SYMBOL_CHECK(RTX)	    (&(RTX)->u.block_sym)
577 578 579

#endif

580 581 582 583 584
/* General accessor macros for accessing the flags of an rtx.  */

/* Access an individual rtx flag, with no checking of any kind.  */
#define RTX_FLAG(RTX, FLAG)	((RTX)->FLAG)

585
#if defined ENABLE_RTL_FLAG_CHECKING && (GCC_VERSION >= 2007)
586
#define RTL_FLAG_CHECK1(NAME, RTX, C1) __extension__			\
587
({ __typeof (RTX) const _rtx = (RTX);					\
588
   if (GET_CODE(_rtx) != C1)						\
589
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
590
			     __FUNCTION__);				\
591 592
   _rtx; })

593
#define RTL_FLAG_CHECK2(NAME, RTX, C1, C2) __extension__		\
594
({ __typeof (RTX) const _rtx = (RTX);					\
595
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2)			\
596
     rtl_check_failed_flag  (NAME,_rtx, __FILE__, __LINE__,		\
597
			      __FUNCTION__);				\
598 599
   _rtx; })

600
#define RTL_FLAG_CHECK3(NAME, RTX, C1, C2, C3) __extension__		\
601
({ __typeof (RTX) const _rtx = (RTX);					\
602
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
603
       && GET_CODE(_rtx) != C3)						\
604
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
605
			     __FUNCTION__);				\
606 607
   _rtx; })

608
#define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4) __extension__	\
609
({ __typeof (RTX) const _rtx = (RTX);					\
610
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
611
       && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4)			\
612
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
613
			      __FUNCTION__);				\
614 615
   _rtx; })

616
#define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5) __extension__	\
617
({ __typeof (RTX) const _rtx = (RTX);					\
618
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
619 620
       && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4			\
       && GET_CODE(_rtx) != C5)						\
621
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
622
			     __FUNCTION__);				\
623 624
   _rtx; })

625 626
#define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6)		\
  __extension__								\
627
({ __typeof (RTX) const _rtx = (RTX);					\
628
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
629 630
       && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4			\
       && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6)			\
631
     rtl_check_failed_flag  (NAME,_rtx, __FILE__, __LINE__,		\
632
			     __FUNCTION__);				\
633 634
   _rtx; })

635 636
#define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7)		\
  __extension__								\
637
({ __typeof (RTX) const _rtx = (RTX);					\
638
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
639 640 641
       && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4			\
       && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6			\
       && GET_CODE(_rtx) != C7)						\
642
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
643
			     __FUNCTION__);				\
644 645
   _rtx; })

646 647
#define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8)	\
  __extension__								\
648
({ __typeof (RTX) const _rtx = (RTX);					\
649
   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2			\
650 651 652
       && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4			\
       && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6			\
       && GET_CODE(_rtx) != C7 && GET_CODE(_rtx) != C8)			\
653
     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
654
			     __FUNCTION__);				\
655 656
   _rtx; })

657
extern void rtl_check_failed_flag (const char *, const_rtx, const char *,
658
				   int, const char *)
659 660 661 662 663
    ATTRIBUTE_NORETURN
    ;

#else	/* not ENABLE_RTL_FLAG_CHECKING */

664 665 666 667
#define RTL_FLAG_CHECK1(NAME, RTX, C1)					(RTX)
#define RTL_FLAG_CHECK2(NAME, RTX, C1, C2)				(RTX)
#define RTL_FLAG_CHECK3(NAME, RTX, C1, C2, C3)				(RTX)
#define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4)			(RTX)
668
#define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5)		(RTX)
669 670 671
#define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6)		(RTX)
#define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7)		(RTX)
#define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8)	(RTX)
672 673
#endif

674 675 676 677 678 679 680 681 682
#define XINT(RTX, N)	(RTL_CHECK2 (RTX, N, 'i', 'n').rt_int)
#define XSTR(RTX, N)	(RTL_CHECK2 (RTX, N, 's', 'S').rt_str)
#define XEXP(RTX, N)	(RTL_CHECK2 (RTX, N, 'e', 'u').rt_rtx)
#define XVEC(RTX, N)	(RTL_CHECK2 (RTX, N, 'E', 'V').rt_rtvec)
#define XMODE(RTX, N)	(RTL_CHECK1 (RTX, N, 'M').rt_type)
#define XBITMAP(RTX, N) (RTL_CHECK1 (RTX, N, 'b').rt_bit)
#define XTREE(RTX, N)   (RTL_CHECK1 (RTX, N, 't').rt_tree)
#define XBBDEF(RTX, N)	(RTL_CHECK1 (RTX, N, 'B').rt_bb)
#define XTMPL(RTX, N)	(RTL_CHECK1 (RTX, N, 'T').rt_str)
683 684 685 686

#define XVECEXP(RTX, N, M)	RTVEC_ELT (XVEC (RTX, N), M)
#define XVECLEN(RTX, N)		GET_NUM_ELEM (XVEC (RTX, N))

687
/* These are like XINT, etc. except that they expect a '0' field instead
688 689
   of the normal type code.  */

690 691 692 693 694 695 696 697 698
#define X0INT(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_int)
#define X0UINT(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_uint)
#define X0STR(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_str)
#define X0EXP(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_rtx)
#define X0VEC(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_rtvec)
#define X0MODE(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_type)
#define X0BITMAP(RTX, N)   (RTL_CHECK1 (RTX, N, '0').rt_bit)
#define X0TREE(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_tree)
#define X0BBDEF(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_bb)
699 700
#define X0ADVFLAGS(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_addr_diff_vec_flags)
#define X0CSELIB(RTX, N)   (RTL_CHECK1 (RTX, N, '0').rt_cselib)
701 702
#define X0MEMATTR(RTX, N)  (RTL_CHECKC1 (RTX, N, MEM).rt_mem)
#define X0REGATTR(RTX, N)  (RTL_CHECKC1 (RTX, N, REG).rt_reg)
703
#define X0CONSTANT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_constant)
704

705 706 707
/* Access a '0' field with any type.  */
#define X0ANY(RTX, N)	   RTL_CHECK1 (RTX, N, '0')

708 709 710 711 712 713 714 715 716
#define XCINT(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_int)
#define XCUINT(RTX, N, C)     (RTL_CHECKC1 (RTX, N, C).rt_uint)
#define XCSTR(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_str)
#define XCEXP(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_rtx)
#define XCVEC(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_rtvec)
#define XCMODE(RTX, N, C)     (RTL_CHECKC1 (RTX, N, C).rt_type)
#define XCBITMAP(RTX, N, C)   (RTL_CHECKC1 (RTX, N, C).rt_bit)
#define XCTREE(RTX, N, C)     (RTL_CHECKC1 (RTX, N, C).rt_tree)
#define XCBBDEF(RTX, N, C)    (RTL_CHECKC1 (RTX, N, C).rt_bb)
717
#define XCCSELIB(RTX, N, C)   (RTL_CHECKC1 (RTX, N, C).rt_cselib)
718 719 720 721

#define XCVECEXP(RTX, N, M, C)	RTVEC_ELT (XCVEC (RTX, N, C), M)
#define XCVECLEN(RTX, N, C)	GET_NUM_ELEM (XCVEC (RTX, N, C))

722
#define XC2EXP(RTX, N, C1, C2)      (RTL_CHECKC2 (RTX, N, C1, C2).rt_rtx)
Jim Wilson committed
723 724 725 726 727

/* ACCESS MACROS for particular fields of insns.  */

/* Holds a unique number for each insn.
   These are not necessarily sequentially increasing.  */
728
#define INSN_UID(INSN)  XINT (INSN, 0)
Jim Wilson committed
729 730

/* Chain insns together in sequence.  */
731 732
#define PREV_INSN(INSN)	XEXP (INSN, 1)
#define NEXT_INSN(INSN)	XEXP (INSN, 2)
Jim Wilson committed
733

734
#define BLOCK_FOR_INSN(INSN) XBBDEF (INSN, 3)
735
#define INSN_LOCATOR(INSN) XINT (INSN, 4)
Jim Wilson committed
736
/* The body of an insn.  */
737
#define PATTERN(INSN)	XEXP (INSN, 5)
Jim Wilson committed
738 739 740

/* Code number of instruction, from when it was recognized.
   -1 means this instruction has not been recognized yet.  */
741
#define INSN_CODE(INSN) XINT (INSN, 6)
Jim Wilson committed
742

743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760
#define RTX_FRAME_RELATED_P(RTX)					\
  (RTL_FLAG_CHECK5("RTX_FRAME_RELATED_P", (RTX), INSN, CALL_INSN,	\
		   JUMP_INSN, BARRIER, SET)->frame_related)

/* 1 if RTX is an insn that has been deleted.  */
#define INSN_DELETED_P(RTX)						\
  (RTL_FLAG_CHECK6("INSN_DELETED_P", (RTX), INSN, CALL_INSN, JUMP_INSN,	\
		   CODE_LABEL, BARRIER, NOTE)->volatil)

/* 1 if RTX is a call to a const or pure function.  */
#define CONST_OR_PURE_CALL_P(RTX)					\
  (RTL_FLAG_CHECK3("CONST_OR_PURE_CALL_P", (RTX), CALL_INSN, NOTE,	\
		   EXPR_LIST)->unchanging)

/* 1 if RTX is a call_insn for a sibling call.  */
#define SIBLING_CALL_P(RTX)						\
  (RTL_FLAG_CHECK1("SIBLING_CALL_P", (RTX), CALL_INSN)->jump)

761
/* 1 if RTX is a jump_insn, call_insn, or insn that is an annulling branch.  */
762
#define INSN_ANNULLED_BRANCH_P(RTX)					\
763
  (RTL_FLAG_CHECK3("INSN_ANNULLED_BRANCH_P", (RTX), JUMP_INSN, CALL_INSN, INSN)->unchanging)
764 765 766

/* 1 if RTX is an insn in a delay slot and is from the target of the branch.
   If the branch insn has INSN_ANNULLED_BRANCH_P set, this insn should only be
Jim Wilson committed
767 768
   executed if the branch is taken.  For annulled branches with this bit
   clear, the insn should be executed only if the branch is not taken.  */
769
#define INSN_FROM_TARGET_P(RTX)						\
770
  (RTL_FLAG_CHECK3("INSN_FROM_TARGET_P", (RTX), INSN, JUMP_INSN, CALL_INSN)->in_struct)
Jim Wilson committed
771

772 773
/* In an ADDR_DIFF_VEC, the flags for RTX for use by branch shortening.
   See the comments for ADDR_DIFF_VEC in rtl.def.  */
774 775
#define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS(RTX, 4)

776 777
/* In a VALUE, the value cselib has assigned to RTX.
   This is a "struct cselib_val_struct", see cselib.h.  */
778 779
#define CSELIB_VAL_PTR(RTX) X0CSELIB(RTX, 0)

Jim Wilson committed
780
/* Holds a list of notes on what this insn does to various REGs.
781 782
   It is a chain of EXPR_LIST rtx's, where the second operand is the
   chain pointer and the first operand is the REG being described.
Jim Wilson committed
783
   The mode field of the EXPR_LIST contains not a real machine mode
784
   but a value from enum reg_note.  */
785
#define REG_NOTES(INSN)	XEXP(INSN, 7)
Jim Wilson committed
786

787 788
enum reg_note
{
789 790 791 792
#define DEF_REG_NOTE(NAME) NAME,
#include "reg-notes.def"
#undef DEF_REG_NOTE
  REG_NOTE_MAX
793 794
};

Jim Wilson committed
795 796
/* Define macros to extract and insert the reg-note kind in an EXPR_LIST.  */
#define REG_NOTE_KIND(LINK) ((enum reg_note) GET_MODE (LINK))
797 798
#define PUT_REG_NOTE_KIND(LINK, KIND) \
  PUT_MODE (LINK, (enum machine_mode) (KIND))
Jim Wilson committed
799 800 801

/* Names for REG_NOTE's in EXPR_LIST insn's.  */

802
extern const char * const reg_note_name[];
Mike Stump committed
803
#define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int) (MODE)])
Jim Wilson committed
804

805 806 807 808 809 810 811
/* This field is only present on CALL_INSNs.  It holds a chain of EXPR_LIST of
   USE and CLOBBER expressions.
     USE expressions list the registers filled with arguments that
   are passed to the function.
     CLOBBER expressions document the registers explicitly clobbered
   by this CALL_INSN.
     Pseudo registers can not be mentioned in this list.  */
812
#define CALL_INSN_FUNCTION_USAGE(INSN)	XEXP(INSN, 8)
813

Jim Wilson committed
814 815 816
/* The label-number of a code-label.  The assembler label
   is made from `L' and the label-number printed in decimal.
   Label numbers are unique in a compilation.  */
817
#define CODE_LABEL_NUMBER(INSN)	XINT (INSN, 6)
Jim Wilson committed
818

819 820 821 822
/* In a NOTE that is a line number, this is a string for the file name that the
   line is in.  We use the same field to record block numbers temporarily in
   NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes.  (We avoid lots of casts
   between ints and pointers if we use a different macro for the block number.)
823
   */
Jim Wilson committed
824

825
/* Opaque data.  */
826
#define NOTE_DATA(INSN)	        RTL_CHECKC1 (INSN, 4, NOTE)
827
#define NOTE_DELETED_LABEL_NAME(INSN) XCSTR (INSN, 4, NOTE)
828
#define SET_INSN_DELETED(INSN) set_insn_deleted (INSN);
829 830 831
#define NOTE_BLOCK(INSN)	XCTREE (INSN, 4, NOTE)
#define NOTE_EH_HANDLER(INSN)	XCINT (INSN, 4, NOTE)
#define NOTE_BASIC_BLOCK(INSN)	XCBBDEF (INSN, 4, NOTE)
832
#define NOTE_VAR_LOCATION(INSN)	XCEXP (INSN, 4, NOTE)
833

Jim Wilson committed
834 835
/* In a NOTE that is a line number, this is the line number.
   Other kinds of NOTEs are identified by negative numbers here.  */
836
#define NOTE_KIND(INSN) XCINT (INSN, 5, NOTE)
Jim Wilson committed
837

838
/* Nonzero if INSN is a note marking the beginning of a basic block.  */
839
#define NOTE_INSN_BASIC_BLOCK_P(INSN)			\
840
  (GET_CODE (INSN) == NOTE				\
841
   && NOTE_KIND (INSN) == NOTE_INSN_BASIC_BLOCK)
842

843 844 845 846 847
/* Variable declaration and the location of a variable.  */
#define NOTE_VAR_LOCATION_DECL(INSN)	(XCTREE (XCEXP (INSN, 4, NOTE), \
						 0, VAR_LOCATION))
#define NOTE_VAR_LOCATION_LOC(INSN)	(XCEXP (XCEXP (INSN, 4, NOTE),  \
						1, VAR_LOCATION))
Jim Wilson committed
848

849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864
/* Initialization status of the variable in the location.  Status
   can be unknown, uninitialized or initialized.  See enumeration
   type below.  */
#define NOTE_VAR_LOCATION_STATUS(INSN)  (XCINT (XCEXP (INSN, 4, NOTE), \
						2, VAR_LOCATION))

/* Possible initialization status of a variable.   When requested
   by the user, this information is tracked and recorded in the DWARF
   debug information, along with the variable's location.  */
enum var_init_status
{
  VAR_INIT_STATUS_UNKNOWN,
  VAR_INIT_STATUS_UNINITIALIZED,
  VAR_INIT_STATUS_INITIALIZED
};

865
/* Codes that appear in the NOTE_KIND field for kinds of notes
866 867
   that are not line numbers.  These codes are all negative.
   
868 869 870 871
   Notice that we do not try to use zero here for any of
   the special note codes because sometimes the source line
   actually can be zero!  This happens (for example) when we
   are generating code for the per-translation-unit constructor
872
   and destructor routines for some C++ translation unit.  */
Jim Wilson committed
873

874 875
enum insn_note
{
876 877 878
#define DEF_INSN_NOTE(NAME) NAME,
#include "insn-notes.def"
#undef DEF_INSN_NOTE
879

880 881
  NOTE_INSN_MAX
};
882

Jim Wilson committed
883 884
/* Names for NOTE insn's other than line numbers.  */

885
extern const char * const note_insn_name[NOTE_INSN_MAX];
886
#define GET_NOTE_INSN_NAME(NOTE_CODE) \
887
  (note_insn_name[(NOTE_CODE)])
Jim Wilson committed
888 889 890

/* The name of a label, in case it corresponds to an explicit label
   in the input source code.  */
891
#define LABEL_NAME(RTX) XCSTR (RTX, 7, CODE_LABEL)
Jim Wilson committed
892 893 894

/* In jump.c, each label contains a count of the number
   of LABEL_REFs that point at it, so unused labels can be deleted.  */
895
#define LABEL_NUSES(RTX) XCINT (RTX, 4, CODE_LABEL)
Jim Wilson committed
896

897 898 899 900 901 902 903 904 905 906 907 908 909 910 911
/* Labels carry a two-bit field composed of the ->jump and ->call
   bits.  This field indicates whether the label is an alternate
   entry point, and if so, what kind.  */
enum label_kind
{
  LABEL_NORMAL = 0,	/* ordinary label */
  LABEL_STATIC_ENTRY,	/* alternate entry point, not exported */
  LABEL_GLOBAL_ENTRY,	/* alternate entry point, exported */
  LABEL_WEAK_ENTRY	/* alternate entry point, exported as weak symbol */
};

#if defined ENABLE_RTL_FLAG_CHECKING && (GCC_VERSION > 2007)

/* Retrieve the kind of LABEL.  */
#define LABEL_KIND(LABEL) __extension__					\
912
({ __typeof (LABEL) const _label = (LABEL);				\
913 914 915 916 917 918 919
   if (GET_CODE (_label) != CODE_LABEL)					\
     rtl_check_failed_flag ("LABEL_KIND", _label, __FILE__, __LINE__,	\
			    __FUNCTION__);				\
   (enum label_kind) ((_label->jump << 1) | _label->call); })

/* Set the kind of LABEL.  */
#define SET_LABEL_KIND(LABEL, KIND) do {				\
920
   __typeof (LABEL) const _label = (LABEL);				\
921
   const unsigned int _kind = (KIND);					\
922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
   if (GET_CODE (_label) != CODE_LABEL)					\
     rtl_check_failed_flag ("SET_LABEL_KIND", _label, __FILE__, __LINE__, \
			    __FUNCTION__);				\
   _label->jump = ((_kind >> 1) & 1);					\
   _label->call = (_kind & 1);						\
} while (0)

#else

/* Retrieve the kind of LABEL.  */
#define LABEL_KIND(LABEL) \
   ((enum label_kind) (((LABEL)->jump << 1) | (LABEL)->call))

/* Set the kind of LABEL.  */
#define SET_LABEL_KIND(LABEL, KIND) do {				\
937 938
   rtx const _label = (LABEL);						\
   const unsigned int _kind = (KIND);					\
939 940 941 942 943 944 945
   _label->jump = ((_kind >> 1) & 1);					\
   _label->call = (_kind & 1);						\
} while (0)

#endif /* rtl flag checking */

#define LABEL_ALT_ENTRY_P(LABEL) (LABEL_KIND (LABEL) != LABEL_NORMAL)
946

Jim Wilson committed
947 948 949
/* In jump.c, each JUMP_INSN can point to a label that it can jump to,
   so that if the JUMP_INSN is deleted, the label's LABEL_NUSES can
   be decremented and possibly the label can be deleted.  */
950
#define JUMP_LABEL(INSN)   XCEXP (INSN, 8, JUMP_INSN)
Jim Wilson committed
951

952 953 954
/* Once basic blocks are found, each CODE_LABEL starts a chain that
   goes through all the LABEL_REFs that jump to that label.  The chain
   eventually winds up at the CODE_LABEL: it is circular.  */
955
#define LABEL_REFS(LABEL) XCEXP (LABEL, 5, CODE_LABEL)
Jim Wilson committed
956

957 958 959 960 961 962 963 964
/* For a REG rtx, REGNO extracts the register number.  REGNO can only
   be used on RHS.  Use SET_REGNO to change the value.  */
#define REGNO(RTX) (rhs_regno(RTX))
#define SET_REGNO(RTX,N) (df_ref_change_reg_with_loc (REGNO(RTX), N, RTX), XCUINT (RTX, 0, REG) = N)

/* ORIGINAL_REGNO holds the number the register originally had; for a
   pseudo register turned into a hard reg this will hold the old pseudo
   register number.  */
965
#define ORIGINAL_REGNO(RTX) X0UINT (RTX, 1)
Jim Wilson committed
966

967 968
/* Force the REGNO macro to only be used on the lhs.  */
static inline unsigned int
969
rhs_regno (const_rtx x)
970 971 972 973 974 975
{
  return XCUINT (x, 0, REG);
}



976 977
/* 1 if RTX is a reg or parallel that is the current function's return
   value.  */
978
#define REG_FUNCTION_VALUE_P(RTX)					\
979
  (RTL_FLAG_CHECK2("REG_FUNCTION_VALUE_P", (RTX), REG, PARALLEL)->return_val)
Jim Wilson committed
980

981 982 983
/* 1 if RTX is a reg that corresponds to a variable declared by the user.  */
#define REG_USERVAR_P(RTX)						\
  (RTL_FLAG_CHECK1("REG_USERVAR_P", (RTX), REG)->volatil)
Jim Wilson committed
984

985 986 987
/* 1 if RTX is a reg that holds a pointer value.  */
#define REG_POINTER(RTX)						\
  (RTL_FLAG_CHECK1("REG_POINTER", (RTX), REG)->frame_related)
988

989 990 991 992
/* 1 if RTX is a mem that holds a pointer value.  */
#define MEM_POINTER(RTX)						\
  (RTL_FLAG_CHECK1("MEM_POINTER", (RTX), MEM)->frame_related)

993 994 995 996
/* 1 if the given register REG corresponds to a hard register.  */
#define HARD_REGISTER_P(REG) (HARD_REGISTER_NUM_P (REGNO (REG)))

/* 1 if the given register number REG_NO corresponds to a hard register.  */
997
#define HARD_REGISTER_NUM_P(REG_NO) ((REG_NO) < FIRST_PSEUDO_REGISTER)
998

Jim Wilson committed
999
/* For a CONST_INT rtx, INTVAL extracts the integer.  */
1000
#define INTVAL(RTX) XCWINT(RTX, 0, CONST_INT)
Stuart Hastings committed
1001
#define UINTVAL(RTX) ((unsigned HOST_WIDE_INT) INTVAL (RTX))
Jim Wilson committed
1002

Zack Weinberg committed
1003
/* For a CONST_DOUBLE:
1004
   For a VOIDmode, there are two integers CONST_DOUBLE_LOW is the
1005
     low-order word and ..._HIGH the high-order.
1006
   For a float, there is a REAL_VALUE_TYPE structure, and
1007
     CONST_DOUBLE_REAL_VALUE(r) is a pointer to it.  */
1008 1009 1010 1011
#define CONST_DOUBLE_LOW(r) XCMWINT (r, 0, CONST_DOUBLE, VOIDmode)
#define CONST_DOUBLE_HIGH(r) XCMWINT (r, 1, CONST_DOUBLE, VOIDmode)
#define CONST_DOUBLE_REAL_VALUE(r) \
  ((const struct real_value *) XCNMPRV (r, CONST_DOUBLE, VOIDmode))
Zack Weinberg committed
1012

1013 1014 1015 1016 1017 1018
/* For a CONST_VECTOR, return element #n.  */
#define CONST_VECTOR_ELT(RTX, N) XCVECEXP (RTX, 0, N, CONST_VECTOR)

/* For a CONST_VECTOR, return the number of elements in a vector.  */
#define CONST_VECTOR_NUNITS(RTX) XCVECLEN (RTX, 0, CONST_VECTOR)

Jim Wilson committed
1019
/* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of.
1020
   SUBREG_BYTE extracts the byte-number.  */
Jim Wilson committed
1021

1022 1023
#define SUBREG_REG(RTX) XCEXP (RTX, 0, SUBREG)
#define SUBREG_BYTE(RTX) XCUINT (RTX, 1, SUBREG)
1024 1025

/* in rtlanal.c */
1026 1027 1028 1029 1030 1031 1032 1033 1034
/* Return the right cost to give to an operation
   to make the cost of the corresponding register-to-register instruction
   N times that of a fast register-to-register instruction.  */
#define COSTS_N_INSNS(N) ((N) * 4)

/* Maximum cost of an rtl expression.  This value has the special meaning
   not to use an rtx with this cost under any circumstances.  */
#define MAX_COST INT_MAX

1035
extern void init_rtlanal (void);
1036 1037
extern int rtx_cost (rtx, enum rtx_code);
extern int address_cost (rtx, enum machine_mode);
1038
extern unsigned int subreg_lsb (const_rtx);
1039 1040
extern unsigned int subreg_lsb_1 (enum machine_mode, enum machine_mode,
				  unsigned int);
1041 1042 1043 1044
extern unsigned int subreg_regno_offset	(unsigned int, enum machine_mode,
					 unsigned int, enum machine_mode);
extern bool subreg_offset_representable_p (unsigned int, enum machine_mode,
					   unsigned int, enum machine_mode);
1045 1046
extern unsigned int subreg_regno (const_rtx);
extern unsigned int subreg_nregs (const_rtx);
1047 1048
extern unsigned HOST_WIDE_INT nonzero_bits (const_rtx, enum machine_mode);
extern unsigned int num_sign_bit_copies (const_rtx, enum machine_mode);
1049
extern bool constant_pool_constant_p (rtx);
1050
extern bool truncated_to_mode (enum machine_mode, const_rtx);
1051

Jim Wilson committed
1052

1053 1054
/* 1 if RTX is a subreg containing a reg that is already known to be
   sign- or zero-extended from the mode of the subreg to the mode of
1055
   the reg.  SUBREG_PROMOTED_UNSIGNED_P gives the signedness of the
1056
   extension.
1057 1058 1059 1060

   When used as a LHS, is means that this extension must be done
   when assigning to SUBREG_REG.  */

1061 1062 1063 1064 1065
#define SUBREG_PROMOTED_VAR_P(RTX)					\
  (RTL_FLAG_CHECK1("SUBREG_PROMOTED", (RTX), SUBREG)->in_struct)

#define SUBREG_PROMOTED_UNSIGNED_SET(RTX, VAL)				\
do {									\
1066
  rtx const _rtx = RTL_FLAG_CHECK1("SUBREG_PROMOTED_UNSIGNED_SET", (RTX), SUBREG); \
1067
  if ((VAL) < 0)							\
1068
    _rtx->volatil = 1;							\
1069
  else {								\
1070 1071
    _rtx->volatil = 0;							\
    _rtx->unchanging = (VAL);						\
1072
  }									\
1073
} while (0)
1074
#define SUBREG_PROMOTED_UNSIGNED_P(RTX)	\
1075 1076
  ((RTL_FLAG_CHECK1("SUBREG_PROMOTED_UNSIGNED_P", (RTX), SUBREG)->volatil) \
     ? -1 : (RTX)->unchanging)
1077

Jim Wilson committed
1078 1079
/* Access various components of an ASM_OPERANDS rtx.  */

1080 1081 1082 1083 1084 1085 1086
#define ASM_OPERANDS_TEMPLATE(RTX) XCSTR (RTX, 0, ASM_OPERANDS)
#define ASM_OPERANDS_OUTPUT_CONSTRAINT(RTX) XCSTR (RTX, 1, ASM_OPERANDS)
#define ASM_OPERANDS_OUTPUT_IDX(RTX) XCINT (RTX, 2, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT_VEC(RTX) XCVEC (RTX, 3, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT_CONSTRAINT_VEC(RTX) XCVEC (RTX, 4, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT(RTX, N) XCVECEXP (RTX, 3, N, ASM_OPERANDS)
#define ASM_OPERANDS_INPUT_LENGTH(RTX) XCVECLEN (RTX, 3, ASM_OPERANDS)
1087
#define ASM_OPERANDS_INPUT_CONSTRAINT_EXP(RTX, N) \
1088
  XCVECEXP (RTX, 4, N, ASM_OPERANDS)
1089
#define ASM_OPERANDS_INPUT_CONSTRAINT(RTX, N) \
1090
  XSTR (XCVECEXP (RTX, 4, N, ASM_OPERANDS), 0)
1091
#define ASM_OPERANDS_INPUT_MODE(RTX, N)  \
1092
  GET_MODE (XCVECEXP (RTX, 4, N, ASM_OPERANDS))
1093 1094
#ifdef USE_MAPPED_LOCATION
#define ASM_OPERANDS_SOURCE_LOCATION(RTX) XCUINT (RTX, 5, ASM_OPERANDS)
1095
#define ASM_INPUT_SOURCE_LOCATION(RTX) XCUINT (RTX, 1, ASM_INPUT)
1096
#else
1097 1098
#define ASM_OPERANDS_SOURCE_FILE(RTX) XCSTR (RTX, 5, ASM_OPERANDS)
#define ASM_OPERANDS_SOURCE_LINE(RTX) XCINT (RTX, 6, ASM_OPERANDS)
1099 1100
#define ASM_INPUT_SOURCE_FILE(RTX) XCSTR (RTX, 1, ASM_INPUT)
#define ASM_INPUT_SOURCE_LINE(RTX) XCINT (RTX, 2, ASM_INPUT)
1101
#endif
Jim Wilson committed
1102

1103 1104 1105 1106
/* 1 if RTX is a mem that is statically allocated in read-only memory.  */
#define MEM_READONLY_P(RTX) \
  (RTL_FLAG_CHECK1("MEM_READONLY_P", (RTX), MEM)->unchanging)

1107
/* 1 if RTX is a mem and we should keep the alias set for this mem
1108 1109
   unchanged when we access a component.  Set to 1, or example, when we
   are already in a non-addressable component of an aggregate.  */
1110 1111
#define MEM_KEEP_ALIAS_SET_P(RTX)					\
  (RTL_FLAG_CHECK1("MEM_KEEP_ALIAS_SET_P", (RTX), MEM)->jump)
1112

1113 1114 1115 1116
/* 1 if RTX is a mem or asm_operand for a volatile reference.  */
#define MEM_VOLATILE_P(RTX)						\
  (RTL_FLAG_CHECK3("MEM_VOLATILE_P", (RTX), MEM, ASM_OPERANDS,		\
		   ASM_INPUT)->volatil)
Jim Wilson committed
1117

1118
/* 1 if RTX is a mem that refers to an aggregate, either to the
1119
   aggregate itself or to a field of the aggregate.  If zero, RTX may
1120
   or may not be such a reference.  */
1121 1122
#define MEM_IN_STRUCT_P(RTX)						\
  (RTL_FLAG_CHECK1("MEM_IN_STRUCT_P", (RTX), MEM)->in_struct)
Jim Wilson committed
1123

1124
/* 1 if RTX is a MEM that refers to a scalar.  If zero, RTX may or may
1125
   not refer to a scalar.  */
1126
#define MEM_SCALAR_P(RTX)						\
1127
  (RTL_FLAG_CHECK1("MEM_SCALAR_P", (RTX), MEM)->return_val)
1128

1129 1130 1131 1132
/* 1 if RTX is a mem that cannot trap.  */
#define MEM_NOTRAP_P(RTX) \
  (RTL_FLAG_CHECK1("MEM_NOTRAP_P", (RTX), MEM)->call)

1133
/* If VAL is nonzero, set MEM_IN_STRUCT_P and clear MEM_SCALAR_P in
1134 1135 1136
   RTX.  Otherwise, vice versa.  Use this macro only when you are
   *sure* that you know that the MEM is in a structure, or is a
   scalar.  VAL is evaluated only once.  */
1137 1138
#define MEM_SET_IN_STRUCT_P(RTX, VAL)		\
do {						\
1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
  if (VAL)					\
    {						\
      MEM_IN_STRUCT_P (RTX) = 1;		\
      MEM_SCALAR_P (RTX) = 0;			\
    }						\
  else						\
    {						\
      MEM_IN_STRUCT_P (RTX) = 0;		\
      MEM_SCALAR_P (RTX) = 1;			\
    }						\
} while (0)
1150

1151 1152 1153 1154
/* The memory attribute block.  We provide access macros for each value
   in the block and provide defaults if none specified.  */
#define MEM_ATTRS(RTX) X0MEMATTR (RTX, 1)

1155 1156 1157 1158
/* The register attribute block.  We provide access macros for each value
   in the block and provide defaults if none specified.  */
#define REG_ATTRS(RTX) X0REGATTR (RTX, 2)

1159 1160
/* For a MEM rtx, the alias set.  If 0, this MEM is not in any alias
   set, and may alias anything.  Otherwise, the MEM can only alias
1161
   MEMs in a conflicting alias set.  This value is set in a
1162
   language-dependent manner in the front-end, and should not be
1163 1164
   altered in the back-end.  These set numbers are tested with
   alias_sets_conflict_p.  */
1165 1166 1167
#define MEM_ALIAS_SET(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->alias)

/* For a MEM rtx, the decl it is known to refer to, if it is known to
1168 1169
   refer to part of a DECL.  It may also be a COMPONENT_REF.  */
#define MEM_EXPR(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->expr)
1170

1171
/* For a MEM rtx, the offset from the start of MEM_EXPR, if known, as a
1172 1173 1174 1175 1176
   RTX that is always a CONST_INT.  */
#define MEM_OFFSET(RTX) (MEM_ATTRS (RTX) == 0 ? 0 : MEM_ATTRS (RTX)->offset)

/* For a MEM rtx, the size in bytes of the MEM, if known, as an RTX that
   is always a CONST_INT.  */
1177 1178 1179 1180
#define MEM_SIZE(RTX)							\
(MEM_ATTRS (RTX) != 0 ? MEM_ATTRS (RTX)->size				\
 : GET_MODE (RTX) != BLKmode ? GEN_INT (GET_MODE_SIZE (GET_MODE (RTX)))	\
 : 0)
1181

1182 1183
/* For a MEM rtx, the alignment in bits.  We can use the alignment of the
   mode as a default when STRICT_ALIGNMENT, but not if not.  */
1184 1185
#define MEM_ALIGN(RTX)							\
(MEM_ATTRS (RTX) != 0 ? MEM_ATTRS (RTX)->align				\
1186 1187
 : (STRICT_ALIGNMENT && GET_MODE (RTX) != BLKmode			\
    ? GET_MODE_ALIGNMENT (GET_MODE (RTX)) : BITS_PER_UNIT))
1188

1189 1190 1191 1192 1193 1194 1195 1196
/* For a REG rtx, the decl it is known to refer to, if it is known to
   refer to part of a DECL.  */
#define REG_EXPR(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->decl)

/* For a MEM rtx, the offset from the start of MEM_DECL, if known, as a
   RTX that is always a CONST_INT.  */
#define REG_OFFSET(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->offset)

1197
/* Copy the attributes that apply to memory locations from RHS to LHS.  */
1198 1199 1200 1201
#define MEM_COPY_ATTRIBUTES(LHS, RHS)				\
  (MEM_VOLATILE_P (LHS) = MEM_VOLATILE_P (RHS),			\
   MEM_IN_STRUCT_P (LHS) = MEM_IN_STRUCT_P (RHS),		\
   MEM_SCALAR_P (LHS) = MEM_SCALAR_P (RHS),			\
1202
   MEM_NOTRAP_P (LHS) = MEM_NOTRAP_P (RHS),			\
1203
   MEM_READONLY_P (LHS) = MEM_READONLY_P (RHS),			\
1204
   MEM_KEEP_ALIAS_SET_P (LHS) = MEM_KEEP_ALIAS_SET_P (RHS),	\
1205
   MEM_POINTER (LHS) = MEM_POINTER (RHS),			\
1206
   MEM_ATTRS (LHS) = MEM_ATTRS (RHS))
1207

1208 1209 1210 1211 1212
/* 1 if RTX is a label_ref for a nonlocal label.  */
/* Likewise in an expr_list for a reg_label note.  */
#define LABEL_REF_NONLOCAL_P(RTX)					\
  (RTL_FLAG_CHECK2("LABEL_REF_NONLOCAL_P", (RTX), LABEL_REF,		\
		   REG_LABEL)->volatil)
Richard Stallman committed
1213

1214 1215 1216
/* 1 if RTX is a code_label that should always be considered to be needed.  */
#define LABEL_PRESERVE_P(RTX)						\
  (RTL_FLAG_CHECK2("LABEL_PRESERVE_P", (RTX), CODE_LABEL, NOTE)->in_struct)
Jim Wilson committed
1217

1218
/* During sched, 1 if RTX is an insn that must be scheduled together
1219
   with the preceding insn.  */
1220
#define SCHED_GROUP_P(RTX)						\
1221 1222
  (RTL_FLAG_CHECK3("SCHED_GROUP_P", (RTX), INSN, JUMP_INSN, CALL_INSN	\
		          )->in_struct)
Jim Wilson committed
1223 1224 1225

/* For a SET rtx, SET_DEST is the place that is set
   and SET_SRC is the value it is set to.  */
1226 1227
#define SET_DEST(RTX) XC2EXP(RTX, 0, SET, CLOBBER)
#define SET_SRC(RTX) XCEXP(RTX, 1, SET)
1228 1229
#define SET_IS_RETURN_P(RTX)						\
  (RTL_FLAG_CHECK1("SET_IS_RETURN_P", (RTX), SET)->jump)
Jim Wilson committed
1230 1231

/* For a TRAP_IF rtx, TRAP_CONDITION is an expression.  */
1232 1233
#define TRAP_CONDITION(RTX) XCEXP (RTX, 0, TRAP_IF)
#define TRAP_CODE(RTX) XCEXP (RTX, 1, TRAP_IF)
Jim Wilson committed
1234

1235 1236 1237
/* For a COND_EXEC rtx, COND_EXEC_TEST is the condition to base
   conditionally executing the code on, COND_EXEC_CODE is the code
   to execute if the condition is true.  */
1238 1239
#define COND_EXEC_TEST(RTX) XCEXP (RTX, 0, COND_EXEC)
#define COND_EXEC_CODE(RTX) XCEXP (RTX, 1, COND_EXEC)
1240

1241 1242
/* 1 if RTX is a symbol_ref that addresses this function's rtl
   constants pool.  */
1243 1244
#define CONSTANT_POOL_ADDRESS_P(RTX)					\
  (RTL_FLAG_CHECK1("CONSTANT_POOL_ADDRESS_P", (RTX), SYMBOL_REF)->unchanging)
Jim Wilson committed
1245

1246 1247 1248 1249 1250
/* 1 if RTX is a symbol_ref that addresses a value in the file's
   tree constant pool.  This information is private to varasm.c.  */
#define TREE_CONSTANT_POOL_ADDRESS_P(RTX)				\
  (RTL_FLAG_CHECK1("TREE_CONSTANT_POOL_ADDRESS_P",			\
		   (RTX), SYMBOL_REF)->frame_related)
1251

1252 1253 1254
/* Used if RTX is a symbol_ref, for machine-specific purposes.  */
#define SYMBOL_REF_FLAG(RTX)						\
  (RTL_FLAG_CHECK1("SYMBOL_REF_FLAG", (RTX), SYMBOL_REF)->volatil)
Jim Wilson committed
1255

1256 1257 1258 1259
/* 1 if RTX is a symbol_ref that has been the library function in
   emit_library_call.  */
#define SYMBOL_REF_USED(RTX)						\
  (RTL_FLAG_CHECK1("SYMBOL_REF_USED", (RTX), SYMBOL_REF)->used)
Jim Wilson committed
1260

1261 1262
/* 1 if RTX is a symbol_ref for a weak symbol.  */
#define SYMBOL_REF_WEAK(RTX)						\
1263
  (RTL_FLAG_CHECK1("SYMBOL_REF_WEAK", (RTX), SYMBOL_REF)->return_val)
1264

1265 1266
/* A pointer attached to the SYMBOL_REF; either SYMBOL_REF_DECL or
   SYMBOL_REF_CONSTANT.  */
1267 1268 1269 1270 1271 1272
#define SYMBOL_REF_DATA(RTX) X0ANY ((RTX), 2)

/* Set RTX's SYMBOL_REF_DECL to DECL.  RTX must not be a constant
   pool symbol.  */
#define SET_SYMBOL_REF_DECL(RTX, DECL) \
  (gcc_assert (!CONSTANT_POOL_ADDRESS_P (RTX)), X0TREE ((RTX), 2) = (DECL))
1273

1274
/* The tree (decl or constant) associated with the symbol, or null.  */
1275 1276 1277
#define SYMBOL_REF_DECL(RTX) \
  (CONSTANT_POOL_ADDRESS_P (RTX) ? NULL : X0TREE ((RTX), 2))

1278 1279 1280 1281
/* Set RTX's SYMBOL_REF_CONSTANT to C.  RTX must be a constant pool symbol.  */
#define SET_SYMBOL_REF_CONSTANT(RTX, C) \
  (gcc_assert (CONSTANT_POOL_ADDRESS_P (RTX)), X0CONSTANT ((RTX), 2) = (C))

1282 1283 1284
/* The rtx constant pool entry for a symbol, or null.  */
#define SYMBOL_REF_CONSTANT(RTX) \
  (CONSTANT_POOL_ADDRESS_P (RTX) ? X0CONSTANT ((RTX), 2) : NULL)
1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313

/* A set of flags on a symbol_ref that are, in some respects, redundant with
   information derivable from the tree decl associated with this symbol.
   Except that we build a *lot* of SYMBOL_REFs that aren't associated with a
   decl.  In some cases this is a bug.  But beyond that, it's nice to cache
   this information to avoid recomputing it.  Finally, this allows space for
   the target to store more than one bit of information, as with
   SYMBOL_REF_FLAG.  */
#define SYMBOL_REF_FLAGS(RTX)	X0INT ((RTX), 1)

/* These flags are common enough to be defined for all targets.  They
   are computed by the default version of targetm.encode_section_info.  */

/* Set if this symbol is a function.  */
#define SYMBOL_FLAG_FUNCTION	(1 << 0)
#define SYMBOL_REF_FUNCTION_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_FUNCTION) != 0)
/* Set if targetm.binds_local_p is true.  */
#define SYMBOL_FLAG_LOCAL	(1 << 1)
#define SYMBOL_REF_LOCAL_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_LOCAL) != 0)
/* Set if targetm.in_small_data_p is true.  */
#define SYMBOL_FLAG_SMALL	(1 << 2)
#define SYMBOL_REF_SMALL_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_SMALL) != 0)
/* The three-bit field at [5:3] is true for TLS variables; use
   SYMBOL_REF_TLS_MODEL to extract the field as an enum tls_model.  */
#define SYMBOL_FLAG_TLS_SHIFT	3
#define SYMBOL_REF_TLS_MODEL(RTX) \
1314
  ((enum tls_model) ((SYMBOL_REF_FLAGS (RTX) >> SYMBOL_FLAG_TLS_SHIFT) & 7))
1315 1316 1317 1318
/* Set if this symbol is not defined in this translation unit.  */
#define SYMBOL_FLAG_EXTERNAL	(1 << 6)
#define SYMBOL_REF_EXTERNAL_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_EXTERNAL) != 0)
1319
/* Set if this symbol has a block_symbol structure associated with it.  */
1320 1321 1322
#define SYMBOL_FLAG_HAS_BLOCK_INFO (1 << 7)
#define SYMBOL_REF_HAS_BLOCK_INFO_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_HAS_BLOCK_INFO) != 0)
1323
/* Set if this symbol is a section anchor.  SYMBOL_REF_ANCHOR_P implies
1324
   SYMBOL_REF_HAS_BLOCK_INFO_P.  */
1325 1326 1327
#define SYMBOL_FLAG_ANCHOR	(1 << 8)
#define SYMBOL_REF_ANCHOR_P(RTX) \
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_ANCHOR) != 0)
1328 1329

/* Subsequent bits are available for the target to use.  */
1330
#define SYMBOL_FLAG_MACH_DEP_SHIFT	9
1331
#define SYMBOL_FLAG_MACH_DEP		(1 << SYMBOL_FLAG_MACH_DEP_SHIFT)
1332

1333 1334 1335
/* If SYMBOL_REF_HAS_BLOCK_INFO_P (RTX), this is the object_block
   structure to which the symbol belongs, or NULL if it has not been
   assigned a block.  */
1336 1337
#define SYMBOL_REF_BLOCK(RTX) (BLOCK_SYMBOL_CHECK (RTX)->block)

1338 1339 1340 1341
/* If SYMBOL_REF_HAS_BLOCK_INFO_P (RTX), this is the offset of RTX from
   the first object in SYMBOL_REF_BLOCK (RTX).  The value is negative if
   RTX has not yet been assigned to a block, or it has not been given an
   offset within that block.  */
1342 1343
#define SYMBOL_REF_BLOCK_OFFSET(RTX) (BLOCK_SYMBOL_CHECK (RTX)->offset)

1344 1345 1346 1347 1348 1349 1350 1351 1352 1353
/* Indicate whether the machine has any sort of auto increment addressing.
   If not, we can avoid checking for REG_INC notes.  */

#if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) \
     || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT) \
     || defined (HAVE_PRE_MODIFY_DISP) || defined (HAVE_PRE_MODIFY_DISP) \
     || defined (HAVE_PRE_MODIFY_REG) || defined (HAVE_POST_MODIFY_REG))
#define AUTO_INC_DEC
#endif

Jim Wilson committed
1354 1355 1356
/* Define a macro to look for REG_INC notes,
   but save time on machines where they never exist.  */

1357
#ifdef AUTO_INC_DEC
1358 1359 1360 1361
#define FIND_REG_INC_NOTE(INSN, REG)			\
  ((REG) != NULL_RTX && REG_P ((REG))			\
   ? find_regno_note ((INSN), REG_INC, REGNO (REG))	\
   : find_reg_note ((INSN), REG_INC, (REG)))
Jim Wilson committed
1362
#else
1363
#define FIND_REG_INC_NOTE(INSN, REG) 0
Jim Wilson committed
1364 1365
#endif

1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381
#ifndef HAVE_PRE_INCREMENT
#define HAVE_PRE_INCREMENT 0
#endif

#ifndef HAVE_PRE_DECREMENT
#define HAVE_PRE_DECREMENT 0
#endif

#ifndef HAVE_POST_INCREMENT
#define HAVE_POST_INCREMENT 0
#endif

#ifndef HAVE_POST_DECREMENT
#define HAVE_POST_DECREMENT 0
#endif

1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397
#ifndef HAVE_POST_MODIFY_DISP
#define HAVE_POST_MODIFY_DISP 0
#endif

#ifndef HAVE_POST_MODIFY_REG
#define HAVE_POST_MODIFY_REG 0
#endif

#ifndef HAVE_PRE_MODIFY_DISP
#define HAVE_PRE_MODIFY_DISP 0
#endif

#ifndef HAVE_PRE_MODIFY_REG
#define HAVE_PRE_MODIFY_REG 0
#endif

1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433

/* Some architectures do not have complete pre/post increment/decrement
   instruction sets, or only move some modes efficiently.  These macros
   allow us to tune autoincrement generation.  */

#ifndef USE_LOAD_POST_INCREMENT
#define USE_LOAD_POST_INCREMENT(MODE)   HAVE_POST_INCREMENT
#endif

#ifndef USE_LOAD_POST_DECREMENT
#define USE_LOAD_POST_DECREMENT(MODE)   HAVE_POST_DECREMENT
#endif

#ifndef USE_LOAD_PRE_INCREMENT
#define USE_LOAD_PRE_INCREMENT(MODE)    HAVE_PRE_INCREMENT
#endif

#ifndef USE_LOAD_PRE_DECREMENT
#define USE_LOAD_PRE_DECREMENT(MODE)    HAVE_PRE_DECREMENT
#endif

#ifndef USE_STORE_POST_INCREMENT
#define USE_STORE_POST_INCREMENT(MODE)  HAVE_POST_INCREMENT
#endif

#ifndef USE_STORE_POST_DECREMENT
#define USE_STORE_POST_DECREMENT(MODE)  HAVE_POST_DECREMENT
#endif

#ifndef USE_STORE_PRE_INCREMENT
#define USE_STORE_PRE_INCREMENT(MODE)   HAVE_PRE_INCREMENT
#endif

#ifndef USE_STORE_PRE_DECREMENT
#define USE_STORE_PRE_DECREMENT(MODE)   HAVE_PRE_DECREMENT
#endif
Jim Wilson committed
1434

1435 1436 1437
/* Nonzero when we are generating CONCATs.  */
extern int generating_concat_p;

1438 1439 1440
/* Nonzero when we are expanding trees to RTL.  */
extern int currently_expanding_to_rtl;

Jim Wilson committed
1441 1442
/* Generally useful functions.  */

1443
/* In expmed.c */
1444
extern int ceil_log2 (unsigned HOST_WIDE_INT);
1445

Kaveh R. Ghazi committed
1446
/* In explow.c */
1447 1448
extern void set_stack_check_libfunc (rtx);
extern HOST_WIDE_INT trunc_int_for_mode	(HOST_WIDE_INT, enum machine_mode);
1449
extern rtx plus_constant (rtx, HOST_WIDE_INT);
1450

1451
/* In emit-rtl.c */
1452
extern rtx gen_blockage (void);
1453 1454 1455 1456 1457 1458 1459 1460
extern rtvec gen_rtvec (int, ...);
extern rtx copy_insn_1 (rtx);
extern rtx copy_insn (rtx);
extern rtx gen_int_mode (HOST_WIDE_INT, enum machine_mode);
extern rtx emit_copy_of_insn_after (rtx, rtx);
extern void set_reg_attrs_from_mem (rtx, rtx);
extern void set_mem_attrs_from_reg (rtx, rtx);
extern void set_reg_attrs_for_parm (rtx, rtx);
1461
extern int mem_expr_equal_p (tree, tree);
1462 1463

/* In rtl.c */
1464 1465 1466
extern rtx rtx_alloc_stat (RTX_CODE MEM_STAT_DECL);
#define rtx_alloc(c) rtx_alloc_stat (c MEM_STAT_INFO)

1467
extern rtvec rtvec_alloc (int);
1468
extern bool shared_const_p (const_rtx);
1469
extern rtx copy_rtx (rtx);
1470
extern void dump_rtx_statistics (void);
1471 1472

/* In emit-rtl.c */
1473
extern rtx copy_rtx_if_shared (rtx);
1474 1475

/* In rtl.c */
1476 1477
extern unsigned int rtx_size (const_rtx);
extern rtx shallow_copy_rtx_stat (const_rtx MEM_STAT_DECL);
1478
#define shallow_copy_rtx(a) shallow_copy_rtx_stat (a MEM_STAT_INFO)
1479
extern int rtx_equal_p (const_rtx, const_rtx);
1480 1481

/* In emit-rtl.c */
1482 1483 1484
extern rtvec gen_rtvec_v (int, rtx *);
extern rtx gen_reg_rtx (enum machine_mode);
extern rtx gen_rtx_REG_offset (rtx, enum machine_mode, unsigned int, int);
1485
extern rtx gen_reg_rtx_offset (rtx, enum machine_mode, int);
1486 1487
extern rtx gen_label_rtx (void);
extern rtx gen_lowpart_common (enum machine_mode, rtx);
1488 1489

/* In cse.c */
1490
extern rtx gen_lowpart_if_possible (enum machine_mode, rtx);
1491 1492

/* In emit-rtl.c */
1493 1494 1495
extern rtx gen_highpart (enum machine_mode, rtx);
extern rtx gen_highpart_mode (enum machine_mode, enum machine_mode, rtx);
extern rtx operand_subword (rtx, unsigned int, int, enum machine_mode);
1496 1497

/* In emit-rtl.c */
1498
extern rtx operand_subword_force (rtx, unsigned int, enum machine_mode);
1499
extern int subreg_lowpart_p (const_rtx);
1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513
extern unsigned int subreg_lowpart_offset (enum machine_mode,
					   enum machine_mode);
extern unsigned int subreg_highpart_offset (enum machine_mode,
					    enum machine_mode);
extern rtx make_safe_from (rtx, rtx);
extern rtx convert_memory_address (enum machine_mode, rtx);
extern rtx get_insns (void);
extern const char *get_insn_name (int);
extern rtx get_last_insn (void);
extern rtx get_last_insn_anywhere (void);
extern rtx get_first_nonnote_insn (void);
extern rtx get_last_nonnote_insn (void);
extern void start_sequence (void);
extern void push_to_sequence (rtx);
1514
extern void push_to_sequence2 (rtx, rtx);
1515 1516 1517
extern void end_sequence (void);
extern rtx immed_double_const (HOST_WIDE_INT, HOST_WIDE_INT,
			       enum machine_mode);
1518

1519 1520 1521 1522
/* In loop-iv.c  */

extern rtx lowpart_subreg (enum machine_mode, rtx, enum machine_mode);

1523
/* In varasm.c  */
1524
extern rtx force_const_mem (enum machine_mode, rtx);
1525 1526

/* In varasm.c  */
1527 1528

struct function;
1529 1530
extern rtx get_pool_constant (rtx);
extern rtx get_pool_constant_mark (rtx, bool *);
1531
extern enum machine_mode get_pool_mode (const_rtx);
1532
extern rtx simplify_subtraction (rtx);
1533 1534

/* In function.c  */
1535 1536 1537 1538 1539
extern rtx assign_stack_local (enum machine_mode, HOST_WIDE_INT, int);
extern rtx assign_stack_temp (enum machine_mode, HOST_WIDE_INT, int);
extern rtx assign_stack_temp_for_type (enum machine_mode,
				       HOST_WIDE_INT, int, tree);
extern rtx assign_temp (tree, int, int, int);
1540

1541
/* In emit-rtl.c */
1542
extern rtx emit_insn_before (rtx, rtx);
1543
extern rtx emit_insn_before_noloc (rtx, rtx, struct basic_block_def *);
1544 1545
extern rtx emit_insn_before_setloc (rtx, rtx, int);
extern rtx emit_jump_insn_before (rtx, rtx);
1546
extern rtx emit_jump_insn_before_noloc (rtx, rtx);
1547 1548
extern rtx emit_jump_insn_before_setloc (rtx, rtx, int);
extern rtx emit_call_insn_before (rtx, rtx);
1549
extern rtx emit_call_insn_before_noloc (rtx, rtx);
1550 1551 1552
extern rtx emit_call_insn_before_setloc (rtx, rtx, int);
extern rtx emit_barrier_before (rtx);
extern rtx emit_label_before (rtx, rtx);
1553
extern rtx emit_note_before (enum insn_note, rtx);
1554
extern rtx emit_insn_after (rtx, rtx);
1555
extern rtx emit_insn_after_noloc (rtx, rtx, struct basic_block_def *);
1556 1557
extern rtx emit_insn_after_setloc (rtx, rtx, int);
extern rtx emit_jump_insn_after (rtx, rtx);
1558
extern rtx emit_jump_insn_after_noloc (rtx, rtx);
1559 1560
extern rtx emit_jump_insn_after_setloc (rtx, rtx, int);
extern rtx emit_call_insn_after (rtx, rtx);
1561
extern rtx emit_call_insn_after_noloc (rtx, rtx);
1562 1563 1564
extern rtx emit_call_insn_after_setloc (rtx, rtx, int);
extern rtx emit_barrier_after (rtx);
extern rtx emit_label_after (rtx, rtx);
1565
extern rtx emit_note_after (enum insn_note, rtx);
1566 1567 1568 1569 1570
extern rtx emit_insn (rtx);
extern rtx emit_jump_insn (rtx);
extern rtx emit_call_insn (rtx);
extern rtx emit_label (rtx);
extern rtx emit_barrier (void);
1571
extern rtx emit_note (enum insn_note);
1572 1573
extern rtx emit_note_copy (rtx);
extern rtx make_insn_raw (rtx);
1574
extern rtx make_jump_insn_raw (rtx);
1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587
extern void add_function_usage_to (rtx, rtx);
extern rtx last_call_insn (void);
extern rtx previous_insn (rtx);
extern rtx next_insn (rtx);
extern rtx prev_nonnote_insn (rtx);
extern rtx next_nonnote_insn (rtx);
extern rtx prev_real_insn (rtx);
extern rtx next_real_insn (rtx);
extern rtx prev_active_insn (rtx);
extern rtx next_active_insn (rtx);
extern int active_insn_p (rtx);
extern rtx prev_label (rtx);
extern rtx next_label (rtx);
1588
extern rtx skip_consecutive_labels (rtx);
1589 1590
extern rtx next_cc0_user (rtx);
extern rtx prev_cc0_setter (rtx);
1591

1592
/* In cfglayout.c  */
1593 1594
extern int insn_line (const_rtx);
extern const char * insn_file (const_rtx);
1595 1596
extern int locator_line (int);
extern const char * locator_file (int);
1597
extern int prologue_locator, epilogue_locator;
1598

1599
/* In jump.c */
1600 1601 1602 1603 1604 1605
extern enum rtx_code reverse_condition (enum rtx_code);
extern enum rtx_code reverse_condition_maybe_unordered (enum rtx_code);
extern enum rtx_code swap_condition (enum rtx_code);
extern enum rtx_code unsigned_condition (enum rtx_code);
extern enum rtx_code signed_condition (enum rtx_code);
extern void mark_jump_label (rtx, rtx, int);
1606
extern unsigned int cleanup_barriers (void);
1607 1608

/* In jump.c */
1609
extern rtx delete_related_insns (rtx);
1610 1611

/* In recog.c  */
1612
extern rtx *find_constant_term_loc (rtx *);
1613 1614

/* In emit-rtl.c  */
1615
extern rtx try_split (rtx, rtx, int);
1616
extern int split_branch_probability;
1617 1618

/* In unknown file  */
1619
extern rtx split_insns (rtx, rtx);
1620 1621

/* In simplify-rtx.c  */
1622 1623
extern rtx simplify_const_unary_operation (enum rtx_code, enum machine_mode,
					   rtx, enum machine_mode);
1624 1625
extern rtx simplify_unary_operation (enum rtx_code, enum machine_mode, rtx,
				     enum machine_mode);
1626 1627
extern rtx simplify_const_binary_operation (enum rtx_code, enum machine_mode,
					    rtx, rtx);
1628 1629 1630 1631
extern rtx simplify_binary_operation (enum rtx_code, enum machine_mode, rtx,
				      rtx);
extern rtx simplify_ternary_operation (enum rtx_code, enum machine_mode,
				       enum machine_mode, rtx, rtx, rtx);
1632 1633
extern rtx simplify_const_relational_operation (enum rtx_code,
						enum machine_mode, rtx, rtx);
1634
extern rtx simplify_relational_operation (enum rtx_code, enum machine_mode,
1635
					  enum machine_mode, rtx, rtx);
1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646
extern rtx simplify_gen_binary (enum rtx_code, enum machine_mode, rtx, rtx);
extern rtx simplify_gen_unary (enum rtx_code, enum machine_mode, rtx,
			       enum machine_mode);
extern rtx simplify_gen_ternary (enum rtx_code, enum machine_mode,
				 enum machine_mode, rtx, rtx, rtx);
extern rtx simplify_gen_relational (enum rtx_code, enum machine_mode,
				    enum machine_mode, rtx, rtx);
extern rtx simplify_subreg (enum machine_mode, rtx, enum machine_mode,
			    unsigned int);
extern rtx simplify_gen_subreg (enum machine_mode, rtx, enum machine_mode,
				unsigned int);
1647
extern rtx simplify_replace_rtx (rtx, const_rtx, rtx);
1648 1649
extern rtx simplify_rtx (rtx);
extern rtx avoid_constant_pool_reference (rtx);
1650
extern bool mode_signbit_p (enum machine_mode, const_rtx);
1651 1652

/* In regclass.c  */
1653 1654
extern enum machine_mode choose_hard_reg_mode (unsigned int, unsigned int,
					       bool);
1655 1656

/* In emit-rtl.c  */
1657
extern rtx set_unique_reg_note (rtx, enum reg_note, rtx);
1658
extern void set_insn_deleted (rtx);
1659

1660 1661
/* Functions in rtlanal.c */

1662 1663 1664 1665 1666
/* Single set is implemented as macro for performance reasons.  */
#define single_set(I) (INSN_P (I) \
		       ? (GET_CODE (PATTERN (I)) == SET \
			  ? PATTERN (I) : single_set_1 (I)) \
		       : NULL_RTX)
1667
#define single_set_1(I) single_set_2 (I, PATTERN (I))
1668

1669
/* Structure used for passing data to REPLACE_LABEL.  */
1670
typedef struct replace_label_data
1671 1672 1673
{
  rtx r1;
  rtx r2;
1674 1675
  bool update_label_nuses;
} replace_label_data;
1676

1677 1678 1679
extern int rtx_addr_can_trap_p (const_rtx);
extern bool nonzero_address_p (const_rtx);
extern int rtx_unstable_p (const_rtx);
1680 1681
extern int rtx_varies_p (rtx, int);
extern int rtx_addr_varies_p (rtx, int);
1682 1683 1684
extern HOST_WIDE_INT get_integer_term (const_rtx);
extern rtx get_related_value (const_rtx);
extern bool offset_within_block_p (const_rtx, HOST_WIDE_INT);
1685
extern void split_const (rtx, rtx *, rtx *);
1686 1687 1688 1689
extern int reg_mentioned_p (const_rtx, const_rtx);
extern int count_occurrences (const_rtx, const_rtx, int);
extern int reg_referenced_p (const_rtx, const_rtx);
extern int reg_used_between_p (const_rtx, const_rtx, const_rtx);
1690 1691
extern int reg_set_between_p (rtx, rtx, rtx);
extern int commutative_operand_precedence (rtx);
Peter Bergner committed
1692
extern bool swap_commutative_operands_p (rtx, rtx);
1693
extern int modified_between_p (rtx, rtx, rtx);
1694
extern int no_labels_between_p (const_rtx, const_rtx);
1695 1696
extern int modified_in_p (rtx, rtx);
extern int reg_set_p (rtx, rtx);
1697 1698 1699
extern rtx single_set_2 (const_rtx, const_rtx);
extern int multiple_sets (const_rtx);
extern int set_noop_p (const_rtx);
1700
extern int noop_move_p (const_rtx);
1701
extern rtx find_last_value (rtx, rtx *, rtx, int);
1702 1703
extern int refers_to_regno_p (unsigned int, unsigned int, const_rtx, rtx *);
extern int reg_overlap_mentioned_p (const_rtx, const_rtx);
1704 1705 1706
extern rtx set_of (rtx, rtx);
extern void note_stores (rtx, void (*) (rtx, rtx, void *), void *);
extern void note_uses (rtx *, void (*) (rtx *, void *), void *);
1707 1708 1709 1710 1711 1712 1713 1714 1715 1716
extern int dead_or_set_p (const_rtx, const_rtx);
extern int dead_or_set_regno_p (const_rtx, unsigned int);
extern rtx find_reg_note (const_rtx, enum reg_note, const_rtx);
extern rtx find_regno_note (const_rtx, enum reg_note, unsigned int);
extern rtx find_reg_equal_equiv_note (const_rtx);
extern rtx find_constant_src (const_rtx);
extern int find_reg_fusage (const_rtx, enum rtx_code, const_rtx);
extern int find_regno_fusage (const_rtx, enum rtx_code, unsigned int);
extern int pure_call_p (const_rtx);
extern void remove_note (rtx, const_rtx);
1717
extern void remove_reg_equal_equiv_notes (rtx);
1718 1719 1720 1721 1722 1723 1724
extern int side_effects_p (const_rtx);
extern int volatile_refs_p (const_rtx);
extern int volatile_insn_p (const_rtx);
extern int may_trap_p (const_rtx);
extern int may_trap_after_code_motion_p (const_rtx);
extern int may_trap_or_fault_p (const_rtx);
extern int inequality_comparisons_p (const_rtx);
1725 1726 1727
extern rtx replace_rtx (rtx, rtx, rtx);
extern int replace_label (rtx *, void *);
extern int rtx_referenced_p (rtx, rtx);
1728 1729
extern bool tablejump_p (const_rtx, rtx *, rtx *);
extern int computed_jump_p (const_rtx);
1730 1731 1732
typedef int (*rtx_function) (rtx *, void *);
extern int for_each_rtx (rtx *, rtx_function, void *);
extern rtx regno_use_in (unsigned int, rtx);
1733 1734 1735 1736
extern int auto_inc_p (const_rtx);
extern int in_expr_list_p (const_rtx, const_rtx);
extern void remove_node_from_expr_list (const_rtx, rtx *);
extern int loc_mentioned_in_p (rtx *, const_rtx);
1737 1738
extern rtx find_first_parameter_load (rtx, rtx);
extern bool keep_with_call_p (rtx);
1739
extern bool label_is_jump_target_p (const_rtx, const_rtx);
1740
extern int insn_rtx_cost (rtx);
Jim Wilson committed
1741

1742 1743 1744 1745 1746 1747 1748 1749
/* Given an insn and condition, return a canonical description of
   the test being made.  */
extern rtx canonicalize_condition (rtx, rtx, int, rtx *, rtx, int, int);

/* Given a JUMP_INSN, return a canonical description of the test
   being made.  */
extern rtx get_condition (rtx, rtx *, int, int);

1750 1751
/* lists.c */

1752 1753 1754 1755 1756 1757
void free_EXPR_LIST_list		(rtx *);
void free_INSN_LIST_list		(rtx *);
void free_EXPR_LIST_node		(rtx);
void free_INSN_LIST_node		(rtx);
rtx alloc_INSN_LIST			(rtx, rtx);
rtx alloc_EXPR_LIST			(int, rtx, rtx);
1758 1759
void remove_free_INSN_LIST_elem (rtx, rtx *);
rtx remove_list_elem (rtx, rtx *);
1760 1761 1762

/* regclass.c */

1763
/* Free up register info memory.  */
1764
extern void free_reg_info (void);
1765

1766
/* recog.c */
1767 1768
extern int asm_noperands (rtx);
extern const char *decode_asm_operands (rtx, rtx *, rtx **, const char **,
1769
					enum machine_mode *, location_t *);
Jim Wilson committed
1770

1771 1772
extern enum reg_class reg_preferred_class (int);
extern enum reg_class reg_alternate_class (int);
Jim Wilson committed
1773

1774
extern void split_all_insns (void);
1775
extern unsigned int split_all_insns_noflow (void);
1776

1777
#define MAX_SAVED_CONST_INT 64
1778
extern GTY(()) rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
1779

1780 1781 1782 1783
#define const0_rtx	(const_int_rtx[MAX_SAVED_CONST_INT])
#define const1_rtx	(const_int_rtx[MAX_SAVED_CONST_INT+1])
#define const2_rtx	(const_int_rtx[MAX_SAVED_CONST_INT+2])
#define constm1_rtx	(const_int_rtx[MAX_SAVED_CONST_INT-1])
1784
extern GTY(()) rtx const_true_rtx;
1785

1786
extern GTY(()) rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
1787

1788
/* Returns a constant 0 rtx in mode MODE.  Integer modes are treated the
1789 1790 1791 1792 1793 1794 1795 1796
   same as VOIDmode.  */

#define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)])

/* Likewise, for the constants 1 and 2.  */

#define CONST1_RTX(MODE) (const_tiny_rtx[1][(int) (MODE)])
#define CONST2_RTX(MODE) (const_tiny_rtx[2][(int) (MODE)])
Jim Wilson committed
1797

1798 1799 1800 1801 1802
/* If HARD_FRAME_POINTER_REGNUM is defined, then a special dummy reg
   is used to represent the frame pointer.  This is because the
   hard frame pointer and the automatic variables are separated by an amount
   that cannot be determined until after register allocation.  We can assume
   that in this case ELIMINABLE_REGS will be defined, one action of which
Kazu Hirata committed
1803
   will be to eliminate FRAME_POINTER_REGNUM into HARD_FRAME_POINTER_REGNUM.  */
1804 1805 1806 1807 1808 1809
#ifndef HARD_FRAME_POINTER_REGNUM
#define HARD_FRAME_POINTER_REGNUM FRAME_POINTER_REGNUM
#endif

/* Index labels for global_rtl.  */
enum global_rtl_index
1810
{
1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842
  GR_PC,
  GR_CC0,
  GR_STACK_POINTER,
  GR_FRAME_POINTER,
/* For register elimination to work properly these hard_frame_pointer_rtx,
   frame_pointer_rtx, and arg_pointer_rtx must be the same if they refer to
   the same register.  */
#if FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
  GR_ARG_POINTER = GR_FRAME_POINTER,
#endif
#if HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM
  GR_HARD_FRAME_POINTER = GR_FRAME_POINTER,
#else
  GR_HARD_FRAME_POINTER,
#endif
#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
#if HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
  GR_ARG_POINTER = GR_HARD_FRAME_POINTER,
#else
  GR_ARG_POINTER,
#endif
#endif
  GR_VIRTUAL_INCOMING_ARGS,
  GR_VIRTUAL_STACK_ARGS,
  GR_VIRTUAL_STACK_DYNAMIC,
  GR_VIRTUAL_OUTGOING_ARGS,
  GR_VIRTUAL_CFA,

  GR_MAX
};

/* Pointers to standard pieces of rtx are stored here.  */
1843
extern GTY(()) rtx global_rtl[GR_MAX];
1844 1845 1846 1847

/* Standard pieces of rtx, to be substituted directly into things.  */
#define pc_rtx                  (global_rtl[GR_PC])
#define cc0_rtx                 (global_rtl[GR_CC0])
1848

Jim Wilson committed
1849 1850 1851
/* All references to certain hard regs, except those created
   by allocating pseudo regs into them (when that's possible),
   go through these unique rtx objects.  */
1852 1853 1854 1855
#define stack_pointer_rtx       (global_rtl[GR_STACK_POINTER])
#define frame_pointer_rtx       (global_rtl[GR_FRAME_POINTER])
#define hard_frame_pointer_rtx	(global_rtl[GR_HARD_FRAME_POINTER])
#define arg_pointer_rtx		(global_rtl[GR_ARG_POINTER])
1856

1857 1858 1859 1860
extern GTY(()) rtx pic_offset_table_rtx;
extern GTY(()) rtx static_chain_rtx;
extern GTY(()) rtx static_chain_incoming_rtx;
extern GTY(()) rtx return_address_pointer_rtx;
1861 1862 1863

/* Include the RTL generation functions.  */

1864
#ifndef GENERATOR_FILE
1865
#include "genrtl.h"
1866 1867 1868 1869 1870 1871 1872 1873
#undef gen_rtx_ASM_INPUT
#ifdef USE_MAPPED_LOCATION
#define gen_rtx_ASM_INPUT(MODE, ARG0)				\
  gen_rtx_fmt_si (ASM_INPUT, (MODE), (ARG0), 0)
#define gen_rtx_ASM_INPUT_loc(MODE, ARG0, LOC)			\
  gen_rtx_fmt_si (ASM_INPUT, (MODE), (ARG0), (LOC))
#else
#define gen_rtx_ASM_INPUT(MODE, ARG0)				\
1874
  gen_rtx_fmt_ssi (ASM_INPUT, (MODE), (ARG0), "", 0)
1875 1876
#define gen_rtx_ASM_INPUT_loc(MODE, ARG0, LOC)			\
  gen_rtx_fmt_ssi (ASM_INPUT, (MODE), (ARG0), (LOC).file, (LOC).line)
1877 1878 1879 1880
#undef gen_rtx_ASM_OPERANDS
#define gen_rtx_ASM_OPERANDS(MODE, ARG0, ARG1, ARG2, ARG3, ARG4, LOC) \
  gen_rtx_fmt_ssiEEsi (ASM_OPERANDS, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4), (LOC).file, (LOC).line)
#endif
1881 1882
#endif

1883 1884
/* There are some RTL codes that require special attention; the
   generation functions included above do the raw handling.  If you
1885
   add to this list, modify special_rtx in gengenrtl.c as well.  */
1886

1887 1888 1889 1890 1891 1892
extern rtx gen_rtx_CONST_INT (enum machine_mode, HOST_WIDE_INT);
extern rtx gen_rtx_CONST_VECTOR (enum machine_mode, rtvec);
extern rtx gen_raw_REG (enum machine_mode, int);
extern rtx gen_rtx_REG (enum machine_mode, unsigned);
extern rtx gen_rtx_SUBREG (enum machine_mode, rtx, int);
extern rtx gen_rtx_MEM (enum machine_mode, rtx);
1893

1894
#define GEN_INT(N)  gen_rtx_CONST_INT (VOIDmode, (N))
1895

Jim Wilson committed
1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907
/* Virtual registers are used during RTL generation to refer to locations into
   the stack frame when the actual location isn't known until RTL generation
   is complete.  The routine instantiate_virtual_regs replaces these with
   the proper value, which is normally {frame,arg,stack}_pointer_rtx plus
   a constant.  */

#define FIRST_VIRTUAL_REGISTER	(FIRST_PSEUDO_REGISTER)

/* This points to the first word of the incoming arguments passed on the stack,
   either by the caller or by the callee when pretending it was passed by the
   caller.  */

1908
#define virtual_incoming_args_rtx       (global_rtl[GR_VIRTUAL_INCOMING_ARGS])
Jim Wilson committed
1909 1910 1911

#define VIRTUAL_INCOMING_ARGS_REGNUM	(FIRST_VIRTUAL_REGISTER)

Richard Stallman committed
1912
/* If FRAME_GROWS_DOWNWARD, this points to immediately above the first
Jim Wilson committed
1913 1914 1915
   variable on the stack.  Otherwise, it points to the first variable on
   the stack.  */

1916
#define virtual_stack_vars_rtx	        (global_rtl[GR_VIRTUAL_STACK_ARGS])
Jim Wilson committed
1917 1918 1919 1920 1921 1922 1923

#define VIRTUAL_STACK_VARS_REGNUM	((FIRST_VIRTUAL_REGISTER) + 1)

/* This points to the location of dynamically-allocated memory on the stack
   immediately after the stack pointer has been adjusted by the amount
   desired.  */

1924
#define virtual_stack_dynamic_rtx	(global_rtl[GR_VIRTUAL_STACK_DYNAMIC])
Jim Wilson committed
1925 1926 1927 1928 1929 1930 1931

#define VIRTUAL_STACK_DYNAMIC_REGNUM	((FIRST_VIRTUAL_REGISTER) + 2)

/* This points to the location in the stack at which outgoing arguments should
   be written when the stack is pre-pushed (arguments pushed using push
   insns always use sp).  */

1932
#define virtual_outgoing_args_rtx	(global_rtl[GR_VIRTUAL_OUTGOING_ARGS])
Jim Wilson committed
1933 1934 1935

#define VIRTUAL_OUTGOING_ARGS_REGNUM	((FIRST_VIRTUAL_REGISTER) + 3)

1936
/* This points to the Canonical Frame Address of the function.  This
1937
   should correspond to the CFA produced by INCOMING_FRAME_SP_OFFSET,
1938
   but is calculated relative to the arg pointer for simplicity; the
1939
   frame pointer nor stack pointer are necessarily fixed relative to
1940 1941
   the CFA until after reload.  */

1942
#define virtual_cfa_rtx			(global_rtl[GR_VIRTUAL_CFA])
1943 1944 1945 1946

#define VIRTUAL_CFA_REGNUM		((FIRST_VIRTUAL_REGISTER) + 4)

#define LAST_VIRTUAL_REGISTER		((FIRST_VIRTUAL_REGISTER) + 4)
Jim Wilson committed
1947

1948
/* Nonzero if REGNUM is a pointer into the stack frame.  */
1949
#define REGNO_PTR_FRAME_P(REGNUM)		\
1950 1951 1952 1953 1954 1955 1956
  ((REGNUM) == STACK_POINTER_REGNUM		\
   || (REGNUM) == FRAME_POINTER_REGNUM		\
   || (REGNUM) == HARD_FRAME_POINTER_REGNUM	\
   || (REGNUM) == ARG_POINTER_REGNUM		\
   || ((REGNUM) >= FIRST_VIRTUAL_REGISTER	\
       && (REGNUM) <= LAST_VIRTUAL_REGISTER))

1957
/* REGNUM never really appearing in the INSN stream.  */
Kazu Hirata committed
1958
#define INVALID_REGNUM			(~(unsigned int) 0)
1959

1960
extern rtx output_constant_def (tree, int);
1961
extern rtx lookup_constant_def (tree);
Jim Wilson committed
1962 1963

/* Nonzero after end of reload pass.
1964
   Set to 1 or 0 by reload1.c.  */
Jim Wilson committed
1965 1966 1967

extern int reload_completed;

Stephen Clarke committed
1968 1969 1970
/* Nonzero after thread_prologue_and_epilogue_insns has run.  */
extern int epilogue_completed;

Jim Wilson committed
1971 1972 1973 1974 1975
/* Set to 1 while reload_as_needed is operating.
   Required by some machines to handle any generated moves differently.  */

extern int reload_in_progress;

1976 1977 1978 1979 1980
/* This macro indicates whether you may create a new
   pseudo-register.  */

#define can_create_pseudo_p() (!reload_in_progress && !reload_completed)

1981 1982 1983 1984 1985 1986
#ifdef STACK_REGS
/* Nonzero after end of regstack pass.
   Set to 1 or 0 by reg-stack.c.  */
extern int regstack_completed;
#endif

Jim Wilson committed
1987 1988 1989 1990 1991 1992 1993 1994
/* If this is nonzero, we do not bother generating VOLATILE
   around volatile memory references, and we are willing to
   output indirect addresses.  If cse is to follow, we reject
   indirect addresses so a useful potential cse is generated;
   if it is used only once, instruction combination will produce
   the same indirect address eventually.  */
extern int cse_not_expected;

1995
/* Translates rtx code to tree code, for those codes needed by
1996 1997 1998
   REAL_ARITHMETIC.  The function returns an int because the caller may not
   know what `enum tree_code' means.  */

1999
extern int rtx_to_tree_code (enum rtx_code);
2000

2001
/* In cse.c */
2002
extern int delete_trivially_dead_insns (rtx, int);
2003
extern int cse_main (rtx, int);
2004 2005
extern int exp_equiv_p (rtx, rtx, int, bool);
extern unsigned hash_rtx (rtx x, enum machine_mode, int *, int *, bool);
2006 2007

/* In jump.c */
2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024
extern int comparison_dominates_p (enum rtx_code, enum rtx_code);
extern int condjump_p (rtx);
extern int any_condjump_p (rtx);
extern int any_uncondjump_p (rtx);
extern rtx pc_set (rtx);
extern rtx condjump_label (rtx);
extern int simplejump_p (rtx);
extern int returnjump_p (rtx);
extern int onlyjump_p (rtx);
extern int only_sets_cc0_p (rtx);
extern int sets_cc0_p (rtx);
extern int invert_jump_1 (rtx, rtx);
extern int invert_jump (rtx, rtx, int);
extern int rtx_renumbered_equal_p (rtx, rtx);
extern int true_regnum (rtx);
extern unsigned int reg_or_subregno (rtx);
extern int redirect_jump_1 (rtx, rtx);
2025
extern void redirect_jump_2 (rtx, rtx, rtx, int, int);
2026 2027
extern int redirect_jump (rtx, rtx, int);
extern void rebuild_jump_labels (rtx);
2028
extern rtx reversed_comparison (rtx, enum machine_mode);
2029
extern enum rtx_code reversed_comparison_code (rtx, rtx);
2030 2031
extern enum rtx_code reversed_comparison_code_parts (enum rtx_code, rtx,
						     rtx, rtx);
2032 2033
extern void delete_for_peephole (rtx, rtx);
extern int condjump_in_parallel_p (rtx);
2034

Kazu Hirata committed
2035
/* In emit-rtl.c.  */
2036 2037 2038
extern int max_reg_num (void);
extern int max_label_num (void);
extern int get_first_label_num (void);
2039
extern void maybe_set_first_label_num (rtx);
2040 2041 2042 2043
extern void delete_insns_since (rtx);
extern void mark_reg_pointer (rtx, int);
extern void mark_user_reg (rtx);
extern void reset_used_flags (rtx);
2044
extern void set_used_flags (rtx);
2045 2046 2047 2048 2049 2050 2051 2052 2053 2054
extern void reorder_insns (rtx, rtx, rtx);
extern void reorder_insns_nobb (rtx, rtx, rtx);
extern int get_max_uid (void);
extern int in_sequence_p (void);
extern void force_next_line_note (void);
extern void init_emit (void);
extern void init_emit_once (int);
extern void push_topmost_sequence (void);
extern void pop_topmost_sequence (void);
extern void set_new_first_and_last_insn (rtx, rtx);
2055
extern unsigned int unshare_all_rtl (void);
2056
extern void unshare_all_rtl_again (rtx);
2057 2058
extern void unshare_all_rtl_in_chain (rtx);
extern void verify_rtl_sharing (void);
2059 2060 2061 2062
extern void set_first_insn (rtx);
extern void set_last_insn (rtx);
extern void link_cc0_insns (rtx);
extern void add_insn (rtx);
2063 2064
extern void add_insn_before (rtx, rtx, struct basic_block_def *);
extern void add_insn_after (rtx, rtx, struct basic_block_def *);
2065 2066 2067
extern void remove_insn (rtx);
extern rtx emit (rtx);
extern rtx delete_insn (rtx);
2068
extern rtx entry_of_function (void);
2069
extern void emit_insn_at_entry (rtx);
2070
extern void delete_insn_chain (rtx, rtx, bool);
2071 2072
extern rtx unlink_insn_chain (rtx, rtx);
extern rtx delete_insn_and_edges (rtx);
2073
extern rtx gen_lowpart_SUBREG (enum machine_mode, rtx);
2074
extern rtx gen_const_mem (enum machine_mode, rtx);
2075 2076
extern rtx gen_frame_mem (enum machine_mode, rtx);
extern rtx gen_tmp_stack_mem (enum machine_mode, rtx);
2077 2078
extern bool validate_subreg (enum machine_mode, enum machine_mode,
			     rtx, unsigned int);
2079

2080
/* In combine.c  */
2081 2082 2083 2084
extern unsigned int extended_count (rtx, enum machine_mode, int);
extern rtx remove_death (unsigned int, rtx);
extern void dump_combine_stats (FILE *);
extern void dump_combine_total_stats (FILE *);
2085

2086 2087 2088
/* In cfgcleanup.c  */
extern void delete_dead_jumptables (void);

2089 2090 2091 2092 2093
/* In sched-vis.c.  */
extern void print_rtl_slim_with_bb (FILE *, rtx, int);
extern void dump_insn_slim (FILE *f, rtx x);
extern void debug_insn_slim (rtx x);

2094
/* In sched-rgn.c.  */
2095
extern void schedule_insns (void);
2096 2097

/* In sched-ebb.c.  */
2098
extern void schedule_ebbs (void);
2099 2100

/* In haifa-sched.c.  */
2101
extern void fix_sched_param (const char *, const char *);
2102 2103

/* In print-rtl.c */
2104
extern const char *print_rtx_head;
2105 2106 2107 2108 2109 2110 2111 2112 2113
extern void debug_rtx (const_rtx);
extern void debug_rtx_list (const_rtx, int);
extern void debug_rtx_range (const_rtx, const_rtx);
extern const_rtx debug_rtx_find (const_rtx, int);
extern void print_mem_expr (FILE *, const_tree);
extern void print_rtl (FILE *, const_rtx);
extern void print_simple_rtl (FILE *, const_rtx);
extern int print_rtl_single (FILE *, const_rtx);
extern void print_inline_rtx (FILE *, const_rtx, int);
2114 2115

/* In function.c */
2116
extern void reposition_prologue_and_epilogue_notes (void);
2117 2118 2119 2120
extern int prologue_epilogue_contains (rtx);
extern int sibcall_epilogue_contains (rtx);
extern void mark_temp_addr_taken (rtx);
extern void update_temp_slot_address (rtx, rtx);
2121 2122

/* In stmt.c */
2123
extern void expand_null_return (void);
2124
extern void expand_naked_return (void);
2125
extern void emit_jump (rtx);
2126 2127

/* In expr.c */
2128 2129
extern rtx move_by_pieces (rtx, rtx, unsigned HOST_WIDE_INT,
			   unsigned int, int);
2130

2131
/* In cfgrtl.c */
2132
extern void print_rtl_with_bb (FILE *, rtx);
2133 2134 2135

/* In cfg.c.  */
extern void dump_reg_info (FILE *);
2136
extern void dump_flow_info (FILE *, int);
2137 2138

/* In expmed.c */
2139 2140 2141
extern void init_expmed (void);
extern void expand_inc (rtx, rtx);
extern void expand_dec (rtx, rtx);
2142

Kaveh R. Ghazi committed
2143
/* In gcse.c */
2144 2145
extern bool can_copy_p (enum machine_mode);
extern rtx fis_get_condition (rtx);
2146

2147
/* In global.c */
2148 2149
extern void mark_elimination (int, int);
extern void dump_global_regs (FILE *);
Kaveh R. Ghazi committed
2150
#ifdef HARD_CONST
2151
/* Yes, this ifdef is silly, but HARD_REG_SET is not always defined.  */
2152
extern void retry_global_alloc (int, HARD_REG_SET);
Kaveh R. Ghazi committed
2153
#endif
2154
extern void build_insn_chain (rtx);
2155 2156

/* In regclass.c */
2157 2158 2159
extern int reg_classes_intersect_p (enum reg_class, enum reg_class);
extern int reg_class_subset_p (enum reg_class, enum reg_class);
extern void globalize_reg (int);
2160
extern void init_reg_modes_once (void);
2161 2162 2163
extern void init_regs (void);
extern void init_fake_stack_mems (void);
extern void init_reg_sets (void);
2164
extern void regclass (rtx, int);
2165
extern void reg_scan (rtx, unsigned int);
2166
extern void fix_register (const char *, int, int);
2167
#ifdef HARD_CONST
2168 2169
extern void cannot_change_mode_set_regs (HARD_REG_SET *,
					 enum machine_mode, unsigned int);
2170
#endif
2171 2172
extern bool invalid_mode_change_p (unsigned int, enum reg_class,
				   enum machine_mode);
2173

Kaveh R. Ghazi committed
2174
/* In reorg.c */
2175
extern void dbr_schedule (rtx);
Kaveh R. Ghazi committed
2176

2177
/* In local-alloc.c */
2178
extern void dump_local_alloc (FILE *);
2179

2180 2181 2182
/* In reload1.c */
extern int function_invariant_p (rtx);

2183
/* In calls.c */
2184 2185 2186 2187 2188 2189
enum libcall_type
{
  LCT_NORMAL = 0,
  LCT_CONST = 1,
  LCT_PURE = 2,
  LCT_CONST_MAKE_BLOCK = 3,
2190
  LCT_PURE_MAKE_BLOCK = 4,
2191
  LCT_NORETURN = 5,
2192
  LCT_THROW = 6,
2193
  LCT_RETURNS_TWICE = 7
2194 2195
};

2196 2197 2198 2199
extern void emit_library_call (rtx, enum libcall_type, enum machine_mode, int,
			       ...);
extern rtx emit_library_call_value (rtx, rtx, enum libcall_type,
				    enum machine_mode, int, ...);
2200 2201

/* In varasm.c */
2202
extern void init_varasm_once (void);
2203 2204
extern enum tls_model decl_default_tls_model (tree);
  
2205
/* In rtl.c */
2206
extern void traverse_md_constants (int (*) (void **, void *), void *);
2207
struct md_constant { char *name, *value; };
2208

2209
/* In read-rtl.c */
2210
extern int read_skip_spaces (FILE *);
2211
extern bool read_rtx (FILE *, rtx *, int *);
2212 2213 2214 2215
extern void copy_rtx_ptr_loc (const void *, const void *);
extern void print_rtx_ptr_loc (const void *);
extern const char *join_c_conditions (const char *, const char *);
extern void print_c_condition (const char *);
2216 2217 2218
extern const char *read_rtx_filename;
extern int read_rtx_lineno;

2219
/* In alias.c */
2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232
extern rtx canon_rtx (rtx);
extern int true_dependence (rtx, enum machine_mode, rtx, int (*)(rtx, int));
extern rtx get_addr (rtx);
extern int canon_true_dependence (rtx, enum machine_mode, rtx, rtx,
				  int (*)(rtx, int));
extern int read_dependence (rtx, rtx);
extern int anti_dependence (rtx, rtx);
extern int output_dependence (rtx, rtx);
extern void init_alias_once (void);
extern void init_alias_analysis (void);
extern void end_alias_analysis (void);
extern bool memory_modified_in_insn_p (rtx, rtx);
extern rtx find_base_term (rtx);
2233
extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int);
2234 2235
extern rtx get_reg_known_value (unsigned int);
extern bool get_reg_known_equiv_p (unsigned int);
2236

2237
#ifdef STACK_REGS
2238
extern int stack_regs_mentioned (rtx insn);
2239 2240
#endif

2241
/* In toplev.c */
2242
extern GTY(()) rtx stack_limit_rtx;
2243

Jan Hubicka committed
2244
/* In predict.c */
2245 2246
extern void invert_br_probabilities (rtx);
extern bool expensive_function_p (int);
2247 2248
/* In cfgexpand.c */
extern void add_reg_br_prob_note (rtx last, int probability);
2249
/* In tracer.c */
2250
extern void tracer (void);
2251

2252
/* In var-tracking.c */
2253
extern unsigned int variable_tracking_main (void);
2254

Zdenek Dvorak committed
2255
/* In stor-layout.c.  */
2256 2257
extern void get_mode_bounds (enum machine_mode, int, enum machine_mode,
			     rtx *, rtx *);
Zdenek Dvorak committed
2258 2259 2260 2261 2262 2263 2264 2265

/* In loop-unswitch.c  */
extern rtx reversed_condition (rtx);
extern rtx compare_and_jump_seq (rtx, rtx, enum rtx_code, rtx, int, rtx);

/* In loop-iv.c  */
extern rtx canon_condition (rtx);
extern void simplify_using_condition (rtx, rtx *, struct bitmap_head_def *);
2266 2267 2268 2269

struct rtl_hooks
{
  rtx (*gen_lowpart) (enum machine_mode, rtx);
2270
  rtx (*gen_lowpart_no_emit) (enum machine_mode, rtx);
2271
  rtx (*reg_nonzero_bits) (const_rtx, enum machine_mode, const_rtx, enum machine_mode,
2272
			   unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT *);
2273
  rtx (*reg_num_sign_bit_copies) (const_rtx, enum machine_mode, const_rtx, enum machine_mode,
2274
				  unsigned int, unsigned int *);
2275
  bool (*reg_truncated_to_mode) (enum machine_mode, const_rtx);
2276

2277
  /* Whenever you add entries here, make sure you adjust rtlhooks-def.h.  */
2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288
};

/* Each pass can provide its own.  */
extern struct rtl_hooks rtl_hooks;

/* ... but then it has to restore these.  */
extern const struct rtl_hooks general_rtl_hooks;

/* Keep this for the nonce.  */
#define gen_lowpart rtl_hooks.gen_lowpart

2289 2290 2291 2292 2293 2294
extern void insn_locators_alloc (void);
extern void insn_locators_finalize (void);
extern void set_curr_insn_source_location (location_t);
extern void set_curr_insn_block (tree);
extern int curr_insn_locator (void);

2295
#endif /* ! GCC_RTL_H */