target-memory.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. /* Simulate storage of variables into target memory.
  2. Copyright (C) 2007-2015 Free Software Foundation, Inc.
  3. Contributed by Paul Thomas and Brooks Moses
  4. This file is part of GCC.
  5. GCC is free software; you can redistribute it and/or modify it under
  6. the terms of the GNU General Public License as published by the Free
  7. Software Foundation; either version 3, or (at your option) any later
  8. version.
  9. GCC is distributed in the hope that it will be useful, but WITHOUT ANY
  10. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  12. for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with GCC; see the file COPYING3. If not see
  15. <http://www.gnu.org/licenses/>. */
  16. #include "config.h"
  17. #include "system.h"
  18. #include "coretypes.h"
  19. #include "flags.h"
  20. #include "hash-set.h"
  21. #include "machmode.h"
  22. #include "vec.h"
  23. #include "double-int.h"
  24. #include "input.h"
  25. #include "alias.h"
  26. #include "symtab.h"
  27. #include "wide-int.h"
  28. #include "inchash.h"
  29. #include "tree.h"
  30. #include "fold-const.h"
  31. #include "stor-layout.h"
  32. #include "gfortran.h"
  33. #include "arith.h"
  34. #include "constructor.h"
  35. #include "trans.h"
  36. #include "trans-const.h"
  37. #include "trans-types.h"
  38. #include "target-memory.h"
  39. /* --------------------------------------------------------------- */
  40. /* Calculate the size of an expression. */
  41. static size_t
  42. size_integer (int kind)
  43. {
  44. return GET_MODE_SIZE (TYPE_MODE (gfc_get_int_type (kind)));;
  45. }
  46. static size_t
  47. size_float (int kind)
  48. {
  49. return GET_MODE_SIZE (TYPE_MODE (gfc_get_real_type (kind)));;
  50. }
  51. static size_t
  52. size_complex (int kind)
  53. {
  54. return 2 * size_float (kind);
  55. }
  56. static size_t
  57. size_logical (int kind)
  58. {
  59. return GET_MODE_SIZE (TYPE_MODE (gfc_get_logical_type (kind)));;
  60. }
  61. static size_t
  62. size_character (int length, int kind)
  63. {
  64. int i = gfc_validate_kind (BT_CHARACTER, kind, false);
  65. return length * gfc_character_kinds[i].bit_size / 8;
  66. }
  67. /* Return the size of a single element of the given expression.
  68. Identical to gfc_target_expr_size for scalars. */
  69. size_t
  70. gfc_element_size (gfc_expr *e)
  71. {
  72. tree type;
  73. switch (e->ts.type)
  74. {
  75. case BT_INTEGER:
  76. return size_integer (e->ts.kind);
  77. case BT_REAL:
  78. return size_float (e->ts.kind);
  79. case BT_COMPLEX:
  80. return size_complex (e->ts.kind);
  81. case BT_LOGICAL:
  82. return size_logical (e->ts.kind);
  83. case BT_CHARACTER:
  84. if (e->expr_type == EXPR_CONSTANT)
  85. return size_character (e->value.character.length, e->ts.kind);
  86. else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
  87. && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
  88. && e->ts.u.cl->length->ts.type == BT_INTEGER)
  89. {
  90. int length;
  91. gfc_extract_int (e->ts.u.cl->length, &length);
  92. return size_character (length, e->ts.kind);
  93. }
  94. else
  95. return 0;
  96. case BT_HOLLERITH:
  97. return e->representation.length;
  98. case BT_DERIVED:
  99. case BT_CLASS:
  100. case BT_VOID:
  101. case BT_ASSUMED:
  102. {
  103. /* Determine type size without clobbering the typespec for ISO C
  104. binding types. */
  105. gfc_typespec ts;
  106. HOST_WIDE_INT size;
  107. ts = e->ts;
  108. type = gfc_typenode_for_spec (&ts);
  109. size = int_size_in_bytes (type);
  110. gcc_assert (size >= 0);
  111. return size;
  112. }
  113. default:
  114. gfc_internal_error ("Invalid expression in gfc_element_size.");
  115. return 0;
  116. }
  117. }
  118. /* Return the size of an expression in its target representation. */
  119. size_t
  120. gfc_target_expr_size (gfc_expr *e)
  121. {
  122. mpz_t tmp;
  123. size_t asz;
  124. gcc_assert (e != NULL);
  125. if (e->rank)
  126. {
  127. if (gfc_array_size (e, &tmp))
  128. asz = mpz_get_ui (tmp);
  129. else
  130. asz = 0;
  131. }
  132. else
  133. asz = 1;
  134. return asz * gfc_element_size (e);
  135. }
  136. /* The encode_* functions export a value into a buffer, and
  137. return the number of bytes of the buffer that have been
  138. used. */
  139. static unsigned HOST_WIDE_INT
  140. encode_array (gfc_expr *expr, unsigned char *buffer, size_t buffer_size)
  141. {
  142. mpz_t array_size;
  143. int i;
  144. int ptr = 0;
  145. gfc_constructor_base ctor = expr->value.constructor;
  146. gfc_array_size (expr, &array_size);
  147. for (i = 0; i < (int)mpz_get_ui (array_size); i++)
  148. {
  149. ptr += gfc_target_encode_expr (gfc_constructor_lookup_expr (ctor, i),
  150. &buffer[ptr], buffer_size - ptr);
  151. }
  152. mpz_clear (array_size);
  153. return ptr;
  154. }
  155. static int
  156. encode_integer (int kind, mpz_t integer, unsigned char *buffer,
  157. size_t buffer_size)
  158. {
  159. return native_encode_expr (gfc_conv_mpz_to_tree (integer, kind),
  160. buffer, buffer_size);
  161. }
  162. static int
  163. encode_float (int kind, mpfr_t real, unsigned char *buffer, size_t buffer_size)
  164. {
  165. return native_encode_expr (gfc_conv_mpfr_to_tree (real, kind, 0), buffer,
  166. buffer_size);
  167. }
  168. static int
  169. encode_complex (int kind, mpc_t cmplx,
  170. unsigned char *buffer, size_t buffer_size)
  171. {
  172. int size;
  173. size = encode_float (kind, mpc_realref (cmplx), &buffer[0], buffer_size);
  174. size += encode_float (kind, mpc_imagref (cmplx),
  175. &buffer[size], buffer_size - size);
  176. return size;
  177. }
  178. static int
  179. encode_logical (int kind, int logical, unsigned char *buffer, size_t buffer_size)
  180. {
  181. return native_encode_expr (build_int_cst (gfc_get_logical_type (kind),
  182. logical),
  183. buffer, buffer_size);
  184. }
  185. int
  186. gfc_encode_character (int kind, int length, const gfc_char_t *string,
  187. unsigned char *buffer, size_t buffer_size)
  188. {
  189. size_t elsize = size_character (1, kind);
  190. tree type = gfc_get_char_type (kind);
  191. int i;
  192. gcc_assert (buffer_size >= size_character (length, kind));
  193. for (i = 0; i < length; i++)
  194. native_encode_expr (build_int_cst (type, string[i]), &buffer[i*elsize],
  195. elsize);
  196. return length;
  197. }
  198. static unsigned HOST_WIDE_INT
  199. encode_derived (gfc_expr *source, unsigned char *buffer, size_t buffer_size)
  200. {
  201. gfc_constructor *c;
  202. gfc_component *cmp;
  203. int ptr;
  204. tree type;
  205. HOST_WIDE_INT size;
  206. type = gfc_typenode_for_spec (&source->ts);
  207. for (c = gfc_constructor_first (source->value.constructor),
  208. cmp = source->ts.u.derived->components;
  209. c;
  210. c = gfc_constructor_next (c), cmp = cmp->next)
  211. {
  212. gcc_assert (cmp);
  213. if (!c->expr)
  214. continue;
  215. ptr = TREE_INT_CST_LOW(DECL_FIELD_OFFSET(cmp->backend_decl))
  216. + TREE_INT_CST_LOW(DECL_FIELD_BIT_OFFSET(cmp->backend_decl))/8;
  217. if (c->expr->expr_type == EXPR_NULL)
  218. {
  219. size = int_size_in_bytes (TREE_TYPE (cmp->backend_decl));
  220. gcc_assert (size >= 0);
  221. memset (&buffer[ptr], 0, size);
  222. }
  223. else
  224. gfc_target_encode_expr (c->expr, &buffer[ptr],
  225. buffer_size - ptr);
  226. }
  227. size = int_size_in_bytes (type);
  228. gcc_assert (size >= 0);
  229. return size;
  230. }
  231. /* Write a constant expression in binary form to a buffer. */
  232. unsigned HOST_WIDE_INT
  233. gfc_target_encode_expr (gfc_expr *source, unsigned char *buffer,
  234. size_t buffer_size)
  235. {
  236. if (source == NULL)
  237. return 0;
  238. if (source->expr_type == EXPR_ARRAY)
  239. return encode_array (source, buffer, buffer_size);
  240. gcc_assert (source->expr_type == EXPR_CONSTANT
  241. || source->expr_type == EXPR_STRUCTURE
  242. || source->expr_type == EXPR_SUBSTRING);
  243. /* If we already have a target-memory representation, we use that rather
  244. than recreating one. */
  245. if (source->representation.string)
  246. {
  247. memcpy (buffer, source->representation.string,
  248. source->representation.length);
  249. return source->representation.length;
  250. }
  251. switch (source->ts.type)
  252. {
  253. case BT_INTEGER:
  254. return encode_integer (source->ts.kind, source->value.integer, buffer,
  255. buffer_size);
  256. case BT_REAL:
  257. return encode_float (source->ts.kind, source->value.real, buffer,
  258. buffer_size);
  259. case BT_COMPLEX:
  260. return encode_complex (source->ts.kind, source->value.complex,
  261. buffer, buffer_size);
  262. case BT_LOGICAL:
  263. return encode_logical (source->ts.kind, source->value.logical, buffer,
  264. buffer_size);
  265. case BT_CHARACTER:
  266. if (source->expr_type == EXPR_CONSTANT || source->ref == NULL)
  267. return gfc_encode_character (source->ts.kind,
  268. source->value.character.length,
  269. source->value.character.string,
  270. buffer, buffer_size);
  271. else
  272. {
  273. int start, end;
  274. gcc_assert (source->expr_type == EXPR_SUBSTRING);
  275. gfc_extract_int (source->ref->u.ss.start, &start);
  276. gfc_extract_int (source->ref->u.ss.end, &end);
  277. return gfc_encode_character (source->ts.kind, MAX(end - start + 1, 0),
  278. &source->value.character.string[start-1],
  279. buffer, buffer_size);
  280. }
  281. case BT_DERIVED:
  282. if (source->ts.u.derived->ts.f90_type == BT_VOID)
  283. {
  284. gfc_constructor *c;
  285. gcc_assert (source->expr_type == EXPR_STRUCTURE);
  286. c = gfc_constructor_first (source->value.constructor);
  287. gcc_assert (c->expr->expr_type == EXPR_CONSTANT
  288. && c->expr->ts.type == BT_INTEGER);
  289. return encode_integer (gfc_index_integer_kind, c->expr->value.integer,
  290. buffer, buffer_size);
  291. }
  292. return encode_derived (source, buffer, buffer_size);
  293. default:
  294. gfc_internal_error ("Invalid expression in gfc_target_encode_expr.");
  295. return 0;
  296. }
  297. }
  298. static int
  299. interpret_array (unsigned char *buffer, size_t buffer_size, gfc_expr *result)
  300. {
  301. gfc_constructor_base base = NULL;
  302. int array_size = 1;
  303. int i;
  304. int ptr = 0;
  305. /* Calculate array size from its shape and rank. */
  306. gcc_assert (result->rank > 0 && result->shape);
  307. for (i = 0; i < result->rank; i++)
  308. array_size *= (int)mpz_get_ui (result->shape[i]);
  309. /* Iterate over array elements, producing constructors. */
  310. for (i = 0; i < array_size; i++)
  311. {
  312. gfc_expr *e = gfc_get_constant_expr (result->ts.type, result->ts.kind,
  313. &result->where);
  314. e->ts = result->ts;
  315. if (e->ts.type == BT_CHARACTER)
  316. e->value.character.length = result->value.character.length;
  317. gfc_constructor_append_expr (&base, e, &result->where);
  318. ptr += gfc_target_interpret_expr (&buffer[ptr], buffer_size - ptr, e,
  319. true);
  320. }
  321. result->value.constructor = base;
  322. return ptr;
  323. }
  324. int
  325. gfc_interpret_integer (int kind, unsigned char *buffer, size_t buffer_size,
  326. mpz_t integer)
  327. {
  328. mpz_init (integer);
  329. gfc_conv_tree_to_mpz (integer,
  330. native_interpret_expr (gfc_get_int_type (kind),
  331. buffer, buffer_size));
  332. return size_integer (kind);
  333. }
  334. int
  335. gfc_interpret_float (int kind, unsigned char *buffer, size_t buffer_size,
  336. mpfr_t real)
  337. {
  338. gfc_set_model_kind (kind);
  339. mpfr_init (real);
  340. gfc_conv_tree_to_mpfr (real,
  341. native_interpret_expr (gfc_get_real_type (kind),
  342. buffer, buffer_size));
  343. return size_float (kind);
  344. }
  345. int
  346. gfc_interpret_complex (int kind, unsigned char *buffer, size_t buffer_size,
  347. mpc_t complex)
  348. {
  349. int size;
  350. size = gfc_interpret_float (kind, &buffer[0], buffer_size,
  351. mpc_realref (complex));
  352. size += gfc_interpret_float (kind, &buffer[size], buffer_size - size,
  353. mpc_imagref (complex));
  354. return size;
  355. }
  356. int
  357. gfc_interpret_logical (int kind, unsigned char *buffer, size_t buffer_size,
  358. int *logical)
  359. {
  360. tree t = native_interpret_expr (gfc_get_logical_type (kind), buffer,
  361. buffer_size);
  362. *logical = wi::eq_p (t, 0) ? 0 : 1;
  363. return size_logical (kind);
  364. }
  365. int
  366. gfc_interpret_character (unsigned char *buffer, size_t buffer_size,
  367. gfc_expr *result)
  368. {
  369. int i;
  370. if (result->ts.u.cl && result->ts.u.cl->length)
  371. result->value.character.length =
  372. (int) mpz_get_ui (result->ts.u.cl->length->value.integer);
  373. gcc_assert (buffer_size >= size_character (result->value.character.length,
  374. result->ts.kind));
  375. result->value.character.string =
  376. gfc_get_wide_string (result->value.character.length + 1);
  377. if (result->ts.kind == gfc_default_character_kind)
  378. for (i = 0; i < result->value.character.length; i++)
  379. result->value.character.string[i] = (gfc_char_t) buffer[i];
  380. else
  381. {
  382. mpz_t integer;
  383. unsigned bytes = size_character (1, result->ts.kind);
  384. mpz_init (integer);
  385. gcc_assert (bytes <= sizeof (unsigned long));
  386. for (i = 0; i < result->value.character.length; i++)
  387. {
  388. gfc_conv_tree_to_mpz (integer,
  389. native_interpret_expr (gfc_get_char_type (result->ts.kind),
  390. &buffer[bytes*i], buffer_size-bytes*i));
  391. result->value.character.string[i]
  392. = (gfc_char_t) mpz_get_ui (integer);
  393. }
  394. mpz_clear (integer);
  395. }
  396. result->value.character.string[result->value.character.length] = '\0';
  397. return result->value.character.length;
  398. }
  399. int
  400. gfc_interpret_derived (unsigned char *buffer, size_t buffer_size, gfc_expr *result)
  401. {
  402. gfc_component *cmp;
  403. int ptr;
  404. tree type;
  405. /* The attributes of the derived type need to be bolted to the floor. */
  406. result->expr_type = EXPR_STRUCTURE;
  407. cmp = result->ts.u.derived->components;
  408. if (result->ts.u.derived->from_intmod == INTMOD_ISO_C_BINDING
  409. && (result->ts.u.derived->intmod_sym_id == ISOCBINDING_PTR
  410. || result->ts.u.derived->intmod_sym_id == ISOCBINDING_FUNPTR))
  411. {
  412. gfc_constructor *c;
  413. gfc_expr *e;
  414. /* Needed as gfc_typenode_for_spec as gfc_typenode_for_spec
  415. sets this to BT_INTEGER. */
  416. result->ts.type = BT_DERIVED;
  417. e = gfc_get_constant_expr (cmp->ts.type, cmp->ts.kind, &result->where);
  418. c = gfc_constructor_append_expr (&result->value.constructor, e, NULL);
  419. c->n.component = cmp;
  420. gfc_target_interpret_expr (buffer, buffer_size, e, true);
  421. e->ts.is_iso_c = 1;
  422. return int_size_in_bytes (ptr_type_node);
  423. }
  424. type = gfc_typenode_for_spec (&result->ts);
  425. /* Run through the derived type components. */
  426. for (;cmp; cmp = cmp->next)
  427. {
  428. gfc_constructor *c;
  429. gfc_expr *e = gfc_get_constant_expr (cmp->ts.type, cmp->ts.kind,
  430. &result->where);
  431. e->ts = cmp->ts;
  432. /* Copy shape, if needed. */
  433. if (cmp->as && cmp->as->rank)
  434. {
  435. int n;
  436. e->expr_type = EXPR_ARRAY;
  437. e->rank = cmp->as->rank;
  438. e->shape = gfc_get_shape (e->rank);
  439. for (n = 0; n < e->rank; n++)
  440. {
  441. mpz_init_set_ui (e->shape[n], 1);
  442. mpz_add (e->shape[n], e->shape[n],
  443. cmp->as->upper[n]->value.integer);
  444. mpz_sub (e->shape[n], e->shape[n],
  445. cmp->as->lower[n]->value.integer);
  446. }
  447. }
  448. c = gfc_constructor_append_expr (&result->value.constructor, e, NULL);
  449. /* The constructor points to the component. */
  450. c->n.component = cmp;
  451. /* Calculate the offset, which consists of the FIELD_OFFSET in
  452. bytes, which appears in multiples of DECL_OFFSET_ALIGN-bit-sized,
  453. and additional bits of FIELD_BIT_OFFSET. The code assumes that all
  454. sizes of the components are multiples of BITS_PER_UNIT,
  455. i.e. there are, e.g., no bit fields. */
  456. gcc_assert (cmp->backend_decl);
  457. ptr = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (cmp->backend_decl));
  458. gcc_assert (ptr % 8 == 0);
  459. ptr = ptr/8 + TREE_INT_CST_LOW (DECL_FIELD_OFFSET (cmp->backend_decl));
  460. gfc_target_interpret_expr (&buffer[ptr], buffer_size - ptr, e, true);
  461. }
  462. return int_size_in_bytes (type);
  463. }
  464. /* Read a binary buffer to a constant expression. */
  465. int
  466. gfc_target_interpret_expr (unsigned char *buffer, size_t buffer_size,
  467. gfc_expr *result, bool convert_widechar)
  468. {
  469. if (result->expr_type == EXPR_ARRAY)
  470. return interpret_array (buffer, buffer_size, result);
  471. switch (result->ts.type)
  472. {
  473. case BT_INTEGER:
  474. result->representation.length =
  475. gfc_interpret_integer (result->ts.kind, buffer, buffer_size,
  476. result->value.integer);
  477. break;
  478. case BT_REAL:
  479. result->representation.length =
  480. gfc_interpret_float (result->ts.kind, buffer, buffer_size,
  481. result->value.real);
  482. break;
  483. case BT_COMPLEX:
  484. result->representation.length =
  485. gfc_interpret_complex (result->ts.kind, buffer, buffer_size,
  486. result->value.complex);
  487. break;
  488. case BT_LOGICAL:
  489. result->representation.length =
  490. gfc_interpret_logical (result->ts.kind, buffer, buffer_size,
  491. &result->value.logical);
  492. break;
  493. case BT_CHARACTER:
  494. result->representation.length =
  495. gfc_interpret_character (buffer, buffer_size, result);
  496. break;
  497. case BT_CLASS:
  498. result->ts = CLASS_DATA (result)->ts;
  499. /* Fall through. */
  500. case BT_DERIVED:
  501. result->representation.length =
  502. gfc_interpret_derived (buffer, buffer_size, result);
  503. gcc_assert (result->representation.length >= 0);
  504. break;
  505. default:
  506. gfc_internal_error ("Invalid expression in gfc_target_interpret_expr.");
  507. break;
  508. }
  509. if (result->ts.type == BT_CHARACTER && convert_widechar)
  510. result->representation.string
  511. = gfc_widechar_to_char (result->value.character.string,
  512. result->value.character.length);
  513. else
  514. {
  515. result->representation.string =
  516. XCNEWVEC (char, result->representation.length + 1);
  517. memcpy (result->representation.string, buffer,
  518. result->representation.length);
  519. result->representation.string[result->representation.length] = '\0';
  520. }
  521. return result->representation.length;
  522. }
  523. /* --------------------------------------------------------------- */
  524. /* Two functions used by trans-common.c to write overlapping
  525. equivalence initializers to a buffer. This is added to the union
  526. and the original initializers freed. */
  527. /* Writes the values of a constant expression to a char buffer. If another
  528. unequal initializer has already been written to the buffer, this is an
  529. error. */
  530. static size_t
  531. expr_to_char (gfc_expr *e, unsigned char *data, unsigned char *chk, size_t len)
  532. {
  533. int i;
  534. int ptr;
  535. gfc_constructor *c;
  536. gfc_component *cmp;
  537. unsigned char *buffer;
  538. if (e == NULL)
  539. return 0;
  540. /* Take a derived type, one component at a time, using the offsets from the backend
  541. declaration. */
  542. if (e->ts.type == BT_DERIVED)
  543. {
  544. for (c = gfc_constructor_first (e->value.constructor),
  545. cmp = e->ts.u.derived->components;
  546. c; c = gfc_constructor_next (c), cmp = cmp->next)
  547. {
  548. gcc_assert (cmp && cmp->backend_decl);
  549. if (!c->expr)
  550. continue;
  551. ptr = TREE_INT_CST_LOW(DECL_FIELD_OFFSET(cmp->backend_decl))
  552. + TREE_INT_CST_LOW(DECL_FIELD_BIT_OFFSET(cmp->backend_decl))/8;
  553. expr_to_char (c->expr, &data[ptr], &chk[ptr], len);
  554. }
  555. return len;
  556. }
  557. /* Otherwise, use the target-memory machinery to write a bitwise image, appropriate
  558. to the target, in a buffer and check off the initialized part of the buffer. */
  559. len = gfc_target_expr_size (e);
  560. buffer = (unsigned char*)alloca (len);
  561. len = gfc_target_encode_expr (e, buffer, len);
  562. for (i = 0; i < (int)len; i++)
  563. {
  564. if (chk[i] && (buffer[i] != data[i]))
  565. {
  566. gfc_error ("Overlapping unequal initializers in EQUIVALENCE "
  567. "at %L", &e->where);
  568. return 0;
  569. }
  570. chk[i] = 0xFF;
  571. }
  572. memcpy (data, buffer, len);
  573. return len;
  574. }
  575. /* Writes the values from the equivalence initializers to a char* array
  576. that will be written to the constructor to make the initializer for
  577. the union declaration. */
  578. size_t
  579. gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, unsigned char *data,
  580. unsigned char *chk, size_t length)
  581. {
  582. size_t len = 0;
  583. gfc_constructor * c;
  584. switch (e->expr_type)
  585. {
  586. case EXPR_CONSTANT:
  587. case EXPR_STRUCTURE:
  588. len = expr_to_char (e, &data[0], &chk[0], length);
  589. break;
  590. case EXPR_ARRAY:
  591. for (c = gfc_constructor_first (e->value.constructor);
  592. c; c = gfc_constructor_next (c))
  593. {
  594. size_t elt_size = gfc_target_expr_size (c->expr);
  595. if (mpz_cmp_si (c->offset, 0) != 0)
  596. len = elt_size * (size_t)mpz_get_si (c->offset);
  597. len = len + gfc_merge_initializers (ts, c->expr, &data[len],
  598. &chk[len], length - len);
  599. }
  600. break;
  601. default:
  602. return 0;
  603. }
  604. return len;
  605. }
  606. /* Transfer the bitpattern of a (integer) BOZ to real or complex variables.
  607. When successful, no BOZ or nothing to do, true is returned. */
  608. bool
  609. gfc_convert_boz (gfc_expr *expr, gfc_typespec *ts)
  610. {
  611. size_t buffer_size, boz_bit_size, ts_bit_size;
  612. int index;
  613. unsigned char *buffer;
  614. if (!expr->is_boz)
  615. return true;
  616. gcc_assert (expr->expr_type == EXPR_CONSTANT
  617. && expr->ts.type == BT_INTEGER);
  618. /* Don't convert BOZ to logical, character, derived etc. */
  619. if (ts->type == BT_REAL)
  620. {
  621. buffer_size = size_float (ts->kind);
  622. ts_bit_size = buffer_size * 8;
  623. }
  624. else if (ts->type == BT_COMPLEX)
  625. {
  626. buffer_size = size_complex (ts->kind);
  627. ts_bit_size = buffer_size * 8 / 2;
  628. }
  629. else
  630. return true;
  631. /* Convert BOZ to the smallest possible integer kind. */
  632. boz_bit_size = mpz_sizeinbase (expr->value.integer, 2);
  633. if (boz_bit_size > ts_bit_size)
  634. {
  635. gfc_error_now ("BOZ constant at %L is too large (%ld vs %ld bits)",
  636. &expr->where, (long) boz_bit_size, (long) ts_bit_size);
  637. return false;
  638. }
  639. for (index = 0; gfc_integer_kinds[index].kind != 0; ++index)
  640. if ((unsigned) gfc_integer_kinds[index].bit_size >= ts_bit_size)
  641. break;
  642. expr->ts.kind = gfc_integer_kinds[index].kind;
  643. buffer_size = MAX (buffer_size, size_integer (expr->ts.kind));
  644. buffer = (unsigned char*)alloca (buffer_size);
  645. encode_integer (expr->ts.kind, expr->value.integer, buffer, buffer_size);
  646. mpz_clear (expr->value.integer);
  647. if (ts->type == BT_REAL)
  648. {
  649. mpfr_init (expr->value.real);
  650. gfc_interpret_float (ts->kind, buffer, buffer_size, expr->value.real);
  651. }
  652. else
  653. {
  654. mpc_init2 (expr->value.complex, mpfr_get_default_prec());
  655. gfc_interpret_complex (ts->kind, buffer, buffer_size,
  656. expr->value.complex);
  657. }
  658. expr->is_boz = 0;
  659. expr->ts.type = ts->type;
  660. expr->ts.kind = ts->kind;
  661. return true;
  662. }