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