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 if (GFC_ARRAY_TYPE_P (type) && GFC_TYPE_ARRAY_RANK (type) == 0)
321 gcc_assert (GFC_TYPE_ARRAY_CORANK (type) > 0);
323 return fold_convert (TYPE_MAIN_VARIANT (type), base);
326 gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
327 type = TREE_TYPE (type);
330 TREE_ADDRESSABLE (base) = 1;
332 /* Strip NON_LVALUE_EXPR nodes. */
333 STRIP_TYPE_NOPS (offset);
335 /* If the array reference is to a pointer, whose target contains a
336 subreference, use the span that is stored with the backend decl
337 and reference the element with pointer arithmetic. */
338 if (decl && (TREE_CODE (decl) == FIELD_DECL
339 || TREE_CODE (decl) == VAR_DECL
340 || TREE_CODE (decl) == PARM_DECL)
341 && GFC_DECL_SUBREF_ARRAY_P (decl)
342 && !integer_zerop (GFC_DECL_SPAN(decl)))
344 offset = fold_build2_loc (input_location, MULT_EXPR,
345 gfc_array_index_type,
346 offset, GFC_DECL_SPAN(decl));
347 tmp = gfc_build_addr_expr (pvoid_type_node, base);
348 tmp = fold_build_pointer_plus_loc (input_location, tmp, offset);
349 tmp = fold_convert (build_pointer_type (type), tmp);
350 if (!TYPE_STRING_FLAG (type))
351 tmp = build_fold_indirect_ref_loc (input_location, tmp);
355 /* Otherwise use a straightforward array reference. */
356 return build4_loc (input_location, ARRAY_REF, type, base, offset,
357 NULL_TREE, NULL_TREE);
361 /* Generate a call to print a runtime error possibly including multiple
362 arguments and a locus. */
365 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 = XALLOCAVEC (tree, nargs + 2);
413 for (i = 0; i < nargs; i++)
414 argarray[2 + i] = va_arg (ap, tree);
416 /* Build the function call to runtime_(warning,error)_at; because of the
417 variable number of arguments, we can't use build_call_expr_loc dinput_location,
420 fntype = TREE_TYPE (gfor_fndecl_runtime_error_at);
422 fntype = TREE_TYPE (gfor_fndecl_runtime_warning_at);
424 loc = where ? where->lb->location : input_location;
425 tmp = fold_builtin_call_array (loc, TREE_TYPE (fntype),
426 fold_build1_loc (loc, 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);
439 gfc_trans_runtime_error (bool error, locus* where, const char* msgid, ...)
444 va_start (ap, msgid);
445 result = trans_runtime_error_vararg (error, where, msgid, ap);
451 /* Generate a runtime error if COND is true. */
454 gfc_trans_runtime_check (bool error, bool once, tree cond, stmtblock_t * pblock,
455 locus * where, const char * msgid, ...)
463 if (integer_zerop (cond))
468 tmpvar = gfc_create_var (boolean_type_node, "print_warning");
469 TREE_STATIC (tmpvar) = 1;
470 DECL_INITIAL (tmpvar) = boolean_true_node;
471 gfc_add_expr_to_block (pblock, tmpvar);
474 gfc_start_block (&block);
476 /* The code to generate the error. */
477 va_start (ap, msgid);
478 gfc_add_expr_to_block (&block,
479 trans_runtime_error_vararg (error, where,
483 gfc_add_modify (&block, tmpvar, boolean_false_node);
485 body = gfc_finish_block (&block);
487 if (integer_onep (cond))
489 gfc_add_expr_to_block (pblock, body);
493 /* Tell the compiler that this isn't likely. */
495 cond = fold_build2_loc (where->lb->location, TRUTH_AND_EXPR,
496 long_integer_type_node, tmpvar, cond);
498 cond = fold_convert (long_integer_type_node, cond);
500 cond = gfc_unlikely (cond);
501 tmp = fold_build3_loc (where->lb->location, COND_EXPR, void_type_node,
503 build_empty_stmt (where->lb->location));
504 gfc_add_expr_to_block (pblock, tmp);
509 /* Call malloc to allocate size bytes of memory, with special conditions:
510 + if size == 0, return a malloced area of size 1,
511 + if malloc returns NULL, issue a runtime error. */
513 gfc_call_malloc (stmtblock_t * block, tree type, tree size)
515 tree tmp, msg, malloc_result, null_result, res, malloc_tree;
518 size = gfc_evaluate_now (size, block);
520 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
521 size = fold_convert (size_type_node, size);
523 /* Create a variable to hold the result. */
524 res = gfc_create_var (prvoid_type_node, NULL);
527 gfc_start_block (&block2);
529 size = fold_build2_loc (input_location, MAX_EXPR, size_type_node, size,
530 build_int_cst (size_type_node, 1));
532 malloc_tree = builtin_decl_explicit (BUILT_IN_MALLOC);
533 gfc_add_modify (&block2, res,
534 fold_convert (prvoid_type_node,
535 build_call_expr_loc (input_location,
536 malloc_tree, 1, size)));
538 /* Optionally check whether malloc was successful. */
539 if (gfc_option.rtcheck & GFC_RTCHECK_MEM)
541 null_result = fold_build2_loc (input_location, EQ_EXPR,
542 boolean_type_node, res,
543 build_int_cst (pvoid_type_node, 0));
544 msg = gfc_build_addr_expr (pchar_type_node,
545 gfc_build_localized_cstring_const ("Memory allocation failed"));
546 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node,
548 build_call_expr_loc (input_location,
549 gfor_fndecl_os_error, 1, msg),
550 build_empty_stmt (input_location));
551 gfc_add_expr_to_block (&block2, tmp);
554 malloc_result = gfc_finish_block (&block2);
556 gfc_add_expr_to_block (block, malloc_result);
559 res = fold_convert (type, res);
564 /* Allocate memory, using an optional status argument.
566 This function follows the following pseudo-code:
569 allocate (size_t size, integer_type stat)
576 newmem = malloc (MAX (size, 1));
580 *stat = LIBERROR_ALLOCATION;
582 runtime_error ("Allocation would exceed memory limit");
587 gfc_allocate_using_malloc (stmtblock_t * block, tree pointer,
588 tree size, tree status)
590 tree tmp, on_error, error_cond;
591 tree status_type = status ? TREE_TYPE (status) : NULL_TREE;
593 /* Evaluate size only once, and make sure it has the right type. */
594 size = gfc_evaluate_now (size, block);
595 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
596 size = fold_convert (size_type_node, size);
598 /* If successful and stat= is given, set status to 0. */
599 if (status != NULL_TREE)
600 gfc_add_expr_to_block (block,
601 fold_build2_loc (input_location, MODIFY_EXPR, status_type,
602 status, build_int_cst (status_type, 0)));
604 /* The allocation itself. */
605 gfc_add_modify (block, pointer,
606 fold_convert (TREE_TYPE (pointer),
607 build_call_expr_loc (input_location,
608 builtin_decl_explicit (BUILT_IN_MALLOC), 1,
609 fold_build2_loc (input_location,
610 MAX_EXPR, size_type_node, size,
611 build_int_cst (size_type_node, 1)))));
613 /* What to do in case of error. */
614 if (status != NULL_TREE)
615 on_error = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
616 status, build_int_cst (status_type, LIBERROR_ALLOCATION));
618 on_error = build_call_expr_loc (input_location, gfor_fndecl_os_error, 1,
619 gfc_build_addr_expr (pchar_type_node,
620 gfc_build_localized_cstring_const
621 ("Allocation would exceed memory limit")));
623 error_cond = fold_build2_loc (input_location, EQ_EXPR,
624 boolean_type_node, pointer,
625 build_int_cst (prvoid_type_node, 0));
626 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node,
627 gfc_unlikely(error_cond), on_error,
628 build_empty_stmt (input_location));
630 gfc_add_expr_to_block (block, tmp);
634 /* Allocate memory, using an optional status argument.
636 This function follows the following pseudo-code:
639 allocate (size_t size, void** token, int *stat, char* errmsg, int errlen)
643 newmem = _caf_register (size, regtype, token, &stat, errmsg, errlen);
647 gfc_allocate_using_lib (stmtblock_t * block, tree pointer, tree size,
648 tree token, tree status, tree errmsg, tree errlen)
652 gcc_assert (token != NULL_TREE);
654 /* Evaluate size only once, and make sure it has the right type. */
655 size = gfc_evaluate_now (size, block);
656 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
657 size = fold_convert (size_type_node, size);
659 /* The allocation itself. */
660 if (status == NULL_TREE)
661 pstat = null_pointer_node;
663 pstat = gfc_build_addr_expr (NULL_TREE, status);
665 if (errmsg == NULL_TREE)
667 gcc_assert(errlen == NULL_TREE);
668 errmsg = null_pointer_node;
669 errlen = build_int_cst (integer_type_node, 0);
672 tmp = build_call_expr_loc (input_location,
673 gfor_fndecl_caf_register, 6,
674 fold_build2_loc (input_location,
675 MAX_EXPR, size_type_node, size,
676 build_int_cst (size_type_node, 1)),
677 build_int_cst (integer_type_node,
678 GFC_CAF_COARRAY_ALLOC),
679 token, pstat, errmsg, errlen);
681 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
682 TREE_TYPE (pointer), pointer,
683 fold_convert ( TREE_TYPE (pointer), tmp));
684 gfc_add_expr_to_block (block, tmp);
688 /* Generate code for an ALLOCATE statement when the argument is an
689 allocatable variable. If the variable is currently allocated, it is an
690 error to allocate it again.
692 This function follows the following pseudo-code:
695 allocate_allocatable (void *mem, size_t size, integer_type stat)
698 return allocate (size, stat);
702 stat = LIBERROR_ALLOCATION;
704 runtime_error ("Attempting to allocate already allocated variable");
708 expr must be set to the original expression being allocated for its locus
709 and variable name in case a runtime error has to be printed. */
711 gfc_allocate_allocatable (stmtblock_t * block, tree mem, tree size, tree token,
712 tree status, tree errmsg, tree errlen, gfc_expr* expr)
714 stmtblock_t alloc_block;
715 tree tmp, null_mem, alloc, error;
716 tree type = TREE_TYPE (mem);
718 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
719 size = fold_convert (size_type_node, size);
721 null_mem = gfc_unlikely (fold_build2_loc (input_location, NE_EXPR,
722 boolean_type_node, mem,
723 build_int_cst (type, 0)));
725 /* If mem is NULL, we call gfc_allocate_using_malloc or
726 gfc_allocate_using_lib. */
727 gfc_start_block (&alloc_block);
729 if (gfc_option.coarray == GFC_FCOARRAY_LIB
730 && gfc_expr_attr (expr).codimension)
731 gfc_allocate_using_lib (&alloc_block, mem, size, token, status,
734 gfc_allocate_using_malloc (&alloc_block, mem, size, status);
736 alloc = gfc_finish_block (&alloc_block);
738 /* If mem is not NULL, we issue a runtime error or set the
744 gcc_assert (expr->expr_type == EXPR_VARIABLE && expr->symtree);
745 varname = gfc_build_cstring_const (expr->symtree->name);
746 varname = gfc_build_addr_expr (pchar_type_node, varname);
748 error = gfc_trans_runtime_error (true, &expr->where,
749 "Attempting to allocate already"
750 " allocated variable '%s'",
754 error = gfc_trans_runtime_error (true, NULL,
755 "Attempting to allocate already allocated"
758 if (status != NULL_TREE)
760 tree status_type = TREE_TYPE (status);
762 error = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
763 status, build_int_cst (status_type, LIBERROR_ALLOCATION));
766 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, null_mem,
768 gfc_add_expr_to_block (block, tmp);
772 /* Free a given variable, if it's not NULL. */
774 gfc_call_free (tree var)
777 tree tmp, cond, call;
779 if (TREE_TYPE (var) != TREE_TYPE (pvoid_type_node))
780 var = fold_convert (pvoid_type_node, var);
782 gfc_start_block (&block);
783 var = gfc_evaluate_now (var, &block);
784 cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, var,
785 build_int_cst (pvoid_type_node, 0));
786 call = build_call_expr_loc (input_location,
787 builtin_decl_explicit (BUILT_IN_FREE),
789 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond, call,
790 build_empty_stmt (input_location));
791 gfc_add_expr_to_block (&block, tmp);
793 return gfc_finish_block (&block);
798 /* User-deallocate; we emit the code directly from the front-end, and the
799 logic is the same as the previous library function:
802 deallocate (void *pointer, GFC_INTEGER_4 * stat)
809 runtime_error ("Attempt to DEALLOCATE unallocated memory.");
819 In this front-end version, status doesn't have to be GFC_INTEGER_4.
820 Moreover, if CAN_FAIL is true, then we will not emit a runtime error,
821 even when no status variable is passed to us (this is used for
822 unconditional deallocation generated by the front-end at end of
825 If a runtime-message is possible, `expr' must point to the original
826 expression being deallocated for its locus and variable name. */
828 gfc_deallocate_with_status (tree pointer, tree status, bool can_fail,
831 stmtblock_t null, non_null;
832 tree cond, tmp, error;
834 cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, pointer,
835 build_int_cst (TREE_TYPE (pointer), 0));
837 /* When POINTER is NULL, we set STATUS to 1 if it's present, otherwise
838 we emit a runtime error. */
839 gfc_start_block (&null);
844 gcc_assert (expr && expr->expr_type == EXPR_VARIABLE && expr->symtree);
846 varname = gfc_build_cstring_const (expr->symtree->name);
847 varname = gfc_build_addr_expr (pchar_type_node, varname);
849 error = gfc_trans_runtime_error (true, &expr->where,
850 "Attempt to DEALLOCATE unallocated '%s'",
854 error = build_empty_stmt (input_location);
856 if (status != NULL_TREE && !integer_zerop (status))
858 tree status_type = TREE_TYPE (TREE_TYPE (status));
861 cond2 = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
862 status, build_int_cst (TREE_TYPE (status), 0));
863 tmp = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
864 fold_build1_loc (input_location, INDIRECT_REF,
865 status_type, status),
866 build_int_cst (status_type, 1));
867 error = fold_build3_loc (input_location, COND_EXPR, void_type_node,
871 gfc_add_expr_to_block (&null, error);
873 /* When POINTER is not NULL, we free it. */
874 gfc_start_block (&non_null);
875 tmp = build_call_expr_loc (input_location,
876 builtin_decl_explicit (BUILT_IN_FREE), 1,
877 fold_convert (pvoid_type_node, pointer));
878 gfc_add_expr_to_block (&non_null, tmp);
880 if (status != NULL_TREE && !integer_zerop (status))
882 /* We set STATUS to zero if it is present. */
883 tree status_type = TREE_TYPE (TREE_TYPE (status));
886 cond2 = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
887 status, build_int_cst (TREE_TYPE (status), 0));
888 tmp = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
889 fold_build1_loc (input_location, INDIRECT_REF,
890 status_type, status),
891 build_int_cst (status_type, 0));
892 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond2,
893 tmp, build_empty_stmt (input_location));
894 gfc_add_expr_to_block (&non_null, tmp);
897 return fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
898 gfc_finish_block (&null),
899 gfc_finish_block (&non_null));
903 /* Generate code for deallocation of allocatable scalars (variables or
904 components). Before the object itself is freed, any allocatable
905 subcomponents are being deallocated. */
908 gfc_deallocate_scalar_with_status (tree pointer, tree status, bool can_fail,
909 gfc_expr* expr, gfc_typespec ts)
911 stmtblock_t null, non_null;
912 tree cond, tmp, error;
914 cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, pointer,
915 build_int_cst (TREE_TYPE (pointer), 0));
917 /* When POINTER is NULL, we set STATUS to 1 if it's present, otherwise
918 we emit a runtime error. */
919 gfc_start_block (&null);
924 gcc_assert (expr && expr->expr_type == EXPR_VARIABLE && expr->symtree);
926 varname = gfc_build_cstring_const (expr->symtree->name);
927 varname = gfc_build_addr_expr (pchar_type_node, varname);
929 error = gfc_trans_runtime_error (true, &expr->where,
930 "Attempt to DEALLOCATE unallocated '%s'",
934 error = build_empty_stmt (input_location);
936 if (status != NULL_TREE && !integer_zerop (status))
938 tree status_type = TREE_TYPE (TREE_TYPE (status));
941 cond2 = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
942 status, build_int_cst (TREE_TYPE (status), 0));
943 tmp = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
944 fold_build1_loc (input_location, INDIRECT_REF,
945 status_type, status),
946 build_int_cst (status_type, 1));
947 error = fold_build3_loc (input_location, COND_EXPR, void_type_node,
951 gfc_add_expr_to_block (&null, error);
953 /* When POINTER is not NULL, we free it. */
954 gfc_start_block (&non_null);
956 /* Free allocatable components. */
957 if (ts.type == BT_DERIVED && ts.u.derived->attr.alloc_comp)
959 tmp = build_fold_indirect_ref_loc (input_location, pointer);
960 tmp = gfc_deallocate_alloc_comp (ts.u.derived, tmp, 0);
961 gfc_add_expr_to_block (&non_null, tmp);
963 else if (ts.type == BT_CLASS
964 && ts.u.derived->components->ts.u.derived->attr.alloc_comp)
966 tmp = build_fold_indirect_ref_loc (input_location, pointer);
967 tmp = gfc_deallocate_alloc_comp (ts.u.derived->components->ts.u.derived,
969 gfc_add_expr_to_block (&non_null, tmp);
972 tmp = build_call_expr_loc (input_location,
973 builtin_decl_explicit (BUILT_IN_FREE), 1,
974 fold_convert (pvoid_type_node, pointer));
975 gfc_add_expr_to_block (&non_null, tmp);
977 if (status != NULL_TREE && !integer_zerop (status))
979 /* We set STATUS to zero if it is present. */
980 tree status_type = TREE_TYPE (TREE_TYPE (status));
983 cond2 = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
984 status, build_int_cst (TREE_TYPE (status), 0));
985 tmp = fold_build2_loc (input_location, MODIFY_EXPR, status_type,
986 fold_build1_loc (input_location, INDIRECT_REF,
987 status_type, status),
988 build_int_cst (status_type, 0));
989 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond2,
990 tmp, build_empty_stmt (input_location));
991 gfc_add_expr_to_block (&non_null, tmp);
994 return fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
995 gfc_finish_block (&null),
996 gfc_finish_block (&non_null));
1000 /* Reallocate MEM so it has SIZE bytes of data. This behaves like the
1001 following pseudo-code:
1004 internal_realloc (void *mem, size_t size)
1006 res = realloc (mem, size);
1007 if (!res && size != 0)
1008 _gfortran_os_error ("Allocation would exceed memory limit");
1016 gfc_call_realloc (stmtblock_t * block, tree mem, tree size)
1018 tree msg, res, nonzero, zero, null_result, tmp;
1019 tree type = TREE_TYPE (mem);
1021 size = gfc_evaluate_now (size, block);
1023 if (TREE_TYPE (size) != TREE_TYPE (size_type_node))
1024 size = fold_convert (size_type_node, size);
1026 /* Create a variable to hold the result. */
1027 res = gfc_create_var (type, NULL);
1029 /* Call realloc and check the result. */
1030 tmp = build_call_expr_loc (input_location,
1031 builtin_decl_explicit (BUILT_IN_REALLOC), 2,
1032 fold_convert (pvoid_type_node, mem), size);
1033 gfc_add_modify (block, res, fold_convert (type, tmp));
1034 null_result = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
1035 res, build_int_cst (pvoid_type_node, 0));
1036 nonzero = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, size,
1037 build_int_cst (size_type_node, 0));
1038 null_result = fold_build2_loc (input_location, TRUTH_AND_EXPR, boolean_type_node,
1039 null_result, nonzero);
1040 msg = gfc_build_addr_expr (pchar_type_node, gfc_build_localized_cstring_const
1041 ("Allocation would exceed memory limit"));
1042 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node,
1044 build_call_expr_loc (input_location,
1045 gfor_fndecl_os_error, 1, msg),
1046 build_empty_stmt (input_location));
1047 gfc_add_expr_to_block (block, tmp);
1049 /* if (size == 0) then the result is NULL. */
1050 tmp = fold_build2_loc (input_location, MODIFY_EXPR, type, res,
1051 build_int_cst (type, 0));
1052 zero = fold_build1_loc (input_location, TRUTH_NOT_EXPR, boolean_type_node,
1054 tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, zero, tmp,
1055 build_empty_stmt (input_location));
1056 gfc_add_expr_to_block (block, tmp);
1062 /* Add an expression to another one, either at the front or the back. */
1065 add_expr_to_chain (tree* chain, tree expr, bool front)
1067 if (expr == NULL_TREE || IS_EMPTY_STMT (expr))
1072 if (TREE_CODE (*chain) != STATEMENT_LIST)
1078 append_to_statement_list (tmp, chain);
1083 tree_stmt_iterator i;
1085 i = tsi_start (*chain);
1086 tsi_link_before (&i, expr, TSI_CONTINUE_LINKING);
1089 append_to_statement_list (expr, chain);
1096 /* Add a statement at the end of a block. */
1099 gfc_add_expr_to_block (stmtblock_t * block, tree expr)
1102 add_expr_to_chain (&block->head, expr, false);
1106 /* Add a statement at the beginning of a block. */
1109 gfc_prepend_expr_to_block (stmtblock_t * block, tree expr)
1112 add_expr_to_chain (&block->head, expr, true);
1116 /* Add a block the end of a block. */
1119 gfc_add_block_to_block (stmtblock_t * block, stmtblock_t * append)
1121 gcc_assert (append);
1122 gcc_assert (!append->has_scope);
1124 gfc_add_expr_to_block (block, append->head);
1125 append->head = NULL_TREE;
1129 /* Save the current locus. The structure may not be complete, and should
1130 only be used with gfc_restore_backend_locus. */
1133 gfc_save_backend_locus (locus * loc)
1135 loc->lb = XCNEW (gfc_linebuf);
1136 loc->lb->location = input_location;
1137 loc->lb->file = gfc_current_backend_file;
1141 /* Set the current locus. */
1144 gfc_set_backend_locus (locus * loc)
1146 gfc_current_backend_file = loc->lb->file;
1147 input_location = loc->lb->location;
1151 /* Restore the saved locus. Only used in conjonction with
1152 gfc_save_backend_locus, to free the memory when we are done. */
1155 gfc_restore_backend_locus (locus * loc)
1157 gfc_set_backend_locus (loc);
1162 /* Translate an executable statement. The tree cond is used by gfc_trans_do.
1163 This static function is wrapped by gfc_trans_code_cond and
1167 trans_code (gfc_code * code, tree cond)
1173 return build_empty_stmt (input_location);
1175 gfc_start_block (&block);
1177 /* Translate statements one by one into GENERIC trees until we reach
1178 the end of this gfc_code branch. */
1179 for (; code; code = code->next)
1181 if (code->here != 0)
1183 res = gfc_trans_label_here (code);
1184 gfc_add_expr_to_block (&block, res);
1187 gfc_set_backend_locus (&code->loc);
1192 case EXEC_END_BLOCK:
1193 case EXEC_END_NESTED_BLOCK:
1194 case EXEC_END_PROCEDURE:
1199 if (code->expr1->ts.type == BT_CLASS)
1200 res = gfc_trans_class_assign (code->expr1, code->expr2, code->op);
1202 res = gfc_trans_assign (code);
1205 case EXEC_LABEL_ASSIGN:
1206 res = gfc_trans_label_assign (code);
1209 case EXEC_POINTER_ASSIGN:
1210 if (code->expr1->ts.type == BT_CLASS)
1211 res = gfc_trans_class_assign (code->expr1, code->expr2, code->op);
1213 res = gfc_trans_pointer_assign (code);
1216 case EXEC_INIT_ASSIGN:
1217 if (code->expr1->ts.type == BT_CLASS)
1218 res = gfc_trans_class_init_assign (code);
1220 res = gfc_trans_init_assign (code);
1228 res = gfc_trans_critical (code);
1232 res = gfc_trans_cycle (code);
1236 res = gfc_trans_exit (code);
1240 res = gfc_trans_goto (code);
1244 res = gfc_trans_entry (code);
1248 res = gfc_trans_pause (code);
1252 case EXEC_ERROR_STOP:
1253 res = gfc_trans_stop (code, code->op == EXEC_ERROR_STOP);
1257 /* For MVBITS we've got the special exception that we need a
1258 dependency check, too. */
1260 bool is_mvbits = false;
1262 if (code->resolved_isym)
1264 res = gfc_conv_intrinsic_subroutine (code);
1265 if (res != NULL_TREE)
1269 if (code->resolved_isym
1270 && code->resolved_isym->id == GFC_ISYM_MVBITS)
1273 res = gfc_trans_call (code, is_mvbits, NULL_TREE,
1279 res = gfc_trans_call (code, false, NULL_TREE,
1283 case EXEC_ASSIGN_CALL:
1284 res = gfc_trans_call (code, true, NULL_TREE,
1289 res = gfc_trans_return (code);
1293 res = gfc_trans_if (code);
1296 case EXEC_ARITHMETIC_IF:
1297 res = gfc_trans_arithmetic_if (code);
1301 res = gfc_trans_block_construct (code);
1305 res = gfc_trans_do (code, cond);
1308 case EXEC_DO_CONCURRENT:
1309 res = gfc_trans_do_concurrent (code);
1313 res = gfc_trans_do_while (code);
1317 res = gfc_trans_select (code);
1320 case EXEC_SELECT_TYPE:
1321 /* Do nothing. SELECT TYPE statements should be transformed into
1322 an ordinary SELECT CASE at resolution stage.
1323 TODO: Add an error message here once this is done. */
1328 res = gfc_trans_flush (code);
1332 case EXEC_SYNC_IMAGES:
1333 case EXEC_SYNC_MEMORY:
1334 res = gfc_trans_sync (code, code->op);
1339 res = gfc_trans_lock_unlock (code, code->op);
1343 res = gfc_trans_forall (code);
1347 res = gfc_trans_where (code);
1351 res = gfc_trans_allocate (code);
1354 case EXEC_DEALLOCATE:
1355 res = gfc_trans_deallocate (code);
1359 res = gfc_trans_open (code);
1363 res = gfc_trans_close (code);
1367 res = gfc_trans_read (code);
1371 res = gfc_trans_write (code);
1375 res = gfc_trans_iolength (code);
1378 case EXEC_BACKSPACE:
1379 res = gfc_trans_backspace (code);
1383 res = gfc_trans_endfile (code);
1387 res = gfc_trans_inquire (code);
1391 res = gfc_trans_wait (code);
1395 res = gfc_trans_rewind (code);
1399 res = gfc_trans_transfer (code);
1403 res = gfc_trans_dt_end (code);
1406 case EXEC_OMP_ATOMIC:
1407 case EXEC_OMP_BARRIER:
1408 case EXEC_OMP_CRITICAL:
1410 case EXEC_OMP_FLUSH:
1411 case EXEC_OMP_MASTER:
1412 case EXEC_OMP_ORDERED:
1413 case EXEC_OMP_PARALLEL:
1414 case EXEC_OMP_PARALLEL_DO:
1415 case EXEC_OMP_PARALLEL_SECTIONS:
1416 case EXEC_OMP_PARALLEL_WORKSHARE:
1417 case EXEC_OMP_SECTIONS:
1418 case EXEC_OMP_SINGLE:
1420 case EXEC_OMP_TASKWAIT:
1421 case EXEC_OMP_TASKYIELD:
1422 case EXEC_OMP_WORKSHARE:
1423 res = gfc_trans_omp_directive (code);
1427 internal_error ("gfc_trans_code(): Bad statement code");
1430 gfc_set_backend_locus (&code->loc);
1432 if (res != NULL_TREE && ! IS_EMPTY_STMT (res))
1434 if (TREE_CODE (res) != STATEMENT_LIST)
1435 SET_EXPR_LOCATION (res, input_location);
1437 /* Add the new statement to the block. */
1438 gfc_add_expr_to_block (&block, res);
1442 /* Return the finished block. */
1443 return gfc_finish_block (&block);
1447 /* Translate an executable statement with condition, cond. The condition is
1448 used by gfc_trans_do to test for IO result conditions inside implied
1449 DO loops of READ and WRITE statements. See build_dt in trans-io.c. */
1452 gfc_trans_code_cond (gfc_code * code, tree cond)
1454 return trans_code (code, cond);
1457 /* Translate an executable statement without condition. */
1460 gfc_trans_code (gfc_code * code)
1462 return trans_code (code, NULL_TREE);
1466 /* This function is called after a complete program unit has been parsed
1470 gfc_generate_code (gfc_namespace * ns)
1473 if (ns->is_block_data)
1475 gfc_generate_block_data (ns);
1479 gfc_generate_function_code (ns);
1483 /* This function is called after a complete module has been parsed
1487 gfc_generate_module_code (gfc_namespace * ns)
1490 struct module_htab_entry *entry;
1492 gcc_assert (ns->proc_name->backend_decl == NULL);
1493 ns->proc_name->backend_decl
1494 = build_decl (ns->proc_name->declared_at.lb->location,
1495 NAMESPACE_DECL, get_identifier (ns->proc_name->name),
1497 entry = gfc_find_module (ns->proc_name->name);
1498 if (entry->namespace_decl)
1499 /* Buggy sourcecode, using a module before defining it? */
1500 htab_empty (entry->decls);
1501 entry->namespace_decl = ns->proc_name->backend_decl;
1503 gfc_generate_module_vars (ns);
1505 /* We need to generate all module function prototypes first, to allow
1507 for (n = ns->contained; n; n = n->sibling)
1514 gfc_create_function_decl (n, false);
1515 DECL_CONTEXT (n->proc_name->backend_decl) = ns->proc_name->backend_decl;
1516 gfc_module_add_decl (entry, n->proc_name->backend_decl);
1517 for (el = ns->entries; el; el = el->next)
1519 DECL_CONTEXT (el->sym->backend_decl) = ns->proc_name->backend_decl;
1520 gfc_module_add_decl (entry, el->sym->backend_decl);
1524 for (n = ns->contained; n; n = n->sibling)
1529 gfc_generate_function_code (n);
1534 /* Initialize an init/cleanup block with existing code. */
1537 gfc_start_wrapped_block (gfc_wrapped_block* block, tree code)
1541 block->init = NULL_TREE;
1543 block->cleanup = NULL_TREE;
1547 /* Add a new pair of initializers/clean-up code. */
1550 gfc_add_init_cleanup (gfc_wrapped_block* block, tree init, tree cleanup)
1554 /* The new pair of init/cleanup should be "wrapped around" the existing
1555 block of code, thus the initialization is added to the front and the
1556 cleanup to the back. */
1557 add_expr_to_chain (&block->init, init, true);
1558 add_expr_to_chain (&block->cleanup, cleanup, false);
1562 /* Finish up a wrapped block by building a corresponding try-finally expr. */
1565 gfc_finish_wrapped_block (gfc_wrapped_block* block)
1571 /* Build the final expression. For this, just add init and body together,
1572 and put clean-up with that into a TRY_FINALLY_EXPR. */
1573 result = block->init;
1574 add_expr_to_chain (&result, block->code, false);
1576 result = build2_loc (input_location, TRY_FINALLY_EXPR, void_type_node,
1577 result, block->cleanup);
1579 /* Clear the block. */
1580 block->init = NULL_TREE;
1581 block->code = NULL_TREE;
1582 block->cleanup = NULL_TREE;
1588 /* Helper function for marking a boolean expression tree as unlikely. */
1591 gfc_unlikely (tree cond)
1595 cond = fold_convert (long_integer_type_node, cond);
1596 tmp = build_zero_cst (long_integer_type_node);
1597 cond = build_call_expr_loc (input_location,
1598 builtin_decl_explicit (BUILT_IN_EXPECT),
1600 cond = fold_convert (boolean_type_node, cond);
1605 /* Helper function for marking a boolean expression tree as likely. */
1608 gfc_likely (tree cond)
1612 cond = fold_convert (long_integer_type_node, cond);
1613 tmp = build_one_cst (long_integer_type_node);
1614 cond = build_call_expr_loc (input_location,
1615 builtin_decl_explicit (BUILT_IN_EXPECT),
1617 cond = fold_convert (boolean_type_node, cond);