1 /* Code translation -- generate GCC trees from gfc_code.
2 Copyright (C) 2002-2016 Free Software Foundation, Inc.
3 Contributed by Paul Brook
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
27 #include "gimple-expr.h" /* For create_tmp_var_raw. */
29 #include "stringpool.h"
30 #include "fold-const.h"
31 #include "tree-iterator.h"
32 #include "trans-stmt.h"
33 #include "trans-array.h"
34 #include "trans-types.h"
35 #include "trans-const.h"
37 /* Naming convention for backend interface code:
39 gfc_trans_* translate gfc_code into STMT trees.
41 gfc_conv_* expression conversion
43 gfc_get_* get a backend tree representation of a decl or type */
45 static gfc_file
*gfc_current_backend_file
;
47 const char gfc_msg_fault
[] = N_("Array reference out of bounds");
48 const char gfc_msg_wrong_return
[] = N_("Incorrect function return value");
51 /* Advance along TREE_CHAIN n times. */
54 gfc_advance_chain (tree t
, int n
)
58 gcc_assert (t
!= NULL_TREE
);
65 /* Strip off a legitimate source ending from the input
66 string NAME of length LEN. */
69 remove_suffix (char *name
, int len
)
73 for (i
= 2; i
< 8 && len
> i
; i
++)
75 if (name
[len
- i
] == '.')
84 /* Creates a variable declaration with a given TYPE. */
87 gfc_create_var_np (tree type
, const char *prefix
)
91 t
= create_tmp_var_raw (type
, prefix
);
93 /* No warnings for anonymous variables. */
95 TREE_NO_WARNING (t
) = 1;
101 /* Like above, but also adds it to the current scope. */
104 gfc_create_var (tree type
, const char *prefix
)
108 tmp
= gfc_create_var_np (type
, prefix
);
116 /* If the expression is not constant, evaluate it now. We assign the
117 result of the expression to an artificially created variable VAR, and
118 return a pointer to the VAR_DECL node for this variable. */
121 gfc_evaluate_now_loc (location_t loc
, tree expr
, stmtblock_t
* pblock
)
125 if (CONSTANT_CLASS_P (expr
))
128 var
= gfc_create_var (TREE_TYPE (expr
), NULL
);
129 gfc_add_modify_loc (loc
, pblock
, var
, expr
);
136 gfc_evaluate_now (tree expr
, stmtblock_t
* pblock
)
138 return gfc_evaluate_now_loc (input_location
, expr
, pblock
);
142 /* Build a MODIFY_EXPR node and add it to a given statement block PBLOCK.
143 A MODIFY_EXPR is an assignment:
147 gfc_add_modify_loc (location_t loc
, stmtblock_t
* pblock
, tree lhs
, tree rhs
)
152 t1
= TREE_TYPE (rhs
);
153 t2
= TREE_TYPE (lhs
);
154 /* Make sure that the types of the rhs and the lhs are the same
155 for scalar assignments. We should probably have something
156 similar for aggregates, but right now removing that check just
157 breaks everything. */
158 gcc_checking_assert (t1
== t2
159 || AGGREGATE_TYPE_P (TREE_TYPE (lhs
)));
161 tmp
= fold_build2_loc (loc
, MODIFY_EXPR
, void_type_node
, lhs
,
163 gfc_add_expr_to_block (pblock
, tmp
);
168 gfc_add_modify (stmtblock_t
* pblock
, tree lhs
, tree rhs
)
170 gfc_add_modify_loc (input_location
, pblock
, lhs
, rhs
);
174 /* Create a new scope/binding level and initialize a block. Care must be
175 taken when translating expressions as any temporaries will be placed in
176 the innermost scope. */
179 gfc_start_block (stmtblock_t
* block
)
181 /* Start a new binding level. */
183 block
->has_scope
= 1;
185 /* The block is empty. */
186 block
->head
= NULL_TREE
;
190 /* Initialize a block without creating a new scope. */
193 gfc_init_block (stmtblock_t
* block
)
195 block
->head
= NULL_TREE
;
196 block
->has_scope
= 0;
200 /* Sometimes we create a scope but it turns out that we don't actually
201 need it. This function merges the scope of BLOCK with its parent.
202 Only variable decls will be merged, you still need to add the code. */
205 gfc_merge_block_scope (stmtblock_t
* block
)
210 gcc_assert (block
->has_scope
);
211 block
->has_scope
= 0;
213 /* Remember the decls in this scope. */
217 /* Add them to the parent scope. */
218 while (decl
!= NULL_TREE
)
220 next
= DECL_CHAIN (decl
);
221 DECL_CHAIN (decl
) = NULL_TREE
;
229 /* Finish a scope containing a block of statements. */
232 gfc_finish_block (stmtblock_t
* stmtblock
)
238 expr
= stmtblock
->head
;
240 expr
= build_empty_stmt (input_location
);
242 stmtblock
->head
= NULL_TREE
;
244 if (stmtblock
->has_scope
)
250 block
= poplevel (1, 0);
251 expr
= build3_v (BIND_EXPR
, decl
, expr
, block
);
261 /* Build an ADDR_EXPR and cast the result to TYPE. If TYPE is NULL, the
262 natural type is used. */
265 gfc_build_addr_expr (tree type
, tree t
)
267 tree base_type
= TREE_TYPE (t
);
270 if (type
&& POINTER_TYPE_P (type
)
271 && TREE_CODE (base_type
) == ARRAY_TYPE
272 && TYPE_MAIN_VARIANT (TREE_TYPE (type
))
273 == TYPE_MAIN_VARIANT (TREE_TYPE (base_type
)))
275 tree min_val
= size_zero_node
;
276 tree type_domain
= TYPE_DOMAIN (base_type
);
277 if (type_domain
&& TYPE_MIN_VALUE (type_domain
))
278 min_val
= TYPE_MIN_VALUE (type_domain
);
279 t
= fold (build4_loc (input_location
, ARRAY_REF
, TREE_TYPE (type
),
280 t
, min_val
, NULL_TREE
, NULL_TREE
));
284 natural_type
= build_pointer_type (base_type
);
286 if (TREE_CODE (t
) == INDIRECT_REF
)
290 t
= TREE_OPERAND (t
, 0);
291 natural_type
= TREE_TYPE (t
);
295 tree base
= get_base_address (t
);
296 if (base
&& DECL_P (base
))
297 TREE_ADDRESSABLE (base
) = 1;
298 t
= fold_build1_loc (input_location
, ADDR_EXPR
, natural_type
, t
);
301 if (type
&& natural_type
!= type
)
302 t
= convert (type
, t
);
308 /* Build an ARRAY_REF with its natural type. */
311 gfc_build_array_ref (tree base
, tree offset
, tree decl
, tree vptr
)
313 tree type
= TREE_TYPE (base
);
317 if (GFC_ARRAY_TYPE_P (type
) && GFC_TYPE_ARRAY_RANK (type
) == 0)
319 gcc_assert (GFC_TYPE_ARRAY_CORANK (type
) > 0);
321 return fold_convert (TYPE_MAIN_VARIANT (type
), base
);
324 /* Scalar coarray, there is nothing to do. */
325 if (TREE_CODE (type
) != ARRAY_TYPE
)
327 gcc_assert (decl
== NULL_TREE
);
328 gcc_assert (integer_zerop (offset
));
332 type
= TREE_TYPE (type
);
334 /* Use pointer arithmetic for deferred character length array
336 if (type
&& TREE_CODE (type
) == ARRAY_TYPE
337 && TYPE_MAXVAL (TYPE_DOMAIN (type
)) != NULL_TREE
338 && (TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type
))) == VAR_DECL
339 || TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type
))) == INDIRECT_REF
)
341 && (TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type
))) == INDIRECT_REF
342 || TREE_CODE (decl
) == FUNCTION_DECL
343 || DECL_CONTEXT (TYPE_MAXVAL (TYPE_DOMAIN (type
)))
344 == DECL_CONTEXT (decl
)))
345 span
= TYPE_MAXVAL (TYPE_DOMAIN (type
));
350 TREE_ADDRESSABLE (base
) = 1;
352 /* Strip NON_LVALUE_EXPR nodes. */
353 STRIP_TYPE_NOPS (offset
);
355 /* If the array reference is to a pointer, whose target contains a
356 subreference, use the span that is stored with the backend decl
357 and reference the element with pointer arithmetic. */
358 if ((decl
&& (TREE_CODE (decl
) == FIELD_DECL
359 || TREE_CODE (decl
) == VAR_DECL
360 || TREE_CODE (decl
) == PARM_DECL
361 || TREE_CODE (decl
) == FUNCTION_DECL
)
362 && ((GFC_DECL_SUBREF_ARRAY_P (decl
)
363 && !integer_zerop (GFC_DECL_SPAN (decl
)))
364 || GFC_DECL_CLASS (decl
)
365 || span
!= NULL_TREE
))
366 || vptr
!= NULL_TREE
)
370 if (GFC_DECL_CLASS (decl
))
372 /* When a temporary is in place for the class array, then the
373 original class' declaration is stored in the saved
375 if (DECL_LANG_SPECIFIC (decl
) && GFC_DECL_SAVED_DESCRIPTOR (decl
))
376 decl
= GFC_DECL_SAVED_DESCRIPTOR (decl
);
379 /* Allow for dummy arguments and other good things. */
380 if (POINTER_TYPE_P (TREE_TYPE (decl
)))
381 decl
= build_fold_indirect_ref_loc (input_location
, decl
);
383 /* Check if '_data' is an array descriptor. If it is not,
384 the array must be one of the components of the class
385 object, so return a normal array reference. */
386 if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (
387 gfc_class_data_get (decl
))))
388 return build4_loc (input_location
, ARRAY_REF
, type
, base
,
389 offset
, NULL_TREE
, NULL_TREE
);
392 span
= gfc_class_vtab_size_get (decl
);
394 else if (GFC_DECL_SUBREF_ARRAY_P (decl
))
395 span
= GFC_DECL_SPAN (decl
);
397 span
= fold_convert (gfc_array_index_type
, span
);
402 span
= gfc_vptr_size_get (vptr
);
406 offset
= fold_build2_loc (input_location
, MULT_EXPR
,
407 gfc_array_index_type
,
409 tmp
= gfc_build_addr_expr (pvoid_type_node
, base
);
410 tmp
= fold_build_pointer_plus_loc (input_location
, tmp
, offset
);
411 tmp
= fold_convert (build_pointer_type (type
), tmp
);
412 if (!TYPE_STRING_FLAG (type
))
413 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
417 /* Otherwise use a straightforward array reference. */
418 return build4_loc (input_location
, ARRAY_REF
, type
, base
, offset
,
419 NULL_TREE
, NULL_TREE
);
423 /* Generate a call to print a runtime error possibly including multiple
424 arguments and a locus. */
427 trans_runtime_error_vararg (bool error
, locus
* where
, const char* msgid
,
440 /* Compute the number of extra arguments from the format string. */
441 for (p
= msgid
, nargs
= 0; *p
; p
++)
449 /* The code to generate the error. */
450 gfc_start_block (&block
);
454 line
= LOCATION_LINE (where
->lb
->location
);
455 message
= xasprintf ("At line %d of file %s", line
,
456 where
->lb
->file
->filename
);
459 message
= xasprintf ("In file '%s', around line %d",
460 gfc_source_file
, LOCATION_LINE (input_location
) + 1);
462 arg
= gfc_build_addr_expr (pchar_type_node
,
463 gfc_build_localized_cstring_const (message
));
466 message
= xasprintf ("%s", _(msgid
));
467 arg2
= gfc_build_addr_expr (pchar_type_node
,
468 gfc_build_localized_cstring_const (message
));
471 /* Build the argument array. */
472 argarray
= XALLOCAVEC (tree
, nargs
+ 2);
475 for (i
= 0; i
< nargs
; i
++)
476 argarray
[2 + i
] = va_arg (ap
, tree
);
478 /* Build the function call to runtime_(warning,error)_at; because of the
479 variable number of arguments, we can't use build_call_expr_loc dinput_location,
482 fntype
= TREE_TYPE (gfor_fndecl_runtime_error_at
);
484 fntype
= TREE_TYPE (gfor_fndecl_runtime_warning_at
);
486 loc
= where
? where
->lb
->location
: input_location
;
487 tmp
= fold_build_call_array_loc (loc
, TREE_TYPE (fntype
),
488 fold_build1_loc (loc
, ADDR_EXPR
,
489 build_pointer_type (fntype
),
491 ? gfor_fndecl_runtime_error_at
492 : gfor_fndecl_runtime_warning_at
),
493 nargs
+ 2, argarray
);
494 gfc_add_expr_to_block (&block
, tmp
);
496 return gfc_finish_block (&block
);
501 gfc_trans_runtime_error (bool error
, locus
* where
, const char* msgid
, ...)
506 va_start (ap
, msgid
);
507 result
= trans_runtime_error_vararg (error
, where
, msgid
, ap
);
513 /* Generate a runtime error if COND is true. */
516 gfc_trans_runtime_check (bool error
, bool once
, tree cond
, stmtblock_t
* pblock
,
517 locus
* where
, const char * msgid
, ...)
525 if (integer_zerop (cond
))
530 tmpvar
= gfc_create_var (boolean_type_node
, "print_warning");
531 TREE_STATIC (tmpvar
) = 1;
532 DECL_INITIAL (tmpvar
) = boolean_true_node
;
533 gfc_add_expr_to_block (pblock
, tmpvar
);
536 gfc_start_block (&block
);
538 /* For error, runtime_error_at already implies PRED_NORETURN. */
540 gfc_add_expr_to_block (&block
, build_predict_expr (PRED_FORTRAN_WARN_ONCE
,
543 /* The code to generate the error. */
544 va_start (ap
, msgid
);
545 gfc_add_expr_to_block (&block
,
546 trans_runtime_error_vararg (error
, where
,
551 gfc_add_modify (&block
, tmpvar
, boolean_false_node
);
553 body
= gfc_finish_block (&block
);
555 if (integer_onep (cond
))
557 gfc_add_expr_to_block (pblock
, body
);
562 cond
= fold_build2_loc (where
->lb
->location
, TRUTH_AND_EXPR
,
563 long_integer_type_node
, tmpvar
, cond
);
565 cond
= fold_convert (long_integer_type_node
, cond
);
567 tmp
= fold_build3_loc (where
->lb
->location
, COND_EXPR
, void_type_node
,
569 build_empty_stmt (where
->lb
->location
));
570 gfc_add_expr_to_block (pblock
, tmp
);
575 /* Call malloc to allocate size bytes of memory, with special conditions:
576 + if size == 0, return a malloced area of size 1,
577 + if malloc returns NULL, issue a runtime error. */
579 gfc_call_malloc (stmtblock_t
* block
, tree type
, tree size
)
581 tree tmp
, msg
, malloc_result
, null_result
, res
, malloc_tree
;
584 /* Create a variable to hold the result. */
585 res
= gfc_create_var (prvoid_type_node
, NULL
);
588 gfc_start_block (&block2
);
590 size
= fold_convert (size_type_node
, size
);
591 size
= fold_build2_loc (input_location
, MAX_EXPR
, size_type_node
, size
,
592 build_int_cst (size_type_node
, 1));
594 malloc_tree
= builtin_decl_explicit (BUILT_IN_MALLOC
);
595 gfc_add_modify (&block2
, res
,
596 fold_convert (prvoid_type_node
,
597 build_call_expr_loc (input_location
,
598 malloc_tree
, 1, size
)));
600 /* Optionally check whether malloc was successful. */
601 if (gfc_option
.rtcheck
& GFC_RTCHECK_MEM
)
603 null_result
= fold_build2_loc (input_location
, EQ_EXPR
,
604 boolean_type_node
, res
,
605 build_int_cst (pvoid_type_node
, 0));
606 msg
= gfc_build_addr_expr (pchar_type_node
,
607 gfc_build_localized_cstring_const ("Memory allocation failed"));
608 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
610 build_call_expr_loc (input_location
,
611 gfor_fndecl_os_error
, 1, msg
),
612 build_empty_stmt (input_location
));
613 gfc_add_expr_to_block (&block2
, tmp
);
616 malloc_result
= gfc_finish_block (&block2
);
617 gfc_add_expr_to_block (block
, malloc_result
);
620 res
= fold_convert (type
, res
);
625 /* Allocate memory, using an optional status argument.
627 This function follows the following pseudo-code:
630 allocate (size_t size, integer_type stat)
637 newmem = malloc (MAX (size, 1));
641 *stat = LIBERROR_ALLOCATION;
643 runtime_error ("Allocation would exceed memory limit");
648 gfc_allocate_using_malloc (stmtblock_t
* block
, tree pointer
,
649 tree size
, tree status
)
651 tree tmp
, error_cond
;
652 stmtblock_t on_error
;
653 tree status_type
= status
? TREE_TYPE (status
) : NULL_TREE
;
655 /* If successful and stat= is given, set status to 0. */
656 if (status
!= NULL_TREE
)
657 gfc_add_expr_to_block (block
,
658 fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
659 status
, build_int_cst (status_type
, 0)));
661 /* The allocation itself. */
662 size
= fold_convert (size_type_node
, size
);
663 gfc_add_modify (block
, pointer
,
664 fold_convert (TREE_TYPE (pointer
),
665 build_call_expr_loc (input_location
,
666 builtin_decl_explicit (BUILT_IN_MALLOC
), 1,
667 fold_build2_loc (input_location
,
668 MAX_EXPR
, size_type_node
, size
,
669 build_int_cst (size_type_node
, 1)))));
671 /* What to do in case of error. */
672 gfc_start_block (&on_error
);
673 if (status
!= NULL_TREE
)
675 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
, status
,
676 build_int_cst (status_type
, LIBERROR_ALLOCATION
));
677 gfc_add_expr_to_block (&on_error
, tmp
);
681 /* Here, os_error already implies PRED_NORETURN. */
682 tmp
= build_call_expr_loc (input_location
, gfor_fndecl_os_error
, 1,
683 gfc_build_addr_expr (pchar_type_node
,
684 gfc_build_localized_cstring_const
685 ("Allocation would exceed memory limit")));
686 gfc_add_expr_to_block (&on_error
, tmp
);
689 error_cond
= fold_build2_loc (input_location
, EQ_EXPR
,
690 boolean_type_node
, pointer
,
691 build_int_cst (prvoid_type_node
, 0));
692 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
693 gfc_unlikely (error_cond
, PRED_FORTRAN_FAIL_ALLOC
),
694 gfc_finish_block (&on_error
),
695 build_empty_stmt (input_location
));
697 gfc_add_expr_to_block (block
, tmp
);
701 /* Allocate memory, using an optional status argument.
703 This function follows the following pseudo-code:
706 allocate (size_t size, void** token, int *stat, char* errmsg, int errlen)
710 newmem = _caf_register (size, regtype, token, &stat, errmsg, errlen);
714 gfc_allocate_using_lib (stmtblock_t
* block
, tree pointer
, tree size
,
715 tree token
, tree status
, tree errmsg
, tree errlen
,
716 bool lock_var
, bool event_var
)
720 gcc_assert (token
!= NULL_TREE
);
722 /* The allocation itself. */
723 if (status
== NULL_TREE
)
724 pstat
= null_pointer_node
;
726 pstat
= gfc_build_addr_expr (NULL_TREE
, status
);
728 if (errmsg
== NULL_TREE
)
730 gcc_assert(errlen
== NULL_TREE
);
731 errmsg
= null_pointer_node
;
732 errlen
= build_int_cst (integer_type_node
, 0);
735 size
= fold_convert (size_type_node
, size
);
736 tmp
= build_call_expr_loc (input_location
,
737 gfor_fndecl_caf_register
, 6,
738 fold_build2_loc (input_location
,
739 MAX_EXPR
, size_type_node
, size
,
740 build_int_cst (size_type_node
, 1)),
741 build_int_cst (integer_type_node
,
742 lock_var
? GFC_CAF_LOCK_ALLOC
743 : event_var
? GFC_CAF_EVENT_ALLOC
744 : GFC_CAF_COARRAY_ALLOC
),
745 token
, pstat
, errmsg
, errlen
);
747 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
748 TREE_TYPE (pointer
), pointer
,
749 fold_convert ( TREE_TYPE (pointer
), tmp
));
750 gfc_add_expr_to_block (block
, tmp
);
752 /* It guarantees memory consistency within the same segment */
753 tmp
= gfc_build_string_const (strlen ("memory")+1, "memory"),
754 tmp
= build5_loc (input_location
, ASM_EXPR
, void_type_node
,
755 gfc_build_string_const (1, ""), NULL_TREE
, NULL_TREE
,
756 tree_cons (NULL_TREE
, tmp
, NULL_TREE
), NULL_TREE
);
757 ASM_VOLATILE_P (tmp
) = 1;
758 gfc_add_expr_to_block (block
, tmp
);
762 /* Generate code for an ALLOCATE statement when the argument is an
763 allocatable variable. If the variable is currently allocated, it is an
764 error to allocate it again.
766 This function follows the following pseudo-code:
769 allocate_allocatable (void *mem, size_t size, integer_type stat)
772 return allocate (size, stat);
776 stat = LIBERROR_ALLOCATION;
778 runtime_error ("Attempting to allocate already allocated variable");
782 expr must be set to the original expression being allocated for its locus
783 and variable name in case a runtime error has to be printed. */
785 gfc_allocate_allocatable (stmtblock_t
* block
, tree mem
, tree size
, tree token
,
786 tree status
, tree errmsg
, tree errlen
, tree label_finish
,
789 stmtblock_t alloc_block
;
790 tree tmp
, null_mem
, alloc
, error
;
791 tree type
= TREE_TYPE (mem
);
793 size
= fold_convert (size_type_node
, size
);
794 null_mem
= gfc_unlikely (fold_build2_loc (input_location
, NE_EXPR
,
795 boolean_type_node
, mem
,
796 build_int_cst (type
, 0)),
797 PRED_FORTRAN_REALLOC
);
799 /* If mem is NULL, we call gfc_allocate_using_malloc or
800 gfc_allocate_using_lib. */
801 gfc_start_block (&alloc_block
);
803 if (flag_coarray
== GFC_FCOARRAY_LIB
804 && gfc_expr_attr (expr
).codimension
)
807 bool lock_var
= expr
->ts
.type
== BT_DERIVED
808 && expr
->ts
.u
.derived
->from_intmod
809 == INTMOD_ISO_FORTRAN_ENV
810 && expr
->ts
.u
.derived
->intmod_sym_id
811 == ISOFORTRAN_LOCK_TYPE
;
812 bool event_var
= expr
->ts
.type
== BT_DERIVED
813 && expr
->ts
.u
.derived
->from_intmod
814 == INTMOD_ISO_FORTRAN_ENV
815 && expr
->ts
.u
.derived
->intmod_sym_id
816 == ISOFORTRAN_EVENT_TYPE
;
817 /* In the front end, we represent the lock variable as pointer. However,
818 the FE only passes the pointer around and leaves the actual
819 representation to the library. Hence, we have to convert back to the
820 number of elements. */
821 if (lock_var
|| event_var
)
822 size
= fold_build2_loc (input_location
, TRUNC_DIV_EXPR
, size_type_node
,
823 size
, TYPE_SIZE_UNIT (ptr_type_node
));
825 gfc_allocate_using_lib (&alloc_block
, mem
, size
, token
, status
,
826 errmsg
, errlen
, lock_var
, event_var
);
828 if (status
!= NULL_TREE
)
830 TREE_USED (label_finish
) = 1;
831 tmp
= build1_v (GOTO_EXPR
, label_finish
);
832 cond
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
833 status
, build_zero_cst (TREE_TYPE (status
)));
834 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
835 gfc_unlikely (cond
, PRED_FORTRAN_FAIL_ALLOC
),
836 tmp
, build_empty_stmt (input_location
));
837 gfc_add_expr_to_block (&alloc_block
, tmp
);
841 gfc_allocate_using_malloc (&alloc_block
, mem
, size
, status
);
843 alloc
= gfc_finish_block (&alloc_block
);
845 /* If mem is not NULL, we issue a runtime error or set the
851 gcc_assert (expr
->expr_type
== EXPR_VARIABLE
&& expr
->symtree
);
852 varname
= gfc_build_cstring_const (expr
->symtree
->name
);
853 varname
= gfc_build_addr_expr (pchar_type_node
, varname
);
855 error
= gfc_trans_runtime_error (true, &expr
->where
,
856 "Attempting to allocate already"
857 " allocated variable '%s'",
861 error
= gfc_trans_runtime_error (true, NULL
,
862 "Attempting to allocate already allocated"
865 if (status
!= NULL_TREE
)
867 tree status_type
= TREE_TYPE (status
);
869 error
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
870 status
, build_int_cst (status_type
, LIBERROR_ALLOCATION
));
873 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
, null_mem
,
875 gfc_add_expr_to_block (block
, tmp
);
879 /* Free a given variable. */
882 gfc_call_free (tree var
)
884 return build_call_expr_loc (input_location
,
885 builtin_decl_explicit (BUILT_IN_FREE
),
886 1, fold_convert (pvoid_type_node
, var
));
890 /* Build a call to a FINAL procedure, which finalizes "var". */
893 gfc_build_final_call (gfc_typespec ts
, gfc_expr
*final_wrapper
, gfc_expr
*var
,
894 bool fini_coarray
, gfc_expr
*class_size
)
898 tree final_fndecl
, array
, size
, tmp
;
899 symbol_attribute attr
;
901 gcc_assert (final_wrapper
->expr_type
== EXPR_VARIABLE
);
904 gfc_start_block (&block
);
905 gfc_init_se (&se
, NULL
);
906 gfc_conv_expr (&se
, final_wrapper
);
907 final_fndecl
= se
.expr
;
908 if (POINTER_TYPE_P (TREE_TYPE (final_fndecl
)))
909 final_fndecl
= build_fold_indirect_ref_loc (input_location
, final_fndecl
);
911 if (ts
.type
== BT_DERIVED
)
915 gcc_assert (!class_size
);
916 elem_size
= gfc_typenode_for_spec (&ts
);
917 elem_size
= TYPE_SIZE_UNIT (elem_size
);
918 size
= fold_convert (gfc_array_index_type
, elem_size
);
920 gfc_init_se (&se
, NULL
);
924 se
.descriptor_only
= 1;
925 gfc_conv_expr_descriptor (&se
, var
);
930 gfc_conv_expr (&se
, var
);
931 gcc_assert (se
.pre
.head
== NULL_TREE
&& se
.post
.head
== NULL_TREE
);
934 /* No copy back needed, hence set attr's allocatable/pointer
936 gfc_clear_attr (&attr
);
937 gfc_init_se (&se
, NULL
);
938 array
= gfc_conv_scalar_to_descriptor (&se
, array
, attr
);
939 gcc_assert (se
.post
.head
== NULL_TREE
);
944 gfc_expr
*array_expr
;
945 gcc_assert (class_size
);
946 gfc_init_se (&se
, NULL
);
947 gfc_conv_expr (&se
, class_size
);
948 gfc_add_block_to_block (&block
, &se
.pre
);
949 gcc_assert (se
.post
.head
== NULL_TREE
);
952 array_expr
= gfc_copy_expr (var
);
953 gfc_init_se (&se
, NULL
);
955 if (array_expr
->rank
)
957 gfc_add_class_array_ref (array_expr
);
958 se
.descriptor_only
= 1;
959 gfc_conv_expr_descriptor (&se
, array_expr
);
964 gfc_add_data_component (array_expr
);
965 gfc_conv_expr (&se
, array_expr
);
966 gfc_add_block_to_block (&block
, &se
.pre
);
967 gcc_assert (se
.post
.head
== NULL_TREE
);
969 if (TREE_CODE (array
) == ADDR_EXPR
970 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (array
, 0))))
971 tmp
= TREE_OPERAND (array
, 0);
973 if (!gfc_is_coarray (array_expr
))
975 /* No copy back needed, hence set attr's allocatable/pointer
977 gfc_clear_attr (&attr
);
978 gfc_init_se (&se
, NULL
);
979 array
= gfc_conv_scalar_to_descriptor (&se
, array
, attr
);
981 gcc_assert (se
.post
.head
== NULL_TREE
);
983 gfc_free_expr (array_expr
);
986 if (!POINTER_TYPE_P (TREE_TYPE (array
)))
987 array
= gfc_build_addr_expr (NULL
, array
);
989 gfc_add_block_to_block (&block
, &se
.pre
);
990 tmp
= build_call_expr_loc (input_location
,
991 final_fndecl
, 3, array
,
992 size
, fini_coarray
? boolean_true_node
993 : boolean_false_node
);
994 gfc_add_block_to_block (&block
, &se
.post
);
995 gfc_add_expr_to_block (&block
, tmp
);
996 return gfc_finish_block (&block
);
1001 gfc_add_comp_finalizer_call (stmtblock_t
*block
, tree decl
, gfc_component
*comp
,
1006 tree final_fndecl
, size
, array
, tmp
, cond
;
1007 symbol_attribute attr
;
1008 gfc_expr
*final_expr
= NULL
;
1010 if (comp
->ts
.type
!= BT_DERIVED
&& comp
->ts
.type
!= BT_CLASS
)
1013 gfc_init_block (&block2
);
1015 if (comp
->ts
.type
== BT_DERIVED
)
1017 if (comp
->attr
.pointer
)
1020 gfc_is_finalizable (comp
->ts
.u
.derived
, &final_expr
);
1024 gfc_init_se (&se
, NULL
);
1025 gfc_conv_expr (&se
, final_expr
);
1026 final_fndecl
= se
.expr
;
1027 size
= gfc_typenode_for_spec (&comp
->ts
);
1028 size
= TYPE_SIZE_UNIT (size
);
1029 size
= fold_convert (gfc_array_index_type
, size
);
1033 else /* comp->ts.type == BT_CLASS. */
1035 if (CLASS_DATA (comp
)->attr
.class_pointer
)
1038 gfc_is_finalizable (CLASS_DATA (comp
)->ts
.u
.derived
, &final_expr
);
1039 final_fndecl
= gfc_class_vtab_final_get (decl
);
1040 size
= gfc_class_vtab_size_get (decl
);
1041 array
= gfc_class_data_get (decl
);
1044 if (comp
->attr
.allocatable
1045 || (comp
->ts
.type
== BT_CLASS
&& CLASS_DATA (comp
)->attr
.allocatable
))
1047 tmp
= GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (array
))
1048 ? gfc_conv_descriptor_data_get (array
) : array
;
1049 cond
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1050 tmp
, fold_convert (TREE_TYPE (tmp
),
1051 null_pointer_node
));
1054 cond
= boolean_true_node
;
1056 if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (array
)))
1058 gfc_clear_attr (&attr
);
1059 gfc_init_se (&se
, NULL
);
1060 array
= gfc_conv_scalar_to_descriptor (&se
, array
, attr
);
1061 gfc_add_block_to_block (&block2
, &se
.pre
);
1062 gcc_assert (se
.post
.head
== NULL_TREE
);
1065 if (!POINTER_TYPE_P (TREE_TYPE (array
)))
1066 array
= gfc_build_addr_expr (NULL
, array
);
1070 tmp
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1072 fold_convert (TREE_TYPE (final_fndecl
),
1073 null_pointer_node
));
1074 cond
= fold_build2_loc (input_location
, TRUTH_ANDIF_EXPR
,
1075 boolean_type_node
, cond
, tmp
);
1078 if (POINTER_TYPE_P (TREE_TYPE (final_fndecl
)))
1079 final_fndecl
= build_fold_indirect_ref_loc (input_location
, final_fndecl
);
1081 tmp
= build_call_expr_loc (input_location
,
1082 final_fndecl
, 3, array
,
1083 size
, fini_coarray
? boolean_true_node
1084 : boolean_false_node
);
1085 gfc_add_expr_to_block (&block2
, tmp
);
1086 tmp
= gfc_finish_block (&block2
);
1088 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
, cond
, tmp
,
1089 build_empty_stmt (input_location
));
1090 gfc_add_expr_to_block (block
, tmp
);
1096 /* Add a call to the finalizer, using the passed *expr. Returns
1097 true when a finalizer call has been inserted. */
1100 gfc_add_finalizer_call (stmtblock_t
*block
, gfc_expr
*expr2
)
1105 gfc_expr
*final_expr
= NULL
;
1106 gfc_expr
*elem_size
= NULL
;
1107 bool has_finalizer
= false;
1109 if (!expr2
|| (expr2
->ts
.type
!= BT_DERIVED
&& expr2
->ts
.type
!= BT_CLASS
))
1112 if (expr2
->ts
.type
== BT_DERIVED
)
1114 gfc_is_finalizable (expr2
->ts
.u
.derived
, &final_expr
);
1119 /* If we have a class array, we need go back to the class
1121 expr
= gfc_copy_expr (expr2
);
1123 if (expr
->ref
&& expr
->ref
->next
&& !expr
->ref
->next
->next
1124 && expr
->ref
->next
->type
== REF_ARRAY
1125 && expr
->ref
->type
== REF_COMPONENT
1126 && strcmp (expr
->ref
->u
.c
.component
->name
, "_data") == 0)
1128 gfc_free_ref_list (expr
->ref
);
1132 for (ref
= expr
->ref
; ref
; ref
= ref
->next
)
1133 if (ref
->next
&& ref
->next
->next
&& !ref
->next
->next
->next
1134 && ref
->next
->next
->type
== REF_ARRAY
1135 && ref
->next
->type
== REF_COMPONENT
1136 && strcmp (ref
->next
->u
.c
.component
->name
, "_data") == 0)
1138 gfc_free_ref_list (ref
->next
);
1142 if (expr
->ts
.type
== BT_CLASS
)
1144 has_finalizer
= gfc_is_finalizable (expr
->ts
.u
.derived
, NULL
);
1146 if (!expr2
->rank
&& !expr2
->ref
&& CLASS_DATA (expr2
->symtree
->n
.sym
)->as
)
1147 expr
->rank
= CLASS_DATA (expr2
->symtree
->n
.sym
)->as
->rank
;
1149 final_expr
= gfc_copy_expr (expr
);
1150 gfc_add_vptr_component (final_expr
);
1151 gfc_add_component_ref (final_expr
, "_final");
1153 elem_size
= gfc_copy_expr (expr
);
1154 gfc_add_vptr_component (elem_size
);
1155 gfc_add_component_ref (elem_size
, "_size");
1158 gcc_assert (final_expr
->expr_type
== EXPR_VARIABLE
);
1160 tmp
= gfc_build_final_call (expr
->ts
, final_expr
, expr
,
1163 if (expr
->ts
.type
== BT_CLASS
&& !has_finalizer
)
1168 gfc_init_se (&se
, NULL
);
1169 se
.want_pointer
= 1;
1170 gfc_conv_expr (&se
, final_expr
);
1171 cond
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1172 se
.expr
, build_int_cst (TREE_TYPE (se
.expr
), 0));
1174 /* For CLASS(*) not only sym->_vtab->_final can be NULL
1175 but already sym->_vtab itself. */
1176 if (UNLIMITED_POLY (expr
))
1179 gfc_expr
*vptr_expr
;
1181 vptr_expr
= gfc_copy_expr (expr
);
1182 gfc_add_vptr_component (vptr_expr
);
1184 gfc_init_se (&se
, NULL
);
1185 se
.want_pointer
= 1;
1186 gfc_conv_expr (&se
, vptr_expr
);
1187 gfc_free_expr (vptr_expr
);
1189 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1191 build_int_cst (TREE_TYPE (se
.expr
), 0));
1192 cond
= fold_build2_loc (input_location
, TRUTH_ANDIF_EXPR
,
1193 boolean_type_node
, cond2
, cond
);
1196 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1197 cond
, tmp
, build_empty_stmt (input_location
));
1200 gfc_add_expr_to_block (block
, tmp
);
1206 /* User-deallocate; we emit the code directly from the front-end, and the
1207 logic is the same as the previous library function:
1210 deallocate (void *pointer, GFC_INTEGER_4 * stat)
1217 runtime_error ("Attempt to DEALLOCATE unallocated memory.");
1227 In this front-end version, status doesn't have to be GFC_INTEGER_4.
1228 Moreover, if CAN_FAIL is true, then we will not emit a runtime error,
1229 even when no status variable is passed to us (this is used for
1230 unconditional deallocation generated by the front-end at end of
1233 If a runtime-message is possible, `expr' must point to the original
1234 expression being deallocated for its locus and variable name.
1236 For coarrays, "pointer" must be the array descriptor and not its
1237 "data" component. */
1239 gfc_deallocate_with_status (tree pointer
, tree status
, tree errmsg
,
1240 tree errlen
, tree label_finish
,
1241 bool can_fail
, gfc_expr
* expr
, bool coarray
)
1243 stmtblock_t null
, non_null
;
1244 tree cond
, tmp
, error
;
1245 tree status_type
= NULL_TREE
;
1246 tree caf_decl
= NULL_TREE
;
1250 gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (pointer
)));
1252 pointer
= gfc_conv_descriptor_data_get (caf_decl
);
1253 STRIP_NOPS (pointer
);
1256 cond
= fold_build2_loc (input_location
, EQ_EXPR
, boolean_type_node
, pointer
,
1257 build_int_cst (TREE_TYPE (pointer
), 0));
1259 /* When POINTER is NULL, we set STATUS to 1 if it's present, otherwise
1260 we emit a runtime error. */
1261 gfc_start_block (&null
);
1266 gcc_assert (expr
&& expr
->expr_type
== EXPR_VARIABLE
&& expr
->symtree
);
1268 varname
= gfc_build_cstring_const (expr
->symtree
->name
);
1269 varname
= gfc_build_addr_expr (pchar_type_node
, varname
);
1271 error
= gfc_trans_runtime_error (true, &expr
->where
,
1272 "Attempt to DEALLOCATE unallocated '%s'",
1276 error
= build_empty_stmt (input_location
);
1278 if (status
!= NULL_TREE
&& !integer_zerop (status
))
1282 status_type
= TREE_TYPE (TREE_TYPE (status
));
1283 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1284 status
, build_int_cst (TREE_TYPE (status
), 0));
1285 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
1286 fold_build1_loc (input_location
, INDIRECT_REF
,
1287 status_type
, status
),
1288 build_int_cst (status_type
, 1));
1289 error
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1293 gfc_add_expr_to_block (&null
, error
);
1295 /* When POINTER is not NULL, we free it. */
1296 gfc_start_block (&non_null
);
1297 gfc_add_finalizer_call (&non_null
, expr
);
1298 if (!coarray
|| flag_coarray
!= GFC_FCOARRAY_LIB
)
1300 tmp
= build_call_expr_loc (input_location
,
1301 builtin_decl_explicit (BUILT_IN_FREE
), 1,
1302 fold_convert (pvoid_type_node
, pointer
));
1303 gfc_add_expr_to_block (&non_null
, tmp
);
1305 if (status
!= NULL_TREE
&& !integer_zerop (status
))
1307 /* We set STATUS to zero if it is present. */
1308 tree status_type
= TREE_TYPE (TREE_TYPE (status
));
1311 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1313 build_int_cst (TREE_TYPE (status
), 0));
1314 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
1315 fold_build1_loc (input_location
, INDIRECT_REF
,
1316 status_type
, status
),
1317 build_int_cst (status_type
, 0));
1318 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1319 gfc_unlikely (cond2
, PRED_FORTRAN_FAIL_ALLOC
),
1320 tmp
, build_empty_stmt (input_location
));
1321 gfc_add_expr_to_block (&non_null
, tmp
);
1326 tree caf_type
, token
, cond2
;
1327 tree pstat
= null_pointer_node
;
1329 if (errmsg
== NULL_TREE
)
1331 gcc_assert (errlen
== NULL_TREE
);
1332 errmsg
= null_pointer_node
;
1333 errlen
= build_zero_cst (integer_type_node
);
1337 gcc_assert (errlen
!= NULL_TREE
);
1338 if (!POINTER_TYPE_P (TREE_TYPE (errmsg
)))
1339 errmsg
= gfc_build_addr_expr (NULL_TREE
, errmsg
);
1342 caf_type
= TREE_TYPE (caf_decl
);
1344 if (status
!= NULL_TREE
&& !integer_zerop (status
))
1346 gcc_assert (status_type
== integer_type_node
);
1350 if (GFC_DESCRIPTOR_TYPE_P (caf_type
)
1351 && GFC_TYPE_ARRAY_AKIND (caf_type
) == GFC_ARRAY_ALLOCATABLE
)
1352 token
= gfc_conv_descriptor_token (caf_decl
);
1353 else if (DECL_LANG_SPECIFIC (caf_decl
)
1354 && GFC_DECL_TOKEN (caf_decl
) != NULL_TREE
)
1355 token
= GFC_DECL_TOKEN (caf_decl
);
1358 gcc_assert (GFC_ARRAY_TYPE_P (caf_type
)
1359 && GFC_TYPE_ARRAY_CAF_TOKEN (caf_type
) != NULL_TREE
);
1360 token
= GFC_TYPE_ARRAY_CAF_TOKEN (caf_type
);
1363 token
= gfc_build_addr_expr (NULL_TREE
, token
);
1364 tmp
= build_call_expr_loc (input_location
,
1365 gfor_fndecl_caf_deregister
, 4,
1366 token
, pstat
, errmsg
, errlen
);
1367 gfc_add_expr_to_block (&non_null
, tmp
);
1369 /* It guarantees memory consistency within the same segment */
1370 tmp
= gfc_build_string_const (strlen ("memory")+1, "memory"),
1371 tmp
= build5_loc (input_location
, ASM_EXPR
, void_type_node
,
1372 gfc_build_string_const (1, ""), NULL_TREE
, NULL_TREE
,
1373 tree_cons (NULL_TREE
, tmp
, NULL_TREE
), NULL_TREE
);
1374 ASM_VOLATILE_P (tmp
) = 1;
1375 gfc_add_expr_to_block (&non_null
, tmp
);
1377 if (status
!= NULL_TREE
)
1379 tree stat
= build_fold_indirect_ref_loc (input_location
, status
);
1381 TREE_USED (label_finish
) = 1;
1382 tmp
= build1_v (GOTO_EXPR
, label_finish
);
1383 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1384 stat
, build_zero_cst (TREE_TYPE (stat
)));
1385 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1386 gfc_unlikely (cond2
, PRED_FORTRAN_REALLOC
),
1387 tmp
, build_empty_stmt (input_location
));
1388 gfc_add_expr_to_block (&non_null
, tmp
);
1392 return fold_build3_loc (input_location
, COND_EXPR
, void_type_node
, cond
,
1393 gfc_finish_block (&null
),
1394 gfc_finish_block (&non_null
));
1398 /* Generate code for deallocation of allocatable scalars (variables or
1399 components). Before the object itself is freed, any allocatable
1400 subcomponents are being deallocated. */
1403 gfc_deallocate_scalar_with_status (tree pointer
, tree status
, bool can_fail
,
1404 gfc_expr
* expr
, gfc_typespec ts
)
1406 stmtblock_t null
, non_null
;
1407 tree cond
, tmp
, error
;
1410 cond
= fold_build2_loc (input_location
, EQ_EXPR
, boolean_type_node
, pointer
,
1411 build_int_cst (TREE_TYPE (pointer
), 0));
1413 /* When POINTER is NULL, we set STATUS to 1 if it's present, otherwise
1414 we emit a runtime error. */
1415 gfc_start_block (&null
);
1420 gcc_assert (expr
&& expr
->expr_type
== EXPR_VARIABLE
&& expr
->symtree
);
1422 varname
= gfc_build_cstring_const (expr
->symtree
->name
);
1423 varname
= gfc_build_addr_expr (pchar_type_node
, varname
);
1425 error
= gfc_trans_runtime_error (true, &expr
->where
,
1426 "Attempt to DEALLOCATE unallocated '%s'",
1430 error
= build_empty_stmt (input_location
);
1432 if (status
!= NULL_TREE
&& !integer_zerop (status
))
1434 tree status_type
= TREE_TYPE (TREE_TYPE (status
));
1437 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1438 status
, build_int_cst (TREE_TYPE (status
), 0));
1439 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
1440 fold_build1_loc (input_location
, INDIRECT_REF
,
1441 status_type
, status
),
1442 build_int_cst (status_type
, 1));
1443 error
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1447 gfc_add_expr_to_block (&null
, error
);
1449 /* When POINTER is not NULL, we free it. */
1450 gfc_start_block (&non_null
);
1452 /* Free allocatable components. */
1453 finalizable
= gfc_add_finalizer_call (&non_null
, expr
);
1454 if (!finalizable
&& ts
.type
== BT_DERIVED
&& ts
.u
.derived
->attr
.alloc_comp
)
1456 tmp
= build_fold_indirect_ref_loc (input_location
, pointer
);
1457 tmp
= gfc_deallocate_alloc_comp (ts
.u
.derived
, tmp
, 0);
1458 gfc_add_expr_to_block (&non_null
, tmp
);
1461 tmp
= build_call_expr_loc (input_location
,
1462 builtin_decl_explicit (BUILT_IN_FREE
), 1,
1463 fold_convert (pvoid_type_node
, pointer
));
1464 gfc_add_expr_to_block (&non_null
, tmp
);
1466 if (status
!= NULL_TREE
&& !integer_zerop (status
))
1468 /* We set STATUS to zero if it is present. */
1469 tree status_type
= TREE_TYPE (TREE_TYPE (status
));
1472 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1473 status
, build_int_cst (TREE_TYPE (status
), 0));
1474 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
1475 fold_build1_loc (input_location
, INDIRECT_REF
,
1476 status_type
, status
),
1477 build_int_cst (status_type
, 0));
1478 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
, cond2
,
1479 tmp
, build_empty_stmt (input_location
));
1480 gfc_add_expr_to_block (&non_null
, tmp
);
1483 return fold_build3_loc (input_location
, COND_EXPR
, void_type_node
, cond
,
1484 gfc_finish_block (&null
),
1485 gfc_finish_block (&non_null
));
1489 /* Reallocate MEM so it has SIZE bytes of data. This behaves like the
1490 following pseudo-code:
1493 internal_realloc (void *mem, size_t size)
1495 res = realloc (mem, size);
1496 if (!res && size != 0)
1497 _gfortran_os_error ("Allocation would exceed memory limit");
1502 gfc_call_realloc (stmtblock_t
* block
, tree mem
, tree size
)
1504 tree msg
, res
, nonzero
, null_result
, tmp
;
1505 tree type
= TREE_TYPE (mem
);
1507 /* Only evaluate the size once. */
1508 size
= save_expr (fold_convert (size_type_node
, size
));
1510 /* Create a variable to hold the result. */
1511 res
= gfc_create_var (type
, NULL
);
1513 /* Call realloc and check the result. */
1514 tmp
= build_call_expr_loc (input_location
,
1515 builtin_decl_explicit (BUILT_IN_REALLOC
), 2,
1516 fold_convert (pvoid_type_node
, mem
), size
);
1517 gfc_add_modify (block
, res
, fold_convert (type
, tmp
));
1518 null_result
= fold_build2_loc (input_location
, EQ_EXPR
, boolean_type_node
,
1519 res
, build_int_cst (pvoid_type_node
, 0));
1520 nonzero
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
, size
,
1521 build_int_cst (size_type_node
, 0));
1522 null_result
= fold_build2_loc (input_location
, TRUTH_AND_EXPR
, boolean_type_node
,
1523 null_result
, nonzero
);
1524 msg
= gfc_build_addr_expr (pchar_type_node
, gfc_build_localized_cstring_const
1525 ("Allocation would exceed memory limit"));
1526 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1528 build_call_expr_loc (input_location
,
1529 gfor_fndecl_os_error
, 1, msg
),
1530 build_empty_stmt (input_location
));
1531 gfc_add_expr_to_block (block
, tmp
);
1537 /* Add an expression to another one, either at the front or the back. */
1540 add_expr_to_chain (tree
* chain
, tree expr
, bool front
)
1542 if (expr
== NULL_TREE
|| IS_EMPTY_STMT (expr
))
1547 if (TREE_CODE (*chain
) != STATEMENT_LIST
)
1553 append_to_statement_list (tmp
, chain
);
1558 tree_stmt_iterator i
;
1560 i
= tsi_start (*chain
);
1561 tsi_link_before (&i
, expr
, TSI_CONTINUE_LINKING
);
1564 append_to_statement_list (expr
, chain
);
1571 /* Add a statement at the end of a block. */
1574 gfc_add_expr_to_block (stmtblock_t
* block
, tree expr
)
1577 add_expr_to_chain (&block
->head
, expr
, false);
1581 /* Add a statement at the beginning of a block. */
1584 gfc_prepend_expr_to_block (stmtblock_t
* block
, tree expr
)
1587 add_expr_to_chain (&block
->head
, expr
, true);
1591 /* Add a block the end of a block. */
1594 gfc_add_block_to_block (stmtblock_t
* block
, stmtblock_t
* append
)
1596 gcc_assert (append
);
1597 gcc_assert (!append
->has_scope
);
1599 gfc_add_expr_to_block (block
, append
->head
);
1600 append
->head
= NULL_TREE
;
1604 /* Save the current locus. The structure may not be complete, and should
1605 only be used with gfc_restore_backend_locus. */
1608 gfc_save_backend_locus (locus
* loc
)
1610 loc
->lb
= XCNEW (gfc_linebuf
);
1611 loc
->lb
->location
= input_location
;
1612 loc
->lb
->file
= gfc_current_backend_file
;
1616 /* Set the current locus. */
1619 gfc_set_backend_locus (locus
* loc
)
1621 gfc_current_backend_file
= loc
->lb
->file
;
1622 input_location
= loc
->lb
->location
;
1626 /* Restore the saved locus. Only used in conjunction with
1627 gfc_save_backend_locus, to free the memory when we are done. */
1630 gfc_restore_backend_locus (locus
* loc
)
1632 gfc_set_backend_locus (loc
);
1637 /* Translate an executable statement. The tree cond is used by gfc_trans_do.
1638 This static function is wrapped by gfc_trans_code_cond and
1642 trans_code (gfc_code
* code
, tree cond
)
1648 return build_empty_stmt (input_location
);
1650 gfc_start_block (&block
);
1652 /* Translate statements one by one into GENERIC trees until we reach
1653 the end of this gfc_code branch. */
1654 for (; code
; code
= code
->next
)
1656 if (code
->here
!= 0)
1658 res
= gfc_trans_label_here (code
);
1659 gfc_add_expr_to_block (&block
, res
);
1662 gfc_current_locus
= code
->loc
;
1663 gfc_set_backend_locus (&code
->loc
);
1668 case EXEC_END_BLOCK
:
1669 case EXEC_END_NESTED_BLOCK
:
1670 case EXEC_END_PROCEDURE
:
1675 if (code
->expr1
->ts
.type
== BT_CLASS
)
1676 res
= gfc_trans_class_assign (code
->expr1
, code
->expr2
, code
->op
);
1678 res
= gfc_trans_assign (code
);
1681 case EXEC_LABEL_ASSIGN
:
1682 res
= gfc_trans_label_assign (code
);
1685 case EXEC_POINTER_ASSIGN
:
1686 if (code
->expr1
->ts
.type
== BT_CLASS
)
1687 res
= gfc_trans_class_assign (code
->expr1
, code
->expr2
, code
->op
);
1688 else if (UNLIMITED_POLY (code
->expr2
)
1689 && code
->expr1
->ts
.type
== BT_DERIVED
1690 && (code
->expr1
->ts
.u
.derived
->attr
.sequence
1691 || code
->expr1
->ts
.u
.derived
->attr
.is_bind_c
))
1693 res
= gfc_trans_class_assign (code
->expr1
, code
->expr2
, code
->op
);
1695 res
= gfc_trans_pointer_assign (code
);
1698 case EXEC_INIT_ASSIGN
:
1699 if (code
->expr1
->ts
.type
== BT_CLASS
)
1700 res
= gfc_trans_class_init_assign (code
);
1702 res
= gfc_trans_init_assign (code
);
1710 res
= gfc_trans_critical (code
);
1714 res
= gfc_trans_cycle (code
);
1718 res
= gfc_trans_exit (code
);
1722 res
= gfc_trans_goto (code
);
1726 res
= gfc_trans_entry (code
);
1730 res
= gfc_trans_pause (code
);
1734 case EXEC_ERROR_STOP
:
1735 res
= gfc_trans_stop (code
, code
->op
== EXEC_ERROR_STOP
);
1739 /* For MVBITS we've got the special exception that we need a
1740 dependency check, too. */
1742 bool is_mvbits
= false;
1744 if (code
->resolved_isym
)
1746 res
= gfc_conv_intrinsic_subroutine (code
);
1747 if (res
!= NULL_TREE
)
1751 if (code
->resolved_isym
1752 && code
->resolved_isym
->id
== GFC_ISYM_MVBITS
)
1755 res
= gfc_trans_call (code
, is_mvbits
, NULL_TREE
,
1761 res
= gfc_trans_call (code
, false, NULL_TREE
,
1765 case EXEC_ASSIGN_CALL
:
1766 res
= gfc_trans_call (code
, true, NULL_TREE
,
1771 res
= gfc_trans_return (code
);
1775 res
= gfc_trans_if (code
);
1778 case EXEC_ARITHMETIC_IF
:
1779 res
= gfc_trans_arithmetic_if (code
);
1783 res
= gfc_trans_block_construct (code
);
1787 res
= gfc_trans_do (code
, cond
);
1790 case EXEC_DO_CONCURRENT
:
1791 res
= gfc_trans_do_concurrent (code
);
1795 res
= gfc_trans_do_while (code
);
1799 res
= gfc_trans_select (code
);
1802 case EXEC_SELECT_TYPE
:
1803 /* Do nothing. SELECT TYPE statements should be transformed into
1804 an ordinary SELECT CASE at resolution stage.
1805 TODO: Add an error message here once this is done. */
1810 res
= gfc_trans_flush (code
);
1814 case EXEC_SYNC_IMAGES
:
1815 case EXEC_SYNC_MEMORY
:
1816 res
= gfc_trans_sync (code
, code
->op
);
1821 res
= gfc_trans_lock_unlock (code
, code
->op
);
1824 case EXEC_EVENT_POST
:
1825 case EXEC_EVENT_WAIT
:
1826 res
= gfc_trans_event_post_wait (code
, code
->op
);
1830 res
= gfc_trans_forall (code
);
1834 res
= gfc_trans_where (code
);
1838 res
= gfc_trans_allocate (code
);
1841 case EXEC_DEALLOCATE
:
1842 res
= gfc_trans_deallocate (code
);
1846 res
= gfc_trans_open (code
);
1850 res
= gfc_trans_close (code
);
1854 res
= gfc_trans_read (code
);
1858 res
= gfc_trans_write (code
);
1862 res
= gfc_trans_iolength (code
);
1865 case EXEC_BACKSPACE
:
1866 res
= gfc_trans_backspace (code
);
1870 res
= gfc_trans_endfile (code
);
1874 res
= gfc_trans_inquire (code
);
1878 res
= gfc_trans_wait (code
);
1882 res
= gfc_trans_rewind (code
);
1886 res
= gfc_trans_transfer (code
);
1890 res
= gfc_trans_dt_end (code
);
1893 case EXEC_OMP_ATOMIC
:
1894 case EXEC_OMP_BARRIER
:
1895 case EXEC_OMP_CANCEL
:
1896 case EXEC_OMP_CANCELLATION_POINT
:
1897 case EXEC_OMP_CRITICAL
:
1898 case EXEC_OMP_DISTRIBUTE
:
1899 case EXEC_OMP_DISTRIBUTE_PARALLEL_DO
:
1900 case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD
:
1901 case EXEC_OMP_DISTRIBUTE_SIMD
:
1903 case EXEC_OMP_DO_SIMD
:
1904 case EXEC_OMP_FLUSH
:
1905 case EXEC_OMP_MASTER
:
1906 case EXEC_OMP_ORDERED
:
1907 case EXEC_OMP_PARALLEL
:
1908 case EXEC_OMP_PARALLEL_DO
:
1909 case EXEC_OMP_PARALLEL_DO_SIMD
:
1910 case EXEC_OMP_PARALLEL_SECTIONS
:
1911 case EXEC_OMP_PARALLEL_WORKSHARE
:
1912 case EXEC_OMP_SECTIONS
:
1914 case EXEC_OMP_SINGLE
:
1915 case EXEC_OMP_TARGET
:
1916 case EXEC_OMP_TARGET_DATA
:
1917 case EXEC_OMP_TARGET_TEAMS
:
1918 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE
:
1919 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO
:
1920 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD
:
1921 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD
:
1922 case EXEC_OMP_TARGET_UPDATE
:
1924 case EXEC_OMP_TASKGROUP
:
1925 case EXEC_OMP_TASKWAIT
:
1926 case EXEC_OMP_TASKYIELD
:
1927 case EXEC_OMP_TEAMS
:
1928 case EXEC_OMP_TEAMS_DISTRIBUTE
:
1929 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO
:
1930 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD
:
1931 case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD
:
1932 case EXEC_OMP_WORKSHARE
:
1933 res
= gfc_trans_omp_directive (code
);
1936 case EXEC_OACC_CACHE
:
1937 case EXEC_OACC_WAIT
:
1938 case EXEC_OACC_UPDATE
:
1939 case EXEC_OACC_LOOP
:
1940 case EXEC_OACC_HOST_DATA
:
1941 case EXEC_OACC_DATA
:
1942 case EXEC_OACC_KERNELS
:
1943 case EXEC_OACC_KERNELS_LOOP
:
1944 case EXEC_OACC_PARALLEL
:
1945 case EXEC_OACC_PARALLEL_LOOP
:
1946 case EXEC_OACC_ENTER_DATA
:
1947 case EXEC_OACC_EXIT_DATA
:
1948 case EXEC_OACC_ATOMIC
:
1949 case EXEC_OACC_DECLARE
:
1950 res
= gfc_trans_oacc_directive (code
);
1954 gfc_internal_error ("gfc_trans_code(): Bad statement code");
1957 gfc_set_backend_locus (&code
->loc
);
1959 if (res
!= NULL_TREE
&& ! IS_EMPTY_STMT (res
))
1961 if (TREE_CODE (res
) != STATEMENT_LIST
)
1962 SET_EXPR_LOCATION (res
, input_location
);
1964 /* Add the new statement to the block. */
1965 gfc_add_expr_to_block (&block
, res
);
1969 /* Return the finished block. */
1970 return gfc_finish_block (&block
);
1974 /* Translate an executable statement with condition, cond. The condition is
1975 used by gfc_trans_do to test for IO result conditions inside implied
1976 DO loops of READ and WRITE statements. See build_dt in trans-io.c. */
1979 gfc_trans_code_cond (gfc_code
* code
, tree cond
)
1981 return trans_code (code
, cond
);
1984 /* Translate an executable statement without condition. */
1987 gfc_trans_code (gfc_code
* code
)
1989 return trans_code (code
, NULL_TREE
);
1993 /* This function is called after a complete program unit has been parsed
1997 gfc_generate_code (gfc_namespace
* ns
)
2000 if (ns
->is_block_data
)
2002 gfc_generate_block_data (ns
);
2006 gfc_generate_function_code (ns
);
2010 /* This function is called after a complete module has been parsed
2014 gfc_generate_module_code (gfc_namespace
* ns
)
2017 struct module_htab_entry
*entry
;
2019 gcc_assert (ns
->proc_name
->backend_decl
== NULL
);
2020 ns
->proc_name
->backend_decl
2021 = build_decl (ns
->proc_name
->declared_at
.lb
->location
,
2022 NAMESPACE_DECL
, get_identifier (ns
->proc_name
->name
),
2024 entry
= gfc_find_module (ns
->proc_name
->name
);
2025 if (entry
->namespace_decl
)
2026 /* Buggy sourcecode, using a module before defining it? */
2027 entry
->decls
->empty ();
2028 entry
->namespace_decl
= ns
->proc_name
->backend_decl
;
2030 gfc_generate_module_vars (ns
);
2032 /* We need to generate all module function prototypes first, to allow
2034 for (n
= ns
->contained
; n
; n
= n
->sibling
)
2041 gfc_create_function_decl (n
, false);
2042 DECL_CONTEXT (n
->proc_name
->backend_decl
) = ns
->proc_name
->backend_decl
;
2043 gfc_module_add_decl (entry
, n
->proc_name
->backend_decl
);
2044 for (el
= ns
->entries
; el
; el
= el
->next
)
2046 DECL_CONTEXT (el
->sym
->backend_decl
) = ns
->proc_name
->backend_decl
;
2047 gfc_module_add_decl (entry
, el
->sym
->backend_decl
);
2051 for (n
= ns
->contained
; n
; n
= n
->sibling
)
2056 gfc_generate_function_code (n
);
2061 /* Initialize an init/cleanup block with existing code. */
2064 gfc_start_wrapped_block (gfc_wrapped_block
* block
, tree code
)
2068 block
->init
= NULL_TREE
;
2070 block
->cleanup
= NULL_TREE
;
2074 /* Add a new pair of initializers/clean-up code. */
2077 gfc_add_init_cleanup (gfc_wrapped_block
* block
, tree init
, tree cleanup
)
2081 /* The new pair of init/cleanup should be "wrapped around" the existing
2082 block of code, thus the initialization is added to the front and the
2083 cleanup to the back. */
2084 add_expr_to_chain (&block
->init
, init
, true);
2085 add_expr_to_chain (&block
->cleanup
, cleanup
, false);
2089 /* Finish up a wrapped block by building a corresponding try-finally expr. */
2092 gfc_finish_wrapped_block (gfc_wrapped_block
* block
)
2098 /* Build the final expression. For this, just add init and body together,
2099 and put clean-up with that into a TRY_FINALLY_EXPR. */
2100 result
= block
->init
;
2101 add_expr_to_chain (&result
, block
->code
, false);
2103 result
= build2_loc (input_location
, TRY_FINALLY_EXPR
, void_type_node
,
2104 result
, block
->cleanup
);
2106 /* Clear the block. */
2107 block
->init
= NULL_TREE
;
2108 block
->code
= NULL_TREE
;
2109 block
->cleanup
= NULL_TREE
;
2115 /* Helper function for marking a boolean expression tree as unlikely. */
2118 gfc_unlikely (tree cond
, enum br_predictor predictor
)
2124 cond
= fold_convert (long_integer_type_node
, cond
);
2125 tmp
= build_zero_cst (long_integer_type_node
);
2126 cond
= build_call_expr_loc (input_location
,
2127 builtin_decl_explicit (BUILT_IN_EXPECT
),
2129 build_int_cst (integer_type_node
,
2132 cond
= fold_convert (boolean_type_node
, cond
);
2137 /* Helper function for marking a boolean expression tree as likely. */
2140 gfc_likely (tree cond
, enum br_predictor predictor
)
2146 cond
= fold_convert (long_integer_type_node
, cond
);
2147 tmp
= build_one_cst (long_integer_type_node
);
2148 cond
= build_call_expr_loc (input_location
,
2149 builtin_decl_explicit (BUILT_IN_EXPECT
),
2151 build_int_cst (integer_type_node
,
2154 cond
= fold_convert (boolean_type_node
, cond
);
2159 /* Get the string length for a deferred character length component. */
2162 gfc_deferred_strlen (gfc_component
*c
, tree
*decl
)
2164 char name
[GFC_MAX_SYMBOL_LEN
+9];
2165 gfc_component
*strlen
;
2166 if (!(c
->ts
.type
== BT_CHARACTER
&& c
->ts
.deferred
))
2168 sprintf (name
, "_%s_length", c
->name
);
2169 for (strlen
= c
; strlen
; strlen
= strlen
->next
)
2170 if (strcmp (strlen
->name
, name
) == 0)
2172 *decl
= strlen
? strlen
->backend_decl
: NULL_TREE
;
2173 return strlen
!= NULL
;