1 /* Simulate storage of variables into target memory.
2 Copyright (C) 2007, 2008, 2009, 2010
3 Free Software Foundation, Inc.
4 Contributed by Paul Thomas and Brooks Moses
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
29 #include "constructor.h"
31 #include "trans-const.h"
32 #include "trans-types.h"
33 #include "target-memory.h"
35 /* --------------------------------------------------------------- */
36 /* Calculate the size of an expression. */
40 size_integer (int kind)
42 return GET_MODE_SIZE (TYPE_MODE (gfc_get_int_type (kind)));;
49 return GET_MODE_SIZE (TYPE_MODE (gfc_get_real_type (kind)));;
54 size_complex (int kind)
56 return 2 * size_float (kind);
61 size_logical (int kind)
63 return GET_MODE_SIZE (TYPE_MODE (gfc_get_logical_type (kind)));;
68 size_character (int length, int kind)
70 int i = gfc_validate_kind (BT_CHARACTER, kind, false);
71 return length * gfc_character_kinds[i].bit_size / 8;
75 /* Return the size of a single element of the given expression.
76 Identical to gfc_target_expr_size for scalars. */
79 gfc_element_size (gfc_expr *e)
86 return size_integer (e->ts.kind);
88 return size_float (e->ts.kind);
90 return size_complex (e->ts.kind);
92 return size_logical (e->ts.kind);
94 if (e->expr_type == EXPR_CONSTANT)
95 return size_character (e->value.character.length, e->ts.kind);
96 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
97 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
98 && e->ts.u.cl->length->ts.type == BT_INTEGER)
102 gfc_extract_int (e->ts.u.cl->length, &length);
103 return size_character (length, e->ts.kind);
109 return e->representation.length;
113 /* Determine type size without clobbering the typespec for ISO C
117 type = gfc_typenode_for_spec (&ts);
118 return int_size_in_bytes (type);
121 gfc_internal_error ("Invalid expression in gfc_element_size.");
127 /* Return the size of an expression in its target representation. */
130 gfc_target_expr_size (gfc_expr *e)
135 gcc_assert (e != NULL);
139 if (gfc_array_size (e, &tmp))
140 asz = mpz_get_ui (tmp);
147 return asz * gfc_element_size (e);
151 /* The encode_* functions export a value into a buffer, and
152 return the number of bytes of the buffer that have been
156 encode_array (gfc_expr *expr, unsigned char *buffer, size_t buffer_size)
162 gfc_constructor_base ctor = expr->value.constructor;
164 gfc_array_size (expr, &array_size);
165 for (i = 0; i < (int)mpz_get_ui (array_size); i++)
167 ptr += gfc_target_encode_expr (gfc_constructor_lookup_expr (ctor, i),
168 &buffer[ptr], buffer_size - ptr);
171 mpz_clear (array_size);
177 encode_integer (int kind, mpz_t integer, unsigned char *buffer,
180 return native_encode_expr (gfc_conv_mpz_to_tree (integer, kind),
181 buffer, buffer_size);
186 encode_float (int kind, mpfr_t real, unsigned char *buffer, size_t buffer_size)
188 return native_encode_expr (gfc_conv_mpfr_to_tree (real, kind, 0), buffer,
194 encode_complex (int kind, mpc_t cmplx,
195 unsigned char *buffer, size_t buffer_size)
198 size = encode_float (kind, mpc_realref (cmplx), &buffer[0], buffer_size);
199 size += encode_float (kind, mpc_imagref (cmplx),
200 &buffer[size], buffer_size - size);
206 encode_logical (int kind, int logical, unsigned char *buffer, size_t buffer_size)
208 return native_encode_expr (build_int_cst (gfc_get_logical_type (kind),
210 buffer, buffer_size);
215 gfc_encode_character (int kind, int length, const gfc_char_t *string,
216 unsigned char *buffer, size_t buffer_size)
218 size_t elsize = size_character (1, kind);
219 tree type = gfc_get_char_type (kind);
222 gcc_assert (buffer_size >= size_character (length, kind));
224 for (i = 0; i < length; i++)
225 native_encode_expr (build_int_cst (type, string[i]), &buffer[i*elsize],
233 encode_derived (gfc_expr *source, unsigned char *buffer, size_t buffer_size)
240 type = gfc_typenode_for_spec (&source->ts);
242 for (c = gfc_constructor_first (source->value.constructor),
243 cmp = source->ts.u.derived->components;
245 c = gfc_constructor_next (c), cmp = cmp->next)
250 ptr = TREE_INT_CST_LOW(DECL_FIELD_OFFSET(cmp->backend_decl))
251 + TREE_INT_CST_LOW(DECL_FIELD_BIT_OFFSET(cmp->backend_decl))/8;
253 if (c->expr->expr_type == EXPR_NULL)
254 memset (&buffer[ptr], 0,
255 int_size_in_bytes (TREE_TYPE (cmp->backend_decl)));
257 gfc_target_encode_expr (c->expr, &buffer[ptr],
261 return int_size_in_bytes (type);
265 /* Write a constant expression in binary form to a buffer. */
267 gfc_target_encode_expr (gfc_expr *source, unsigned char *buffer,
273 if (source->expr_type == EXPR_ARRAY)
274 return encode_array (source, buffer, buffer_size);
276 gcc_assert (source->expr_type == EXPR_CONSTANT
277 || source->expr_type == EXPR_STRUCTURE
278 || source->expr_type == EXPR_SUBSTRING);
280 /* If we already have a target-memory representation, we use that rather
281 than recreating one. */
282 if (source->representation.string)
284 memcpy (buffer, source->representation.string,
285 source->representation.length);
286 return source->representation.length;
289 switch (source->ts.type)
292 return encode_integer (source->ts.kind, source->value.integer, buffer,
295 return encode_float (source->ts.kind, source->value.real, buffer,
298 return encode_complex (source->ts.kind, source->value.complex,
299 buffer, buffer_size);
301 return encode_logical (source->ts.kind, source->value.logical, buffer,
304 if (source->expr_type == EXPR_CONSTANT || source->ref == NULL)
305 return gfc_encode_character (source->ts.kind,
306 source->value.character.length,
307 source->value.character.string,
308 buffer, buffer_size);
313 gcc_assert (source->expr_type == EXPR_SUBSTRING);
314 gfc_extract_int (source->ref->u.ss.start, &start);
315 gfc_extract_int (source->ref->u.ss.end, &end);
316 return gfc_encode_character (source->ts.kind, MAX(end - start + 1, 0),
317 &source->value.character.string[start-1],
318 buffer, buffer_size);
322 return encode_derived (source, buffer, buffer_size);
324 gfc_internal_error ("Invalid expression in gfc_target_encode_expr.");
331 interpret_array (unsigned char *buffer, size_t buffer_size, gfc_expr *result)
333 gfc_constructor_base base = NULL;
338 /* Calculate array size from its shape and rank. */
339 gcc_assert (result->rank > 0 && result->shape);
341 for (i = 0; i < result->rank; i++)
342 array_size *= (int)mpz_get_ui (result->shape[i]);
344 /* Iterate over array elements, producing constructors. */
345 for (i = 0; i < array_size; i++)
347 gfc_expr *e = gfc_get_constant_expr (result->ts.type, result->ts.kind,
351 if (e->ts.type == BT_CHARACTER)
352 e->value.character.length = result->value.character.length;
354 gfc_constructor_append_expr (&base, e, &result->where);
356 ptr += gfc_target_interpret_expr (&buffer[ptr], buffer_size - ptr, e,
360 result->value.constructor = base;
366 gfc_interpret_integer (int kind, unsigned char *buffer, size_t buffer_size,
370 gfc_conv_tree_to_mpz (integer,
371 native_interpret_expr (gfc_get_int_type (kind),
372 buffer, buffer_size));
373 return size_integer (kind);
378 gfc_interpret_float (int kind, unsigned char *buffer, size_t buffer_size,
381 gfc_set_model_kind (kind);
383 gfc_conv_tree_to_mpfr (real,
384 native_interpret_expr (gfc_get_real_type (kind),
385 buffer, buffer_size));
387 return size_float (kind);
392 gfc_interpret_complex (int kind, unsigned char *buffer, size_t buffer_size,
396 size = gfc_interpret_float (kind, &buffer[0], buffer_size,
397 mpc_realref (complex));
398 size += gfc_interpret_float (kind, &buffer[size], buffer_size - size,
399 mpc_imagref (complex));
405 gfc_interpret_logical (int kind, unsigned char *buffer, size_t buffer_size,
408 tree t = native_interpret_expr (gfc_get_logical_type (kind), buffer,
410 *logical = double_int_zero_p (tree_to_double_int (t))
412 return size_logical (kind);
417 gfc_interpret_character (unsigned char *buffer, size_t buffer_size,
422 if (result->ts.u.cl && result->ts.u.cl->length)
423 result->value.character.length =
424 (int) mpz_get_ui (result->ts.u.cl->length->value.integer);
426 gcc_assert (buffer_size >= size_character (result->value.character.length,
428 result->value.character.string =
429 gfc_get_wide_string (result->value.character.length + 1);
431 if (result->ts.kind == gfc_default_character_kind)
432 for (i = 0; i < result->value.character.length; i++)
433 result->value.character.string[i] = (gfc_char_t) buffer[i];
437 unsigned bytes = size_character (1, result->ts.kind);
439 gcc_assert (bytes <= sizeof (unsigned long));
441 for (i = 0; i < result->value.character.length; i++)
443 gfc_conv_tree_to_mpz (integer,
444 native_interpret_expr (gfc_get_char_type (result->ts.kind),
445 &buffer[bytes*i], buffer_size-bytes*i));
446 result->value.character.string[i]
447 = (gfc_char_t) mpz_get_ui (integer);
453 result->value.character.string[result->value.character.length] = '\0';
455 return result->value.character.length;
460 gfc_interpret_derived (unsigned char *buffer, size_t buffer_size, gfc_expr *result)
466 /* The attributes of the derived type need to be bolted to the floor. */
467 result->expr_type = EXPR_STRUCTURE;
469 cmp = result->ts.u.derived->components;
471 if (result->ts.u.derived->from_intmod == INTMOD_ISO_C_BINDING
472 && (result->ts.u.derived->intmod_sym_id == ISOCBINDING_PTR
473 || result->ts.u.derived->intmod_sym_id == ISOCBINDING_FUNPTR))
477 /* Needed as gfc_typenode_for_spec as gfc_typenode_for_spec
478 sets this to BT_INTEGER. */
479 result->ts.type = BT_DERIVED;
480 e = gfc_get_constant_expr (cmp->ts.type, cmp->ts.kind, &result->where);
481 c = gfc_constructor_append_expr (&result->value.constructor, e, NULL);
482 c->n.component = cmp;
483 gfc_target_interpret_expr (buffer, buffer_size, e, true);
485 return int_size_in_bytes (ptr_type_node);
488 type = gfc_typenode_for_spec (&result->ts);
490 /* Run through the derived type components. */
491 for (;cmp; cmp = cmp->next)
494 gfc_expr *e = gfc_get_constant_expr (cmp->ts.type, cmp->ts.kind,
498 /* Copy shape, if needed. */
499 if (cmp->as && cmp->as->rank)
503 e->expr_type = EXPR_ARRAY;
504 e->rank = cmp->as->rank;
506 e->shape = gfc_get_shape (e->rank);
507 for (n = 0; n < e->rank; n++)
509 mpz_init_set_ui (e->shape[n], 1);
510 mpz_add (e->shape[n], e->shape[n],
511 cmp->as->upper[n]->value.integer);
512 mpz_sub (e->shape[n], e->shape[n],
513 cmp->as->lower[n]->value.integer);
517 c = gfc_constructor_append_expr (&result->value.constructor, e, NULL);
519 /* The constructor points to the component. */
520 c->n.component = cmp;
522 /* Calculate the offset, which consists of the FIELD_OFFSET in
523 bytes, which appears in multiples of DECL_OFFSET_ALIGN-bit-sized,
524 and additional bits of FIELD_BIT_OFFSET. The code assumes that all
525 sizes of the components are multiples of BITS_PER_UNIT,
526 i.e. there are, e.g., no bit fields. */
528 gcc_assert (cmp->backend_decl);
529 ptr = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (cmp->backend_decl));
530 gcc_assert (ptr % 8 == 0);
531 ptr = ptr/8 + TREE_INT_CST_LOW (DECL_FIELD_OFFSET (cmp->backend_decl));
533 gfc_target_interpret_expr (&buffer[ptr], buffer_size - ptr, e, true);
536 return int_size_in_bytes (type);
540 /* Read a binary buffer to a constant expression. */
542 gfc_target_interpret_expr (unsigned char *buffer, size_t buffer_size,
543 gfc_expr *result, bool convert_widechar)
545 if (result->expr_type == EXPR_ARRAY)
546 return interpret_array (buffer, buffer_size, result);
548 switch (result->ts.type)
551 result->representation.length =
552 gfc_interpret_integer (result->ts.kind, buffer, buffer_size,
553 result->value.integer);
557 result->representation.length =
558 gfc_interpret_float (result->ts.kind, buffer, buffer_size,
563 result->representation.length =
564 gfc_interpret_complex (result->ts.kind, buffer, buffer_size,
565 result->value.complex);
569 result->representation.length =
570 gfc_interpret_logical (result->ts.kind, buffer, buffer_size,
571 &result->value.logical);
575 result->representation.length =
576 gfc_interpret_character (buffer, buffer_size, result);
580 result->ts = CLASS_DATA (result)->ts;
583 result->representation.length =
584 gfc_interpret_derived (buffer, buffer_size, result);
588 gfc_internal_error ("Invalid expression in gfc_target_interpret_expr.");
592 if (result->ts.type == BT_CHARACTER && convert_widechar)
593 result->representation.string
594 = gfc_widechar_to_char (result->value.character.string,
595 result->value.character.length);
598 result->representation.string =
599 XCNEWVEC (char, result->representation.length + 1);
600 memcpy (result->representation.string, buffer,
601 result->representation.length);
602 result->representation.string[result->representation.length] = '\0';
605 return result->representation.length;
609 /* --------------------------------------------------------------- */
610 /* Two functions used by trans-common.c to write overlapping
611 equivalence initializers to a buffer. This is added to the union
612 and the original initializers freed. */
615 /* Writes the values of a constant expression to a char buffer. If another
616 unequal initializer has already been written to the buffer, this is an
620 expr_to_char (gfc_expr *e, unsigned char *data, unsigned char *chk, size_t len)
626 unsigned char *buffer;
631 /* Take a derived type, one component at a time, using the offsets from the backend
633 if (e->ts.type == BT_DERIVED)
635 for (c = gfc_constructor_first (e->value.constructor),
636 cmp = e->ts.u.derived->components;
637 c; c = gfc_constructor_next (c), cmp = cmp->next)
639 gcc_assert (cmp && cmp->backend_decl);
642 ptr = TREE_INT_CST_LOW(DECL_FIELD_OFFSET(cmp->backend_decl))
643 + TREE_INT_CST_LOW(DECL_FIELD_BIT_OFFSET(cmp->backend_decl))/8;
644 expr_to_char (c->expr, &data[ptr], &chk[ptr], len);
649 /* Otherwise, use the target-memory machinery to write a bitwise image, appropriate
650 to the target, in a buffer and check off the initialized part of the buffer. */
651 len = gfc_target_expr_size (e);
652 buffer = (unsigned char*)alloca (len);
653 len = gfc_target_encode_expr (e, buffer, len);
655 for (i = 0; i < (int)len; i++)
657 if (chk[i] && (buffer[i] != data[i]))
659 gfc_error ("Overlapping unequal initializers in EQUIVALENCE "
666 memcpy (data, buffer, len);
671 /* Writes the values from the equivalence initializers to a char* array
672 that will be written to the constructor to make the initializer for
673 the union declaration. */
676 gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, unsigned char *data,
677 unsigned char *chk, size_t length)
682 switch (e->expr_type)
686 len = expr_to_char (e, &data[0], &chk[0], length);
691 for (c = gfc_constructor_first (e->value.constructor);
692 c; c = gfc_constructor_next (c))
694 size_t elt_size = gfc_target_expr_size (c->expr);
697 len = elt_size * (size_t)mpz_get_si (c->offset);
699 len = len + gfc_merge_initializers (ts, c->expr, &data[len],
700 &chk[len], length - len);
712 /* Transfer the bitpattern of a (integer) BOZ to real or complex variables.
713 When successful, no BOZ or nothing to do, true is returned. */
716 gfc_convert_boz (gfc_expr *expr, gfc_typespec *ts)
718 size_t buffer_size, boz_bit_size, ts_bit_size;
720 unsigned char *buffer;
725 gcc_assert (expr->expr_type == EXPR_CONSTANT
726 && expr->ts.type == BT_INTEGER);
728 /* Don't convert BOZ to logical, character, derived etc. */
729 if (ts->type == BT_REAL)
731 buffer_size = size_float (ts->kind);
732 ts_bit_size = buffer_size * 8;
734 else if (ts->type == BT_COMPLEX)
736 buffer_size = size_complex (ts->kind);
737 ts_bit_size = buffer_size * 8 / 2;
742 /* Convert BOZ to the smallest possible integer kind. */
743 boz_bit_size = mpz_sizeinbase (expr->value.integer, 2);
745 if (boz_bit_size > ts_bit_size)
747 gfc_error_now ("BOZ constant at %L is too large (%ld vs %ld bits)",
748 &expr->where, (long) boz_bit_size, (long) ts_bit_size);
752 for (index = 0; gfc_integer_kinds[index].kind != 0; ++index)
753 if ((unsigned) gfc_integer_kinds[index].bit_size >= ts_bit_size)
756 expr->ts.kind = gfc_integer_kinds[index].kind;
757 buffer_size = MAX (buffer_size, size_integer (expr->ts.kind));
759 buffer = (unsigned char*)alloca (buffer_size);
760 encode_integer (expr->ts.kind, expr->value.integer, buffer, buffer_size);
761 mpz_clear (expr->value.integer);
763 if (ts->type == BT_REAL)
765 mpfr_init (expr->value.real);
766 gfc_interpret_float (ts->kind, buffer, buffer_size, expr->value.real);
770 mpc_init2 (expr->value.complex, mpfr_get_default_prec());
771 gfc_interpret_complex (ts->kind, buffer, buffer_size,
772 expr->value.complex);
775 expr->ts.type = ts->type;
776 expr->ts.kind = ts->kind;