* config/mips/mips.h (SUBTARGET_CPP_SIZE_SPEC): Remove duplicate
[official-gcc.git] / gcc / ch / typeck.c
blob84ee56ebd395fd2aad04ebd2cb17b81df7b12589
1 /* Build expressions with type checking for CHILL compiler.
2 Copyright (C) 1992, 1993, 1994, 1998, 1999, 2000
3 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
23 /* This file is part of the CHILL front end.
24 It contains routines to build C expressions given their operands,
25 including computing the modes of the result, C-specific error checks,
26 and some optimization.
28 There are also routines to build RETURN_STMT nodes and CASE_STMT nodes,
29 and to process initializations in declarations (since they work
30 like a strange sort of assignment). */
32 #include "config.h"
33 #include "system.h"
34 #include "tree.h"
35 #include "ch-tree.h"
36 #include "flags.h"
37 #include "rtl.h"
38 #include "expr.h"
39 #include "lex.h"
40 #include "toplev.h"
41 #include "output.h"
43 /* forward declarations */
44 static int chill_l_equivalent PARAMS ((tree, tree, struct mode_chain*));
45 static tree extract_constant_from_buffer PARAMS ((tree, const unsigned char *, int));
46 static int expand_constant_to_buffer PARAMS ((tree, unsigned char *, int));
47 static tree build_empty_string PARAMS ((tree));
48 static tree make_chill_pointer_type PARAMS ((tree, enum tree_code));
49 static unsigned int min_precision PARAMS ((tree, int));
50 static tree make_chill_range_type PARAMS ((tree, tree, tree));
51 static void apply_chill_array_layout PARAMS ((tree));
52 static int field_decl_cmp PARAMS ((tree *, tree*));
53 static tree make_chill_struct_type PARAMS ((tree));
54 static int apply_chill_field_layout PARAMS ((tree, int *));
57 * This function checks an array access.
58 * It calls error (ERROR_MESSAGE) if the condition (index <= domain max value
59 * index >= domain min value)
60 * is not met at compile time,
61 * If a runtime test is required and permitted,
62 * check_expression is used to do so.
63 * the global RANGE_CHECKING flags controls the
64 * generation of runtime checking code.
66 tree
67 valid_array_index_p (array, idx, error_message, is_varying_lhs)
68 tree array, idx;
69 const char *error_message;
70 int is_varying_lhs;
72 tree cond, low_limit, high_cond, atype, domain;
73 tree orig_index = idx;
74 enum chill_tree_code condition;
76 if (array == NULL_TREE || TREE_CODE (array) == ERROR_MARK
77 || idx == NULL_TREE || TREE_CODE (idx) == ERROR_MARK)
78 return error_mark_node;
80 if (TREE_CODE (idx) == TYPE_DECL
81 || TREE_CODE_CLASS (TREE_CODE (idx)) == 't')
83 error ("array or string index is a mode (instead of a value)");
84 return error_mark_node;
87 atype = TREE_TYPE (array);
89 if (chill_varying_type_p (atype))
91 domain = TYPE_DOMAIN (CH_VARYING_ARRAY_TYPE (atype));
92 high_cond = build_component_ref (array, var_length_id);
93 if (chill_varying_string_type_p (atype))
95 if (is_varying_lhs)
96 condition = GT_EXPR;
97 else
98 condition = GE_EXPR;
100 else
101 condition = GT_EXPR;
103 else
105 domain = TYPE_DOMAIN (atype);
106 high_cond = TYPE_MAX_VALUE (domain);
107 condition = GT_EXPR;
110 if (CH_STRING_TYPE_P (atype))
112 if (! CH_SIMILAR (TREE_TYPE (orig_index), integer_type_node))
114 error ("index is not an integer expression");
115 return error_mark_node;
118 else
120 if (! CH_COMPATIBLE (orig_index, domain))
122 error ("index not compatible with index mode");
123 return error_mark_node;
127 /* Convert BOOLS(1) to BOOL and CHARS(1) to CHAR. */
128 if (flag_old_strings)
130 idx = convert_to_discrete (idx);
131 if (idx == NULL) /* should never happen */
132 error ("index is not discrete");
135 /* we know we'll refer to this value twice */
136 if (range_checking)
137 idx = save_expr (idx);
139 low_limit = TYPE_MIN_VALUE (domain);
140 high_cond = build_compare_discrete_expr (condition, idx, high_cond);
142 /* an invalid index expression meets this condition */
143 cond = fold (build (TRUTH_ORIF_EXPR, boolean_type_node,
144 build_compare_discrete_expr (LT_EXPR, idx, low_limit),
145 high_cond));
147 /* strip a redundant NOP_EXPR */
148 if (TREE_CODE (cond) == NOP_EXPR
149 && TREE_TYPE (cond) == boolean_type_node
150 && TREE_CODE (TREE_OPERAND (cond, 0)) == INTEGER_CST)
151 cond = TREE_OPERAND (cond, 0);
153 idx = convert (CH_STRING_TYPE_P (atype) ? integer_type_node : domain,
154 idx);
156 if (TREE_CODE (cond) == INTEGER_CST)
158 if (tree_int_cst_equal (cond, boolean_false_node))
159 return idx; /* condition met at compile time */
160 error ("%s", error_message); /* condition failed at compile time */
161 return error_mark_node;
163 else if (range_checking)
165 /* FIXME: often, several of these conditions will
166 be generated for the same source file and line number.
167 A great optimization would be to share the
168 cause_exception function call among them rather
169 than generating a cause_exception call for each. */
170 return check_expression (idx, cond,
171 ridpointers[(int) RID_RANGEFAIL]);
173 else
174 return idx; /* don't know at compile time */
178 * Extract a slice from an array, which could look like a
179 * SET_TYPE if it's a bitstring. The array could also be VARYING
180 * if the element type is CHAR. The min_value and length values
181 * must have already been checked with valid_array_index_p. No
182 * checking is done here.
184 tree
185 build_chill_slice (array, min_value, length)
186 tree array, min_value, length;
188 tree result;
189 tree array_type = TREE_TYPE (array);
191 if (!CH_REFERABLE (array) && TREE_CODE (array) != SAVE_EXPR
192 && (TREE_CODE (array) != COMPONENT_REF
193 || TREE_CODE (TREE_OPERAND (array, 0)) != SAVE_EXPR))
195 if (!TREE_CONSTANT (array))
196 warning ("possible internal error - slice argument is neither referable nor constant");
197 else
199 /* Force to storage.
200 NOTE: This could mean multiple identical copies of
201 the same constant. FIXME. */
202 tree mydecl = decl_temp1 (get_unique_identifier("SLICEE"),
203 array_type, 1, array, 0, 0);
204 TREE_READONLY (mydecl) = 1;
205 /* mark_addressable (mydecl); FIXME: necessary? */
206 array = mydecl;
211 The code-generation which uses a slice tree needs not only to
212 know the dynamic upper and lower limits of that slice, but the
213 original static allocation, to use to build temps where one or both
214 of the dynamic limits must be calculated at runtime.. We pass the
215 dynamic size by building a new array_type whose limits are the
216 min_value and min_value + length values passed to us.
218 The static allocation info is passed by using the parent array's
219 limits to compute a temp_size, which is passed in the lang_specific
220 field of the slice_type. */
222 if (TREE_CODE (array_type) == ARRAY_TYPE)
224 tree domain_type = TYPE_DOMAIN (array_type);
225 tree domain_min = TYPE_MIN_VALUE (domain_type);
226 tree domain_max
227 = fold (build (PLUS_EXPR, domain_type,
228 domain_min,
229 fold (build (MINUS_EXPR, integer_type_node,
230 length, integer_one_node))));
231 tree index_type = build_chill_range_type (TYPE_DOMAIN (array_type),
232 domain_min,
233 domain_max);
235 tree element_type = TREE_TYPE (array_type);
236 tree slice_type = build_simple_array_type (element_type, index_type, NULL_TREE);
237 tree slice_pointer_type;
238 tree max_size;
240 if (CH_CHARS_TYPE_P (array_type))
241 MARK_AS_STRING_TYPE (slice_type);
242 else
243 TYPE_PACKED (slice_type) = TYPE_PACKED (array_type);
245 SET_CH_NOVELTY (slice_type, CH_NOVELTY (array_type));
247 if (TREE_CONSTANT (array) && host_integerp (min_value, 0)
248 && host_integerp (length, 0))
250 unsigned HOST_WIDE_INT type_size = int_size_in_bytes (array_type);
251 unsigned char *buffer = (unsigned char *) alloca (type_size);
252 int delta = (int_size_in_bytes (element_type)
253 * (tree_low_cst (min_value, 0)
254 - tree_low_cst (domain_min, 0)));
256 memset (buffer, 0, type_size);
257 if (expand_constant_to_buffer (array, buffer, type_size))
259 result = extract_constant_from_buffer (slice_type,
260 buffer + delta,
261 type_size - delta);
262 if (result)
263 return result;
267 /* Kludge used by case CONCAT_EXPR in chill_expand_expr.
268 Set TYPE_ARRAY_MAX_SIZE to a constant upper bound on the
269 bytes needed. */
270 max_size = size_in_bytes (slice_type);
271 if (TREE_CODE (max_size) != INTEGER_CST)
273 max_size = TYPE_ARRAY_MAX_SIZE (array_type);
274 if (max_size == NULL_TREE)
275 max_size = size_in_bytes (array_type);
277 TYPE_ARRAY_MAX_SIZE (slice_type) = max_size;
279 mark_addressable (array);
280 /* Contruct a SLICE_EXPR to represent a slice of a packed array of bits. */
281 if (TYPE_PACKED (array_type))
283 if (pass == 2 && TREE_CODE (length) != INTEGER_CST)
285 sorry ("bit array slice with non-constant length");
286 return error_mark_node;
288 if (domain_min && ! integer_zerop (domain_min))
289 min_value = size_binop (MINUS_EXPR, min_value,
290 convert (sizetype, domain_min));
291 result = build (SLICE_EXPR, slice_type, array, min_value, length);
292 TREE_READONLY (result)
293 = TREE_READONLY (array) | TYPE_READONLY (TREE_TYPE (array_type));
294 return result;
297 slice_pointer_type = build_chill_pointer_type (slice_type);
298 if (TREE_CODE (min_value) == INTEGER_CST
299 && domain_min && TREE_CODE (domain_min) == INTEGER_CST
300 && compare_int_csts (EQ_EXPR, min_value, domain_min))
301 result = fold (build1 (ADDR_EXPR, slice_pointer_type, array));
302 else
304 min_value = convert (sizetype, min_value);
305 if (domain_min && ! integer_zerop (domain_min))
306 min_value = size_binop (MINUS_EXPR, min_value,
307 convert (sizetype, domain_min));
308 min_value = size_binop (MULT_EXPR, min_value,
309 size_in_bytes (element_type));
310 result = fold (build (PLUS_EXPR, slice_pointer_type,
311 build1 (ADDR_EXPR, slice_pointer_type,
312 array),
313 convert (slice_pointer_type, min_value)));
315 /* Return the final array value. */
316 result = fold (build1 (INDIRECT_REF, slice_type, result));
317 TREE_READONLY (result)
318 = TREE_READONLY (array) | TYPE_READONLY (element_type);
319 return result;
321 else if (TREE_CODE (array_type) == SET_TYPE) /* actually a bitstring */
323 if (pass == 2 && TREE_CODE (length) != INTEGER_CST)
325 sorry ("bitstring slice with non-constant length");
326 return error_mark_node;
328 result = build (SLICE_EXPR, build_bitstring_type (length),
329 array, min_value, length);
330 TREE_READONLY (result)
331 = TREE_READONLY (array) | TYPE_READONLY (TREE_TYPE (array_type));
332 return result;
334 else if (chill_varying_type_p (array_type))
335 return build_chill_slice (varying_to_slice (array), min_value, length);
336 else
338 error ("slice operation on non-array, non-bitstring value not supported");
339 return error_mark_node;
343 static tree
344 build_empty_string (type)
345 tree type;
347 int orig_pass = pass;
348 tree range, result;
350 range = build_chill_range_type (type, integer_zero_node,
351 integer_minus_one_node);
352 result = build_chill_array_type (type,
353 tree_cons (NULL_TREE, range, NULL_TREE), 0, NULL_TREE);
354 pass = 2;
355 range = build_chill_range_type (type, integer_zero_node,
356 integer_minus_one_node);
357 result = build_chill_array_type (type,
358 tree_cons (NULL_TREE, range, NULL_TREE), 0, NULL_TREE);
359 pass = orig_pass;
361 return decl_temp1 (get_unique_identifier ("EMPTY_STRING"),
362 result, 0, NULL_TREE, 0, 0);
365 /* We build the runtime range-checking as a separate list
366 * rather than making a compound_expr with min_value
367 * (for example), to control when that comparison gets
368 * generated. We cannot allow it in a TYPE_MAX_VALUE or
369 * TYPE_MIN_VALUE expression, for instance, because that code
370 * will get generated when the slice is laid out, which would
371 * put it outside the scope of an exception handler for the
372 * statement we're generating. I.e. we would be generating
373 * cause_exception calls which might execute before the
374 * necessary ch_link_handler call.
376 tree
377 build_chill_slice_with_range (array, min_value, max_value)
378 tree array, min_value, max_value;
380 if (array == NULL_TREE || TREE_CODE (array) == ERROR_MARK
381 || min_value == NULL_TREE || TREE_CODE(min_value) == ERROR_MARK
382 || max_value == NULL_TREE || TREE_CODE(max_value) == ERROR_MARK)
383 return error_mark_node;
385 if (TREE_TYPE (array) == NULL_TREE
386 || (TREE_CODE (TREE_TYPE (array)) != ARRAY_TYPE
387 && TREE_CODE (TREE_TYPE (array)) != SET_TYPE
388 && !chill_varying_type_p (TREE_TYPE (array))))
390 error ("can only take slice of array or string");
391 return error_mark_node;
394 array = save_if_needed (array);
396 /* FIXME: test here for max_value >= min_value, except
397 for max_value == -1, min_value == 0 (empty string) */
398 min_value = valid_array_index_p (array, min_value,
399 "slice lower limit out-of-range", 0);
400 if (TREE_CODE (min_value) == ERROR_MARK)
401 return min_value;
403 /* FIXME: suppress this test if max_value is the LENGTH of a
404 varying array, which has presumably already been checked. */
405 max_value = valid_array_index_p (array, max_value,
406 "slice upper limit out-of-range", 0);
407 if (TREE_CODE (max_value) == ERROR_MARK)
408 return error_mark_node;
410 if (TREE_CODE (min_value) == INTEGER_CST
411 && TREE_CODE (max_value) == INTEGER_CST
412 && tree_int_cst_lt (max_value, min_value))
413 return build_empty_string (TREE_TYPE (TREE_TYPE (array)));
415 return
416 build_chill_slice
417 (array, min_value,
418 save_expr (fold (build (PLUS_EXPR, integer_type_node,
419 fold (build (MINUS_EXPR, integer_type_node,
420 max_value, min_value)),
421 integer_one_node))));
424 tree
425 build_chill_slice_with_length (array, min_value, length)
426 tree array, min_value, length;
428 tree max_index;
429 tree cond, high_cond, atype;
431 if (array == NULL_TREE || TREE_CODE (array) == ERROR_MARK
432 || min_value == NULL_TREE || TREE_CODE(min_value) == ERROR_MARK
433 || length == NULL_TREE || TREE_CODE(length) == ERROR_MARK)
434 return error_mark_node;
436 if (TREE_TYPE (array) == NULL_TREE
437 || (TREE_CODE (TREE_TYPE (array)) != ARRAY_TYPE
438 && TREE_CODE (TREE_TYPE (array)) != SET_TYPE
439 && !chill_varying_type_p (TREE_TYPE (array))))
441 error ("can only take slice of array or string");
442 return error_mark_node;
445 if (TREE_CONSTANT (length)
446 && tree_int_cst_lt (length, integer_zero_node))
447 return build_empty_string (TREE_TYPE (TREE_TYPE (array)));
449 array = save_if_needed (array);
450 min_value = save_expr (min_value);
451 length = save_expr (length);
453 if (! CH_SIMILAR (TREE_TYPE (length), integer_type_node))
455 error ("slice length is not an integer");
456 length = integer_one_node;
459 max_index = fold (build (MINUS_EXPR, integer_type_node,
460 fold (build (PLUS_EXPR, integer_type_node,
461 length, min_value)),
462 integer_one_node));
463 max_index = convert_to_class (chill_expr_class (min_value), max_index);
465 min_value = valid_array_index_p (array, min_value,
466 "slice start index out-of-range", 0);
467 if (TREE_CODE (min_value) == ERROR_MARK)
468 return error_mark_node;
470 atype = TREE_TYPE (array);
472 if (chill_varying_type_p (atype))
473 high_cond = build_component_ref (array, var_length_id);
474 else
475 high_cond = TYPE_MAX_VALUE (TYPE_DOMAIN (atype));
477 /* an invalid index expression meets this condition */
478 cond = fold (build (TRUTH_ORIF_EXPR, boolean_type_node,
479 build_compare_discrete_expr (LT_EXPR,
480 length, integer_zero_node),
481 build_compare_discrete_expr (GT_EXPR,
482 max_index, high_cond)));
484 if (TREE_CODE (cond) == INTEGER_CST)
486 if (! tree_int_cst_equal (cond, boolean_false_node))
488 error ("slice length out-of-range");
489 return error_mark_node;
493 else if (range_checking)
495 min_value = check_expression (min_value, cond,
496 ridpointers[(int) RID_RANGEFAIL]);
499 return build_chill_slice (array, min_value, length);
502 tree
503 build_chill_array_ref (array, indexlist)
504 tree array, indexlist;
506 tree idx;
508 if (array == NULL_TREE || TREE_CODE (array) == ERROR_MARK)
509 return error_mark_node;
510 if (indexlist == NULL_TREE || TREE_CODE (indexlist) == ERROR_MARK)
511 return error_mark_node;
513 idx = TREE_VALUE (indexlist); /* handle first index */
515 idx = valid_array_index_p (array, idx,
516 "array index out-of-range", 0);
517 if (TREE_CODE (idx) == ERROR_MARK)
518 return error_mark_node;
520 array = build_chill_array_ref_1 (array, idx);
522 if (array && TREE_CODE (array) != ERROR_MARK
523 && TREE_CHAIN (indexlist))
525 /* Z.200 (1988) section 4.2.8 says that:
526 <array> '(' <expression {',' <expression> }* ')'
527 is derived syntax (i.e. syntactic sugar) for:
528 <array> '(' <expression ')' { '(' <expression> ')' }*
529 The intent is clear if <array> has mode: ARRAY (...) ARRAY (...) XXX.
530 But what if <array> has mode: ARRAY (...) CHARS (N)
531 or: ARRAY (...) BOOLS (N).
532 Z.200 doesn't explicitly prohibit it, but the intent is unclear.
533 We'll allow it, since it seems reasonable and useful.
534 However, we won't allow it if <array> is:
535 ARRAY (...) PROC (...).
536 (The latter would make sense if we allowed general
537 Currying, which Chill doesn't.) */
538 if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE
539 || chill_varying_type_p (TREE_TYPE (array))
540 || CH_BOOLS_TYPE_P (TREE_TYPE (array)))
541 array = build_generalized_call (array, TREE_CHAIN (indexlist));
542 else
543 error ("too many index expressions");
545 return array;
549 * Don't error check the index in here. It's supposed to be
550 * checked by the caller.
552 tree
553 build_chill_array_ref_1 (array, idx)
554 tree array, idx;
556 tree type;
557 tree domain;
558 tree rval;
560 if (array == NULL_TREE || TREE_CODE (array) == ERROR_MARK
561 || idx == NULL_TREE || TREE_CODE (idx) == ERROR_MARK)
562 return error_mark_node;
564 if (chill_varying_type_p (TREE_TYPE (array)))
565 array = varying_to_slice (array);
567 domain = TYPE_DOMAIN (TREE_TYPE (array));
569 #if 0
570 if (! integer_zerop (TYPE_MIN_VALUE (domain)))
572 /* The C part of the compiler doesn't understand how to do
573 arithmetic with dissimilar enum types. So we check compatibility
574 here, and perform the math in INTEGER_TYPE. */
575 if (TREE_CODE (TREE_TYPE (idx)) == ENUMERAL_TYPE
576 && chill_comptypes (TREE_TYPE (idx), domain, 0))
577 idx = convert (TREE_TYPE (TYPE_MIN_VALUE (domain)), idx);
578 idx = build_binary_op (MINUS_EXPR, idx, TYPE_MIN_VALUE (domain), 0);
580 #endif
582 if (CH_STRING_TYPE_P (TREE_TYPE (array)))
584 /* Could be bitstring or char string. */
585 if (TREE_TYPE (TREE_TYPE (array)) == boolean_type_node)
587 rval = build (SET_IN_EXPR, boolean_type_node, idx, array);
588 TREE_READONLY (rval) = TREE_READONLY (array);
589 return rval;
593 if (!discrete_type_p (TREE_TYPE (idx)))
595 error ("array index is not discrete");
596 return error_mark_node;
599 /* An array that is indexed by a non-constant
600 cannot be stored in a register; we must be able to do
601 address arithmetic on its address.
602 Likewise an array of elements of variable size. */
603 if (TREE_CODE (idx) != INTEGER_CST
604 || (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array))) != 0
605 && TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array)))) != INTEGER_CST))
607 if (mark_addressable (array) == 0)
608 return error_mark_node;
611 type = TREE_TYPE (TREE_TYPE (array));
613 /* Do constant folding */
614 if (TREE_CODE (idx) == INTEGER_CST && TREE_CONSTANT (array))
616 struct ch_class class;
617 class.kind = CH_VALUE_CLASS;
618 class.mode = type;
620 if (TREE_CODE (array) == CONSTRUCTOR)
622 tree list = CONSTRUCTOR_ELTS (array);
623 for ( ; list != NULL_TREE; list = TREE_CHAIN (list))
625 if (tree_int_cst_equal (TREE_PURPOSE (list), idx))
626 return convert_to_class (class, TREE_VALUE (list));
629 else if (TREE_CODE (array) == STRING_CST
630 && CH_CHARS_TYPE_P (TREE_TYPE (array)))
632 HOST_WIDE_INT i = tree_low_cst (idx, 0);
634 if (i >= 0 && i < TREE_STRING_LENGTH (array))
635 return
636 convert_to_class
637 (class,
638 build_int_2
639 ((unsigned char) TREE_STRING_POINTER (array) [i], 0));
643 if (TYPE_PACKED (TREE_TYPE (array)))
644 rval = build (PACKED_ARRAY_REF, type, array, idx);
645 else
646 rval = build (ARRAY_REF, type, array, idx);
648 /* Array ref is const/volatile if the array elements are
649 or if the array is. */
650 TREE_READONLY (rval) = TREE_READONLY (array) | TYPE_READONLY (type);
651 TREE_SIDE_EFFECTS (rval)
652 |= (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (array)))
653 | TREE_SIDE_EFFECTS (array));
654 TREE_THIS_VOLATILE (rval)
655 |= (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (array)))
656 /* This was added by rms on 16 Nov 91.
657 It fixes vol struct foo *a; a->elts[1]
658 in an inline function.
659 Hope it doesn't break something else. */
660 | TREE_THIS_VOLATILE (array));
661 return fold (rval);
664 tree
665 build_chill_bitref (bitstring, indexlist)
666 tree bitstring, indexlist;
668 if (TREE_CODE (bitstring) == ERROR_MARK)
669 return bitstring;
670 if (TREE_CODE (indexlist) == ERROR_MARK)
671 return indexlist;
673 if (TREE_CHAIN (indexlist) != NULL_TREE)
675 error ("invalid compound index for bitstring mode");
676 return error_mark_node;
679 if (TREE_CODE (indexlist) == TREE_LIST)
681 tree result = build (SET_IN_EXPR, boolean_type_node,
682 TREE_VALUE (indexlist), bitstring);
683 TREE_READONLY (result) = TREE_READONLY (bitstring);
684 return result;
686 else abort ();
691 discrete_type_p (type)
692 tree type;
694 return INTEGRAL_TYPE_P (type);
697 /* Checks that EXP has discrete type, or can be converted to discrete.
698 Otherwise, returns NULL_TREE.
699 Normally returns the (possibly-converted) EXP. */
701 tree
702 convert_to_discrete (exp)
703 tree exp;
705 if (! discrete_type_p (TREE_TYPE (exp)))
707 if (flag_old_strings)
709 if (CH_CHARS_ONE_P (TREE_TYPE (exp)))
710 return convert (char_type_node, exp);
711 if (CH_BOOLS_ONE_P (TREE_TYPE (exp)))
712 return convert (boolean_type_node, exp);
714 return NULL_TREE;
716 return exp;
719 /* Write into BUFFER the target-machine representation of VALUE.
720 Returns 1 on success, or 0 on failure. (Either the VALUE was
721 not constant, or we don't know how to do the conversion.) */
723 static int
724 expand_constant_to_buffer (value, buffer, buf_size)
725 tree value;
726 unsigned char *buffer;
727 int buf_size;
729 tree type = TREE_TYPE (value);
730 int size = int_size_in_bytes (type);
731 int i;
732 if (size < 0 || size > buf_size)
733 return 0;
734 switch (TREE_CODE (value))
736 case INTEGER_CST:
738 unsigned HOST_WIDE_INT lo = TREE_INT_CST_LOW (value);
739 HOST_WIDE_INT hi = TREE_INT_CST_HIGH (value);
740 for (i = 0; i < size; i++)
742 /* Doesn't work if host and target BITS_PER_UNIT differ. */
743 unsigned char byte = lo & ((1 << BITS_PER_UNIT) - 1);
745 if (BYTES_BIG_ENDIAN)
746 buffer[size - i - 1] = byte;
747 else
748 buffer[i] = byte;
750 rshift_double (lo, hi, BITS_PER_UNIT, BITS_PER_UNIT * size,
751 &lo, &hi, 0);
754 break;
755 case STRING_CST:
757 size = TREE_STRING_LENGTH (value);
758 if (size > buf_size)
759 return 0;
760 bcopy (TREE_STRING_POINTER (value), buffer, size);
761 break;
763 case CONSTRUCTOR:
764 if (TREE_CODE (type) == ARRAY_TYPE)
766 tree element_type = TREE_TYPE (type);
767 int element_size = int_size_in_bytes (element_type);
768 tree list = CONSTRUCTOR_ELTS (value);
769 HOST_WIDE_INT next_index;
770 HOST_WIDE_INT min_index = 0;
771 if (element_size < 0)
772 return 0;
774 if (TYPE_DOMAIN (type) != 0)
776 tree min_val = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
777 if (min_val)
779 if (! host_integerp (min_val, 0))
780 return 0;
781 else
782 min_index = tree_low_cst (min_val, 0);
786 next_index = min_index;
788 for (; list != NULL_TREE; list = TREE_CHAIN (list))
790 HOST_WIDE_INT offset;
791 HOST_WIDE_INT last_index;
792 tree purpose = TREE_PURPOSE (list);
794 if (purpose)
796 if (host_integerp (purpose, 0))
797 last_index = next_index = tree_low_cst (purpose, 0);
798 else if (TREE_CODE (purpose) == RANGE_EXPR)
800 next_index = tree_low_cst (TREE_OPERAND (purpose, 0), 0);
801 last_index = tree_low_cst (TREE_OPERAND (purpose, 1), 0);
803 else
804 return 0;
806 else
807 last_index = next_index;
808 for ( ; next_index <= last_index; next_index++)
810 offset = (next_index - min_index) * element_size;
811 if (!expand_constant_to_buffer (TREE_VALUE (list),
812 buffer + offset,
813 buf_size - offset))
814 return 0;
817 break;
819 else if (TREE_CODE (type) == RECORD_TYPE)
821 tree list = CONSTRUCTOR_ELTS (value);
822 for (; list != NULL_TREE; list = TREE_CHAIN (list))
824 tree field = TREE_PURPOSE (list);
825 HOST_WIDE_INT offset;
827 if (field == NULL_TREE || TREE_CODE (field) != FIELD_DECL)
828 return 0;
830 if (DECL_BIT_FIELD (field))
831 return 0;
833 offset = int_byte_position (field);
834 if (!expand_constant_to_buffer (TREE_VALUE (list),
835 buffer + offset,
836 buf_size - offset))
837 return 0;
839 break;
841 else if (TREE_CODE (type) == SET_TYPE)
843 if (get_set_constructor_bytes (value, buffer, buf_size)
844 != NULL_TREE)
845 return 0;
847 break;
848 default:
849 return 0;
851 return 1;
854 /* Given that BUFFER contains a target-machine representation of
855 a value of type TYPE, return that value as a tree.
856 Returns NULL_TREE on failure. (E.g. the TYPE might be variable size,
857 or perhaps we don't know how to do the conversion.) */
859 static tree
860 extract_constant_from_buffer (type, buffer, buf_size)
861 tree type;
862 const unsigned char *buffer;
863 int buf_size;
865 tree value;
866 HOST_WIDE_INT size = int_size_in_bytes (type);
867 HOST_WIDE_INT i;
869 if (size < 0 || size > buf_size)
870 return 0;
872 switch (TREE_CODE (type))
874 case INTEGER_TYPE:
875 case CHAR_TYPE:
876 case BOOLEAN_TYPE:
877 case ENUMERAL_TYPE:
878 case POINTER_TYPE:
880 HOST_WIDE_INT lo = 0, hi = 0;
881 /* Accumulate (into (lo,hi) the bytes (from buffer). */
882 for (i = size; --i >= 0; )
884 unsigned char byte;
885 /* Get next byte (in big-endian order). */
886 if (BYTES_BIG_ENDIAN)
887 byte = buffer[size - i - 1];
888 else
889 byte = buffer[i];
890 lshift_double (lo, hi, BITS_PER_UNIT, TYPE_PRECISION (type),
891 &lo, &hi, 0);
892 add_double (lo, hi, byte, 0, &lo, &hi);
894 value = build_int_2 (lo, hi);
895 TREE_TYPE (value) = type;
896 return value;
898 case ARRAY_TYPE:
900 tree element_type = TREE_TYPE (type);
901 int element_size = int_size_in_bytes (element_type);
902 tree list = NULL_TREE;
903 HOST_WIDE_INT min_index = 0, max_index, cur_index;
904 if (element_size == 1 && CH_CHARS_TYPE_P (type))
906 value = build_string (size, buffer);
907 CH_DERIVED_FLAG (value) = 1;
908 TREE_TYPE (value) = type;
909 return value;
911 if (TYPE_DOMAIN (type) == 0)
912 return 0;
913 value = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
914 if (value)
916 if (! host_integerp (value, 0))
917 return 0;
918 else
919 min_index = tree_low_cst (value, 0);
922 value = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
923 if (value == NULL_TREE || ! host_integerp (value, 0))
924 return 0;
925 else
926 max_index = tree_low_cst (value, 0);
928 for (cur_index = max_index; cur_index >= min_index; cur_index--)
930 HOST_WIDE_INT offset = (cur_index - min_index) * element_size;
931 value = extract_constant_from_buffer (element_type,
932 buffer + offset,
933 buf_size - offset);
934 if (value == NULL_TREE)
935 return NULL_TREE;
936 list = tree_cons (build_int_2 (cur_index, 0), value, list);
938 value = build (CONSTRUCTOR, type, NULL_TREE, list);
939 TREE_CONSTANT (value) = 1;
940 TREE_STATIC (value) = 1;
941 return value;
943 case RECORD_TYPE:
945 tree list = NULL_TREE;
946 tree field = TYPE_FIELDS (type);
947 for (; field != NULL_TREE; field = TREE_CHAIN (field))
949 HOST_WIDE_INT offset = int_byte_position (field);
951 if (DECL_BIT_FIELD (field))
952 return 0;
953 value = extract_constant_from_buffer (TREE_TYPE (field),
954 buffer + offset,
955 buf_size - offset);
956 if (value == NULL_TREE)
957 return NULL_TREE;
958 list = tree_cons (field, value, list);
960 value = build (CONSTRUCTOR, type, NULL_TREE, nreverse (list));
961 TREE_CONSTANT (value) = 1;
962 TREE_STATIC (value) = 1;
963 return value;
966 case UNION_TYPE:
968 tree longest_variant = NULL_TREE;
969 unsigned HOST_WIDE_INT longest_size = 0;
970 tree field = TYPE_FIELDS (type);
972 /* This is a kludge. We assume that converting the data to te
973 longest variant will provide valid data for the "correct"
974 variant. This is usually the case, but is not guaranteed.
975 For example, the longest variant may include holes.
976 Also incorrect interpreting the given value as the longest
977 variant may confuse the compiler if that should happen
978 to yield invalid values. ??? */
980 for (; field != NULL_TREE; field = TREE_CHAIN (field))
982 unsigned HOST_WIDE_INT size
983 = int_size_in_bytes (TREE_TYPE (field));
985 if (size > longest_size)
987 longest_size = size;
988 longest_variant = field;
992 if (longest_variant == NULL_TREE)
993 return NULL_TREE;
995 return
996 extract_constant_from_buffer (TREE_TYPE (longest_variant),
997 buffer, buf_size);
1000 case SET_TYPE:
1002 tree list = NULL_TREE;
1003 int i;
1004 HOST_WIDE_INT min_index, max_index;
1006 if (TYPE_DOMAIN (type) == 0)
1007 return 0;
1009 value = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
1010 if (value == NULL_TREE)
1011 min_index = 0;
1013 else if (! host_integerp (value, 0))
1014 return 0;
1015 else
1016 min_index = tree_low_cst (value, 0);
1018 value = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
1019 if (value == NULL_TREE)
1020 max_index = 0;
1021 else if (! host_integerp (value, 0))
1022 return 0;
1023 else
1024 max_index = tree_low_cst (value, 0);
1026 for (i = max_index + 1 - min_index; --i >= 0; )
1028 unsigned char byte = (unsigned char) buffer[i / BITS_PER_UNIT];
1029 unsigned bit_pos = (unsigned) i % (unsigned) BITS_PER_UNIT;
1031 if (BYTES_BIG_ENDIAN
1032 ? (byte & (1 << (BITS_PER_UNIT - 1 - bit_pos)))
1033 : (byte & (1 << bit_pos)))
1034 list = tree_cons (NULL_TREE,
1035 build_int_2 (i + min_index, 0), list);
1037 value = build (CONSTRUCTOR, type, NULL_TREE, list);
1038 TREE_CONSTANT (value) = 1;
1039 TREE_STATIC (value) = 1;
1040 return value;
1043 default:
1044 return NULL_TREE;
1048 tree
1049 build_chill_cast (type, expr)
1050 tree type, expr;
1052 tree expr_type;
1053 int expr_type_size;
1054 int type_size;
1055 int type_is_discrete;
1056 int expr_type_is_discrete;
1058 if (type == NULL_TREE || TREE_CODE (type) == ERROR_MARK)
1059 return error_mark_node;
1060 if (expr == NULL_TREE || TREE_CODE (expr) == ERROR_MARK)
1061 return error_mark_node;
1063 /* if expression was untyped because of its context (an
1064 if_expr or case_expr in a tuple, perhaps) just apply
1065 the type */
1066 expr_type = TREE_TYPE (expr);
1067 if (expr_type == NULL_TREE
1068 || TREE_CODE (expr_type) == ERROR_MARK)
1069 return convert (type, expr);
1071 if (expr_type == type)
1072 return expr;
1074 expr_type_size = int_size_in_bytes (expr_type);
1075 type_size = int_size_in_bytes (type);
1077 if (expr_type_size == -1)
1079 error ("conversions from variable_size value");
1080 return error_mark_node;
1082 if (type_size == -1)
1084 error ("conversions to variable_size mode");
1085 return error_mark_node;
1088 /* FIXME: process REAL ==> INT && INT ==> REAL && REAL ==> REAL. I hope this is correct. */
1089 if ((TREE_CODE (expr_type) == INTEGER_TYPE && TREE_CODE (type) == REAL_TYPE) ||
1090 (TREE_CODE (expr_type) == REAL_TYPE && TREE_CODE (type) == INTEGER_TYPE) ||
1091 (TREE_CODE (expr_type) == REAL_TYPE && TREE_CODE (type) == REAL_TYPE))
1092 return convert (type, expr);
1094 /* FIXME: Don't know if this is correct */
1095 /* Don't allow conversions to or from REAL with others then integer */
1096 if (TREE_CODE (type) == REAL_TYPE)
1098 error ("cannot convert to float");
1099 return error_mark_node;
1101 else if (TREE_CODE (expr_type) == REAL_TYPE)
1103 error ("cannot convert float to this mode");
1104 return error_mark_node;
1107 if (expr_type_size == type_size && CH_REFERABLE (expr))
1108 goto do_location_conversion;
1110 type_is_discrete
1111 = discrete_type_p (type) || TREE_CODE (type) == POINTER_TYPE;
1112 expr_type_is_discrete
1113 = discrete_type_p (expr_type) || TREE_CODE (expr_type) == POINTER_TYPE;
1114 if (expr_type_is_discrete && type_is_discrete)
1116 /* do an overflow check
1117 FIXME: is this always necessary ??? */
1118 /* FIXME: don't do range chacking when target type is PTR.
1119 PTR doesn't have MIN and MAXVALUE. result is sigsegv. */
1120 if (range_checking && type != ptr_type_node)
1122 tree tmp = expr;
1124 STRIP_NOPS (tmp);
1125 if (TREE_CONSTANT (tmp) && TREE_CODE (tmp) != ADDR_EXPR)
1127 if (compare_int_csts (LT_EXPR, tmp, TYPE_MIN_VALUE (type)) ||
1128 compare_int_csts (GT_EXPR, tmp, TYPE_MAX_VALUE (type)))
1130 error ("OVERFLOW in expression conversion");
1131 return error_mark_node;
1134 else
1136 int cond1 = tree_int_cst_lt (TYPE_SIZE (type),
1137 TYPE_SIZE (expr_type));
1138 int cond2 = TREE_UNSIGNED (type) && (! TREE_UNSIGNED (expr_type));
1139 int cond3 = (! TREE_UNSIGNED (type))
1140 && TREE_UNSIGNED (expr_type)
1141 && tree_int_cst_equal (TYPE_SIZE (type),
1142 TYPE_SIZE (expr_type));
1143 int cond4 = TREE_TYPE (type) && type_is_discrete;
1145 if (cond1 || cond2 || cond3 || cond4)
1147 tree type_min = TYPE_MIN_VALUE (type);
1148 tree type_max = TYPE_MAX_VALUE (type);
1150 expr = save_if_needed (expr);
1151 if (expr && type_min && type_max)
1153 tree check = test_range (expr, type_min, type_max);
1154 if (!integer_zerop (check))
1156 if (current_function_decl == NULL_TREE)
1158 if (TREE_CODE (check) == INTEGER_CST)
1159 error ("overflow (not inside function)");
1160 else
1161 warning ("possible overflow (not inside function)");
1163 else
1165 if (TREE_CODE (check) == INTEGER_CST)
1166 warning ("expression will always cause OVERFLOW");
1167 expr = check_expression (expr, check,
1168 ridpointers[(int) RID_OVERFLOW]);
1175 return convert (type, expr);
1178 if (TREE_CODE (expr) == INTEGER_CST && expr_type_size != type_size)
1180 /* There should probably be a pedwarn here ... */
1181 tree itype = type_for_size (type_size * BITS_PER_UNIT, 1);
1182 if (itype)
1184 expr = convert (itype, expr);
1185 expr_type = TREE_TYPE (expr);
1186 expr_type_size= type_size;
1190 /* If expr is a constant of the right size, use it to to
1191 initialize a static variable. */
1192 if (expr_type_size == type_size && TREE_CONSTANT (expr) && !pedantic)
1194 unsigned char *buffer = (unsigned char*) alloca (type_size);
1195 tree value;
1196 memset (buffer, 0, type_size);
1197 if (!expand_constant_to_buffer (expr, buffer, type_size))
1199 error ("not implemented: constant conversion from that kind of expression");
1200 return error_mark_node;
1202 value = extract_constant_from_buffer (type, buffer, type_size);
1203 if (value == NULL_TREE)
1205 error ("not implemented: constant conversion to that kind of mode");
1206 return error_mark_node;
1208 return value;
1211 if (!CH_REFERABLE (expr) && expr_type_size == type_size)
1213 tree temp = decl_temp1 (get_unique_identifier ("CAST"),
1214 TREE_TYPE (expr), 0, 0, 0, 0);
1215 tree convert1 = build_chill_modify_expr (temp, expr);
1216 pedwarn ("non-standard, non-portable value conversion");
1217 return build (COMPOUND_EXPR, type, convert1,
1218 build_chill_cast (type, temp));
1221 if (CH_REFERABLE (expr) && expr_type_size != type_size)
1222 error ("location conversion between differently-sized modes");
1223 else
1224 error ("unsupported value conversion");
1225 return error_mark_node;
1227 do_location_conversion:
1228 /* To avoid confusing other parts of gcc,
1229 represent this as the C expression: *(TYPE*)EXPR. */
1230 mark_addressable (expr);
1231 expr = build1 (INDIRECT_REF, type,
1232 build1 (NOP_EXPR, build_pointer_type (type),
1233 build1 (ADDR_EXPR, build_pointer_type (expr_type),
1234 expr)));
1235 TREE_READONLY (expr) = TYPE_READONLY (type);
1236 return expr;
1239 /* Given a set_type, build an integer array from it that C will grok. */
1241 tree
1242 build_array_from_set (type)
1243 tree type;
1245 tree bytespint, bit_array_size, int_array_count;
1247 if (type == NULL_TREE || type == error_mark_node
1248 || TREE_CODE (type) != SET_TYPE)
1249 return error_mark_node;
1251 /* ??? Should this really be *HOST*?? */
1252 bytespint = size_int (HOST_BITS_PER_INT / HOST_BITS_PER_CHAR);
1253 bit_array_size = size_in_bytes (type);
1254 int_array_count = size_binop (TRUNC_DIV_EXPR, bit_array_size, bytespint);
1255 if (integer_zerop (int_array_count))
1256 int_array_count = size_one_node;
1257 type = build_array_type (integer_type_node,
1258 build_index_type (int_array_count));
1259 return type;
1263 tree
1264 build_chill_bin_type (size)
1265 tree size;
1267 #if 0
1268 HOST_WIDE_INT isize;
1270 if (! host_integerp (size, 1))
1272 error ("operand to bin must be a non-negative integer literal");
1273 return error_mark_node;
1276 isize = tree_low_cst (size, 1);
1278 if (isize <= TYPE_PRECISION (unsigned_char_type_node))
1279 return unsigned_char_type_node;
1280 if (isize <= TYPE_PRECISION (short_unsigned_type_node))
1281 return short_unsigned_type_node;
1282 if (isize <= TYPE_PRECISION (unsigned_type_node))
1283 return unsigned_type_node;
1284 if (isize <= TYPE_PRECISION (long_unsigned_type_node))
1285 return long_unsigned_type_node;
1286 if (isize <= TYPE_PRECISION (long_long_unsigned_type_node))
1287 return long_long_unsigned_type_node;
1288 error ("size %d of BIN too big - no such integer mode", isize);
1289 return error_mark_node;
1290 #endif
1291 tree bintype;
1293 if (pass == 1)
1295 bintype = make_node (INTEGER_TYPE);
1296 TREE_TYPE (bintype) = ridpointers[(int) RID_BIN];
1297 TYPE_MIN_VALUE (bintype) = size;
1298 TYPE_MAX_VALUE (bintype) = size;
1300 else
1302 error ("BIN in pass 2");
1303 return error_mark_node;
1305 return bintype;
1308 tree
1309 chill_expand_tuple (type, constructor)
1310 tree type, constructor;
1312 const char *name;
1313 tree nonreft = type;
1315 if (TYPE_NAME (type) != NULL_TREE)
1317 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
1318 name = IDENTIFIER_POINTER (TYPE_NAME (type));
1319 else
1320 name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
1322 else
1323 name = "";
1325 /* get to actual underlying type for digest_init */
1326 while (nonreft && TREE_CODE (nonreft) == REFERENCE_TYPE)
1327 nonreft = TREE_TYPE (nonreft);
1329 if (TREE_CODE (nonreft) == ARRAY_TYPE
1330 || TREE_CODE (nonreft) == RECORD_TYPE
1331 || TREE_CODE (nonreft) == SET_TYPE)
1332 return convert (nonreft, constructor);
1333 else
1335 error ("mode of tuple is neither ARRAY, STRUCT, nor POWERSET");
1336 return error_mark_node;
1340 /* This function classifies an expr into the Null class,
1341 the All class, the M-Value, the M-derived, or the M-reference class.
1342 It probably has some inaccuracies. */
1344 struct ch_class
1345 chill_expr_class (expr)
1346 tree expr;
1348 struct ch_class class;
1349 /* The Null class contains the NULL pointer constant (only). */
1350 if (expr == null_pointer_node)
1352 class.kind = CH_NULL_CLASS;
1353 class.mode = NULL_TREE;
1354 return class;
1357 /* The All class contains the <undefined value> "*". */
1358 if (TREE_CODE (expr) == UNDEFINED_EXPR)
1360 class.kind = CH_ALL_CLASS;
1361 class.mode = NULL_TREE;
1362 return class;
1365 if (CH_DERIVED_FLAG (expr))
1367 class.kind = CH_DERIVED_CLASS;
1368 class.mode = TREE_TYPE (expr);
1369 return class;
1372 /* The M-Reference contains <references location> (address-of) expressions.
1373 Note that something that's been converted to a reference doesn't count. */
1374 if (TREE_CODE (expr) == ADDR_EXPR
1375 && TREE_CODE (TREE_TYPE (expr)) != REFERENCE_TYPE)
1377 class.kind = CH_REFERENCE_CLASS;
1378 class.mode = TREE_TYPE (TREE_TYPE (expr));
1379 return class;
1382 /* The M-Value class contains expressions with a known, specific mode M. */
1383 class.kind = CH_VALUE_CLASS;
1384 class.mode = TREE_TYPE (expr);
1385 return class;
1388 /* Returns >= 1 iff REF is a location. Return 2 if it is referable. */
1390 int chill_location (ref)
1391 tree ref;
1393 register enum tree_code code = TREE_CODE (ref);
1395 switch (code)
1397 case REALPART_EXPR:
1398 case IMAGPART_EXPR:
1399 case ARRAY_REF:
1400 case PACKED_ARRAY_REF:
1401 case COMPONENT_REF:
1402 case NOP_EXPR: /* RETYPE_EXPR */
1403 return chill_location (TREE_OPERAND (ref, 0));
1404 case COMPOUND_EXPR:
1405 return chill_location (TREE_OPERAND (ref, 1));
1407 case BIT_FIELD_REF:
1408 case SLICE_EXPR:
1409 /* A bit-string slice is nor referable. */
1410 return chill_location (TREE_OPERAND (ref, 0)) == 0 ? 0 : 1;
1412 case CONSTRUCTOR:
1413 case STRING_CST:
1414 return 0;
1416 case INDIRECT_REF:
1417 case VAR_DECL:
1418 case PARM_DECL:
1419 case RESULT_DECL:
1420 case ERROR_MARK:
1421 if (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE
1422 && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE)
1423 return 2;
1424 break;
1426 default:
1427 break;
1429 return 0;
1433 chill_referable (val)
1434 tree val;
1436 return chill_location (val) > 1;
1439 /* Make a copy of MODE, but with the given NOVELTY. */
1441 tree
1442 copy_novelty (novelty, mode)
1443 tree novelty, mode;
1445 if (CH_NOVELTY (mode) != novelty)
1447 mode = copy_node (mode);
1448 TYPE_MAIN_VARIANT (mode) = mode;
1449 TYPE_NEXT_VARIANT (mode) = 0;
1450 TYPE_POINTER_TO (mode) = 0;
1451 TYPE_REFERENCE_TO (mode) = 0;
1452 SET_CH_NOVELTY (mode, novelty);
1454 return mode;
1458 struct mode_chain
1460 struct mode_chain *prev;
1461 tree mode1, mode2;
1464 /* Tests if MODE1 and MODE2 are SIMILAR.
1465 This is more or less as defined in the Blue Book, though
1466 see FIXME for parts that are unfinished.
1467 CHAIN is used to catch infinite recursion: It is a list of pairs
1468 of mode arguments to calls to chill_similar "outer" to this call. */
1471 chill_similar (mode1, mode2, chain)
1472 tree mode1, mode2;
1473 struct mode_chain *chain;
1475 int varying1, varying2;
1476 tree t1, t2;
1477 struct mode_chain *link, node;
1478 if (mode1 == NULL_TREE || mode2 == NULL_TREE)
1479 return 0;
1481 while (TREE_CODE (mode1) == REFERENCE_TYPE)
1482 mode1 = TREE_TYPE (mode1);
1483 while (TREE_CODE (mode2) == REFERENCE_TYPE)
1484 mode2 = TREE_TYPE (mode2);
1486 /* Range modes are similar to their parent types. */
1487 while (TREE_CODE (mode1) == INTEGER_TYPE && TREE_TYPE (mode1) != NULL_TREE)
1488 mode1 = TREE_TYPE (mode1);
1489 while (TREE_CODE (mode2) == INTEGER_TYPE && TREE_TYPE (mode2) != NULL_TREE)
1490 mode2 = TREE_TYPE (mode2);
1493 /* see Z.200 sections 12.1.2.2 and 13.2 - all integer precisions
1494 are similar to INT and to each other */
1495 if (mode1 == mode2 ||
1496 (TREE_CODE (mode1) == INTEGER_TYPE && TREE_CODE (mode2) == INTEGER_TYPE))
1497 return 1;
1499 /* This guards against certain kinds of recursion.
1500 For example:
1501 SYNMODE a = STRUCT ( next REF a );
1502 SYNMODE b = STRUCT ( next REF b );
1503 These moes are similar, but will get an infite recursion trying
1504 to prove that. So, if we are recursing, assume the moes are similar.
1505 If they are not, we'll find some other discrepancy. */
1506 for (link = chain; link != NULL; link = link->prev)
1508 if (link->mode1 == mode1 && link->mode2 == mode2)
1509 return 1;
1512 node.mode1 = mode1;
1513 node.mode2 = mode2;
1514 node.prev = chain;
1516 varying1 = chill_varying_type_p (mode1);
1517 varying2 = chill_varying_type_p (mode2);
1518 /* FIXME: This isn't quite strict enough. */
1519 if ((varying1 && varying2)
1520 || (varying1 && TREE_CODE (mode2) == ARRAY_TYPE)
1521 || (varying2 && TREE_CODE (mode1) == ARRAY_TYPE))
1522 return 1;
1524 if (TREE_CODE(mode1) != TREE_CODE(mode2))
1526 if (flag_old_strings)
1528 /* The recursion is to handle varying strings. */
1529 if ((TREE_CODE (mode1) == CHAR_TYPE
1530 && CH_SIMILAR (mode2, string_one_type_node))
1531 || (TREE_CODE (mode2) == CHAR_TYPE
1532 && CH_SIMILAR (mode1, string_one_type_node)))
1533 return 1;
1534 if ((TREE_CODE (mode1) == BOOLEAN_TYPE
1535 && CH_SIMILAR (mode2, bitstring_one_type_node))
1536 || (TREE_CODE (mode2) == BOOLEAN_TYPE
1537 && CH_SIMILAR (mode1, bitstring_one_type_node)))
1538 return 1;
1540 if (TREE_CODE (mode1) == FUNCTION_TYPE
1541 && TREE_CODE (mode2) == POINTER_TYPE
1542 && TREE_CODE (TREE_TYPE (mode2)) == FUNCTION_TYPE)
1543 mode2 = TREE_TYPE (mode2);
1544 else if (TREE_CODE (mode2) == FUNCTION_TYPE
1545 && TREE_CODE (mode1) == POINTER_TYPE
1546 && TREE_CODE (TREE_TYPE (mode1)) == FUNCTION_TYPE)
1547 mode1 = TREE_TYPE (mode1);
1548 else
1549 return 0;
1552 if (CH_IS_BUFFER_MODE (mode1) && CH_IS_BUFFER_MODE (mode2))
1554 tree len1 = max_queue_size (mode1);
1555 tree len2 = max_queue_size (mode2);
1556 return tree_int_cst_equal (len1, len2);
1558 else if (CH_IS_EVENT_MODE (mode1) && CH_IS_EVENT_MODE (mode2))
1560 tree len1 = max_queue_size (mode1);
1561 tree len2 = max_queue_size (mode2);
1562 return tree_int_cst_equal (len1, len2);
1564 else if (CH_IS_ACCESS_MODE (mode1) && CH_IS_ACCESS_MODE (mode2))
1566 tree index1 = access_indexmode (mode1);
1567 tree index2 = access_indexmode (mode2);
1568 tree record1 = access_recordmode (mode1);
1569 tree record2 = access_recordmode (mode2);
1570 if (! chill_read_compatible (index1, index2))
1571 return 0;
1572 return chill_read_compatible (record1, record2);
1574 switch ((enum chill_tree_code)TREE_CODE (mode1))
1576 case INTEGER_TYPE:
1577 case BOOLEAN_TYPE:
1578 case CHAR_TYPE:
1579 return 1;
1580 case ENUMERAL_TYPE:
1581 if (TYPE_VALUES (mode1) == TYPE_VALUES (mode2))
1582 return 1;
1583 else
1585 /* FIXME: This is more strict than z.200, which seems to
1586 allow the elements to be reordered, as long as they
1587 have the same values. */
1589 tree field1 = TYPE_VALUES (mode1);
1590 tree field2 = TYPE_VALUES (mode2);
1592 while (field1 != NULL_TREE && field2 != NULL_TREE)
1594 tree value1, value2;
1595 /* Check that the names are equal. */
1596 if (TREE_PURPOSE (field1) != TREE_PURPOSE (field2))
1597 break;
1599 value1 = TREE_VALUE (field1);
1600 value2 = TREE_VALUE (field2);
1601 /* This isn't quite sufficient in general, but will do ... */
1602 /* Note that proclaim_decl can cause the SET modes to be
1603 compared BEFORE they are satisfied, but otherwise
1604 chill_similar is mostly called after satisfaction. */
1605 if (TREE_CODE (value1) == CONST_DECL)
1606 value1 = DECL_INITIAL (value1);
1607 if (TREE_CODE (value2) == CONST_DECL)
1608 value2 = DECL_INITIAL (value2);
1609 /* Check that the values are equal or both NULL. */
1610 if (!(value1 == NULL_TREE && value2 == NULL_TREE)
1611 && (value1 == NULL_TREE || value2 == NULL_TREE
1612 || ! tree_int_cst_equal (value1, value2)))
1613 break;
1614 field1 = TREE_CHAIN (field1);
1615 field2 = TREE_CHAIN (field2);
1617 return field1 == NULL_TREE && field2 == NULL_TREE;
1619 case SET_TYPE:
1620 /* check for bit strings */
1621 if (CH_BOOLS_TYPE_P (mode1))
1622 return CH_BOOLS_TYPE_P (mode2);
1623 if (CH_BOOLS_TYPE_P (mode2))
1624 return CH_BOOLS_TYPE_P (mode1);
1625 /* both are powerset modes */
1626 return CH_EQUIVALENT (TYPE_DOMAIN (mode1), TYPE_DOMAIN (mode2));
1628 case POINTER_TYPE:
1629 /* Are the referenced modes equivalent? */
1630 return !integer_zerop (chill_equivalent (TREE_TYPE (mode1),
1631 TREE_TYPE (mode2),
1632 &node));
1634 case ARRAY_TYPE:
1635 /* char for char strings */
1636 if (CH_CHARS_TYPE_P (mode1))
1637 return CH_CHARS_TYPE_P (mode2);
1638 if (CH_CHARS_TYPE_P (mode2))
1639 return CH_CHARS_TYPE_P (mode1);
1640 /* array modes */
1641 if (CH_V_EQUIVALENT (TYPE_DOMAIN (mode1), TYPE_DOMAIN (mode2))
1642 /* Are the elements modes equivalent? */
1643 && !integer_zerop (chill_equivalent (TREE_TYPE (mode1),
1644 TREE_TYPE (mode2),
1645 &node)))
1647 /* FIXME: Check that element layouts are equivalent */
1649 tree count1 = fold (build (MINUS_EXPR, sizetype,
1650 TYPE_MAX_VALUE (TYPE_DOMAIN (mode1)),
1651 TYPE_MIN_VALUE (TYPE_DOMAIN (mode1))));
1652 tree count2 = fold (build (MINUS_EXPR, sizetype,
1653 TYPE_MAX_VALUE (TYPE_DOMAIN (mode2)),
1654 TYPE_MIN_VALUE (TYPE_DOMAIN (mode2))));
1655 tree cond = build_compare_discrete_expr (EQ_EXPR, count1, count2);
1656 if (TREE_CODE (cond) == INTEGER_CST)
1657 return !integer_zerop (cond);
1658 else
1660 #if 0
1661 extern int ignoring;
1662 if (!ignoring
1663 && range_checking
1664 && current_function_decl)
1665 return cond;
1666 #endif
1667 return 1;
1670 return 0;
1672 case RECORD_TYPE:
1673 case UNION_TYPE:
1674 for (t1 = TYPE_FIELDS (mode1), t2 = TYPE_FIELDS (mode2);
1675 t1 && t2; t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
1677 if (TREE_CODE (t1) != TREE_CODE (t2))
1678 return 0;
1679 /* Are the field modes equivalent? */
1680 if (integer_zerop (chill_equivalent (TREE_TYPE (t1),
1681 TREE_TYPE (t2),
1682 &node)))
1683 return 0;
1685 return t1 == t2;
1687 case FUNCTION_TYPE:
1688 if (!chill_l_equivalent (TREE_TYPE (mode1), TREE_TYPE (mode2), &node))
1689 return 0;
1690 for (t1 = TYPE_ARG_TYPES (mode1), t2 = TYPE_ARG_TYPES (mode2);
1691 t1 != NULL_TREE && t2 != NULL_TREE;
1692 t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
1694 tree attr1 = TREE_PURPOSE (t1)
1695 ? TREE_PURPOSE (t1) : ridpointers[(int) RID_IN];
1696 tree attr2 = TREE_PURPOSE (t2)
1697 ? TREE_PURPOSE (t2) : ridpointers[(int) RID_IN];
1698 if (attr1 != attr2)
1699 return 0;
1700 if (!chill_l_equivalent (TREE_VALUE (t1), TREE_VALUE (t2), &node))
1701 return 0;
1703 if (t1 != t2) /* Both NULL_TREE */
1704 return 0;
1705 /* check list of exception names */
1706 t1 = TYPE_RAISES_EXCEPTIONS (mode1);
1707 t2 = TYPE_RAISES_EXCEPTIONS (mode2);
1708 if (t1 == NULL_TREE && t2 != NULL_TREE)
1709 return 0;
1710 if (t1 != NULL_TREE && t2 == NULL_TREE)
1711 return 0;
1712 if (list_length (t1) != list_length (t2))
1713 return 0;
1714 while (t1 != NULL_TREE)
1716 if (value_member (TREE_VALUE (t1), t2) == NULL_TREE)
1717 return 0;
1718 t1 = TREE_CHAIN (t1);
1720 /* FIXME: Should also check they have the same RECURSIVITY */
1721 return 1;
1723 default:
1725 /* Need to handle row modes, instance modes,
1726 association modes, access modes, text modes,
1727 duration modes, absolute time modes, structure modes,
1728 parameterized structure modes */
1730 return 1;
1733 /* Return a node that is true iff MODE1 and MODE2 are equivalent.
1734 This is normally boolean_true_node or boolean_false_node,
1735 but can be dynamic for dynamic types.
1736 CHAIN is as for chill_similar. */
1738 tree
1739 chill_equivalent (mode1, mode2, chain)
1740 tree mode1, mode2;
1741 struct mode_chain *chain;
1743 int varying1, varying2;
1744 int is_string1, is_string2;
1745 tree base_mode1, base_mode2;
1747 /* Are the modes v-equivalent? */
1748 #if 0
1749 if (!chill_similar (mode1, mode2, chain)
1750 || CH_NOVELTY(mode1) != CH_NOVELTY(mode2))
1751 return boolean_false_node;
1752 #endif
1753 if (!chill_similar (mode1, mode2, chain))
1754 return boolean_false_node;
1755 else if (TREE_CODE (mode2) == FUNCTION_TYPE
1756 && TREE_CODE (mode1) == POINTER_TYPE
1757 && TREE_CODE (TREE_TYPE (mode1)) == FUNCTION_TYPE)
1758 /* don't check novelty in this case to avoid error in case of
1759 NEWMODE'd proceduremode gets assigned a function */
1760 return boolean_true_node;
1761 else if (CH_NOVELTY(mode1) != CH_NOVELTY(mode2))
1762 return boolean_false_node;
1764 varying1 = chill_varying_type_p (mode1);
1765 varying2 = chill_varying_type_p (mode2);
1767 if (varying1 != varying2)
1768 return boolean_false_node;
1769 base_mode1 = varying1 ? CH_VARYING_ARRAY_TYPE (mode1) : mode1;
1770 base_mode2 = varying2 ? CH_VARYING_ARRAY_TYPE (mode2) : mode2;
1771 is_string1 = CH_STRING_TYPE_P (base_mode1);
1772 is_string2 = CH_STRING_TYPE_P (base_mode2);
1773 if (is_string1 || is_string2)
1775 if (is_string1 != is_string2)
1776 return boolean_false_node;
1777 return fold (build (EQ_EXPR, boolean_type_node,
1778 TYPE_SIZE (base_mode1),
1779 TYPE_SIZE (base_mode2)));
1782 /* && some more stuff FIXME! */
1783 if (TREE_CODE(mode1) == INTEGER_TYPE || TREE_CODE(mode2) == INTEGER_TYPE)
1785 if (TREE_CODE(mode1) != INTEGER_TYPE || TREE_CODE(mode2) != INTEGER_TYPE)
1786 return boolean_false_node;
1787 /* If one is a range, the other has to be a range. */
1788 if ((TREE_TYPE (mode1) != NULL_TREE) != (TREE_TYPE (mode2) != NULL_TREE))
1789 return boolean_false_node;
1790 if (TYPE_PRECISION (mode1) != TYPE_PRECISION (mode2))
1791 return boolean_false_node;
1792 if (!tree_int_cst_equal (TYPE_MIN_VALUE (mode1), TYPE_MIN_VALUE (mode2)))
1793 return boolean_false_node;
1794 if (!tree_int_cst_equal (TYPE_MAX_VALUE (mode1), TYPE_MAX_VALUE (mode2)))
1795 return boolean_false_node;
1797 return boolean_true_node;
1800 static int
1801 chill_l_equivalent (mode1, mode2, chain)
1802 tree mode1, mode2;
1803 struct mode_chain *chain;
1805 /* Are the modes equivalent? */
1806 if (integer_zerop (chill_equivalent (mode1, mode2, chain)))
1807 return 0;
1808 if (TYPE_READONLY (mode1) != TYPE_READONLY (mode2))
1809 return 0;
1811 ... other conditions ...;
1813 return 1;
1816 /* See Z200 12.1.2.12 */
1819 chill_read_compatible (modeM, modeN)
1820 tree modeM, modeN;
1822 while (TREE_CODE (modeM) == REFERENCE_TYPE)
1823 modeM = TREE_TYPE (modeM);
1824 while (TREE_CODE (modeN) == REFERENCE_TYPE)
1825 modeN = TREE_TYPE (modeN);
1827 if (!CH_EQUIVALENT (modeM, modeN))
1828 return 0;
1829 if (TYPE_READONLY (modeN))
1831 if (!TYPE_READONLY (modeM))
1832 return 0;
1833 if (CH_IS_BOUND_REFERENCE_MODE (modeM)
1834 && CH_IS_BOUND_REFERENCE_MODE (modeN))
1836 return chill_l_equivalent (TREE_TYPE (modeM), TREE_TYPE (modeN), 0);
1839 ...;
1842 return 1;
1845 /* Tests if MODE is compatible with the class of EXPR.
1846 Cfr. Chill Blue Book 12.1.2.15. */
1849 chill_compatible (expr, mode)
1850 tree expr, mode;
1852 struct ch_class class;
1854 if (expr == NULL_TREE || TREE_CODE (expr) == ERROR_MARK)
1855 return 0;
1856 if (mode == NULL_TREE || TREE_CODE (mode) == ERROR_MARK)
1857 return 0;
1859 while (TREE_CODE (mode) == REFERENCE_TYPE)
1860 mode = TREE_TYPE (mode);
1862 if (TREE_TYPE (expr) == NULL_TREE)
1864 if (TREE_CODE (expr) == CONSTRUCTOR)
1865 return TREE_CODE (mode) == RECORD_TYPE
1866 || ((TREE_CODE (mode) == SET_TYPE || TREE_CODE (mode) == ARRAY_TYPE)
1867 && ! TYPE_STRING_FLAG (mode));
1868 else
1869 return TREE_CODE (expr) == CASE_EXPR || TREE_CODE (expr) == COND_EXPR;
1872 class = chill_expr_class (expr);
1873 switch (class.kind)
1875 case CH_ALL_CLASS:
1876 return 1;
1877 case CH_NULL_CLASS:
1878 return CH_IS_REFERENCE_MODE (mode) || CH_IS_PROCEDURE_MODE (mode)
1879 || CH_IS_INSTANCE_MODE (mode);
1880 case CH_VALUE_CLASS:
1881 if (CH_HAS_REFERENCING_PROPERTY (mode))
1882 return CH_RESTRICTABLE_TO(mode, class.mode);
1883 else
1884 return CH_V_EQUIVALENT(mode, class.mode);
1885 case CH_DERIVED_CLASS:
1886 return CH_SIMILAR (class.mode, mode);
1887 case CH_REFERENCE_CLASS:
1888 if (!CH_IS_REFERENCE_MODE (mode))
1889 return 0;
1890 /* FIXME!
1891 if (class.mode is a row mode)
1892 ...;
1893 else if (class.mode is not a static mode)
1894 return 0; is this possible?
1896 return !CH_IS_BOUND_REFERENCE_MODE(mode)
1897 || CH_READ_COMPATIBLE (TREE_TYPE (mode), class.mode);
1899 return 0; /* ERROR! */
1902 /* Tests if the class of of EXPR1 and EXPR2 are compatible.
1903 Cfr. Chill Blue Book 12.1.2.16. */
1906 chill_compatible_classes (expr1, expr2)
1907 tree expr1, expr2;
1909 struct ch_class temp;
1910 struct ch_class class1, class2;
1911 class1 = chill_expr_class (expr1);
1912 class2 = chill_expr_class (expr2);
1914 switch (class1.kind)
1916 case CH_ALL_CLASS:
1917 return 1;
1918 case CH_NULL_CLASS:
1919 switch (class2.kind)
1921 case CH_ALL_CLASS:
1922 case CH_NULL_CLASS:
1923 case CH_REFERENCE_CLASS:
1924 return 1;
1925 case CH_VALUE_CLASS:
1926 case CH_DERIVED_CLASS:
1927 goto rule4;
1929 case CH_REFERENCE_CLASS:
1930 switch (class2.kind)
1932 case CH_ALL_CLASS:
1933 case CH_NULL_CLASS:
1934 return 1;
1935 case CH_REFERENCE_CLASS:
1936 return CH_EQUIVALENT (class1.mode, class2.mode);
1937 case CH_VALUE_CLASS:
1938 goto rule6;
1939 case CH_DERIVED_CLASS:
1940 return 0;
1942 case CH_DERIVED_CLASS:
1943 switch (class2.kind)
1945 case CH_ALL_CLASS:
1946 return 1;
1947 case CH_VALUE_CLASS:
1948 case CH_DERIVED_CLASS:
1949 return CH_SIMILAR (class1.mode, class2.mode);
1950 case CH_NULL_CLASS:
1951 class2 = class1;
1952 goto rule4;
1953 case CH_REFERENCE_CLASS:
1954 return 0;
1956 case CH_VALUE_CLASS:
1957 switch (class2.kind)
1959 case CH_ALL_CLASS:
1960 return 1;
1961 case CH_DERIVED_CLASS:
1962 return CH_SIMILAR (class1.mode, class2.mode);
1963 case CH_VALUE_CLASS:
1964 return CH_V_EQUIVALENT (class1.mode, class2.mode);
1965 case CH_NULL_CLASS:
1966 class2 = class1;
1967 goto rule4;
1968 case CH_REFERENCE_CLASS:
1969 temp = class1; class1 = class2; class2 = temp;
1970 goto rule6;
1973 rule4:
1974 /* The Null class is Compatible with the M-derived class or M-value class
1975 if and only if M is a reference mdoe, procedure mode or instance mode.*/
1976 return CH_IS_REFERENCE_MODE (class2.mode)
1977 || CH_IS_PROCEDURE_MODE (class2.mode)
1978 || CH_IS_INSTANCE_MODE (class2.mode);
1980 rule6:
1981 /* The M-reference class is compatible with the N-value class if and
1982 only if N is a reference mode and ... */
1983 if (!CH_IS_REFERENCE_MODE (class2.mode))
1984 return 0;
1985 if (1) /* If M is a static mode - FIXME */
1987 if (!CH_IS_BOUND_REFERENCE_MODE (class2.mode))
1988 return 1;
1989 if (CH_EQUIVALENT (TREE_TYPE (class2.mode), class1.mode))
1990 return 1;
1992 /* If N is a row mode whose .... FIXME */
1993 return 0;
1996 /* Cfr. Blue Book 12.1.1.6, with some "extensions." */
1998 tree
1999 chill_root_mode (mode)
2000 tree mode;
2002 /* Reference types are not user-visible types.
2003 This seems like a good place to get rid of them. */
2004 if (TREE_CODE (mode) == REFERENCE_TYPE)
2005 mode = TREE_TYPE (mode);
2007 while (TREE_CODE (mode) == INTEGER_TYPE && TREE_TYPE (mode) != NULL_TREE)
2008 mode = TREE_TYPE (mode); /* a sub-range */
2010 /* This extension in not in the Blue Book - which only has a
2011 single Integer type.
2012 We should probably use chill_integer_type_node rather
2013 than integer_type_node, but that is likely to bomb.
2014 At some point, these will become the same, I hope. FIXME */
2015 if (TREE_CODE (mode) == INTEGER_TYPE
2016 && TYPE_PRECISION (mode) < TYPE_PRECISION (integer_type_node)
2017 && CH_NOVELTY (mode) == NULL_TREE)
2018 mode = integer_type_node;
2020 if (TREE_CODE (mode) == FUNCTION_TYPE)
2021 return build_pointer_type (mode);
2023 return mode;
2026 /* Cfr. Blue Book 12.1.1.7. */
2028 tree
2029 chill_resulting_mode (mode1, mode2)
2030 tree mode1, mode2;
2032 mode1 = CH_ROOT_MODE (mode1);
2033 mode2 = CH_ROOT_MODE (mode2);
2034 if (chill_varying_type_p (mode1))
2035 return mode1;
2036 if (chill_varying_type_p (mode2))
2037 return mode2;
2038 return mode1;
2041 /* Cfr. Blue Book (z200, 1988) 12.1.1.7 Resulting class. */
2043 struct ch_class
2044 chill_resulting_class (class1, class2)
2045 struct ch_class class1, class2;
2047 struct ch_class class;
2048 switch (class1.kind)
2050 case CH_VALUE_CLASS:
2051 switch (class2.kind)
2053 case CH_DERIVED_CLASS:
2054 case CH_ALL_CLASS:
2055 class.kind = CH_VALUE_CLASS;
2056 class.mode = CH_ROOT_MODE (class1.mode);
2057 return class;
2058 case CH_VALUE_CLASS:
2059 class.kind = CH_VALUE_CLASS;
2060 class.mode
2061 = CH_ROOT_MODE (CH_RESULTING_MODE (class1.mode, class2.mode));
2062 return class;
2063 default:
2064 break;
2066 break;
2067 case CH_DERIVED_CLASS:
2068 switch (class2.kind)
2070 case CH_VALUE_CLASS:
2071 class.kind = CH_VALUE_CLASS;
2072 class.mode = CH_ROOT_MODE (class2.mode);
2073 return class;
2074 case CH_DERIVED_CLASS:
2075 class.kind = CH_DERIVED_CLASS;
2076 class.mode = CH_RESULTING_MODE (class1.mode, class2.mode);
2077 return class;
2078 case CH_ALL_CLASS:
2079 class.kind = CH_DERIVED_CLASS;
2080 class.mode = CH_ROOT_MODE (class1.mode);
2081 return class;
2082 default:
2083 break;
2085 break;
2086 case CH_ALL_CLASS:
2087 switch (class2.kind)
2089 case CH_VALUE_CLASS:
2090 class.kind = CH_VALUE_CLASS;
2091 class.mode = CH_ROOT_MODE (class2.mode);
2092 return class;
2093 case CH_ALL_CLASS:
2094 class.kind = CH_ALL_CLASS;
2095 class.mode = NULL_TREE;
2096 return class;
2097 case CH_DERIVED_CLASS:
2098 class.kind = CH_DERIVED_CLASS;
2099 class.mode = CH_ROOT_MODE (class2.mode);
2100 return class;
2101 default:
2102 break;
2104 break;
2105 default:
2106 break;
2108 error ("internal error in chill_root_resulting_mode");
2109 class.kind = CH_VALUE_CLASS;
2110 class.mode = CH_ROOT_MODE (class1.mode);
2111 return class;
2116 * See Z.200, section 6.3, static conditions. This function
2117 * returns bool_false_node if the condition is not met at compile time,
2118 * bool_true_node if the condition is detectably met at compile time
2119 * an expression if a runtime check would be required or was generated.
2120 * It should only be called with string modes and values.
2122 tree
2123 string_assignment_condition (lhs_mode, rhs_value)
2124 tree lhs_mode, rhs_value;
2126 tree lhs_size, rhs_size, cond;
2127 tree rhs_mode = TREE_TYPE (rhs_value);
2128 int lhs_varying = chill_varying_type_p (lhs_mode);
2130 if (lhs_varying)
2131 lhs_size = size_in_bytes (CH_VARYING_ARRAY_TYPE (lhs_mode));
2132 else if (CH_BOOLS_TYPE_P (lhs_mode))
2133 lhs_size = TYPE_MAX_VALUE (TYPE_DOMAIN (lhs_mode));
2134 else
2135 lhs_size = size_in_bytes (lhs_mode);
2136 lhs_size = convert (chill_unsigned_type_node, lhs_size);
2138 if (rhs_mode && TREE_CODE (rhs_mode) == REFERENCE_TYPE)
2139 rhs_mode = TREE_TYPE (rhs_mode);
2140 if (rhs_mode == NULL_TREE)
2142 /* actually, count constructor's length */
2143 abort ();
2145 else if (chill_varying_type_p (rhs_mode))
2146 rhs_size = build_component_ref (rhs_value, var_length_id);
2147 else if (CH_BOOLS_TYPE_P (rhs_mode))
2148 rhs_size = TYPE_MAX_VALUE (TYPE_DOMAIN (rhs_mode));
2149 else
2150 rhs_size = size_in_bytes (rhs_mode);
2151 rhs_size = convert (chill_unsigned_type_node, rhs_size);
2153 /* validity condition */
2154 cond = fold (build (lhs_varying ? GE_EXPR : EQ_EXPR,
2155 boolean_type_node, lhs_size, rhs_size));
2156 return cond;
2160 * take a basic CHILL type and wrap it in a VARYING structure.
2161 * Be sure the length field is initialized. Return the wrapper.
2163 tree
2164 build_varying_struct (type)
2165 tree type;
2167 tree decl1, decl2, result;
2169 if (type == NULL_TREE || TREE_CODE (type) == ERROR_MARK)
2170 return error_mark_node;
2172 decl1 = build_decl (FIELD_DECL, var_length_id, chill_integer_type_node);
2173 decl2 = build_decl (FIELD_DECL, var_data_id, type);
2174 TREE_CHAIN (decl1) = decl2;
2175 TREE_CHAIN (decl2) = NULL_TREE;
2176 result = build_chill_struct_type (decl1);
2178 /* mark this so we don't complain about missing initializers.
2179 It's fine for a VARYING array to be partially initialized.. */
2180 C_TYPE_VARIABLE_SIZE(type) = 1;
2181 return result;
2186 * This is the struct type that forms the runtime initializer
2187 * list. There's at least one of these generated per module.
2188 * It's attached to the global initializer list by the module's
2189 * 'constructor' code. Should only be called in pass 2.
2191 tree
2192 build_init_struct ()
2194 tree decl1, decl2, result;
2195 /* We temporarily reset the maximum_field_alignment to zero so the
2196 compiler's init data structures can be compatible with the
2197 run-time system, even when we're compiling with -fpack. */
2198 unsigned int save_maximum_field_alignment = maximum_field_alignment;
2199 maximum_field_alignment = 0;
2201 decl1 = build_decl (FIELD_DECL, get_identifier ("__INIT_ENTRY"),
2202 build_chill_pointer_type (
2203 build_function_type (void_type_node, NULL_TREE)));
2205 decl2 = build_decl (FIELD_DECL, get_identifier ("__INIT_NEXT"),
2206 build_chill_pointer_type (void_type_node));
2208 TREE_CHAIN (decl1) = decl2;
2209 TREE_CHAIN (decl2) = NULL_TREE;
2210 result = build_chill_struct_type (decl1);
2211 maximum_field_alignment = save_maximum_field_alignment;
2212 return result;
2217 * Return 1 if the given type is a single-bit boolean set,
2218 * in which the domain's min and max values
2219 * are both zero,
2220 * 0 if not. This can become a macro later..
2223 ch_singleton_set (type)
2224 tree type;
2226 if (type == NULL_TREE || TREE_CODE (type) == ERROR_MARK)
2227 return 0;
2228 if (TREE_CODE (type) != SET_TYPE)
2229 return 0;
2230 if (TREE_TYPE (type) == NULL_TREE
2231 || TREE_CODE (TREE_TYPE (type)) != BOOLEAN_TYPE)
2232 return 0;
2233 if (TYPE_DOMAIN (type) == NULL_TREE)
2234 return 0;
2235 if (! tree_int_cst_equal (TYPE_MIN_VALUE (TYPE_DOMAIN (type)),
2236 integer_zero_node))
2237 return 0;
2238 if (! tree_int_cst_equal (TYPE_MAX_VALUE (TYPE_DOMAIN (type)),
2239 integer_zero_node))
2240 return 0;
2241 return 1;
2244 /* return non-zero if TYPE is a compiler-generated VARYING
2245 array of some base type */
2247 chill_varying_type_p (type)
2248 tree type;
2250 if (type == NULL_TREE)
2251 return 0;
2252 if (TREE_CODE (type) != RECORD_TYPE)
2253 return 0;
2254 if (TYPE_FIELDS (type) == NULL_TREE
2255 || TREE_CHAIN (TYPE_FIELDS (type)) == NULL_TREE)
2256 return 0;
2257 if (DECL_NAME (TYPE_FIELDS (type)) != var_length_id)
2258 return 0;
2259 if (DECL_NAME (TREE_CHAIN (TYPE_FIELDS (type))) != var_data_id)
2260 return 0;
2261 if (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))) != NULL_TREE)
2262 return 0;
2263 return 1;
2266 /* return non-zero if TYPE is a compiler-generated VARYING
2267 string record */
2269 chill_varying_string_type_p (type)
2270 tree type;
2272 tree var_data_type;
2274 if (!chill_varying_type_p (type))
2275 return 0;
2277 var_data_type = CH_VARYING_ARRAY_TYPE (type);
2278 return CH_CHARS_TYPE_P (var_data_type);
2281 /* swiped from c-typeck.c */
2282 /* Build an assignment expression of lvalue LHS from value RHS. */
2284 tree
2285 build_chill_modify_expr (lhs, rhs)
2286 tree lhs, rhs;
2288 register tree result;
2291 tree lhstype = TREE_TYPE (lhs);
2293 /* Avoid duplicate error messages from operands that had errors. */
2294 if (lhs == NULL_TREE || TREE_CODE (lhs) == ERROR_MARK || rhs == NULL_TREE || TREE_CODE (rhs) == ERROR_MARK)
2295 return error_mark_node;
2297 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
2298 /* Do not use STRIP_NOPS here. We do not want an enumerator
2299 whose value is 0 to count as a null pointer constant. */
2300 if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
2301 rhs = TREE_OPERAND (rhs, 0);
2303 #if 0
2304 /* Handle a cast used as an "lvalue".
2305 We have already performed any binary operator using the value as cast.
2306 Now convert the result to the cast type of the lhs,
2307 and then true type of the lhs and store it there;
2308 then convert result back to the cast type to be the value
2309 of the assignment. */
2311 switch (TREE_CODE (lhs))
2313 case NOP_EXPR:
2314 case CONVERT_EXPR:
2315 case FLOAT_EXPR:
2316 case FIX_TRUNC_EXPR:
2317 case FIX_FLOOR_EXPR:
2318 case FIX_ROUND_EXPR:
2319 case FIX_CEIL_EXPR:
2321 tree inner_lhs = TREE_OPERAND (lhs, 0);
2322 tree result;
2323 result = build_chill_modify_expr (inner_lhs,
2324 convert (TREE_TYPE (inner_lhs),
2325 convert (lhstype, rhs)));
2326 pedantic_lvalue_warning (CONVERT_EXPR);
2327 return convert (TREE_TYPE (lhs), result);
2331 /* Now we have handled acceptable kinds of LHS that are not truly lvalues.
2332 Reject anything strange now. */
2334 if (!lvalue_or_else (lhs, "assignment"))
2335 return error_mark_node;
2336 #endif
2337 /* FIXME: need to generate a RANGEFAIL if the RHS won't
2338 fit into the LHS. */
2340 if (TREE_CODE (lhs) != VAR_DECL
2341 && ((TREE_CODE (TREE_TYPE (lhs)) == ARRAY_TYPE &&
2342 (TREE_TYPE (rhs) && TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE)) ||
2343 chill_varying_type_p (TREE_TYPE (lhs)) ||
2344 chill_varying_type_p (TREE_TYPE (rhs))))
2346 int lhs_varying = chill_varying_type_p (TREE_TYPE (lhs));
2347 int rhs_varying = chill_varying_type_p (TREE_TYPE (rhs));
2349 /* point at actual RHS data's type */
2350 tree rhs_data_type = rhs_varying ?
2351 CH_VARYING_ARRAY_TYPE (TREE_TYPE (rhs)) :
2352 TREE_TYPE (rhs);
2354 /* point at actual LHS data's type */
2355 tree lhs_data_type = lhs_varying ?
2356 CH_VARYING_ARRAY_TYPE (TREE_TYPE (lhs)) :
2357 TREE_TYPE (lhs);
2359 int lhs_bytes = int_size_in_bytes (lhs_data_type);
2360 int rhs_bytes = int_size_in_bytes (rhs_data_type);
2362 /* if both sides not varying, and sizes not dynamically
2363 computed, sizes must *match* */
2364 if (! lhs_varying && ! rhs_varying && lhs_bytes != rhs_bytes
2365 && lhs_bytes > 0 && rhs_bytes > 0)
2367 error ("string lengths not equal");
2368 return error_mark_node;
2370 /* Must have enough space on LHS for static size of RHS */
2372 if (lhs_bytes > 0 && rhs_bytes > 0
2373 && lhs_bytes < rhs_bytes)
2375 if (rhs_varying)
2377 /* FIXME: generate runtime test for room */
2380 else
2382 error ("can't do ARRAY assignment - too large");
2383 return error_mark_node;
2388 /* now we know the RHS will fit in LHS, build trees for the
2389 emit_block_move parameters */
2391 if (lhs_varying)
2392 rhs = convert (TREE_TYPE (lhs), rhs);
2393 else
2395 if (rhs_varying)
2396 rhs = build_component_ref (rhs, var_data_id);
2398 if (! mark_addressable (rhs))
2400 error ("rhs of array assignment is not addressable");
2401 return error_mark_node;
2404 lhs = force_addr_of (lhs);
2405 rhs = build1 (ADDR_EXPR, const_ptr_type_node, rhs);
2406 return
2407 build_chill_function_call (lookup_name (get_identifier ("memmove")),
2408 tree_cons (NULL_TREE, lhs,
2409 tree_cons (NULL_TREE, rhs,
2410 tree_cons (NULL_TREE, size_in_bytes (rhs_data_type),
2411 NULL_TREE))));
2415 result = build (MODIFY_EXPR, lhstype, lhs, rhs);
2416 TREE_SIDE_EFFECTS (result) = 1;
2418 return result;
2421 /* Constructors for pointer, array and function types.
2422 (RECORD_TYPE, UNION_TYPE and ENUMERAL_TYPE nodes are
2423 constructed by language-dependent code, not here.) */
2425 /* Construct, lay out and return the type of pointers to TO_TYPE.
2426 If such a type has already been constructed, reuse it. */
2428 static tree
2429 make_chill_pointer_type (to_type, code)
2430 tree to_type;
2431 enum tree_code code; /* POINTER_TYPE or REFERENCE_TYPE */
2433 extern struct obstack *current_obstack;
2434 extern struct obstack *saveable_obstack;
2435 extern struct obstack permanent_obstack;
2436 tree t;
2437 register struct obstack *ambient_obstack = current_obstack;
2438 register struct obstack *ambient_saveable_obstack = saveable_obstack;
2440 /* If TO_TYPE is permanent, make this permanent too. */
2441 if (TREE_PERMANENT (to_type))
2443 current_obstack = &permanent_obstack;
2444 saveable_obstack = &permanent_obstack;
2447 t = make_node (code);
2448 TREE_TYPE (t) = to_type;
2450 current_obstack = ambient_obstack;
2451 saveable_obstack = ambient_saveable_obstack;
2452 return t;
2456 tree
2457 build_chill_pointer_type (to_type)
2458 tree to_type;
2460 int is_type_node = TREE_CODE_CLASS (TREE_CODE (to_type)) == 't';
2461 register tree t = is_type_node ? TYPE_POINTER_TO (to_type) : NULL_TREE;
2463 /* First, if we already have a type for pointers to TO_TYPE, use it. */
2465 if (t)
2466 return t;
2468 /* We need a new one. */
2469 t = make_chill_pointer_type (to_type, POINTER_TYPE);
2471 /* Lay out the type. This function has many callers that are concerned
2472 with expression-construction, and this simplifies them all.
2473 Also, it guarantees the TYPE_SIZE is permanent if the type is. */
2474 if ((is_type_node && (TYPE_SIZE (to_type) != NULL_TREE))
2475 || pass == 2)
2477 /* Record this type as the pointer to TO_TYPE. */
2478 TYPE_POINTER_TO (to_type) = t;
2479 layout_type (t);
2482 return t;
2485 tree
2486 build_chill_reference_type (to_type)
2487 tree to_type;
2489 int is_type_node = TREE_CODE_CLASS (TREE_CODE (to_type)) == 't';
2490 register tree t = is_type_node ? TYPE_REFERENCE_TO (to_type) : NULL_TREE;
2492 /* First, if we already have a type for references to TO_TYPE, use it. */
2494 if (t)
2495 return t;
2497 /* We need a new one. */
2498 t = make_chill_pointer_type (to_type, REFERENCE_TYPE);
2500 /* Lay out the type. This function has many callers that are concerned
2501 with expression-construction, and this simplifies them all.
2502 Also, it guarantees the TYPE_SIZE is permanent if the type is. */
2503 if ((is_type_node && (TYPE_SIZE (to_type) != NULL_TREE))
2504 || pass == 2)
2506 /* Record this type as the reference to TO_TYPE. */
2507 TYPE_REFERENCE_TO (to_type) = t;
2508 layout_type (t);
2509 CH_NOVELTY (t) = CH_NOVELTY (to_type);
2512 return t;
2515 static tree
2516 make_chill_range_type (type, lowval, highval)
2517 tree type, lowval, highval;
2519 register tree itype = make_node (INTEGER_TYPE);
2520 TREE_TYPE (itype) = type;
2521 TYPE_MIN_VALUE (itype) = lowval;
2522 TYPE_MAX_VALUE (itype) = highval;
2523 return itype;
2527 /* Return the minimum number of bits needed to represent VALUE in a
2528 signed or unsigned type, UNSIGNEDP says which. */
2530 static unsigned int
2531 min_precision (value, unsignedp)
2532 tree value;
2533 int unsignedp;
2535 int log;
2537 /* If the value is negative, compute its negative minus 1. The latter
2538 adjustment is because the absolute value of the largest negative value
2539 is one larger than the largest positive value. This is equivalent to
2540 a bit-wise negation, so use that operation instead. */
2542 if (tree_int_cst_sgn (value) < 0)
2543 value = fold (build1 (BIT_NOT_EXPR, TREE_TYPE (value), value));
2545 /* Return the number of bits needed, taking into account the fact
2546 that we need one more bit for a signed than unsigned type. */
2548 if (integer_zerop (value))
2549 log = 0;
2550 else
2551 log = tree_floor_log2 (value);
2553 return log + 1 + ! unsignedp;
2556 tree
2557 layout_chill_range_type (rangetype, must_be_const)
2558 tree rangetype;
2559 int must_be_const;
2561 tree type = TREE_TYPE (rangetype);
2562 tree lowval = TYPE_MIN_VALUE (rangetype);
2563 tree highval = TYPE_MAX_VALUE (rangetype);
2564 int bad_limits = 0;
2566 if (TYPE_SIZE (rangetype) != NULL_TREE)
2567 return rangetype;
2569 /* process BIN */
2570 if (type == ridpointers[(int) RID_BIN])
2572 int binsize;
2574 /* Make a range out of it */
2575 if (TREE_CODE (highval) != INTEGER_CST)
2577 error ("non-constant expression for BIN");
2578 return error_mark_node;
2580 else if (tree_int_cst_sgn (highval) < 0)
2582 error ("expression for BIN must not be negative");
2583 return error_mark_node;
2585 else if (compare_tree_int (highval, 32) > 0)
2587 error ("cannot process BIN (>32)");
2588 return error_mark_node;
2591 binsize = tree_low_cst (highval, 1);
2592 type = ridpointers [(int) RID_RANGE];
2593 lowval = integer_zero_node;
2594 highval = build_int_2 ((1 << binsize) - 1, 0);
2597 if (TREE_CODE (lowval) == ERROR_MARK
2598 || TREE_CODE (highval) == ERROR_MARK)
2599 return error_mark_node;
2601 if (!CH_COMPATIBLE_CLASSES (lowval, highval))
2603 error ("bounds of range are not compatible");
2604 return error_mark_node;
2607 if (type == string_index_type_dummy)
2609 if (TREE_CODE (highval) == INTEGER_CST
2610 && compare_int_csts (LT_EXPR, highval, integer_minus_one_node))
2612 error ("negative string length");
2613 highval = integer_minus_one_node;
2615 if (compare_int_csts (EQ_EXPR, highval, integer_minus_one_node))
2616 type = integer_type_node;
2617 else
2618 type = sizetype;
2619 TREE_TYPE (rangetype) = type;
2621 else if (type == ridpointers[(int) RID_RANGE])
2623 /* This isn't 100% right, since the Blue Book definition
2624 uses Resulting Class, rather than Resulting Mode,
2625 but it's close enough. */
2626 type = CH_ROOT_RESULTING_CLASS (lowval, highval).mode;
2628 /* The default TYPE is the type of the constants -
2629 except if the constants are integers, we choose an
2630 integer type that fits. */
2631 if (TREE_CODE (type) == INTEGER_TYPE
2632 && TREE_CODE (lowval) == INTEGER_CST
2633 && TREE_CODE (highval) == INTEGER_CST)
2635 int unsignedp = tree_int_cst_sgn (lowval) >= 0;
2636 unsigned int precision = MAX (min_precision (highval, unsignedp),
2637 min_precision (lowval, unsignedp));
2639 type = type_for_size (precision, unsignedp);
2643 TREE_TYPE (rangetype) = type;
2645 else
2647 if (!CH_COMPATIBLE (lowval, type))
2649 error ("range's lower bound and parent mode don't match");
2650 return integer_type_node; /* an innocuous fake */
2652 if (!CH_COMPATIBLE (highval, type))
2654 error ("range's upper bound and parent mode don't match");
2655 return integer_type_node; /* an innocuous fake */
2659 if (TREE_CODE (type) == ERROR_MARK)
2660 return type;
2661 else if (TREE_CODE_CLASS (TREE_CODE (type)) != 't')
2663 error ("making range from non-mode");
2664 return error_mark_node;
2667 if (TREE_CODE (lowval) == REAL_CST || TREE_CODE (highval) == REAL_CST)
2669 sorry ("floating point ranges");
2670 return integer_type_node; /* another fake */
2673 if (TREE_CODE (lowval) != INTEGER_CST || TREE_CODE (highval) != INTEGER_CST)
2675 if (must_be_const)
2677 error ("range mode has non-constant limits");
2678 bad_limits = 1;
2681 else if (tree_int_cst_equal (lowval, integer_zero_node)
2682 && tree_int_cst_equal (highval, integer_minus_one_node))
2683 ; /* do nothing - this is the index type for an empty string */
2684 else if (compare_int_csts (LT_EXPR, highval, TYPE_MIN_VALUE (type)))
2686 error ("range's high bound < mode's low bound");
2687 bad_limits = 1;
2689 else if (compare_int_csts (GT_EXPR, highval, TYPE_MAX_VALUE (type)))
2691 error ("range's high bound > mode's high bound");
2692 bad_limits = 1;
2694 else if (compare_int_csts (LT_EXPR, highval, lowval))
2696 error ("range mode high bound < range mode low bound");
2697 bad_limits = 1;
2699 else if (compare_int_csts (LT_EXPR, lowval, TYPE_MIN_VALUE (type)))
2701 error ("range's low bound < mode's low bound");
2702 bad_limits = 1;
2704 else if (compare_int_csts (GT_EXPR, lowval, TYPE_MAX_VALUE (type)))
2706 error ("range's low bound > mode's high bound");
2707 bad_limits = 1;
2710 if (bad_limits)
2712 lowval = TYPE_MIN_VALUE (type);
2713 highval = lowval;
2716 highval = convert (type, highval);
2717 lowval = convert (type, lowval);
2718 TYPE_MIN_VALUE (rangetype) = lowval;
2719 TYPE_MAX_VALUE (rangetype) = highval;
2720 TYPE_PRECISION (rangetype) = TYPE_PRECISION (type);
2721 TYPE_MODE (rangetype) = TYPE_MODE (type);
2722 TYPE_SIZE (rangetype) = TYPE_SIZE (type);
2723 TYPE_SIZE_UNIT (rangetype) = TYPE_SIZE_UNIT (type);
2724 TYPE_ALIGN (rangetype) = TYPE_ALIGN (type);
2725 TYPE_USER_ALIGN (rangetype) = TYPE_USER_ALIGN (type);
2726 TREE_UNSIGNED (rangetype) = TREE_UNSIGNED (type);
2727 CH_NOVELTY (rangetype) = CH_NOVELTY (type);
2728 return rangetype;
2731 /* Build a _TYPE node that has range bounds associated with its values.
2732 TYPE is the base type for the range type. */
2733 tree
2734 build_chill_range_type (type, lowval, highval)
2735 tree type, lowval, highval;
2737 tree rangetype;
2739 if (type == NULL_TREE)
2740 type = ridpointers[(int) RID_RANGE];
2741 else if (TREE_CODE (type) == ERROR_MARK)
2742 return error_mark_node;
2744 rangetype = make_chill_range_type (type, lowval, highval);
2745 if (pass != 1)
2746 rangetype = layout_chill_range_type (rangetype, 0);
2748 return rangetype;
2751 /* Build a CHILL array type, but with minimal checking etc. */
2753 tree
2754 build_simple_array_type (type, idx, layout)
2755 tree type, idx, layout;
2757 tree array_type = make_node (ARRAY_TYPE);
2758 TREE_TYPE (array_type) = type;
2759 TYPE_DOMAIN (array_type) = idx;
2760 TYPE_ATTRIBUTES (array_type) = layout;
2761 if (pass != 1)
2762 array_type = layout_chill_array_type (array_type);
2763 return array_type;
2766 static void
2767 apply_chill_array_layout (array_type)
2768 tree array_type;
2770 tree layout, temp, what, element_type;
2771 HOST_WIDE_INT stepsize = 0;
2772 HOST_WIDE_INT word, start_bit = 0, length;
2773 HOST_WIDE_INT natural_length;
2774 int stepsize_specified;
2775 int start_bit_error = 0;
2776 int length_error = 0;
2778 layout = TYPE_ATTRIBUTES (array_type);
2779 if (layout == NULL_TREE)
2780 return;
2782 if (layout == integer_zero_node) /* NOPACK */
2784 TYPE_PACKED (array_type) = 0;
2785 return;
2788 /* Allow for the packing of 1 bit discrete modes at the bit level. */
2789 element_type = TREE_TYPE (array_type);
2790 if (discrete_type_p (element_type)
2791 && get_type_precision (TYPE_MIN_VALUE (element_type),
2792 TYPE_MAX_VALUE (element_type)) == 1)
2793 natural_length = 1;
2794 else if (host_integerp (TYPE_SIZE (element_type), 1))
2795 natural_length = tree_low_cst (TYPE_SIZE (element_type), 1);
2796 else
2797 natural_length = -1;
2799 if (layout == integer_one_node) /* PACK */
2801 if (natural_length == 1)
2802 TYPE_PACKED (array_type) = 1;
2803 return;
2806 /* The layout is a STEP (...).
2807 The current implementation restricts STEP specifications to be of the form
2808 STEP(POS(0,0,n),n) where n is the natural size of the element mode. */
2809 stepsize_specified = 0;
2810 temp = TREE_VALUE (layout);
2811 if (TREE_VALUE (temp) != NULL_TREE)
2813 if (! host_integerp (TREE_VALUE (temp), 0))
2814 error ("stepsize in STEP must be an integer constant");
2815 else
2817 if (tree_int_cst_sgn (TREE_VALUE (temp)) <= 0)
2818 error ("stepsize in STEP must be > 0");
2819 else
2820 stepsize_specified = 1;
2822 stepsize = tree_low_cst (TREE_VALUE (temp), 1);
2823 if (stepsize != natural_length)
2824 sorry ("stepsize in STEP must be the natural width of the array element mode");
2828 temp = TREE_PURPOSE (temp);
2829 if (! host_integerp (TREE_PURPOSE (temp), 0))
2830 error ("starting word in POS must be an integer constant");
2831 else
2833 if (tree_int_cst_sgn (TREE_PURPOSE (temp)) < 0)
2834 error ("starting word in POS must be >= 0");
2835 if (! integer_zerop (TREE_PURPOSE (temp)))
2836 sorry ("starting word in POS within STEP must be 0");
2838 word = tree_low_cst (TREE_PURPOSE (temp), 0);
2841 length = natural_length;
2842 temp = TREE_VALUE (temp);
2843 if (temp != NULL_TREE)
2845 int wordsize = TYPE_PRECISION (chill_integer_type_node);
2846 if (! host_integerp (TREE_PURPOSE (temp), 0))
2848 error ("starting bit in POS must be an integer constant");
2849 start_bit_error = 1;
2851 else
2853 if (! integer_zerop (TREE_PURPOSE (temp)))
2854 sorry ("starting bit in POS within STEP must be 0");
2856 if (tree_int_cst_sgn (TREE_PURPOSE (temp)) < 0)
2858 error ("starting bit in POS must be >= 0");
2859 start_bit = 0;
2860 start_bit_error = 1;
2863 start_bit = tree_low_cst (TREE_PURPOSE (temp), 0);
2864 if (start_bit >= wordsize)
2866 error ("starting bit in POS must be < the width of a word");
2867 start_bit = 0;
2868 start_bit_error = 1;
2872 temp = TREE_VALUE (temp);
2873 if (temp != NULL_TREE)
2875 what = TREE_PURPOSE (temp);
2876 if (what == integer_zero_node)
2878 if (! host_integerp (TREE_VALUE (temp), 0))
2880 error ("length in POS must be an integer constant");
2881 length_error = 1;
2883 else
2885 length = tree_low_cst (TREE_VALUE (temp), 0);
2886 if (length <= 0)
2887 error ("length in POS must be > 0");
2890 else
2892 if (! host_integerp (TREE_VALUE (temp), 0))
2894 error ("end bit in POS must be an integer constant");
2895 length_error = 1;
2897 else
2899 HOST_WIDE_INT end_bit = tree_low_cst (TREE_VALUE (temp), 0);
2901 if (end_bit < start_bit)
2903 error ("end bit in POS must be >= the start bit");
2904 end_bit = wordsize - 1;
2905 length_error = 1;
2907 else if (end_bit >= wordsize)
2909 error ("end bit in POS must be < the width of a word");
2910 end_bit = wordsize - 1;
2911 length_error = 1;
2913 else if (start_bit_error)
2914 length_error = 1;
2915 else
2916 length = end_bit - start_bit + 1;
2920 if (! length_error && length != natural_length)
2921 sorry ("the length specified on POS within STEP must be the natural length of the array element type");
2925 if (! length_error && stepsize_specified && stepsize < length)
2926 error ("step size in STEP must be >= the length in POS");
2928 if (length == 1)
2929 TYPE_PACKED (array_type) = 1;
2932 tree
2933 layout_chill_array_type (array_type)
2934 tree array_type;
2936 tree itype;
2937 tree element_type = TREE_TYPE (array_type);
2939 if (TREE_CODE (element_type) == ARRAY_TYPE
2940 && TYPE_SIZE (element_type) == 0)
2941 layout_chill_array_type (element_type);
2943 itype = TYPE_DOMAIN (array_type);
2945 if (TREE_CODE (itype) == ERROR_MARK
2946 || TREE_CODE (element_type) == ERROR_MARK)
2947 return error_mark_node;
2949 /* do a lower/upper bound check. */
2950 if (TREE_CODE (itype) == INTEGER_CST)
2952 error ("array index must be a range, not a single integer");
2953 return error_mark_node;
2955 if (TREE_CODE_CLASS (TREE_CODE (itype)) != 't'
2956 || !discrete_type_p (itype))
2958 error ("array index is not a discrete mode");
2959 return error_mark_node;
2962 /* apply the array layout, if specified. */
2963 apply_chill_array_layout (array_type);
2964 TYPE_ATTRIBUTES (array_type) = NULL_TREE;
2966 /* Make sure TYPE_POINTER_TO (element_type) is filled in. */
2967 build_pointer_type (element_type);
2969 if (TYPE_SIZE (array_type) == 0)
2970 layout_type (array_type);
2972 if (TYPE_READONLY_PROPERTY (element_type))
2973 TYPE_FIELDS_READONLY (array_type) = 1;
2975 TYPE_ARRAY_MAX_SIZE (array_type) = size_in_bytes (array_type);
2976 return array_type;
2979 /* Build a CHILL array type.
2981 TYPE is the element type of the array.
2982 IDXLIST is the list of dimensions of the array.
2983 VARYING_P is non-zero if the array is a varying array.
2984 LAYOUT is (NULL_TREE, integer_one_node, integer_zero_node, tree_list),
2985 meaning (default, pack, nopack, STEP (...) ). */
2986 tree
2987 build_chill_array_type (type, idxlist, varying_p, layouts)
2988 tree type, idxlist;
2989 int varying_p;
2990 tree layouts;
2992 tree array_type = type;
2994 if (type == NULL_TREE || TREE_CODE (type) == ERROR_MARK)
2995 return error_mark_node;
2996 if (idxlist == NULL_TREE || TREE_CODE (idxlist) == ERROR_MARK)
2997 return error_mark_node;
2999 /* We have to walk down the list of index decls, building inner
3000 array types as we go. We need to reverse the list of layouts so that the
3001 first layout applies to the last index etc. */
3002 layouts = nreverse (layouts);
3003 for ( ; idxlist; idxlist = TREE_CHAIN (idxlist))
3005 if (layouts != NULL_TREE)
3007 type = build_simple_array_type (
3008 type, TREE_VALUE (idxlist), TREE_VALUE (layouts));
3009 layouts = TREE_CHAIN (layouts);
3011 else
3012 type = build_simple_array_type (type, TREE_VALUE (idxlist), NULL_TREE);
3014 array_type = type;
3015 if (varying_p)
3016 array_type = build_varying_struct (array_type);
3017 return array_type;
3020 /* Function to help qsort sort FIELD_DECLs by name order. */
3022 static int
3023 field_decl_cmp (x, y)
3024 tree *x, *y;
3026 return (long)DECL_NAME (*x) - (long)DECL_NAME (*y);
3029 static tree
3030 make_chill_struct_type (fieldlist)
3031 tree fieldlist;
3033 tree t, x;
3035 t = make_node (TREE_UNION_ELEM (fieldlist) ? UNION_TYPE : RECORD_TYPE);
3037 /* Install struct as DECL_CONTEXT of each field decl. */
3038 for (x = fieldlist; x; x = TREE_CHAIN (x))
3039 DECL_CONTEXT (x) = t;
3041 /* Delete all duplicate fields from the fieldlist */
3042 for (x = fieldlist; x && TREE_CHAIN (x);)
3043 /* Anonymous fields aren't duplicates. */
3044 if (DECL_NAME (TREE_CHAIN (x)) == 0)
3045 x = TREE_CHAIN (x);
3046 else
3048 register tree y = fieldlist;
3050 while (1)
3052 if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x)))
3053 break;
3054 if (y == x)
3055 break;
3056 y = TREE_CHAIN (y);
3058 if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x)))
3060 error_with_decl (TREE_CHAIN (x), "duplicate member `%s'");
3061 TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x));
3063 else x = TREE_CHAIN (x);
3066 TYPE_FIELDS (t) = fieldlist;
3068 return t;
3071 /* DECL is a FIELD_DECL.
3072 DECL_INIT (decl) is
3073 (NULL_TREE, integer_one_node, integer_zero_node, tree_list)
3074 meaning
3075 (default, pack, nopack, POS (...) ).
3077 The return value is a boolean: 1 if POS specified, 0 if not */
3079 static int
3080 apply_chill_field_layout (decl, next_struct_offset)
3081 tree decl;
3082 int *next_struct_offset;
3084 tree layout = DECL_INITIAL (decl);
3085 tree type = TREE_TYPE (decl);
3086 tree temp, what;
3087 HOST_WIDE_INT word = 0;
3088 HOST_WIDE_INT wordsize, start_bit, offset, length, natural_length;
3089 int pos_error = 0;
3090 int is_discrete = discrete_type_p (type);
3092 if (is_discrete)
3093 natural_length
3094 = get_type_precision (TYPE_MIN_VALUE (type), TYPE_MAX_VALUE (type));
3095 else if (host_integerp (TYPE_SIZE (type), 1))
3096 natural_length = tree_low_cst (TYPE_SIZE (type), 1);
3097 else
3098 natural_length = -1;
3100 if (layout == integer_zero_node) /* NOPACK */
3102 *next_struct_offset += natural_length;
3103 return 0; /* not POS */
3106 if (layout == integer_one_node) /* PACK */
3108 if (is_discrete)
3110 DECL_BIT_FIELD (decl) = 1;
3111 DECL_SIZE (decl) = bitsize_int (natural_length);
3113 else
3115 DECL_ALIGN (decl) = BITS_PER_UNIT;
3116 DECL_USER_ALIGN (decl) = 0;
3119 DECL_PACKED (decl) = 1;
3120 *next_struct_offset += natural_length;
3121 return 0; /* not POS */
3124 /* The layout is a POS (...). The current implementation restricts the use
3125 of POS to monotonically increasing fields whose width must be the
3126 natural width of the underlying type. */
3127 temp = TREE_PURPOSE (layout);
3129 if (! host_integerp (TREE_PURPOSE (temp), 0))
3131 error ("starting word in POS must be an integer constant");
3132 pos_error = 1;
3134 else
3136 if (tree_int_cst_sgn (TREE_PURPOSE (temp)) < 0)
3138 error ("starting word in POS must be >= 0");
3139 word = 0;
3140 pos_error = 1;
3142 else
3143 word = tree_low_cst (TREE_PURPOSE (temp), 0);
3146 wordsize = TYPE_PRECISION (chill_integer_type_node);
3147 offset = word * wordsize;
3148 length = natural_length;
3150 temp = TREE_VALUE (temp);
3151 if (temp != NULL_TREE)
3153 if (! host_integerp (TREE_PURPOSE (temp), 0))
3155 error ("starting bit in POS must be an integer constant");
3156 start_bit = *next_struct_offset - offset;
3157 pos_error = 1;
3159 else
3161 if (tree_int_cst_sgn (TREE_PURPOSE (temp)) < 0)
3163 error ("starting bit in POS must be >= 0");
3164 start_bit = *next_struct_offset - offset;
3165 pos_error = 1;
3168 start_bit = tree_low_cst (TREE_PURPOSE (temp), 0);
3169 if (start_bit >= wordsize)
3171 error ("starting bit in POS must be < the width of a word");
3172 start_bit = *next_struct_offset - offset;
3173 pos_error = 1;
3177 temp = TREE_VALUE (temp);
3178 if (temp != NULL_TREE)
3180 what = TREE_PURPOSE (temp);
3181 if (what == integer_zero_node)
3183 if (! host_integerp (TREE_VALUE (temp), 0))
3185 error ("length in POS must be an integer constant");
3186 pos_error = 1;
3188 else
3190 if (tree_int_cst_sgn (TREE_VALUE (temp)) < 0)
3192 error ("length in POS must be > 0");
3193 length = natural_length;
3194 pos_error = 1;
3196 else
3197 length = tree_low_cst (TREE_VALUE (temp), 0);
3201 else
3203 if (! host_integerp (TREE_VALUE (temp), 0))
3205 error ("end bit in POS must be an integer constant");
3206 pos_error = 1;
3208 else
3210 HOST_WIDE_INT end_bit = tree_low_cst (TREE_VALUE (temp), 0);
3212 if (end_bit < start_bit)
3214 error ("end bit in POS must be >= the start bit");
3215 pos_error = 1;
3217 else if (end_bit >= wordsize)
3219 error ("end bit in POS must be < the width of a word");
3220 pos_error = 1;
3222 else
3223 length = end_bit - start_bit + 1;
3227 if (length != natural_length && ! pos_error)
3229 sorry ("the length specified on POS must be the natural length of the field type");
3230 length = natural_length;
3234 offset += start_bit;
3237 if (offset != *next_struct_offset && ! pos_error)
3238 sorry ("STRUCT fields must be layed out in monotonically increasing order");
3240 DECL_PACKED (decl) = 1;
3241 DECL_BIT_FIELD (decl) = is_discrete;
3243 if (is_discrete)
3244 DECL_SIZE (decl) = bitsize_int (length);
3246 *next_struct_offset += natural_length;
3248 return 1; /* was POS */
3251 tree
3252 layout_chill_struct_type (t)
3253 tree t;
3255 tree fieldlist = TYPE_FIELDS (t);
3256 tree x;
3257 int old_momentary;
3258 int was_pos;
3259 int pos_seen = 0;
3260 int pos_error = 0;
3261 int next_struct_offset;
3263 old_momentary = suspend_momentary ();
3265 /* Process specified field sizes. */
3266 next_struct_offset = 0;
3267 for (x = fieldlist; x; x = TREE_CHAIN (x))
3269 /* An EVENT or BUFFER mode is implemented as a RECORD_TYPE
3270 which may contain a CONST_DECL for the maximum queue size. */
3271 if (TREE_CODE (x) == CONST_DECL)
3272 continue;
3274 /* If any field is const, the structure type is pseudo-const. */
3275 /* A field that is pseudo-const makes the structure likewise. */
3276 if (TREE_READONLY (x) || TYPE_READONLY_PROPERTY (TREE_TYPE (x)))
3277 TYPE_FIELDS_READONLY (t) = 1;
3279 /* Any field that is volatile means variables of this type must be
3280 treated in some ways as volatile. */
3281 if (TREE_THIS_VOLATILE (x))
3282 C_TYPE_FIELDS_VOLATILE (t) = 1;
3284 if (DECL_INITIAL (x) != NULL_TREE)
3286 was_pos = apply_chill_field_layout (x, &next_struct_offset);
3287 DECL_INITIAL (x) = NULL_TREE;
3289 else
3291 unsigned int min_align = TYPE_ALIGN (TREE_TYPE (x));
3292 DECL_ALIGN (x) = MAX (DECL_ALIGN (x), min_align);
3293 was_pos = 0;
3295 if ((! was_pos && pos_seen) || (was_pos && ! pos_seen && x != fieldlist))
3296 pos_error = 1;
3297 pos_seen |= was_pos;
3300 if (pos_error)
3301 error ("if one field has a POS layout, then all fields must have a POS layout");
3303 /* Now DECL_INITIAL is null on all fields. */
3305 layout_type (t);
3307 /* Now we have the truly final field list.
3308 Store it in this type and in the variants. */
3310 TYPE_FIELDS (t) = fieldlist;
3312 /* If there are lots of fields, sort so we can look through them fast.
3313 We arbitrarily consider 16 or more elts to be "a lot". */
3315 int len = 0;
3317 for (x = fieldlist; x; x = TREE_CHAIN (x))
3319 if (len > 15)
3320 break;
3321 len += 1;
3323 if (len > 15)
3325 tree *field_array;
3326 char *space;
3328 len += list_length (x);
3329 /* Use the same allocation policy here that make_node uses, to
3330 ensure that this lives as long as the rest of the struct decl.
3331 All decls in an inline function need to be saved. */
3332 if (allocation_temporary_p ())
3333 space = savealloc (sizeof (struct lang_type) + len * sizeof (tree));
3334 else
3335 space = oballoc (sizeof (struct lang_type) + len * sizeof (tree));
3337 TYPE_LANG_SPECIFIC (t) = (struct lang_type *) space;
3338 TYPE_LANG_SPECIFIC (t)->foo.rec.len = len;
3340 field_array = &TYPE_LANG_SPECIFIC (t)->foo.rec.elts[0];
3341 len = 0;
3342 for (x = fieldlist; x; x = TREE_CHAIN (x))
3343 field_array[len++] = x;
3345 qsort (field_array, len, sizeof (tree),
3346 (int (*) PARAMS ((const void *, const void *))) field_decl_cmp);
3350 for (x = TYPE_MAIN_VARIANT (t); x; x = TYPE_NEXT_VARIANT (x))
3352 TYPE_FIELDS (x) = TYPE_FIELDS (t);
3353 TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (t);
3354 TYPE_ALIGN (x) = TYPE_ALIGN (t);
3355 TYPE_USER_ALIGN (x) = TYPE_USER_ALIGN (t);
3358 resume_momentary (old_momentary);
3360 return t;
3363 /* Given a list of fields, FIELDLIST, return a structure
3364 type that contains these fields. The returned type is
3365 always a new type. */
3366 tree
3367 build_chill_struct_type (fieldlist)
3368 tree fieldlist;
3370 register tree t;
3372 if (fieldlist == NULL_TREE || TREE_CODE (fieldlist) == ERROR_MARK)
3373 return error_mark_node;
3375 t = make_chill_struct_type (fieldlist);
3376 if (pass != 1)
3377 t = layout_chill_struct_type (t);
3379 /* pushtag (NULL_TREE, t); */
3381 return t;
3384 /* Fix a LANG_TYPE. These are used for three different uses:
3385 - representing a 'READ M' (in which case TYPE_READONLY is set);
3386 - for a NEWMODE or SYNMODE (CH_NOVELTY is set for a NEWMODE); and
3387 - for a parameterised type (TREE_TYPE points to base type,
3388 while TYPE_DOMAIN is the parameter or parameter list).
3389 Called from satisfy. */
3390 tree
3391 smash_dummy_type (type)
3392 tree type;
3394 /* Save fields that we don't want to copy from ORIGIN. */
3395 tree origin = TREE_TYPE (type);
3396 tree main_tree = TYPE_MAIN_VARIANT (origin);
3397 int save_uid = TYPE_UID (type);
3398 struct obstack *save_obstack = TYPE_OBSTACK (type);
3399 tree save_name = TYPE_NAME (type);
3400 int save_permanent = TREE_PERMANENT (type);
3401 int save_readonly = TYPE_READONLY (type);
3402 tree save_novelty = CH_NOVELTY (type);
3403 tree save_domain = TYPE_DOMAIN (type);
3405 if (origin == NULL_TREE)
3406 abort ();
3408 if (save_domain)
3410 if (TREE_CODE (save_domain) == ERROR_MARK)
3411 return error_mark_node;
3412 if (origin == char_type_node)
3413 { /* Old-fashioned CHAR(N) declaration. */
3414 origin = build_string_type (origin, save_domain);
3416 else
3417 { /* Handle parameterised modes. */
3418 int is_varying = chill_varying_type_p (origin);
3419 tree new_max = save_domain;
3420 tree origin_novelty = CH_NOVELTY (origin);
3421 if (is_varying)
3422 origin = CH_VARYING_ARRAY_TYPE (origin);
3423 if (CH_STRING_TYPE_P (origin))
3425 tree oldindex = TYPE_DOMAIN (origin);
3426 new_max = check_range (new_max, new_max, NULL_TREE,
3427 fold (build (PLUS_EXPR, integer_type_node,
3428 TYPE_MAX_VALUE (oldindex),
3429 integer_one_node)));
3430 origin = build_string_type (TREE_TYPE (origin), new_max);
3432 else if (TREE_CODE (origin) == ARRAY_TYPE)
3434 tree oldindex = TYPE_DOMAIN (origin);
3435 tree upper = check_range (new_max, new_max, NULL_TREE,
3436 TYPE_MAX_VALUE (oldindex));
3437 tree newindex
3438 = build_chill_range_type (TREE_TYPE (oldindex),
3439 TYPE_MIN_VALUE (oldindex), upper);
3440 origin = build_simple_array_type (TREE_TYPE (origin), newindex, NULL_TREE);
3442 else if (TREE_CODE (origin) == RECORD_TYPE)
3444 error ("parameterized structures not implemented");
3445 return error_mark_node;
3447 else
3449 error ("invalid parameterized type");
3450 return error_mark_node;
3453 SET_CH_NOVELTY (origin, origin_novelty);
3454 if (is_varying)
3456 origin = build_varying_struct (origin);
3457 SET_CH_NOVELTY (origin, origin_novelty);
3460 save_domain = NULL_TREE;
3463 if (TREE_CODE (origin) == ERROR_MARK)
3464 return error_mark_node;
3466 *(struct tree_type*)type = *(struct tree_type*)origin;
3467 /* The following is so that the debug code for
3468 the copy is different from the original type.
3469 The two statements usually duplicate each other
3470 (because they clear fields of the same union),
3471 but the optimizer should catch that. */
3472 TYPE_SYMTAB_POINTER (type) = 0;
3473 TYPE_SYMTAB_ADDRESS (type) = 0;
3475 /* Restore fields that we didn't want copied from ORIGIN. */
3476 TYPE_UID (type) = save_uid;
3477 TYPE_OBSTACK (type) = save_obstack;
3478 TREE_PERMANENT (type) = save_permanent;
3479 TYPE_NAME (type) = save_name;
3481 TREE_CHAIN (type) = NULL_TREE;
3482 TYPE_VOLATILE (type) = 0;
3483 TYPE_POINTER_TO (type) = 0;
3484 TYPE_REFERENCE_TO (type) = 0;
3486 if (save_readonly)
3487 { /* TYPE is READ ORIGIN.
3488 Add this type to the chain of variants of TYPE. */
3489 TYPE_NEXT_VARIANT (type) = TYPE_NEXT_VARIANT (main_tree);
3490 TYPE_NEXT_VARIANT (main_tree) = type;
3491 TYPE_READONLY (type) = save_readonly;
3493 else
3495 /* TYPE is the copy of the RHS in a NEWMODE or SYNMODE.
3496 We also get here after old-fashioned CHAR(N) declaration (see above). */
3497 TYPE_MAIN_VARIANT (type) = type;
3498 TYPE_NEXT_VARIANT (type) = NULL_TREE;
3499 if (save_name)
3500 DECL_ORIGINAL_TYPE (save_name) = origin;
3502 if (save_novelty != NULL_TREE) /* A NEWMODE declaration. */
3504 CH_NOVELTY (type) = save_novelty;
3506 /* Z.200: "If the DEFINING mode of the NEWMODE name is a range mode,
3507 then the virtual mode &name is introduced as the PARENT mode
3508 of the NEWMODE name. The DEFINING mode of &name is the PARENT
3509 mode of the range mode, and the NOVELTY of &name is that of
3510 the NEWMODE name." */
3512 if (TREE_CODE (type) == INTEGER_TYPE && TREE_TYPE (type))
3514 tree parent;
3515 /* PARENT is the virtual mode &name mentioned above. */
3516 push_obstacks_nochange ();
3517 end_temporary_allocation ();
3518 parent = copy_novelty (save_novelty,TREE_TYPE (type));
3519 pop_obstacks ();
3521 TREE_TYPE (type) = parent;
3522 TYPE_MIN_VALUE (type) = convert (parent, TYPE_MIN_VALUE (type));
3523 TYPE_MAX_VALUE (type) = convert (parent, TYPE_MAX_VALUE (type));
3527 return type;
3530 /* This generates a LANG_TYPE node that represents 'READ TYPE'. */
3532 tree
3533 build_readonly_type (type)
3534 tree type;
3536 tree node = make_node (LANG_TYPE);
3537 TREE_TYPE (node) = type;
3538 TYPE_READONLY (node) = 1;
3539 if (pass != 1)
3540 node = smash_dummy_type (node);
3541 return node;
3545 /* Return an unsigned type the same as TYPE in other respects. */
3547 tree
3548 unsigned_type (type)
3549 tree type;
3551 tree type1 = TYPE_MAIN_VARIANT (type);
3552 if (type1 == signed_char_type_node || type1 == char_type_node)
3553 return unsigned_char_type_node;
3554 if (type1 == integer_type_node)
3555 return unsigned_type_node;
3556 if (type1 == short_integer_type_node)
3557 return short_unsigned_type_node;
3558 if (type1 == long_integer_type_node)
3559 return long_unsigned_type_node;
3560 if (type1 == long_long_integer_type_node)
3561 return long_long_unsigned_type_node;
3563 return signed_or_unsigned_type (1, type);
3566 /* Return a signed type the same as TYPE in other respects. */
3568 tree
3569 signed_type (type)
3570 tree type;
3572 tree type1 = TYPE_MAIN_VARIANT (type);
3573 while (TREE_CODE (type1) == INTEGER_TYPE && TREE_TYPE (type1) != NULL_TREE)
3574 type1 = TREE_TYPE (type1);
3575 if (type1 == unsigned_char_type_node || type1 == char_type_node)
3576 return signed_char_type_node;
3577 if (type1 == unsigned_type_node)
3578 return integer_type_node;
3579 if (type1 == short_unsigned_type_node)
3580 return short_integer_type_node;
3581 if (type1 == long_unsigned_type_node)
3582 return long_integer_type_node;
3583 if (type1 == long_long_unsigned_type_node)
3584 return long_long_integer_type_node;
3585 if (TYPE_PRECISION (type1) == 1)
3586 return signed_boolean_type_node;
3588 return signed_or_unsigned_type (0, type);
3591 /* Return a type the same as TYPE except unsigned or
3592 signed according to UNSIGNEDP. */
3594 tree
3595 signed_or_unsigned_type (unsignedp, type)
3596 int unsignedp;
3597 tree type;
3599 if (! INTEGRAL_TYPE_P (type)
3600 || TREE_UNSIGNED (type) == unsignedp)
3601 return type;
3603 if (TYPE_PRECISION (type) == TYPE_PRECISION (signed_char_type_node))
3604 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
3605 if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
3606 return unsignedp ? unsigned_type_node : integer_type_node;
3607 if (TYPE_PRECISION (type) == TYPE_PRECISION (short_integer_type_node))
3608 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
3609 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_integer_type_node))
3610 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
3611 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_long_integer_type_node))
3612 return (unsignedp ? long_long_unsigned_type_node
3613 : long_long_integer_type_node);
3614 return type;
3617 /* Mark EXP saying that we need to be able to take the
3618 address of it; it should not be allocated in a register.
3619 Value is 1 if successful. */
3622 mark_addressable (exp)
3623 tree exp;
3625 register tree x = exp;
3626 while (1)
3627 switch (TREE_CODE (x))
3629 case ADDR_EXPR:
3630 case COMPONENT_REF:
3631 case ARRAY_REF:
3632 case REALPART_EXPR:
3633 case IMAGPART_EXPR:
3634 x = TREE_OPERAND (x, 0);
3635 break;
3637 case TRUTH_ANDIF_EXPR:
3638 case TRUTH_ORIF_EXPR:
3639 case COMPOUND_EXPR:
3640 x = TREE_OPERAND (x, 1);
3641 break;
3643 case COND_EXPR:
3644 return mark_addressable (TREE_OPERAND (x, 1))
3645 & mark_addressable (TREE_OPERAND (x, 2));
3647 case CONSTRUCTOR:
3648 TREE_ADDRESSABLE (x) = 1;
3649 return 1;
3651 case INDIRECT_REF:
3652 /* We sometimes add a cast *(TYPE*)&FOO to handle type and mode
3653 incompatibility problems. Handle this case by marking FOO. */
3654 if (TREE_CODE (TREE_OPERAND (x, 0)) == NOP_EXPR
3655 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (x, 0), 0)) == ADDR_EXPR)
3657 x = TREE_OPERAND (TREE_OPERAND (x, 0), 0);
3658 break;
3660 if (TREE_CODE (TREE_OPERAND (x, 0)) == ADDR_EXPR)
3662 x = TREE_OPERAND (x, 0);
3663 break;
3665 return 1;
3667 case VAR_DECL:
3668 case CONST_DECL:
3669 case PARM_DECL:
3670 case RESULT_DECL:
3671 if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
3672 && DECL_NONLOCAL (x))
3674 if (TREE_PUBLIC (x))
3676 error ("global register variable `%s' used in nested function",
3677 IDENTIFIER_POINTER (DECL_NAME (x)));
3678 return 0;
3680 pedwarn ("register variable `%s' used in nested function",
3681 IDENTIFIER_POINTER (DECL_NAME (x)));
3683 else if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x))
3685 if (TREE_PUBLIC (x))
3687 error ("address of global register variable `%s' requested",
3688 IDENTIFIER_POINTER (DECL_NAME (x)));
3689 return 0;
3692 /* If we are making this addressable due to its having
3693 volatile components, give a different error message. Also
3694 handle the case of an unnamed parameter by not trying
3695 to give the name. */
3697 else if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (x)))
3699 error ("cannot put object with volatile field into register");
3700 return 0;
3703 pedwarn ("address of register variable `%s' requested",
3704 IDENTIFIER_POINTER (DECL_NAME (x)));
3706 put_var_into_stack (x);
3708 /* drops through */
3709 case FUNCTION_DECL:
3710 TREE_ADDRESSABLE (x) = 1;
3711 #if 0 /* poplevel deals with this now. */
3712 if (DECL_CONTEXT (x) == 0)
3713 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (x)) = 1;
3714 #endif
3715 /* drops through */
3716 default:
3717 return 1;
3721 /* Return an integer type with BITS bits of precision,
3722 that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */
3724 tree
3725 type_for_size (bits, unsignedp)
3726 unsigned bits;
3727 int unsignedp;
3729 if (bits == TYPE_PRECISION (integer_type_node))
3730 return unsignedp ? unsigned_type_node : integer_type_node;
3732 if (bits == TYPE_PRECISION (signed_char_type_node))
3733 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
3735 if (bits == TYPE_PRECISION (short_integer_type_node))
3736 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
3738 if (bits == TYPE_PRECISION (long_integer_type_node))
3739 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
3741 if (bits == TYPE_PRECISION (long_long_integer_type_node))
3742 return (unsignedp ? long_long_unsigned_type_node
3743 : long_long_integer_type_node);
3745 if (bits <= TYPE_PRECISION (intQI_type_node))
3746 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
3748 if (bits <= TYPE_PRECISION (intHI_type_node))
3749 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
3751 if (bits <= TYPE_PRECISION (intSI_type_node))
3752 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
3754 if (bits <= TYPE_PRECISION (intDI_type_node))
3755 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
3757 #if HOST_BITS_PER_WIDE_INT >= 64
3758 if (bits <= TYPE_PRECISION (intTI_type_node))
3759 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
3760 #endif
3762 return 0;
3765 /* Return a data type that has machine mode MODE.
3766 If the mode is an integer,
3767 then UNSIGNEDP selects between signed and unsigned types. */
3769 tree
3770 type_for_mode (mode, unsignedp)
3771 enum machine_mode mode;
3772 int unsignedp;
3774 if ((int)mode == (int)TYPE_MODE (integer_type_node))
3775 return unsignedp ? unsigned_type_node : integer_type_node;
3777 if ((int)mode == (int)TYPE_MODE (signed_char_type_node))
3778 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
3780 if ((int)mode == (int)TYPE_MODE (short_integer_type_node))
3781 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
3783 if ((int)mode == (int)TYPE_MODE (long_integer_type_node))
3784 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
3786 if ((int)mode == (int)TYPE_MODE (long_long_integer_type_node))
3787 return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
3789 if ((int)mode == (int)TYPE_MODE (intQI_type_node))
3790 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
3792 if ((int)mode == (int)TYPE_MODE (intHI_type_node))
3793 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
3795 if ((int)mode == (int)TYPE_MODE (intSI_type_node))
3796 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
3798 if ((int)mode == (int)TYPE_MODE (intDI_type_node))
3799 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
3801 #if HOST_BITS_PER_WIDE_INT >= 64
3802 if ((int)mode == (int)TYPE_MODE (intTI_type_node))
3803 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
3804 #endif
3806 if ((int)mode == (int)TYPE_MODE (float_type_node))
3807 return float_type_node;
3809 if ((int)mode == (int)TYPE_MODE (double_type_node))
3810 return double_type_node;
3812 if ((int)mode == (int)TYPE_MODE (long_double_type_node))
3813 return long_double_type_node;
3815 if ((int)mode == (int)TYPE_MODE (build_pointer_type (char_type_node)))
3816 return build_pointer_type (char_type_node);
3818 if ((int)mode == (int)TYPE_MODE (build_pointer_type (integer_type_node)))
3819 return build_pointer_type (integer_type_node);
3821 return 0;