static int encode_derived (gfc_expr *source, unsigned char *buffer, size_t buffer_size) { gfc_constructor *ctr; gfc_component *cmp; int ptr; tree type; type = gfc_typenode_for_spec (&source->ts); ctr = source->value.constructor; cmp = source->ts.derived->components; for (;ctr; ctr = ctr->next, cmp = cmp->next) { gcc_assert (cmp); if (!ctr->expr) continue; ptr = TREE_INT_CST_LOW(DECL_FIELD_OFFSET(cmp->backend_decl)) + TREE_INT_CST_LOW(DECL_FIELD_BIT_OFFSET(cmp->backend_decl))/8; if (ctr->expr->expr_type == EXPR_NULL) memset (&buffer[ptr], 0, int_size_in_bytes (TREE_TYPE (cmp->backend_decl))); else gfc_target_encode_expr (ctr->expr, &buffer[ptr], buffer_size - ptr); } return int_size_in_bytes (type); }
static size_t expr_to_char (gfc_expr *e, unsigned char *data, unsigned char *chk, size_t len) { int i; int ptr; gfc_constructor *ctr; gfc_component *cmp; unsigned char *buffer; if (e == NULL) return 0; /* Take a derived type, one component at a time, using the offsets from the backend declaration. */ if (e->ts.type == BT_DERIVED) { ctr = e->value.constructor; cmp = e->ts.derived->components; for (;ctr; ctr = ctr->next, cmp = cmp->next) { gcc_assert (cmp && cmp->backend_decl); if (!ctr->expr) continue; ptr = TREE_INT_CST_LOW(DECL_FIELD_OFFSET(cmp->backend_decl)) + TREE_INT_CST_LOW(DECL_FIELD_BIT_OFFSET(cmp->backend_decl))/8; expr_to_char (ctr->expr, &data[ptr], &chk[ptr], len); } return len; } /* Otherwise, use the target-memory machinery to write a bitwise image, appropriate to the target, in a buffer and check off the initialized part of the buffer. */ len = gfc_target_expr_size (e); buffer = (unsigned char*)alloca (len); len = gfc_target_encode_expr (e, buffer, len); for (i = 0; i < (int)len; i++) { if (chk[i] && (buffer[i] != data[i])) { gfc_error ("Overlapping unequal initializers in EQUIVALENCE " "at %L", &e->where); return 0; } chk[i] = 0xFF; } memcpy (data, buffer, len); return len; }
static int encode_array (gfc_expr *expr, unsigned char *buffer, size_t buffer_size) { mpz_t array_size; int i; int ptr = 0; gfc_array_size (expr, &array_size); for (i = 0; i < (int)mpz_get_ui (array_size); i++) { ptr += gfc_target_encode_expr (gfc_get_array_element (expr, i), &buffer[ptr], buffer_size - ptr); } mpz_clear (array_size); return ptr; }
static int encode_array (gfc_expr *expr, unsigned char *buffer, size_t buffer_size) { mpz_t array_size; int i; int ptr = 0; gfc_constructor_base ctor = expr->value.constructor; gfc_array_size (expr, &array_size); for (i = 0; i < (int)mpz_get_ui (array_size); i++) { ptr += gfc_target_encode_expr (gfc_constructor_lookup_expr (ctor, i), &buffer[ptr], buffer_size - ptr); } mpz_clear (array_size); return ptr; }