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"
26 #include "gimple.h" /* For create_tmp_var_raw. */
27 #include "tree-iterator.h"
28 #include "diagnostic-core.h" /* For internal_error. */
33 #include "trans-stmt.h"
34 #include "trans-array.h"
35 #include "trans-types.h"
36 #include "trans-const.h"
38 /* Naming convention for backend interface code:
40 gfc_trans_* translate gfc_code into STMT trees.
42 gfc_conv_* expression conversion
44 gfc_get_* get a backend tree representation of a decl or type */
46 static gfc_file *gfc_current_backend_file;
48 const char gfc_msg_fault[] = N_("Array reference out of bounds");
49 const char gfc_msg_wrong_return[] = N_("Incorrect function return value");
52 /* Advance along TREE_CHAIN n times. */
55 gfc_advance_chain (tree t, int n)
59 gcc_assert (t != NULL_TREE);
66 /* Strip off a legitimate source ending from the input
67 string NAME of length LEN. */
70 remove_suffix (char *name, int len)
74 for (i = 2; i < 8 && len > i; i++)
76 if (name[len - i] == '.')
85 /* Creates a variable declaration with a given TYPE. */
88 gfc_create_var_np (tree type, const char *prefix)
92 t = create_tmp_var_raw (type, prefix);
94 /* No warnings for anonymous variables. */
96 TREE_NO_WARNING (t) = 1;
102 /* Like above, but also adds it to the current scope. */
105 gfc_create_var (tree type, const char *prefix)
109 tmp = gfc_create_var_np (type, prefix);
117 /* If the expression is not constant, evaluate it now. We assign the
118 result of the expression to an artificially created variable VAR, and
119 return a pointer to the VAR_DECL node for this variable. */
122 gfc_evaluate_now_loc (location_t loc, tree expr, stmtblock_t * pblock)
126 if (CONSTANT_CLASS_P (expr))
129 var = gfc_create_var (TREE_TYPE (expr), NULL);
130 gfc_add_modify_loc (loc, pblock, var, expr);
137 gfc_evaluate_now (tree expr, stmtblock_t * pblock)
139 return gfc_evaluate_now_loc (input_location, expr, pblock);
143 /* Build a MODIFY_EXPR node and add it to a given statement block PBLOCK.
144 A MODIFY_EXPR is an assignment:
148 gfc_add_modify_loc (location_t loc, stmtblock_t * pblock, tree lhs, tree rhs)
152 #ifdef ENABLE_CHECKING
154 t1 = TREE_TYPE (rhs);
155 t2 = TREE_TYPE (lhs);
156 /* Make sure that the types of the rhs and the lhs are the same
157 for scalar assignments. We should probably have something
158 similar for aggregates, but right now removing that check just
159 breaks everything. */
161 || AGGREGATE_TYPE_P (TREE_TYPE (lhs)));
164 tmp = fold_build2_loc (loc, MODIFY_EXPR, void_type_node, lhs,
166 gfc_add_expr_to_block (pblock, tmp);
171 gfc_add_modify (stmtblock_t * pblock, tree lhs, tree rhs)
173 gfc_add_modify_loc (input_location, pblock, lhs, rhs);
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 = DECL_CHAIN (decl);
224 DECL_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_loc (input_location, 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_loc (input_location, 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_loc (input_location, MULT_EXPR,
338 gfc_array_index_type,
339 offset, GFC_DECL_SPAN(decl));
340 tmp = gfc_build_addr_expr (pvoid_type_node, base);
341 tmp = fold_build2_loc (input_location, POINTER_PLUS_EXPR,
342 pvoid_type_node, tmp,
343 fold_convert (sizetype, offset));
344 tmp = fold_convert (build_pointer_type (type), tmp);
345 if (!TYPE_STRING_FLAG (type))
346 tmp = build_fold_indirect_ref_loc (input_location, tmp);
350 /* Otherwise use a straightforward array reference. */
351 return build4_loc (input_location, ARRAY_REF, type, base, offset,
352 NULL_TREE, NULL_TREE);
356 /* Generate a call to print a runtime error possibly including multiple
357 arguments and a locus. */
360 trans_runtime_error_vararg (bool error, locus* where, const char* msgid,
373 /* Compute the number of extra arguments from the format string. */
374 for (p = msgid, nargs = 0; *p; p++)
382 /* The code to generate the error. */
383 gfc_start_block (&block);
387 line = LOCATION_LINE (where->lb->location);
388 asprintf (&message, "At line %d of file %s", line,
389 where->lb->file->filename);
392 asprintf (&message, "In file '%s', around line %d",
393 gfc_source_file, input_line + 1);
395 arg = gfc_build_addr_expr (pchar_type_node,
396 gfc_build_localized_cstring_const (message));
399 asprintf (&message, "%s", _(msgid));
400 arg2 = gfc_build_addr_expr (pchar_type_node,
401 gfc_build_localized_cstring_const (message));
404 /* Build the argument array. */
405 argarray = XALLOCAVEC (tree, nargs + 2);
408 for (i = 0; i < nargs; i++)
409 argarray[2 + i] = va_arg (ap, tree);
411 /* Build the function call to runtime_(warning,error)_at; because of the
412 variable number of arguments, we can't use build_call_expr_loc dinput_location,
415 fntype = TREE_TYPE (gfor_fndecl_runtime_error_at);
417 fntype = TREE_TYPE (gfor_fndecl_runtime_warning_at);
419 loc = where ? where->lb->location : input_location;
420 tmp = fold_builtin_call_array (loc, TREE_TYPE (fntype),
421 fold_build1_loc (loc, ADDR_EXPR,
422 build_pointer_type (fntype),
424 ? gfor_fndecl_runtime_error_at
425 : gfor_fndecl_runtime_warning_at),
426 nargs + 2, argarray);
427 gfc_add_expr_to_block (&block, tmp);
429 return gfc_finish_block (&block);
434 gfc_trans_runtime_error (bool error, locus* where, const char* msgid, ...)
439 va_start (ap, msgid);
440 result = trans_runtime_error_vararg (error, where, msgid, ap);
446 /* Generate a runtime error if COND is true. */
449 gfc_trans_runtime_check (bool error, bool once, tree cond, stmtblock_t * pblock,
450 locus * where, const char * msgid, ...)
458 if (integer_zerop (cond))
463 tmpvar = gfc_create_var (boolean_type_node, "print_warning");
464 TREE_STATIC (tmpvar) = 1;
465 DECL_INITIAL (tmpvar) = boolean_true_node;
466 gfc_add_expr_to_block (pblock, tmpvar);
469 gfc_start_block (&block);
471 /* The code to generate the error. */
472 va_start (ap, msgid);
473 gfc_add_expr_to_block (&block,
474 trans_runtime_error_vararg (error, where,
478 gfc_add_modify (&block, tmpvar, boolean_false_node);
480 body = gfc_finish_block (&block);
482 if (integer_onep (cond))
484 gfc_add_expr_to_block (pblock, body);
488 /* Tell the compiler that this isn't likely. */
490 cond = fold_build2_loc (where->lb->location, TRUTH_AND_EXPR,
491 long_integer_type_node, tmpvar, cond);
493 cond = fold_convert (long_integer_type_node, cond);
495 cond = gfc_unlikely (cond);
496 tmp = fold_build3_loc (where->lb->location, COND_EXPR, void_type_node,
498 build_empty_stmt (where->lb->location));
499 gfc_add_expr_to_block (pblock, tmp);
504 /* Call malloc to allocate size bytes of memory, with special conditions:
505 + if size == 0, return a malloced area of size 1,
506 + if malloc returns NULL, issue a runtime error. */
508 gfc_call_malloc (stmtblock_t * block, tree type, tree size)
510 tree tmp, msg, malloc_result, null_result, res;
513 size = gfc_evaluate_now (size, block);
515 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
516 size = fold_convert (size_type_node, size);
518 /* Create a variable to hold the result. */
519 res = gfc_create_var (prvoid_type_node, NULL);
522 gfc_start_block (&block2);
524 size = fold_build2_loc (input_location, MAX_EXPR, size_type_node, size,
525 build_int_cst (size_type_node, 1));
527 gfc_add_modify (&block2, res,
528 fold_convert (prvoid_type_node,
529 build_call_expr_loc (input_location,
530 built_in_decls[BUILT_IN_MALLOC], 1, size)));
532 /* Optionally check whether malloc was successful. */
533 if (gfc_option.rtcheck & GFC_RTCHECK_MEM)
535 null_result = fold_build2_loc (input_location, EQ_EXPR,
536 boolean_type_node, res,
537 build_int_cst (pvoid_type_node, 0));
538 msg = gfc_build_addr_expr (pchar_type_node,
539 gfc_build_localized_cstring_const ("Memory allocation failed"));
540 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node,
542 build_call_expr_loc (input_location,
543 gfor_fndecl_os_error, 1, msg),
544 build_empty_stmt (input_location));
545 gfc_add_expr_to_block (&block2, tmp);
548 malloc_result = gfc_finish_block (&block2);
550 gfc_add_expr_to_block (block, malloc_result);
553 res = fold_convert (type, res);
558 /* Allocate memory, using an optional status argument.
560 This function follows the following pseudo-code:
563 allocate (size_t size, integer_type* stat)
570 newmem = malloc (MAX (size, 1));
574 *stat = LIBERROR_ALLOCATION;
576 runtime_error ("Allocation would exceed memory limit");
581 gfc_allocate_with_status (stmtblock_t * block, tree size, tree status)
583 stmtblock_t alloc_block;
584 tree res, tmp, msg, cond;
585 tree status_type = status ? TREE_TYPE (TREE_TYPE (status)) : NULL_TREE;
587 /* Evaluate size only once, and make sure it has the right type. */
588 size = gfc_evaluate_now (size, block);
589 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
590 size = fold_convert (size_type_node, size);
592 /* Create a variable to hold the result. */
593 res = gfc_create_var (prvoid_type_node, NULL);
595 /* Set the optional status variable to zero. */
596 if (status != NULL_TREE && !integer_zerop (status))
598 tmp = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
599 fold_build1_loc (input_location, INDIRECT_REF,
600 status_type, status),
601 build_int_cst (status_type, 0));
602 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node,
603 fold_build2_loc (input_location, NE_EXPR,
604 boolean_type_node, status,
605 build_int_cst (TREE_TYPE (status), 0)),
606 tmp, build_empty_stmt (input_location));
607 gfc_add_expr_to_block (block, tmp);
610 /* The allocation itself. */
611 gfc_start_block (&alloc_block);
612 gfc_add_modify (&alloc_block, res,
613 fold_convert (prvoid_type_node,
614 build_call_expr_loc (input_location,
615 built_in_decls[BUILT_IN_MALLOC], 1,
616 fold_build2_loc (input_location,
617 MAX_EXPR, size_type_node, size,
618 build_int_cst (size_type_node,
621 msg = gfc_build_addr_expr (pchar_type_node, gfc_build_localized_cstring_const
622 ("Allocation would exceed memory limit"));
623 tmp = build_call_expr_loc (input_location,
624 gfor_fndecl_os_error, 1, msg);
626 if (status != NULL_TREE && !integer_zerop (status))
628 /* Set the status variable if it's present. */
631 cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
632 status, build_int_cst (TREE_TYPE (status), 0));
633 tmp2 = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
634 fold_build1_loc (input_location, INDIRECT_REF,
635 status_type, status),
636 build_int_cst (status_type, LIBERROR_ALLOCATION));
637 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
641 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node,
642 fold_build2_loc (input_location, EQ_EXPR,
643 boolean_type_node, res,
644 build_int_cst (prvoid_type_node, 0)),
645 tmp, build_empty_stmt (input_location));
646 gfc_add_expr_to_block (&alloc_block, tmp);
647 gfc_add_expr_to_block (block, gfc_finish_block (&alloc_block));
653 /* Generate code for an ALLOCATE statement when the argument is an
654 allocatable array. If the array is currently allocated, it is an
655 error to allocate it again.
657 This function follows the following pseudo-code:
660 allocate_array (void *mem, size_t size, integer_type *stat)
663 return allocate (size, stat);
669 mem = allocate (size, stat);
670 *stat = LIBERROR_ALLOCATION;
674 runtime_error ("Attempting to allocate already allocated variable");
678 expr must be set to the original expression being allocated for its locus
679 and variable name in case a runtime error has to be printed. */
681 gfc_allocate_array_with_status (stmtblock_t * block, tree mem, tree size,
682 tree status, gfc_expr* expr)
684 stmtblock_t alloc_block;
685 tree res, tmp, null_mem, alloc, error;
686 tree type = TREE_TYPE (mem);
688 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
689 size = fold_convert (size_type_node, size);
691 /* Create a variable to hold the result. */
692 res = gfc_create_var (type, NULL);
693 null_mem = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, mem,
694 build_int_cst (type, 0));
696 /* If mem is NULL, we call gfc_allocate_with_status. */
697 gfc_start_block (&alloc_block);
698 tmp = gfc_allocate_with_status (&alloc_block, size, status);
699 gfc_add_modify (&alloc_block, res, fold_convert (type, tmp));
700 alloc = gfc_finish_block (&alloc_block);
702 /* Otherwise, we issue a runtime error or set the status variable. */
707 gcc_assert (expr->expr_type == EXPR_VARIABLE && expr->symtree);
708 varname = gfc_build_cstring_const (expr->symtree->name);
709 varname = gfc_build_addr_expr (pchar_type_node, varname);
711 error = gfc_trans_runtime_error (true, &expr->where,
712 "Attempting to allocate already"
713 " allocated variable '%s'",
717 error = gfc_trans_runtime_error (true, NULL,
718 "Attempting to allocate already allocated"
721 if (status != NULL_TREE && !integer_zerop (status))
723 tree status_type = TREE_TYPE (TREE_TYPE (status));
724 stmtblock_t set_status_block;
726 gfc_start_block (&set_status_block);
727 tmp = build_call_expr_loc (input_location,
728 built_in_decls[BUILT_IN_FREE], 1,
729 fold_convert (pvoid_type_node, mem));
730 gfc_add_expr_to_block (&set_status_block, tmp);
732 tmp = gfc_allocate_with_status (&set_status_block, size, status);
733 gfc_add_modify (&set_status_block, res, fold_convert (type, tmp));
735 gfc_add_modify (&set_status_block,
736 fold_build1_loc (input_location, INDIRECT_REF,
737 status_type, status),
738 build_int_cst (status_type, LIBERROR_ALLOCATION));
740 tmp = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
741 status, build_int_cst (status_type, 0));
742 error = fold_build3_loc (input_location, COND_EXPR, void_type_node, tmp,
743 error, gfc_finish_block (&set_status_block));
746 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, null_mem,
748 gfc_add_expr_to_block (block, tmp);
754 /* Free a given variable, if it's not NULL. */
756 gfc_call_free (tree var)
759 tree tmp, cond, call;
761 if (TREE_TYPE (var) != TREE_TYPE (pvoid_type_node))
762 var = fold_convert (pvoid_type_node, var);
764 gfc_start_block (&block);
765 var = gfc_evaluate_now (var, &block);
766 cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, var,
767 build_int_cst (pvoid_type_node, 0));
768 call = build_call_expr_loc (input_location,
769 built_in_decls[BUILT_IN_FREE], 1, var);
770 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond, call,
771 build_empty_stmt (input_location));
772 gfc_add_expr_to_block (&block, tmp);
774 return gfc_finish_block (&block);
779 /* User-deallocate; we emit the code directly from the front-end, and the
780 logic is the same as the previous library function:
783 deallocate (void *pointer, GFC_INTEGER_4 * stat)
790 runtime_error ("Attempt to DEALLOCATE unallocated memory.");
800 In this front-end version, status doesn't have to be GFC_INTEGER_4.
801 Moreover, if CAN_FAIL is true, then we will not emit a runtime error,
802 even when no status variable is passed to us (this is used for
803 unconditional deallocation generated by the front-end at end of
806 If a runtime-message is possible, `expr' must point to the original
807 expression being deallocated for its locus and variable name. */
809 gfc_deallocate_with_status (tree pointer, tree status, bool can_fail,
812 stmtblock_t null, non_null;
813 tree cond, tmp, error;
815 cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, pointer,
816 build_int_cst (TREE_TYPE (pointer), 0));
818 /* When POINTER is NULL, we set STATUS to 1 if it's present, otherwise
819 we emit a runtime error. */
820 gfc_start_block (&null);
825 gcc_assert (expr && expr->expr_type == EXPR_VARIABLE && expr->symtree);
827 varname = gfc_build_cstring_const (expr->symtree->name);
828 varname = gfc_build_addr_expr (pchar_type_node, varname);
830 error = gfc_trans_runtime_error (true, &expr->where,
831 "Attempt to DEALLOCATE unallocated '%s'",
835 error = build_empty_stmt (input_location);
837 if (status != NULL_TREE && !integer_zerop (status))
839 tree status_type = TREE_TYPE (TREE_TYPE (status));
842 cond2 = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
843 status, build_int_cst (TREE_TYPE (status), 0));
844 tmp = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
845 fold_build1_loc (input_location, INDIRECT_REF,
846 status_type, status),
847 build_int_cst (status_type, 1));
848 error = fold_build3_loc (input_location, COND_EXPR, void_type_node,
852 gfc_add_expr_to_block (&null, error);
854 /* When POINTER is not NULL, we free it. */
855 gfc_start_block (&non_null);
856 tmp = build_call_expr_loc (input_location,
857 built_in_decls[BUILT_IN_FREE], 1,
858 fold_convert (pvoid_type_node, pointer));
859 gfc_add_expr_to_block (&non_null, tmp);
861 if (status != NULL_TREE && !integer_zerop (status))
863 /* We set STATUS to zero if it is present. */
864 tree status_type = TREE_TYPE (TREE_TYPE (status));
867 cond2 = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
868 status, build_int_cst (TREE_TYPE (status), 0));
869 tmp = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
870 fold_build1_loc (input_location, INDIRECT_REF,
871 status_type, status),
872 build_int_cst (status_type, 0));
873 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond2,
874 tmp, build_empty_stmt (input_location));
875 gfc_add_expr_to_block (&non_null, tmp);
878 return fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
879 gfc_finish_block (&null),
880 gfc_finish_block (&non_null));
884 /* Generate code for deallocation of allocatable scalars (variables or
885 components). Before the object itself is freed, any allocatable
886 subcomponents are being deallocated. */
889 gfc_deallocate_scalar_with_status (tree pointer, tree status, bool can_fail,
890 gfc_expr* expr, gfc_typespec ts)
892 stmtblock_t null, non_null;
893 tree cond, tmp, error;
895 cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, pointer,
896 build_int_cst (TREE_TYPE (pointer), 0));
898 /* When POINTER is NULL, we set STATUS to 1 if it's present, otherwise
899 we emit a runtime error. */
900 gfc_start_block (&null);
905 gcc_assert (expr && expr->expr_type == EXPR_VARIABLE && expr->symtree);
907 varname = gfc_build_cstring_const (expr->symtree->name);
908 varname = gfc_build_addr_expr (pchar_type_node, varname);
910 error = gfc_trans_runtime_error (true, &expr->where,
911 "Attempt to DEALLOCATE unallocated '%s'",
915 error = build_empty_stmt (input_location);
917 if (status != NULL_TREE && !integer_zerop (status))
919 tree status_type = TREE_TYPE (TREE_TYPE (status));
922 cond2 = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
923 status, build_int_cst (TREE_TYPE (status), 0));
924 tmp = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
925 fold_build1_loc (input_location, INDIRECT_REF,
926 status_type, status),
927 build_int_cst (status_type, 1));
928 error = fold_build3_loc (input_location, COND_EXPR, void_type_node,
932 gfc_add_expr_to_block (&null, error);
934 /* When POINTER is not NULL, we free it. */
935 gfc_start_block (&non_null);
937 /* Free allocatable components. */
938 if (ts.type == BT_DERIVED && ts.u.derived->attr.alloc_comp)
940 tmp = build_fold_indirect_ref_loc (input_location, pointer);
941 tmp = gfc_deallocate_alloc_comp (ts.u.derived, tmp, 0);
942 gfc_add_expr_to_block (&non_null, tmp);
944 else if (ts.type == BT_CLASS
945 && ts.u.derived->components->ts.u.derived->attr.alloc_comp)
947 tmp = build_fold_indirect_ref_loc (input_location, pointer);
948 tmp = gfc_deallocate_alloc_comp (ts.u.derived->components->ts.u.derived,
950 gfc_add_expr_to_block (&non_null, tmp);
953 tmp = build_call_expr_loc (input_location,
954 built_in_decls[BUILT_IN_FREE], 1,
955 fold_convert (pvoid_type_node, pointer));
956 gfc_add_expr_to_block (&non_null, tmp);
958 if (status != NULL_TREE && !integer_zerop (status))
960 /* We set STATUS to zero if it is present. */
961 tree status_type = TREE_TYPE (TREE_TYPE (status));
964 cond2 = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
965 status, build_int_cst (TREE_TYPE (status), 0));
966 tmp = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
967 fold_build1_loc (input_location, INDIRECT_REF,
968 status_type, status),
969 build_int_cst (status_type, 0));
970 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond2,
971 tmp, build_empty_stmt (input_location));
972 gfc_add_expr_to_block (&non_null, tmp);
975 return fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
976 gfc_finish_block (&null),
977 gfc_finish_block (&non_null));
981 /* Reallocate MEM so it has SIZE bytes of data. This behaves like the
982 following pseudo-code:
985 internal_realloc (void *mem, size_t size)
987 res = realloc (mem, size);
988 if (!res && size != 0)
989 _gfortran_os_error ("Allocation would exceed memory limit");
997 gfc_call_realloc (stmtblock_t * block, tree mem, tree size)
999 tree msg, res, nonzero, zero, null_result, tmp;
1000 tree type = TREE_TYPE (mem);
1002 size = gfc_evaluate_now (size, block);
1004 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
1005 size = fold_convert (size_type_node, size);
1007 /* Create a variable to hold the result. */
1008 res = gfc_create_var (type, NULL);
1010 /* Call realloc and check the result. */
1011 tmp = build_call_expr_loc (input_location,
1012 built_in_decls[BUILT_IN_REALLOC], 2,
1013 fold_convert (pvoid_type_node, mem), size);
1014 gfc_add_modify (block, res, fold_convert (type, tmp));
1015 null_result = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
1016 res, build_int_cst (pvoid_type_node, 0));
1017 nonzero = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, size,
1018 build_int_cst (size_type_node, 0));
1019 null_result = fold_build2_loc (input_location, TRUTH_AND_EXPR, boolean_type_node,
1020 null_result, nonzero);
1021 msg = gfc_build_addr_expr (pchar_type_node, gfc_build_localized_cstring_const
1022 ("Allocation would exceed memory limit"));
1023 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node,
1025 build_call_expr_loc (input_location,
1026 gfor_fndecl_os_error, 1, msg),
1027 build_empty_stmt (input_location));
1028 gfc_add_expr_to_block (block, tmp);
1030 /* if (size == 0) then the result is NULL. */
1031 tmp = fold_build2_loc (input_location, MODIFY_EXPR, type, res,
1032 build_int_cst (type, 0));
1033 zero = fold_build1_loc (input_location, TRUTH_NOT_EXPR, boolean_type_node,
1035 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, zero, tmp,
1036 build_empty_stmt (input_location));
1037 gfc_add_expr_to_block (block, tmp);
1043 /* Add an expression to another one, either at the front or the back. */
1046 add_expr_to_chain (tree* chain, tree expr, bool front)
1048 if (expr == NULL_TREE || IS_EMPTY_STMT (expr))
1053 if (TREE_CODE (*chain) != STATEMENT_LIST)
1059 append_to_statement_list (tmp, chain);
1064 tree_stmt_iterator i;
1066 i = tsi_start (*chain);
1067 tsi_link_before (&i, expr, TSI_CONTINUE_LINKING);
1070 append_to_statement_list (expr, chain);
1077 /* Add a statement at the end of a block. */
1080 gfc_add_expr_to_block (stmtblock_t * block, tree expr)
1083 add_expr_to_chain (&block->head, expr, false);
1087 /* Add a statement at the beginning of a block. */
1090 gfc_prepend_expr_to_block (stmtblock_t * block, tree expr)
1093 add_expr_to_chain (&block->head, expr, true);
1097 /* Add a block the end of a block. */
1100 gfc_add_block_to_block (stmtblock_t * block, stmtblock_t * append)
1102 gcc_assert (append);
1103 gcc_assert (!append->has_scope);
1105 gfc_add_expr_to_block (block, append->head);
1106 append->head = NULL_TREE;
1110 /* Save the current locus. The structure may not be complete, and should
1111 only be used with gfc_restore_backend_locus. */
1114 gfc_save_backend_locus (locus * loc)
1116 loc->lb = XCNEW (gfc_linebuf);
1117 loc->lb->location = input_location;
1118 loc->lb->file = gfc_current_backend_file;
1122 /* Set the current locus. */
1125 gfc_set_backend_locus (locus * loc)
1127 gfc_current_backend_file = loc->lb->file;
1128 input_location = loc->lb->location;
1132 /* Restore the saved locus. Only used in conjonction with
1133 gfc_save_backend_locus, to free the memory when we are done. */
1136 gfc_restore_backend_locus (locus * loc)
1138 gfc_set_backend_locus (loc);
1143 /* Translate an executable statement. The tree cond is used by gfc_trans_do.
1144 This static function is wrapped by gfc_trans_code_cond and
1148 trans_code (gfc_code * code, tree cond)
1154 return build_empty_stmt (input_location);
1156 gfc_start_block (&block);
1158 /* Translate statements one by one into GENERIC trees until we reach
1159 the end of this gfc_code branch. */
1160 for (; code; code = code->next)
1162 if (code->here != 0)
1164 res = gfc_trans_label_here (code);
1165 gfc_add_expr_to_block (&block, res);
1168 gfc_set_backend_locus (&code->loc);
1173 case EXEC_END_BLOCK:
1174 case EXEC_END_PROCEDURE:
1179 if (code->expr1->ts.type == BT_CLASS)
1180 res = gfc_trans_class_assign (code->expr1, code->expr2, code->op);
1182 res = gfc_trans_assign (code);
1185 case EXEC_LABEL_ASSIGN:
1186 res = gfc_trans_label_assign (code);
1189 case EXEC_POINTER_ASSIGN:
1190 if (code->expr1->ts.type == BT_CLASS)
1191 res = gfc_trans_class_assign (code->expr1, code->expr2, code->op);
1193 res = gfc_trans_pointer_assign (code);
1196 case EXEC_INIT_ASSIGN:
1197 if (code->expr1->ts.type == BT_CLASS)
1198 res = gfc_trans_class_init_assign (code);
1200 res = gfc_trans_init_assign (code);
1208 res = gfc_trans_critical (code);
1212 res = gfc_trans_cycle (code);
1216 res = gfc_trans_exit (code);
1220 res = gfc_trans_goto (code);
1224 res = gfc_trans_entry (code);
1228 res = gfc_trans_pause (code);
1232 case EXEC_ERROR_STOP:
1233 res = gfc_trans_stop (code, code->op == EXEC_ERROR_STOP);
1237 /* For MVBITS we've got the special exception that we need a
1238 dependency check, too. */
1240 bool is_mvbits = false;
1241 if (code->resolved_isym
1242 && code->resolved_isym->id == GFC_ISYM_MVBITS)
1244 if (code->resolved_isym
1245 && code->resolved_isym->id == GFC_ISYM_MOVE_ALLOC)
1246 res = gfc_conv_intrinsic_move_alloc (code);
1248 res = gfc_trans_call (code, is_mvbits, NULL_TREE,
1254 res = gfc_trans_call (code, false, NULL_TREE,
1258 case EXEC_ASSIGN_CALL:
1259 res = gfc_trans_call (code, true, NULL_TREE,
1264 res = gfc_trans_return (code);
1268 res = gfc_trans_if (code);
1271 case EXEC_ARITHMETIC_IF:
1272 res = gfc_trans_arithmetic_if (code);
1276 res = gfc_trans_block_construct (code);
1280 res = gfc_trans_do (code, cond);
1284 res = gfc_trans_do_while (code);
1288 res = gfc_trans_select (code);
1291 case EXEC_SELECT_TYPE:
1292 /* Do nothing. SELECT TYPE statements should be transformed into
1293 an ordinary SELECT CASE at resolution stage.
1294 TODO: Add an error message here once this is done. */
1299 res = gfc_trans_flush (code);
1303 case EXEC_SYNC_IMAGES:
1304 case EXEC_SYNC_MEMORY:
1305 res = gfc_trans_sync (code, code->op);
1309 res = gfc_trans_forall (code);
1313 res = gfc_trans_where (code);
1317 res = gfc_trans_allocate (code);
1320 case EXEC_DEALLOCATE:
1321 res = gfc_trans_deallocate (code);
1325 res = gfc_trans_open (code);
1329 res = gfc_trans_close (code);
1333 res = gfc_trans_read (code);
1337 res = gfc_trans_write (code);
1341 res = gfc_trans_iolength (code);
1344 case EXEC_BACKSPACE:
1345 res = gfc_trans_backspace (code);
1349 res = gfc_trans_endfile (code);
1353 res = gfc_trans_inquire (code);
1357 res = gfc_trans_wait (code);
1361 res = gfc_trans_rewind (code);
1365 res = gfc_trans_transfer (code);
1369 res = gfc_trans_dt_end (code);
1372 case EXEC_OMP_ATOMIC:
1373 case EXEC_OMP_BARRIER:
1374 case EXEC_OMP_CRITICAL:
1376 case EXEC_OMP_FLUSH:
1377 case EXEC_OMP_MASTER:
1378 case EXEC_OMP_ORDERED:
1379 case EXEC_OMP_PARALLEL:
1380 case EXEC_OMP_PARALLEL_DO:
1381 case EXEC_OMP_PARALLEL_SECTIONS:
1382 case EXEC_OMP_PARALLEL_WORKSHARE:
1383 case EXEC_OMP_SECTIONS:
1384 case EXEC_OMP_SINGLE:
1386 case EXEC_OMP_TASKWAIT:
1387 case EXEC_OMP_WORKSHARE:
1388 res = gfc_trans_omp_directive (code);
1392 internal_error ("gfc_trans_code(): Bad statement code");
1395 gfc_set_backend_locus (&code->loc);
1397 if (res != NULL_TREE && ! IS_EMPTY_STMT (res))
1399 if (TREE_CODE (res) != STATEMENT_LIST)
1400 SET_EXPR_LOCATION (res, input_location);
1402 /* Add the new statement to the block. */
1403 gfc_add_expr_to_block (&block, res);
1407 /* Return the finished block. */
1408 return gfc_finish_block (&block);
1412 /* Translate an executable statement with condition, cond. The condition is
1413 used by gfc_trans_do to test for IO result conditions inside implied
1414 DO loops of READ and WRITE statements. See build_dt in trans-io.c. */
1417 gfc_trans_code_cond (gfc_code * code, tree cond)
1419 return trans_code (code, cond);
1422 /* Translate an executable statement without condition. */
1425 gfc_trans_code (gfc_code * code)
1427 return trans_code (code, NULL_TREE);
1431 /* This function is called after a complete program unit has been parsed
1435 gfc_generate_code (gfc_namespace * ns)
1438 if (ns->is_block_data)
1440 gfc_generate_block_data (ns);
1444 gfc_generate_function_code (ns);
1448 /* This function is called after a complete module has been parsed
1452 gfc_generate_module_code (gfc_namespace * ns)
1455 struct module_htab_entry *entry;
1457 gcc_assert (ns->proc_name->backend_decl == NULL);
1458 ns->proc_name->backend_decl
1459 = build_decl (ns->proc_name->declared_at.lb->location,
1460 NAMESPACE_DECL, get_identifier (ns->proc_name->name),
1462 entry = gfc_find_module (ns->proc_name->name);
1463 if (entry->namespace_decl)
1464 /* Buggy sourcecode, using a module before defining it? */
1465 htab_empty (entry->decls);
1466 entry->namespace_decl = ns->proc_name->backend_decl;
1468 gfc_generate_module_vars (ns);
1470 /* We need to generate all module function prototypes first, to allow
1472 for (n = ns->contained; n; n = n->sibling)
1479 gfc_create_function_decl (n, false);
1480 DECL_CONTEXT (n->proc_name->backend_decl) = ns->proc_name->backend_decl;
1481 gfc_module_add_decl (entry, n->proc_name->backend_decl);
1482 for (el = ns->entries; el; el = el->next)
1484 DECL_CONTEXT (el->sym->backend_decl) = ns->proc_name->backend_decl;
1485 gfc_module_add_decl (entry, el->sym->backend_decl);
1489 for (n = ns->contained; n; n = n->sibling)
1494 gfc_generate_function_code (n);
1499 /* Initialize an init/cleanup block with existing code. */
1502 gfc_start_wrapped_block (gfc_wrapped_block* block, tree code)
1506 block->init = NULL_TREE;
1508 block->cleanup = NULL_TREE;
1512 /* Add a new pair of initializers/clean-up code. */
1515 gfc_add_init_cleanup (gfc_wrapped_block* block, tree init, tree cleanup)
1519 /* The new pair of init/cleanup should be "wrapped around" the existing
1520 block of code, thus the initialization is added to the front and the
1521 cleanup to the back. */
1522 add_expr_to_chain (&block->init, init, true);
1523 add_expr_to_chain (&block->cleanup, cleanup, false);
1527 /* Finish up a wrapped block by building a corresponding try-finally expr. */
1530 gfc_finish_wrapped_block (gfc_wrapped_block* block)
1536 /* Build the final expression. For this, just add init and body together,
1537 and put clean-up with that into a TRY_FINALLY_EXPR. */
1538 result = block->init;
1539 add_expr_to_chain (&result, block->code, false);
1541 result = build2_loc (input_location, TRY_FINALLY_EXPR, void_type_node,
1542 result, block->cleanup);
1544 /* Clear the block. */
1545 block->init = NULL_TREE;
1546 block->code = NULL_TREE;
1547 block->cleanup = NULL_TREE;
1553 /* Helper function for marking a boolean expression tree as unlikely. */
1556 gfc_unlikely (tree cond)
1560 cond = fold_convert (long_integer_type_node, cond);
1561 tmp = build_zero_cst (long_integer_type_node);
1562 cond = build_call_expr_loc (input_location,
1563 built_in_decls[BUILT_IN_EXPECT], 2, cond, tmp);
1564 cond = fold_convert (boolean_type_node, cond);