1 /* Code translation -- generate GCC trees from gfc_code.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3 Free Software Foundation, Inc.
4 Contributed by Paul Brook
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/>. */
24 #include "coretypes.h"
27 #include "tree-iterator.h"
35 #include "trans-stmt.h"
36 #include "trans-array.h"
37 #include "trans-types.h"
38 #include "trans-const.h"
40 /* Naming convention for backend interface code:
42 gfc_trans_* translate gfc_code into STMT trees.
44 gfc_conv_* expression conversion
46 gfc_get_* get a backend tree representation of a decl or type */
48 static gfc_file *gfc_current_backend_file;
50 const char gfc_msg_fault[] = N_("Array reference out of bounds");
51 const char gfc_msg_wrong_return[] = N_("Incorrect function return value");
54 /* Advance along TREE_CHAIN n times. */
57 gfc_advance_chain (tree t, int n)
61 gcc_assert (t != NULL_TREE);
68 /* Wrap a node in a TREE_LIST node and add it to the end of a list. */
71 gfc_chainon_list (tree list, tree add)
75 l = tree_cons (NULL_TREE, add, NULL_TREE);
77 return chainon (list, l);
81 /* Strip off a legitimate source ending from the input
82 string NAME of length LEN. */
85 remove_suffix (char *name, int len)
89 for (i = 2; i < 8 && len > i; i++)
91 if (name[len - i] == '.')
100 /* Creates a variable declaration with a given TYPE. */
103 gfc_create_var_np (tree type, const char *prefix)
107 t = create_tmp_var_raw (type, prefix);
109 /* No warnings for anonymous variables. */
111 TREE_NO_WARNING (t) = 1;
117 /* Like above, but also adds it to the current scope. */
120 gfc_create_var (tree type, const char *prefix)
124 tmp = gfc_create_var_np (type, prefix);
132 /* If the expression is not constant, evaluate it now. We assign the
133 result of the expression to an artificially created variable VAR, and
134 return a pointer to the VAR_DECL node for this variable. */
137 gfc_evaluate_now (tree expr, stmtblock_t * pblock)
141 if (CONSTANT_CLASS_P (expr))
144 var = gfc_create_var (TREE_TYPE (expr), NULL);
145 gfc_add_modify (pblock, var, expr);
151 /* Build a MODIFY_EXPR node and add it to a given statement block PBLOCK.
152 A MODIFY_EXPR is an assignment:
156 gfc_add_modify (stmtblock_t * pblock, tree lhs, tree rhs)
160 #ifdef ENABLE_CHECKING
162 t1 = TREE_TYPE (rhs);
163 t2 = TREE_TYPE (lhs);
164 /* Make sure that the types of the rhs and the lhs are the same
165 for scalar assignments. We should probably have something
166 similar for aggregates, but right now removing that check just
167 breaks everything. */
169 || AGGREGATE_TYPE_P (TREE_TYPE (lhs)));
172 tmp = fold_build2 (MODIFY_EXPR, void_type_node, lhs, rhs);
173 gfc_add_expr_to_block (pblock, tmp);
177 /* Create a new scope/binding level and initialize a block. Care must be
178 taken when translating expressions as any temporaries will be placed in
179 the innermost scope. */
182 gfc_start_block (stmtblock_t * block)
184 /* Start a new binding level. */
186 block->has_scope = 1;
188 /* The block is empty. */
189 block->head = NULL_TREE;
193 /* Initialize a block without creating a new scope. */
196 gfc_init_block (stmtblock_t * block)
198 block->head = NULL_TREE;
199 block->has_scope = 0;
203 /* Sometimes we create a scope but it turns out that we don't actually
204 need it. This function merges the scope of BLOCK with its parent.
205 Only variable decls will be merged, you still need to add the code. */
208 gfc_merge_block_scope (stmtblock_t * block)
213 gcc_assert (block->has_scope);
214 block->has_scope = 0;
216 /* Remember the decls in this scope. */
220 /* Add them to the parent scope. */
221 while (decl != NULL_TREE)
223 next = TREE_CHAIN (decl);
224 TREE_CHAIN (decl) = NULL_TREE;
232 /* Finish a scope containing a block of statements. */
235 gfc_finish_block (stmtblock_t * stmtblock)
241 expr = stmtblock->head;
243 expr = build_empty_stmt (input_location);
245 stmtblock->head = NULL_TREE;
247 if (stmtblock->has_scope)
253 block = poplevel (1, 0, 0);
254 expr = build3_v (BIND_EXPR, decl, expr, block);
264 /* Build an ADDR_EXPR and cast the result to TYPE. If TYPE is NULL, the
265 natural type is used. */
268 gfc_build_addr_expr (tree type, tree t)
270 tree base_type = TREE_TYPE (t);
273 if (type && POINTER_TYPE_P (type)
274 && TREE_CODE (base_type) == ARRAY_TYPE
275 && TYPE_MAIN_VARIANT (TREE_TYPE (type))
276 == TYPE_MAIN_VARIANT (TREE_TYPE (base_type)))
278 tree min_val = size_zero_node;
279 tree type_domain = TYPE_DOMAIN (base_type);
280 if (type_domain && TYPE_MIN_VALUE (type_domain))
281 min_val = TYPE_MIN_VALUE (type_domain);
282 t = fold (build4 (ARRAY_REF, TREE_TYPE (type),
283 t, min_val, NULL_TREE, NULL_TREE));
287 natural_type = build_pointer_type (base_type);
289 if (TREE_CODE (t) == INDIRECT_REF)
293 t = TREE_OPERAND (t, 0);
294 natural_type = TREE_TYPE (t);
298 tree base = get_base_address (t);
299 if (base && DECL_P (base))
300 TREE_ADDRESSABLE (base) = 1;
301 t = fold_build1 (ADDR_EXPR, natural_type, t);
304 if (type && natural_type != type)
305 t = convert (type, t);
311 /* Build an ARRAY_REF with its natural type. */
314 gfc_build_array_ref (tree base, tree offset, tree decl)
316 tree type = TREE_TYPE (base);
319 gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
320 type = TREE_TYPE (type);
323 TREE_ADDRESSABLE (base) = 1;
325 /* Strip NON_LVALUE_EXPR nodes. */
326 STRIP_TYPE_NOPS (offset);
328 /* If the array reference is to a pointer, whose target contains a
329 subreference, use the span that is stored with the backend decl
330 and reference the element with pointer arithmetic. */
331 if (decl && (TREE_CODE (decl) == FIELD_DECL
332 || TREE_CODE (decl) == VAR_DECL
333 || TREE_CODE (decl) == PARM_DECL)
334 && GFC_DECL_SUBREF_ARRAY_P (decl)
335 && !integer_zerop (GFC_DECL_SPAN(decl)))
337 offset = fold_build2 (MULT_EXPR, gfc_array_index_type,
338 offset, GFC_DECL_SPAN(decl));
339 tmp = gfc_build_addr_expr (pvoid_type_node, base);
340 tmp = fold_build2 (POINTER_PLUS_EXPR, pvoid_type_node,
341 tmp, fold_convert (sizetype, offset));
342 tmp = fold_convert (build_pointer_type (type), tmp);
343 if (!TYPE_STRING_FLAG (type))
344 tmp = build_fold_indirect_ref_loc (input_location, tmp);
348 /* Otherwise use a straightforward array reference. */
349 return build4 (ARRAY_REF, type, base, offset, NULL_TREE, NULL_TREE);
353 /* Generate a call to print a runtime error possibly including multiple
354 arguments and a locus. */
357 gfc_trans_runtime_error (bool error, locus* where, const char* msgid, ...)
361 va_start (ap, msgid);
362 return gfc_trans_runtime_error_vararg (error, where, msgid, ap);
366 gfc_trans_runtime_error_vararg (bool error, locus* where, const char* msgid,
378 /* Compute the number of extra arguments from the format string. */
379 for (p = msgid, nargs = 0; *p; p++)
387 /* The code to generate the error. */
388 gfc_start_block (&block);
392 line = LOCATION_LINE (where->lb->location);
393 asprintf (&message, "At line %d of file %s", line,
394 where->lb->file->filename);
397 asprintf (&message, "In file '%s', around line %d",
398 gfc_source_file, input_line + 1);
400 arg = gfc_build_addr_expr (pchar_type_node,
401 gfc_build_localized_cstring_const (message));
404 asprintf (&message, "%s", _(msgid));
405 arg2 = gfc_build_addr_expr (pchar_type_node,
406 gfc_build_localized_cstring_const (message));
409 /* Build the argument array. */
410 argarray = (tree *) alloca (sizeof (tree) * (nargs + 2));
413 for (i = 0; i < nargs; i++)
414 argarray[2 + i] = va_arg (ap, tree);
417 /* Build the function call to runtime_(warning,error)_at; because of the
418 variable number of arguments, we can't use build_call_expr_loc dinput_location,
421 fntype = TREE_TYPE (gfor_fndecl_runtime_error_at);
423 fntype = TREE_TYPE (gfor_fndecl_runtime_warning_at);
425 tmp = fold_builtin_call_array (input_location, TREE_TYPE (fntype),
426 fold_build1 (ADDR_EXPR,
427 build_pointer_type (fntype),
429 ? gfor_fndecl_runtime_error_at
430 : gfor_fndecl_runtime_warning_at),
431 nargs + 2, argarray);
432 gfc_add_expr_to_block (&block, tmp);
434 return gfc_finish_block (&block);
438 /* Generate a runtime error if COND is true. */
441 gfc_trans_runtime_check (bool error, bool once, tree cond, stmtblock_t * pblock,
442 locus * where, const char * msgid, ...)
450 if (integer_zerop (cond))
455 tmpvar = gfc_create_var (boolean_type_node, "print_warning");
456 TREE_STATIC (tmpvar) = 1;
457 DECL_INITIAL (tmpvar) = boolean_true_node;
458 gfc_add_expr_to_block (pblock, tmpvar);
461 gfc_start_block (&block);
463 /* The code to generate the error. */
464 va_start (ap, msgid);
465 gfc_add_expr_to_block (&block,
466 gfc_trans_runtime_error_vararg (error, where,
470 gfc_add_modify (&block, tmpvar, boolean_false_node);
472 body = gfc_finish_block (&block);
474 if (integer_onep (cond))
476 gfc_add_expr_to_block (pblock, body);
480 /* Tell the compiler that this isn't likely. */
482 cond = fold_build2 (TRUTH_AND_EXPR, long_integer_type_node, tmpvar,
485 cond = fold_convert (long_integer_type_node, cond);
487 tmp = build_int_cst (long_integer_type_node, 0);
488 cond = build_call_expr_loc (input_location,
489 built_in_decls[BUILT_IN_EXPECT], 2, cond, tmp);
490 cond = fold_convert (boolean_type_node, cond);
492 tmp = build3_v (COND_EXPR, cond, body, build_empty_stmt (input_location));
493 gfc_add_expr_to_block (pblock, tmp);
498 /* Call malloc to allocate size bytes of memory, with special conditions:
499 + if size <= 0, return a malloced area of size 1,
500 + if malloc returns NULL, issue a runtime error. */
502 gfc_call_malloc (stmtblock_t * block, tree type, tree size)
504 tree tmp, msg, malloc_result, null_result, res;
507 size = gfc_evaluate_now (size, block);
509 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
510 size = fold_convert (size_type_node, size);
512 /* Create a variable to hold the result. */
513 res = gfc_create_var (prvoid_type_node, NULL);
516 gfc_start_block (&block2);
518 size = fold_build2 (MAX_EXPR, size_type_node, size,
519 build_int_cst (size_type_node, 1));
521 gfc_add_modify (&block2, res,
522 fold_convert (prvoid_type_node,
523 build_call_expr_loc (input_location,
524 built_in_decls[BUILT_IN_MALLOC], 1, size)));
526 /* Optionally check whether malloc was successful. */
527 if (gfc_option.rtcheck & GFC_RTCHECK_MEM)
529 null_result = fold_build2 (EQ_EXPR, boolean_type_node, res,
530 build_int_cst (pvoid_type_node, 0));
531 msg = gfc_build_addr_expr (pchar_type_node,
532 gfc_build_localized_cstring_const ("Memory allocation failed"));
533 tmp = fold_build3 (COND_EXPR, void_type_node, null_result,
534 build_call_expr_loc (input_location,
535 gfor_fndecl_os_error, 1, msg),
536 build_empty_stmt (input_location));
537 gfc_add_expr_to_block (&block2, tmp);
540 malloc_result = gfc_finish_block (&block2);
542 gfc_add_expr_to_block (block, malloc_result);
545 res = fold_convert (type, res);
550 /* Allocate memory, using an optional status argument.
552 This function follows the following pseudo-code:
555 allocate (size_t size, integer_type* stat)
562 // The only time this can happen is the size wraps around.
567 *stat = LIBERROR_ALLOCATION;
571 runtime_error ("Attempt to allocate negative amount of memory. "
572 "Possible integer overflow");
576 newmem = malloc (MAX (size, 1));
580 *stat = LIBERROR_ALLOCATION;
582 runtime_error ("Out of memory");
589 gfc_allocate_with_status (stmtblock_t * block, tree size, tree status)
591 stmtblock_t alloc_block;
592 tree res, tmp, error, msg, cond;
593 tree status_type = status ? TREE_TYPE (TREE_TYPE (status)) : NULL_TREE;
595 /* Evaluate size only once, and make sure it has the right type. */
596 size = gfc_evaluate_now (size, block);
597 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
598 size = fold_convert (size_type_node, size);
600 /* Create a variable to hold the result. */
601 res = gfc_create_var (prvoid_type_node, NULL);
603 /* Set the optional status variable to zero. */
604 if (status != NULL_TREE && !integer_zerop (status))
606 tmp = fold_build2 (MODIFY_EXPR, status_type,
607 fold_build1 (INDIRECT_REF, status_type, status),
608 build_int_cst (status_type, 0));
609 tmp = fold_build3 (COND_EXPR, void_type_node,
610 fold_build2 (NE_EXPR, boolean_type_node, status,
611 build_int_cst (TREE_TYPE (status), 0)),
612 tmp, build_empty_stmt (input_location));
613 gfc_add_expr_to_block (block, tmp);
616 /* Generate the block of code handling (size < 0). */
617 msg = gfc_build_addr_expr (pchar_type_node, gfc_build_localized_cstring_const
618 ("Attempt to allocate negative amount of memory. "
619 "Possible integer overflow"));
620 error = build_call_expr_loc (input_location,
621 gfor_fndecl_runtime_error, 1, msg);
623 if (status != NULL_TREE && !integer_zerop (status))
625 /* Set the status variable if it's present. */
626 stmtblock_t set_status_block;
628 gfc_start_block (&set_status_block);
629 gfc_add_modify (&set_status_block,
630 fold_build1 (INDIRECT_REF, status_type, status),
631 build_int_cst (status_type, LIBERROR_ALLOCATION));
632 gfc_add_modify (&set_status_block, res,
633 build_int_cst (prvoid_type_node, 0));
635 tmp = fold_build2 (EQ_EXPR, boolean_type_node, status,
636 build_int_cst (TREE_TYPE (status), 0));
637 error = fold_build3 (COND_EXPR, void_type_node, tmp, error,
638 gfc_finish_block (&set_status_block));
641 /* The allocation itself. */
642 gfc_start_block (&alloc_block);
643 gfc_add_modify (&alloc_block, res,
644 fold_convert (prvoid_type_node,
645 build_call_expr_loc (input_location,
646 built_in_decls[BUILT_IN_MALLOC], 1,
647 fold_build2 (MAX_EXPR, size_type_node,
649 build_int_cst (size_type_node, 1)))));
651 msg = gfc_build_addr_expr (pchar_type_node, gfc_build_localized_cstring_const
653 tmp = build_call_expr_loc (input_location,
654 gfor_fndecl_os_error, 1, msg);
656 if (status != NULL_TREE && !integer_zerop (status))
658 /* Set the status variable if it's present. */
661 cond = fold_build2 (EQ_EXPR, boolean_type_node, status,
662 build_int_cst (TREE_TYPE (status), 0));
663 tmp2 = fold_build2 (MODIFY_EXPR, status_type,
664 fold_build1 (INDIRECT_REF, status_type, status),
665 build_int_cst (status_type, LIBERROR_ALLOCATION));
666 tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp,
670 tmp = fold_build3 (COND_EXPR, void_type_node,
671 fold_build2 (EQ_EXPR, boolean_type_node, res,
672 build_int_cst (prvoid_type_node, 0)),
673 tmp, build_empty_stmt (input_location));
674 gfc_add_expr_to_block (&alloc_block, tmp);
676 cond = fold_build2 (LT_EXPR, boolean_type_node, size,
677 build_int_cst (TREE_TYPE (size), 0));
678 tmp = fold_build3 (COND_EXPR, void_type_node, cond, error,
679 gfc_finish_block (&alloc_block));
680 gfc_add_expr_to_block (block, tmp);
686 /* Generate code for an ALLOCATE statement when the argument is an
687 allocatable array. If the array is currently allocated, it is an
688 error to allocate it again.
690 This function follows the following pseudo-code:
693 allocate_array (void *mem, size_t size, integer_type *stat)
696 return allocate (size, stat);
702 mem = allocate (size, stat);
703 *stat = LIBERROR_ALLOCATION;
707 runtime_error ("Attempting to allocate already allocated variable");
711 expr must be set to the original expression being allocated for its locus
712 and variable name in case a runtime error has to be printed. */
714 gfc_allocate_array_with_status (stmtblock_t * block, tree mem, tree size,
715 tree status, gfc_expr* expr)
717 stmtblock_t alloc_block;
718 tree res, tmp, null_mem, alloc, error;
719 tree type = TREE_TYPE (mem);
721 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
722 size = fold_convert (size_type_node, size);
724 /* Create a variable to hold the result. */
725 res = gfc_create_var (type, NULL);
726 null_mem = fold_build2 (EQ_EXPR, boolean_type_node, mem,
727 build_int_cst (type, 0));
729 /* If mem is NULL, we call gfc_allocate_with_status. */
730 gfc_start_block (&alloc_block);
731 tmp = gfc_allocate_with_status (&alloc_block, size, status);
732 gfc_add_modify (&alloc_block, res, fold_convert (type, tmp));
733 alloc = gfc_finish_block (&alloc_block);
735 /* Otherwise, we issue a runtime error or set the status variable. */
740 gcc_assert (expr->expr_type == EXPR_VARIABLE && expr->symtree);
741 varname = gfc_build_cstring_const (expr->symtree->name);
742 varname = gfc_build_addr_expr (pchar_type_node, varname);
744 error = gfc_trans_runtime_error (true, &expr->where,
745 "Attempting to allocate already"
746 " allocated variable '%s'",
750 error = gfc_trans_runtime_error (true, NULL,
751 "Attempting to allocate already allocated"
754 if (status != NULL_TREE && !integer_zerop (status))
756 tree status_type = TREE_TYPE (TREE_TYPE (status));
757 stmtblock_t set_status_block;
759 gfc_start_block (&set_status_block);
760 tmp = build_call_expr_loc (input_location,
761 built_in_decls[BUILT_IN_FREE], 1,
762 fold_convert (pvoid_type_node, mem));
763 gfc_add_expr_to_block (&set_status_block, tmp);
765 tmp = gfc_allocate_with_status (&set_status_block, size, status);
766 gfc_add_modify (&set_status_block, res, fold_convert (type, tmp));
768 gfc_add_modify (&set_status_block,
769 fold_build1 (INDIRECT_REF, status_type, status),
770 build_int_cst (status_type, LIBERROR_ALLOCATION));
772 tmp = fold_build2 (EQ_EXPR, boolean_type_node, status,
773 build_int_cst (status_type, 0));
774 error = fold_build3 (COND_EXPR, void_type_node, tmp, error,
775 gfc_finish_block (&set_status_block));
778 tmp = fold_build3 (COND_EXPR, void_type_node, null_mem, alloc, error);
779 gfc_add_expr_to_block (block, tmp);
785 /* Free a given variable, if it's not NULL. */
787 gfc_call_free (tree var)
790 tree tmp, cond, call;
792 if (TREE_TYPE (var) != TREE_TYPE (pvoid_type_node))
793 var = fold_convert (pvoid_type_node, var);
795 gfc_start_block (&block);
796 var = gfc_evaluate_now (var, &block);
797 cond = fold_build2 (NE_EXPR, boolean_type_node, var,
798 build_int_cst (pvoid_type_node, 0));
799 call = build_call_expr_loc (input_location,
800 built_in_decls[BUILT_IN_FREE], 1, var);
801 tmp = fold_build3 (COND_EXPR, void_type_node, cond, call,
802 build_empty_stmt (input_location));
803 gfc_add_expr_to_block (&block, tmp);
805 return gfc_finish_block (&block);
810 /* User-deallocate; we emit the code directly from the front-end, and the
811 logic is the same as the previous library function:
814 deallocate (void *pointer, GFC_INTEGER_4 * stat)
821 runtime_error ("Attempt to DEALLOCATE unallocated memory.");
831 In this front-end version, status doesn't have to be GFC_INTEGER_4.
832 Moreover, if CAN_FAIL is true, then we will not emit a runtime error,
833 even when no status variable is passed to us (this is used for
834 unconditional deallocation generated by the front-end at end of
837 If a runtime-message is possible, `expr' must point to the original
838 expression being deallocated for its locus and variable name. */
840 gfc_deallocate_with_status (tree pointer, tree status, bool can_fail,
843 stmtblock_t null, non_null;
844 tree cond, tmp, error;
846 cond = fold_build2 (EQ_EXPR, boolean_type_node, pointer,
847 build_int_cst (TREE_TYPE (pointer), 0));
849 /* When POINTER is NULL, we set STATUS to 1 if it's present, otherwise
850 we emit a runtime error. */
851 gfc_start_block (&null);
856 gcc_assert (expr && expr->expr_type == EXPR_VARIABLE && expr->symtree);
858 varname = gfc_build_cstring_const (expr->symtree->name);
859 varname = gfc_build_addr_expr (pchar_type_node, varname);
861 error = gfc_trans_runtime_error (true, &expr->where,
862 "Attempt to DEALLOCATE unallocated '%s'",
866 error = build_empty_stmt (input_location);
868 if (status != NULL_TREE && !integer_zerop (status))
870 tree status_type = TREE_TYPE (TREE_TYPE (status));
873 cond2 = fold_build2 (NE_EXPR, boolean_type_node, status,
874 build_int_cst (TREE_TYPE (status), 0));
875 tmp = fold_build2 (MODIFY_EXPR, status_type,
876 fold_build1 (INDIRECT_REF, status_type, status),
877 build_int_cst (status_type, 1));
878 error = fold_build3 (COND_EXPR, void_type_node, cond2, tmp, error);
881 gfc_add_expr_to_block (&null, error);
883 /* When POINTER is not NULL, we free it. */
884 gfc_start_block (&non_null);
885 tmp = build_call_expr_loc (input_location,
886 built_in_decls[BUILT_IN_FREE], 1,
887 fold_convert (pvoid_type_node, pointer));
888 gfc_add_expr_to_block (&non_null, tmp);
890 if (status != NULL_TREE && !integer_zerop (status))
892 /* We set STATUS to zero if it is present. */
893 tree status_type = TREE_TYPE (TREE_TYPE (status));
896 cond2 = fold_build2 (NE_EXPR, boolean_type_node, status,
897 build_int_cst (TREE_TYPE (status), 0));
898 tmp = fold_build2 (MODIFY_EXPR, status_type,
899 fold_build1 (INDIRECT_REF, status_type, status),
900 build_int_cst (status_type, 0));
901 tmp = fold_build3 (COND_EXPR, void_type_node, cond2, tmp,
902 build_empty_stmt (input_location));
903 gfc_add_expr_to_block (&non_null, tmp);
906 return fold_build3 (COND_EXPR, void_type_node, cond,
907 gfc_finish_block (&null), gfc_finish_block (&non_null));
911 /* Reallocate MEM so it has SIZE bytes of data. This behaves like the
912 following pseudo-code:
915 internal_realloc (void *mem, size_t size)
918 runtime_error ("Attempt to allocate a negative amount of memory.");
919 res = realloc (mem, size);
920 if (!res && size != 0)
921 _gfortran_os_error ("Out of memory");
929 gfc_call_realloc (stmtblock_t * block, tree mem, tree size)
931 tree msg, res, negative, nonzero, zero, null_result, tmp;
932 tree type = TREE_TYPE (mem);
934 size = gfc_evaluate_now (size, block);
936 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
937 size = fold_convert (size_type_node, size);
939 /* Create a variable to hold the result. */
940 res = gfc_create_var (type, NULL);
943 negative = fold_build2 (LT_EXPR, boolean_type_node, size,
944 build_int_cst (size_type_node, 0));
945 msg = gfc_build_addr_expr (pchar_type_node, gfc_build_localized_cstring_const
946 ("Attempt to allocate a negative amount of memory."));
947 tmp = fold_build3 (COND_EXPR, void_type_node, negative,
948 build_call_expr_loc (input_location,
949 gfor_fndecl_runtime_error, 1, msg),
950 build_empty_stmt (input_location));
951 gfc_add_expr_to_block (block, tmp);
953 /* Call realloc and check the result. */
954 tmp = build_call_expr_loc (input_location,
955 built_in_decls[BUILT_IN_REALLOC], 2,
956 fold_convert (pvoid_type_node, mem), size);
957 gfc_add_modify (block, res, fold_convert (type, tmp));
958 null_result = fold_build2 (EQ_EXPR, boolean_type_node, res,
959 build_int_cst (pvoid_type_node, 0));
960 nonzero = fold_build2 (NE_EXPR, boolean_type_node, size,
961 build_int_cst (size_type_node, 0));
962 null_result = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, null_result,
964 msg = gfc_build_addr_expr (pchar_type_node, gfc_build_localized_cstring_const
966 tmp = fold_build3 (COND_EXPR, void_type_node, null_result,
967 build_call_expr_loc (input_location,
968 gfor_fndecl_os_error, 1, msg),
969 build_empty_stmt (input_location));
970 gfc_add_expr_to_block (block, tmp);
972 /* if (size == 0) then the result is NULL. */
973 tmp = fold_build2 (MODIFY_EXPR, type, res, build_int_cst (type, 0));
974 zero = fold_build1 (TRUTH_NOT_EXPR, boolean_type_node, nonzero);
975 tmp = fold_build3 (COND_EXPR, void_type_node, zero, tmp,
976 build_empty_stmt (input_location));
977 gfc_add_expr_to_block (block, tmp);
982 /* Add a statement to a block. */
985 gfc_add_expr_to_block (stmtblock_t * block, tree expr)
989 if (expr == NULL_TREE || IS_EMPTY_STMT (expr))
994 if (TREE_CODE (block->head) != STATEMENT_LIST)
999 block->head = NULL_TREE;
1000 append_to_statement_list (tmp, &block->head);
1002 append_to_statement_list (expr, &block->head);
1005 /* Don't bother creating a list if we only have a single statement. */
1010 /* Add a block the end of a block. */
1013 gfc_add_block_to_block (stmtblock_t * block, stmtblock_t * append)
1015 gcc_assert (append);
1016 gcc_assert (!append->has_scope);
1018 gfc_add_expr_to_block (block, append->head);
1019 append->head = NULL_TREE;
1023 /* Get the current locus. The structure may not be complete, and should
1024 only be used with gfc_set_backend_locus. */
1027 gfc_get_backend_locus (locus * loc)
1029 loc->lb = XCNEW (gfc_linebuf);
1030 loc->lb->location = input_location;
1031 loc->lb->file = gfc_current_backend_file;
1035 /* Set the current locus. */
1038 gfc_set_backend_locus (locus * loc)
1040 gfc_current_backend_file = loc->lb->file;
1041 input_location = loc->lb->location;
1045 /* Translate an executable statement. The tree cond is used by gfc_trans_do.
1046 This static function is wrapped by gfc_trans_code_cond and
1050 trans_code (gfc_code * code, tree cond)
1056 return build_empty_stmt (input_location);
1058 gfc_start_block (&block);
1060 /* Translate statements one by one into GENERIC trees until we reach
1061 the end of this gfc_code branch. */
1062 for (; code; code = code->next)
1064 if (code->here != 0)
1066 res = gfc_trans_label_here (code);
1067 gfc_add_expr_to_block (&block, res);
1070 gfc_set_backend_locus (&code->loc);
1075 case EXEC_END_BLOCK:
1076 case EXEC_END_PROCEDURE:
1081 if (code->expr1->ts.type == BT_CLASS)
1082 res = gfc_trans_class_assign (code);
1084 res = gfc_trans_assign (code);
1087 case EXEC_LABEL_ASSIGN:
1088 res = gfc_trans_label_assign (code);
1091 case EXEC_POINTER_ASSIGN:
1092 if (code->expr1->ts.type == BT_CLASS)
1093 res = gfc_trans_class_assign (code);
1095 res = gfc_trans_pointer_assign (code);
1098 case EXEC_INIT_ASSIGN:
1099 if (code->expr1->ts.type == BT_CLASS)
1100 res = gfc_trans_class_assign (code);
1102 res = gfc_trans_init_assign (code);
1110 res = gfc_trans_critical (code);
1114 res = gfc_trans_cycle (code);
1118 res = gfc_trans_exit (code);
1122 res = gfc_trans_goto (code);
1126 res = gfc_trans_entry (code);
1130 res = gfc_trans_pause (code);
1134 case EXEC_ERROR_STOP:
1135 res = gfc_trans_stop (code, code->op == EXEC_ERROR_STOP);
1139 /* For MVBITS we've got the special exception that we need a
1140 dependency check, too. */
1142 bool is_mvbits = false;
1143 if (code->resolved_isym
1144 && code->resolved_isym->id == GFC_ISYM_MVBITS)
1146 res = gfc_trans_call (code, is_mvbits, NULL_TREE,
1152 res = gfc_trans_call (code, false, NULL_TREE,
1156 case EXEC_ASSIGN_CALL:
1157 res = gfc_trans_call (code, true, NULL_TREE,
1162 res = gfc_trans_return (code);
1166 res = gfc_trans_if (code);
1169 case EXEC_ARITHMETIC_IF:
1170 res = gfc_trans_arithmetic_if (code);
1174 res = gfc_trans_block_construct (code);
1178 res = gfc_trans_do (code, cond);
1182 res = gfc_trans_do_while (code);
1186 res = gfc_trans_select (code);
1189 case EXEC_SELECT_TYPE:
1190 /* Do nothing. SELECT TYPE statements should be transformed into
1191 an ordinary SELECT CASE at resolution stage.
1192 TODO: Add an error message here once this is done. */
1197 res = gfc_trans_flush (code);
1201 case EXEC_SYNC_IMAGES:
1202 case EXEC_SYNC_MEMORY:
1203 res = gfc_trans_sync (code, code->op);
1207 res = gfc_trans_forall (code);
1211 res = gfc_trans_where (code);
1215 res = gfc_trans_allocate (code);
1218 case EXEC_DEALLOCATE:
1219 res = gfc_trans_deallocate (code);
1223 res = gfc_trans_open (code);
1227 res = gfc_trans_close (code);
1231 res = gfc_trans_read (code);
1235 res = gfc_trans_write (code);
1239 res = gfc_trans_iolength (code);
1242 case EXEC_BACKSPACE:
1243 res = gfc_trans_backspace (code);
1247 res = gfc_trans_endfile (code);
1251 res = gfc_trans_inquire (code);
1255 res = gfc_trans_wait (code);
1259 res = gfc_trans_rewind (code);
1263 res = gfc_trans_transfer (code);
1267 res = gfc_trans_dt_end (code);
1270 case EXEC_OMP_ATOMIC:
1271 case EXEC_OMP_BARRIER:
1272 case EXEC_OMP_CRITICAL:
1274 case EXEC_OMP_FLUSH:
1275 case EXEC_OMP_MASTER:
1276 case EXEC_OMP_ORDERED:
1277 case EXEC_OMP_PARALLEL:
1278 case EXEC_OMP_PARALLEL_DO:
1279 case EXEC_OMP_PARALLEL_SECTIONS:
1280 case EXEC_OMP_PARALLEL_WORKSHARE:
1281 case EXEC_OMP_SECTIONS:
1282 case EXEC_OMP_SINGLE:
1284 case EXEC_OMP_TASKWAIT:
1285 case EXEC_OMP_WORKSHARE:
1286 res = gfc_trans_omp_directive (code);
1290 internal_error ("gfc_trans_code(): Bad statement code");
1293 gfc_set_backend_locus (&code->loc);
1295 if (res != NULL_TREE && ! IS_EMPTY_STMT (res))
1297 if (TREE_CODE (res) != STATEMENT_LIST)
1298 SET_EXPR_LOCATION (res, input_location);
1300 /* Add the new statement to the block. */
1301 gfc_add_expr_to_block (&block, res);
1305 /* Return the finished block. */
1306 return gfc_finish_block (&block);
1310 /* Translate an executable statement with condition, cond. The condition is
1311 used by gfc_trans_do to test for IO result conditions inside implied
1312 DO loops of READ and WRITE statements. See build_dt in trans-io.c. */
1315 gfc_trans_code_cond (gfc_code * code, tree cond)
1317 return trans_code (code, cond);
1320 /* Translate an executable statement without condition. */
1323 gfc_trans_code (gfc_code * code)
1325 return trans_code (code, NULL_TREE);
1329 /* This function is called after a complete program unit has been parsed
1333 gfc_generate_code (gfc_namespace * ns)
1336 if (ns->is_block_data)
1338 gfc_generate_block_data (ns);
1342 gfc_generate_function_code (ns);
1346 /* This function is called after a complete module has been parsed
1350 gfc_generate_module_code (gfc_namespace * ns)
1353 struct module_htab_entry *entry;
1355 gcc_assert (ns->proc_name->backend_decl == NULL);
1356 ns->proc_name->backend_decl
1357 = build_decl (ns->proc_name->declared_at.lb->location,
1358 NAMESPACE_DECL, get_identifier (ns->proc_name->name),
1360 entry = gfc_find_module (ns->proc_name->name);
1361 if (entry->namespace_decl)
1362 /* Buggy sourcecode, using a module before defining it? */
1363 htab_empty (entry->decls);
1364 entry->namespace_decl = ns->proc_name->backend_decl;
1366 gfc_generate_module_vars (ns);
1368 /* We need to generate all module function prototypes first, to allow
1370 for (n = ns->contained; n; n = n->sibling)
1377 gfc_create_function_decl (n);
1378 gcc_assert (DECL_CONTEXT (n->proc_name->backend_decl) == NULL_TREE);
1379 DECL_CONTEXT (n->proc_name->backend_decl) = ns->proc_name->backend_decl;
1380 gfc_module_add_decl (entry, n->proc_name->backend_decl);
1381 for (el = ns->entries; el; el = el->next)
1383 gcc_assert (DECL_CONTEXT (el->sym->backend_decl) == NULL_TREE);
1384 DECL_CONTEXT (el->sym->backend_decl) = ns->proc_name->backend_decl;
1385 gfc_module_add_decl (entry, el->sym->backend_decl);
1389 for (n = ns->contained; n; n = n->sibling)
1394 gfc_generate_function_code (n);