1 /* Code translation -- generate GCC trees from gfc_code.
2 Copyright (C) 2002-2013 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"
25 #include "gimple.h" /* For create_tmp_var_raw. */
26 #include "tree-iterator.h"
27 #include "diagnostic-core.h" /* For internal_error. */
31 #include "trans-stmt.h"
32 #include "trans-array.h"
33 #include "trans-types.h"
34 #include "trans-const.h"
36 /* Naming convention for backend interface code:
38 gfc_trans_* translate gfc_code into STMT trees.
40 gfc_conv_* expression conversion
42 gfc_get_* get a backend tree representation of a decl or type */
44 static gfc_file
*gfc_current_backend_file
;
46 const char gfc_msg_fault
[] = N_("Array reference out of bounds");
47 const char gfc_msg_wrong_return
[] = N_("Incorrect function return value");
50 /* Advance along TREE_CHAIN n times. */
53 gfc_advance_chain (tree t
, int n
)
57 gcc_assert (t
!= NULL_TREE
);
64 /* Strip off a legitimate source ending from the input
65 string NAME of length LEN. */
68 remove_suffix (char *name
, int len
)
72 for (i
= 2; i
< 8 && len
> i
; i
++)
74 if (name
[len
- i
] == '.')
83 /* Creates a variable declaration with a given TYPE. */
86 gfc_create_var_np (tree type
, const char *prefix
)
90 t
= create_tmp_var_raw (type
, prefix
);
92 /* No warnings for anonymous variables. */
94 TREE_NO_WARNING (t
) = 1;
100 /* Like above, but also adds it to the current scope. */
103 gfc_create_var (tree type
, const char *prefix
)
107 tmp
= gfc_create_var_np (type
, prefix
);
115 /* If the expression is not constant, evaluate it now. We assign the
116 result of the expression to an artificially created variable VAR, and
117 return a pointer to the VAR_DECL node for this variable. */
120 gfc_evaluate_now_loc (location_t loc
, tree expr
, stmtblock_t
* pblock
)
124 if (CONSTANT_CLASS_P (expr
))
127 var
= gfc_create_var (TREE_TYPE (expr
), NULL
);
128 gfc_add_modify_loc (loc
, pblock
, var
, expr
);
135 gfc_evaluate_now (tree expr
, stmtblock_t
* pblock
)
137 return gfc_evaluate_now_loc (input_location
, expr
, pblock
);
141 /* Build a MODIFY_EXPR node and add it to a given statement block PBLOCK.
142 A MODIFY_EXPR is an assignment:
146 gfc_add_modify_loc (location_t loc
, stmtblock_t
* pblock
, tree lhs
, tree rhs
)
150 #ifdef ENABLE_CHECKING
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. */
159 || AGGREGATE_TYPE_P (TREE_TYPE (lhs
)));
162 tmp
= fold_build2_loc (loc
, MODIFY_EXPR
, void_type_node
, lhs
,
164 gfc_add_expr_to_block (pblock
, tmp
);
169 gfc_add_modify (stmtblock_t
* pblock
, tree lhs
, tree rhs
)
171 gfc_add_modify_loc (input_location
, pblock
, lhs
, rhs
);
175 /* Create a new scope/binding level and initialize a block. Care must be
176 taken when translating expressions as any temporaries will be placed in
177 the innermost scope. */
180 gfc_start_block (stmtblock_t
* block
)
182 /* Start a new binding level. */
184 block
->has_scope
= 1;
186 /* The block is empty. */
187 block
->head
= NULL_TREE
;
191 /* Initialize a block without creating a new scope. */
194 gfc_init_block (stmtblock_t
* block
)
196 block
->head
= NULL_TREE
;
197 block
->has_scope
= 0;
201 /* Sometimes we create a scope but it turns out that we don't actually
202 need it. This function merges the scope of BLOCK with its parent.
203 Only variable decls will be merged, you still need to add the code. */
206 gfc_merge_block_scope (stmtblock_t
* block
)
211 gcc_assert (block
->has_scope
);
212 block
->has_scope
= 0;
214 /* Remember the decls in this scope. */
218 /* Add them to the parent scope. */
219 while (decl
!= NULL_TREE
)
221 next
= DECL_CHAIN (decl
);
222 DECL_CHAIN (decl
) = NULL_TREE
;
230 /* Finish a scope containing a block of statements. */
233 gfc_finish_block (stmtblock_t
* stmtblock
)
239 expr
= stmtblock
->head
;
241 expr
= build_empty_stmt (input_location
);
243 stmtblock
->head
= NULL_TREE
;
245 if (stmtblock
->has_scope
)
251 block
= poplevel (1, 0);
252 expr
= build3_v (BIND_EXPR
, decl
, expr
, block
);
262 /* Build an ADDR_EXPR and cast the result to TYPE. If TYPE is NULL, the
263 natural type is used. */
266 gfc_build_addr_expr (tree type
, tree t
)
268 tree base_type
= TREE_TYPE (t
);
271 if (type
&& POINTER_TYPE_P (type
)
272 && TREE_CODE (base_type
) == ARRAY_TYPE
273 && TYPE_MAIN_VARIANT (TREE_TYPE (type
))
274 == TYPE_MAIN_VARIANT (TREE_TYPE (base_type
)))
276 tree min_val
= size_zero_node
;
277 tree type_domain
= TYPE_DOMAIN (base_type
);
278 if (type_domain
&& TYPE_MIN_VALUE (type_domain
))
279 min_val
= TYPE_MIN_VALUE (type_domain
);
280 t
= fold (build4_loc (input_location
, ARRAY_REF
, TREE_TYPE (type
),
281 t
, min_val
, NULL_TREE
, NULL_TREE
));
285 natural_type
= build_pointer_type (base_type
);
287 if (TREE_CODE (t
) == INDIRECT_REF
)
291 t
= TREE_OPERAND (t
, 0);
292 natural_type
= TREE_TYPE (t
);
296 tree base
= get_base_address (t
);
297 if (base
&& DECL_P (base
))
298 TREE_ADDRESSABLE (base
) = 1;
299 t
= fold_build1_loc (input_location
, ADDR_EXPR
, natural_type
, t
);
302 if (type
&& natural_type
!= type
)
303 t
= convert (type
, t
);
309 /* Build an ARRAY_REF with its natural type. */
312 gfc_build_array_ref (tree base
, tree offset
, tree decl
)
314 tree type
= TREE_TYPE (base
);
318 if (GFC_ARRAY_TYPE_P (type
) && GFC_TYPE_ARRAY_RANK (type
) == 0)
320 gcc_assert (GFC_TYPE_ARRAY_CORANK (type
) > 0);
322 return fold_convert (TYPE_MAIN_VARIANT (type
), base
);
325 /* Scalar coarray, there is nothing to do. */
326 if (TREE_CODE (type
) != ARRAY_TYPE
)
328 gcc_assert (decl
== NULL_TREE
);
329 gcc_assert (integer_zerop (offset
));
333 type
= TREE_TYPE (type
);
336 TREE_ADDRESSABLE (base
) = 1;
338 /* Strip NON_LVALUE_EXPR nodes. */
339 STRIP_TYPE_NOPS (offset
);
341 /* If the array reference is to a pointer, whose target contains a
342 subreference, use the span that is stored with the backend decl
343 and reference the element with pointer arithmetic. */
344 if (decl
&& (TREE_CODE (decl
) == FIELD_DECL
345 || TREE_CODE (decl
) == VAR_DECL
346 || TREE_CODE (decl
) == PARM_DECL
)
347 && ((GFC_DECL_SUBREF_ARRAY_P (decl
)
348 && !integer_zerop (GFC_DECL_SPAN(decl
)))
349 || GFC_DECL_CLASS (decl
)))
351 if (GFC_DECL_CLASS (decl
))
353 /* Allow for dummy arguments and other good things. */
354 if (POINTER_TYPE_P (TREE_TYPE (decl
)))
355 decl
= build_fold_indirect_ref_loc (input_location
, decl
);
357 /* Check if '_data' is an array descriptor. If it is not,
358 the array must be one of the components of the class object,
359 so return a normal array reference. */
360 if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_class_data_get (decl
))))
361 return build4_loc (input_location
, ARRAY_REF
, type
, base
,
362 offset
, NULL_TREE
, NULL_TREE
);
364 span
= gfc_vtable_size_get (decl
);
366 else if (GFC_DECL_SUBREF_ARRAY_P (decl
))
367 span
= GFC_DECL_SPAN(decl
);
371 offset
= fold_build2_loc (input_location
, MULT_EXPR
,
372 gfc_array_index_type
,
374 tmp
= gfc_build_addr_expr (pvoid_type_node
, base
);
375 tmp
= fold_build_pointer_plus_loc (input_location
, tmp
, offset
);
376 tmp
= fold_convert (build_pointer_type (type
), tmp
);
377 if (!TYPE_STRING_FLAG (type
))
378 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
382 /* Otherwise use a straightforward array reference. */
383 return build4_loc (input_location
, ARRAY_REF
, type
, base
, offset
,
384 NULL_TREE
, NULL_TREE
);
388 /* Generate a call to print a runtime error possibly including multiple
389 arguments and a locus. */
392 trans_runtime_error_vararg (bool error
, locus
* where
, const char* msgid
,
405 /* Compute the number of extra arguments from the format string. */
406 for (p
= msgid
, nargs
= 0; *p
; p
++)
414 /* The code to generate the error. */
415 gfc_start_block (&block
);
419 line
= LOCATION_LINE (where
->lb
->location
);
420 asprintf (&message
, "At line %d of file %s", line
,
421 where
->lb
->file
->filename
);
424 asprintf (&message
, "In file '%s', around line %d",
425 gfc_source_file
, input_line
+ 1);
427 arg
= gfc_build_addr_expr (pchar_type_node
,
428 gfc_build_localized_cstring_const (message
));
431 asprintf (&message
, "%s", _(msgid
));
432 arg2
= gfc_build_addr_expr (pchar_type_node
,
433 gfc_build_localized_cstring_const (message
));
436 /* Build the argument array. */
437 argarray
= XALLOCAVEC (tree
, nargs
+ 2);
440 for (i
= 0; i
< nargs
; i
++)
441 argarray
[2 + i
] = va_arg (ap
, tree
);
443 /* Build the function call to runtime_(warning,error)_at; because of the
444 variable number of arguments, we can't use build_call_expr_loc dinput_location,
447 fntype
= TREE_TYPE (gfor_fndecl_runtime_error_at
);
449 fntype
= TREE_TYPE (gfor_fndecl_runtime_warning_at
);
451 loc
= where
? where
->lb
->location
: input_location
;
452 tmp
= fold_builtin_call_array (loc
, TREE_TYPE (fntype
),
453 fold_build1_loc (loc
, ADDR_EXPR
,
454 build_pointer_type (fntype
),
456 ? gfor_fndecl_runtime_error_at
457 : gfor_fndecl_runtime_warning_at
),
458 nargs
+ 2, argarray
);
459 gfc_add_expr_to_block (&block
, tmp
);
461 return gfc_finish_block (&block
);
466 gfc_trans_runtime_error (bool error
, locus
* where
, const char* msgid
, ...)
471 va_start (ap
, msgid
);
472 result
= trans_runtime_error_vararg (error
, where
, msgid
, ap
);
478 /* Generate a runtime error if COND is true. */
481 gfc_trans_runtime_check (bool error
, bool once
, tree cond
, stmtblock_t
* pblock
,
482 locus
* where
, const char * msgid
, ...)
490 if (integer_zerop (cond
))
495 tmpvar
= gfc_create_var (boolean_type_node
, "print_warning");
496 TREE_STATIC (tmpvar
) = 1;
497 DECL_INITIAL (tmpvar
) = boolean_true_node
;
498 gfc_add_expr_to_block (pblock
, tmpvar
);
501 gfc_start_block (&block
);
503 /* The code to generate the error. */
504 va_start (ap
, msgid
);
505 gfc_add_expr_to_block (&block
,
506 trans_runtime_error_vararg (error
, where
,
511 gfc_add_modify (&block
, tmpvar
, boolean_false_node
);
513 body
= gfc_finish_block (&block
);
515 if (integer_onep (cond
))
517 gfc_add_expr_to_block (pblock
, body
);
521 /* Tell the compiler that this isn't likely. */
523 cond
= fold_build2_loc (where
->lb
->location
, TRUTH_AND_EXPR
,
524 long_integer_type_node
, tmpvar
, cond
);
526 cond
= fold_convert (long_integer_type_node
, cond
);
528 cond
= gfc_unlikely (cond
);
529 tmp
= fold_build3_loc (where
->lb
->location
, COND_EXPR
, void_type_node
,
531 build_empty_stmt (where
->lb
->location
));
532 gfc_add_expr_to_block (pblock
, tmp
);
537 /* Call malloc to allocate size bytes of memory, with special conditions:
538 + if size == 0, return a malloced area of size 1,
539 + if malloc returns NULL, issue a runtime error. */
541 gfc_call_malloc (stmtblock_t
* block
, tree type
, tree size
)
543 tree tmp
, msg
, malloc_result
, null_result
, res
, malloc_tree
;
546 size
= gfc_evaluate_now (size
, block
);
548 if (TREE_TYPE (size
) != TREE_TYPE (size_type_node
))
549 size
= fold_convert (size_type_node
, size
);
551 /* Create a variable to hold the result. */
552 res
= gfc_create_var (prvoid_type_node
, NULL
);
555 gfc_start_block (&block2
);
557 size
= fold_build2_loc (input_location
, MAX_EXPR
, size_type_node
, size
,
558 build_int_cst (size_type_node
, 1));
560 malloc_tree
= builtin_decl_explicit (BUILT_IN_MALLOC
);
561 gfc_add_modify (&block2
, res
,
562 fold_convert (prvoid_type_node
,
563 build_call_expr_loc (input_location
,
564 malloc_tree
, 1, size
)));
566 /* Optionally check whether malloc was successful. */
567 if (gfc_option
.rtcheck
& GFC_RTCHECK_MEM
)
569 null_result
= fold_build2_loc (input_location
, EQ_EXPR
,
570 boolean_type_node
, res
,
571 build_int_cst (pvoid_type_node
, 0));
572 msg
= gfc_build_addr_expr (pchar_type_node
,
573 gfc_build_localized_cstring_const ("Memory allocation failed"));
574 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
576 build_call_expr_loc (input_location
,
577 gfor_fndecl_os_error
, 1, msg
),
578 build_empty_stmt (input_location
));
579 gfc_add_expr_to_block (&block2
, tmp
);
582 malloc_result
= gfc_finish_block (&block2
);
584 gfc_add_expr_to_block (block
, malloc_result
);
587 res
= fold_convert (type
, res
);
592 /* Allocate memory, using an optional status argument.
594 This function follows the following pseudo-code:
597 allocate (size_t size, integer_type stat)
604 newmem = malloc (MAX (size, 1));
608 *stat = LIBERROR_ALLOCATION;
610 runtime_error ("Allocation would exceed memory limit");
615 gfc_allocate_using_malloc (stmtblock_t
* block
, tree pointer
,
616 tree size
, tree status
)
618 tree tmp
, on_error
, error_cond
;
619 tree status_type
= status
? TREE_TYPE (status
) : NULL_TREE
;
621 /* Evaluate size only once, and make sure it has the right type. */
622 size
= gfc_evaluate_now (size
, block
);
623 if (TREE_TYPE (size
) != TREE_TYPE (size_type_node
))
624 size
= fold_convert (size_type_node
, size
);
626 /* If successful and stat= is given, set status to 0. */
627 if (status
!= NULL_TREE
)
628 gfc_add_expr_to_block (block
,
629 fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
630 status
, build_int_cst (status_type
, 0)));
632 /* The allocation itself. */
633 gfc_add_modify (block
, pointer
,
634 fold_convert (TREE_TYPE (pointer
),
635 build_call_expr_loc (input_location
,
636 builtin_decl_explicit (BUILT_IN_MALLOC
), 1,
637 fold_build2_loc (input_location
,
638 MAX_EXPR
, size_type_node
, size
,
639 build_int_cst (size_type_node
, 1)))));
641 /* What to do in case of error. */
642 if (status
!= NULL_TREE
)
643 on_error
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
644 status
, build_int_cst (status_type
, LIBERROR_ALLOCATION
));
646 on_error
= build_call_expr_loc (input_location
, gfor_fndecl_os_error
, 1,
647 gfc_build_addr_expr (pchar_type_node
,
648 gfc_build_localized_cstring_const
649 ("Allocation would exceed memory limit")));
651 error_cond
= fold_build2_loc (input_location
, EQ_EXPR
,
652 boolean_type_node
, pointer
,
653 build_int_cst (prvoid_type_node
, 0));
654 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
655 gfc_unlikely (error_cond
), on_error
,
656 build_empty_stmt (input_location
));
658 gfc_add_expr_to_block (block
, tmp
);
662 /* Allocate memory, using an optional status argument.
664 This function follows the following pseudo-code:
667 allocate (size_t size, void** token, int *stat, char* errmsg, int errlen)
671 newmem = _caf_register (size, regtype, token, &stat, errmsg, errlen);
675 gfc_allocate_using_lib (stmtblock_t
* block
, tree pointer
, tree size
,
676 tree token
, tree status
, tree errmsg
, tree errlen
)
680 gcc_assert (token
!= NULL_TREE
);
682 /* Evaluate size only once, and make sure it has the right type. */
683 size
= gfc_evaluate_now (size
, block
);
684 if (TREE_TYPE (size
) != TREE_TYPE (size_type_node
))
685 size
= fold_convert (size_type_node
, size
);
687 /* The allocation itself. */
688 if (status
== NULL_TREE
)
689 pstat
= null_pointer_node
;
691 pstat
= gfc_build_addr_expr (NULL_TREE
, status
);
693 if (errmsg
== NULL_TREE
)
695 gcc_assert(errlen
== NULL_TREE
);
696 errmsg
= null_pointer_node
;
697 errlen
= build_int_cst (integer_type_node
, 0);
700 tmp
= build_call_expr_loc (input_location
,
701 gfor_fndecl_caf_register
, 6,
702 fold_build2_loc (input_location
,
703 MAX_EXPR
, size_type_node
, size
,
704 build_int_cst (size_type_node
, 1)),
705 build_int_cst (integer_type_node
,
706 GFC_CAF_COARRAY_ALLOC
),
707 token
, pstat
, errmsg
, errlen
);
709 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
710 TREE_TYPE (pointer
), pointer
,
711 fold_convert ( TREE_TYPE (pointer
), tmp
));
712 gfc_add_expr_to_block (block
, tmp
);
716 /* Generate code for an ALLOCATE statement when the argument is an
717 allocatable variable. If the variable is currently allocated, it is an
718 error to allocate it again.
720 This function follows the following pseudo-code:
723 allocate_allocatable (void *mem, size_t size, integer_type stat)
726 return allocate (size, stat);
730 stat = LIBERROR_ALLOCATION;
732 runtime_error ("Attempting to allocate already allocated variable");
736 expr must be set to the original expression being allocated for its locus
737 and variable name in case a runtime error has to be printed. */
739 gfc_allocate_allocatable (stmtblock_t
* block
, tree mem
, tree size
, tree token
,
740 tree status
, tree errmsg
, tree errlen
, tree label_finish
,
743 stmtblock_t alloc_block
;
744 tree tmp
, null_mem
, alloc
, error
;
745 tree type
= TREE_TYPE (mem
);
747 if (TREE_TYPE (size
) != TREE_TYPE (size_type_node
))
748 size
= fold_convert (size_type_node
, size
);
750 null_mem
= gfc_unlikely (fold_build2_loc (input_location
, NE_EXPR
,
751 boolean_type_node
, mem
,
752 build_int_cst (type
, 0)));
754 /* If mem is NULL, we call gfc_allocate_using_malloc or
755 gfc_allocate_using_lib. */
756 gfc_start_block (&alloc_block
);
758 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
759 && gfc_expr_attr (expr
).codimension
)
763 gfc_allocate_using_lib (&alloc_block
, mem
, size
, token
, status
,
765 if (status
!= NULL_TREE
)
767 TREE_USED (label_finish
) = 1;
768 tmp
= build1_v (GOTO_EXPR
, label_finish
);
769 cond
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
770 status
, build_zero_cst (TREE_TYPE (status
)));
771 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
772 gfc_unlikely (cond
), tmp
,
773 build_empty_stmt (input_location
));
774 gfc_add_expr_to_block (&alloc_block
, tmp
);
778 gfc_allocate_using_malloc (&alloc_block
, mem
, size
, status
);
780 alloc
= gfc_finish_block (&alloc_block
);
782 /* If mem is not NULL, we issue a runtime error or set the
788 gcc_assert (expr
->expr_type
== EXPR_VARIABLE
&& expr
->symtree
);
789 varname
= gfc_build_cstring_const (expr
->symtree
->name
);
790 varname
= gfc_build_addr_expr (pchar_type_node
, varname
);
792 error
= gfc_trans_runtime_error (true, &expr
->where
,
793 "Attempting to allocate already"
794 " allocated variable '%s'",
798 error
= gfc_trans_runtime_error (true, NULL
,
799 "Attempting to allocate already allocated"
802 if (status
!= NULL_TREE
)
804 tree status_type
= TREE_TYPE (status
);
806 error
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
807 status
, build_int_cst (status_type
, LIBERROR_ALLOCATION
));
810 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
, null_mem
,
812 gfc_add_expr_to_block (block
, tmp
);
816 /* Free a given variable, if it's not NULL. */
818 gfc_call_free (tree var
)
821 tree tmp
, cond
, call
;
823 if (TREE_TYPE (var
) != TREE_TYPE (pvoid_type_node
))
824 var
= fold_convert (pvoid_type_node
, var
);
826 gfc_start_block (&block
);
827 var
= gfc_evaluate_now (var
, &block
);
828 cond
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
, var
,
829 build_int_cst (pvoid_type_node
, 0));
830 call
= build_call_expr_loc (input_location
,
831 builtin_decl_explicit (BUILT_IN_FREE
),
833 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
, cond
, call
,
834 build_empty_stmt (input_location
));
835 gfc_add_expr_to_block (&block
, tmp
);
837 return gfc_finish_block (&block
);
841 /* Build a call to a FINAL procedure, which finalizes "var". */
844 gfc_build_final_call (gfc_typespec ts
, gfc_expr
*final_wrapper
, gfc_expr
*var
,
845 bool fini_coarray
, gfc_expr
*class_size
)
849 tree final_fndecl
, array
, size
, tmp
;
850 symbol_attribute attr
;
852 gcc_assert (final_wrapper
->expr_type
== EXPR_VARIABLE
);
855 gfc_start_block (&block
);
856 gfc_init_se (&se
, NULL
);
857 gfc_conv_expr (&se
, final_wrapper
);
858 final_fndecl
= se
.expr
;
859 if (POINTER_TYPE_P (TREE_TYPE (final_fndecl
)))
860 final_fndecl
= build_fold_indirect_ref_loc (input_location
, final_fndecl
);
862 if (ts
.type
== BT_DERIVED
)
866 gcc_assert (!class_size
);
867 elem_size
= gfc_typenode_for_spec (&ts
);
868 elem_size
= TYPE_SIZE_UNIT (elem_size
);
869 size
= fold_convert (gfc_array_index_type
, elem_size
);
871 gfc_init_se (&se
, NULL
);
875 se
.descriptor_only
= 1;
876 gfc_conv_expr_descriptor (&se
, var
);
881 gfc_conv_expr (&se
, var
);
882 gcc_assert (se
.pre
.head
== NULL_TREE
&& se
.post
.head
== NULL_TREE
);
885 /* No copy back needed, hence set attr's allocatable/pointer
887 gfc_clear_attr (&attr
);
888 gfc_init_se (&se
, NULL
);
889 array
= gfc_conv_scalar_to_descriptor (&se
, array
, attr
);
890 gcc_assert (se
.post
.head
== NULL_TREE
);
895 gfc_expr
*array_expr
;
896 gcc_assert (class_size
);
897 gfc_init_se (&se
, NULL
);
898 gfc_conv_expr (&se
, class_size
);
899 gfc_add_block_to_block (&block
, &se
.pre
);
900 gcc_assert (se
.post
.head
== NULL_TREE
);
903 array_expr
= gfc_copy_expr (var
);
904 gfc_init_se (&se
, NULL
);
906 if (array_expr
->rank
)
908 gfc_add_class_array_ref (array_expr
);
909 se
.descriptor_only
= 1;
910 gfc_conv_expr_descriptor (&se
, array_expr
);
915 gfc_add_data_component (array_expr
);
916 gfc_conv_expr (&se
, array_expr
);
917 gfc_add_block_to_block (&block
, &se
.pre
);
918 gcc_assert (se
.post
.head
== NULL_TREE
);
920 if (TREE_CODE (array
) == ADDR_EXPR
921 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (array
, 0))))
922 tmp
= TREE_OPERAND (array
, 0);
924 if (!gfc_is_coarray (array_expr
))
926 /* No copy back needed, hence set attr's allocatable/pointer
928 gfc_clear_attr (&attr
);
929 gfc_init_se (&se
, NULL
);
930 array
= gfc_conv_scalar_to_descriptor (&se
, array
, attr
);
932 gcc_assert (se
.post
.head
== NULL_TREE
);
934 gfc_free_expr (array_expr
);
937 if (!POINTER_TYPE_P (TREE_TYPE (array
)))
938 array
= gfc_build_addr_expr (NULL
, array
);
940 gfc_add_block_to_block (&block
, &se
.pre
);
941 tmp
= build_call_expr_loc (input_location
,
942 final_fndecl
, 3, array
,
943 size
, fini_coarray
? boolean_true_node
944 : boolean_false_node
);
945 gfc_add_block_to_block (&block
, &se
.post
);
946 gfc_add_expr_to_block (&block
, tmp
);
947 return gfc_finish_block (&block
);
952 gfc_add_comp_finalizer_call (stmtblock_t
*block
, tree decl
, gfc_component
*comp
,
957 tree final_fndecl
, size
, array
, tmp
, cond
;
958 symbol_attribute attr
;
959 gfc_expr
*final_expr
= NULL
;
961 if (comp
->ts
.type
!= BT_DERIVED
&& comp
->ts
.type
!= BT_CLASS
)
964 gfc_init_block (&block2
);
966 if (comp
->ts
.type
== BT_DERIVED
)
968 if (comp
->attr
.pointer
)
971 gfc_is_finalizable (comp
->ts
.u
.derived
, &final_expr
);
975 gfc_init_se (&se
, NULL
);
976 gfc_conv_expr (&se
, final_expr
);
977 final_fndecl
= se
.expr
;
978 size
= gfc_typenode_for_spec (&comp
->ts
);
979 size
= TYPE_SIZE_UNIT (size
);
980 size
= fold_convert (gfc_array_index_type
, size
);
984 else /* comp->ts.type == BT_CLASS. */
986 if (CLASS_DATA (comp
)->attr
.class_pointer
)
989 gfc_is_finalizable (CLASS_DATA (comp
)->ts
.u
.derived
, &final_expr
);
990 final_fndecl
= gfc_vtable_final_get (decl
);
991 size
= gfc_vtable_size_get (decl
);
992 array
= gfc_class_data_get (decl
);
995 if (comp
->attr
.allocatable
996 || (comp
->ts
.type
== BT_CLASS
&& CLASS_DATA (comp
)->attr
.allocatable
))
998 tmp
= GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (array
))
999 ? gfc_conv_descriptor_data_get (array
) : array
;
1000 cond
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1001 tmp
, fold_convert (TREE_TYPE (tmp
),
1002 null_pointer_node
));
1005 cond
= boolean_true_node
;
1007 if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (array
)))
1009 gfc_clear_attr (&attr
);
1010 gfc_init_se (&se
, NULL
);
1011 array
= gfc_conv_scalar_to_descriptor (&se
, array
, attr
);
1012 gfc_add_block_to_block (&block2
, &se
.pre
);
1013 gcc_assert (se
.post
.head
== NULL_TREE
);
1016 if (!POINTER_TYPE_P (TREE_TYPE (array
)))
1017 array
= gfc_build_addr_expr (NULL
, array
);
1021 tmp
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1023 fold_convert (TREE_TYPE (final_fndecl
),
1024 null_pointer_node
));
1025 cond
= fold_build2_loc (input_location
, TRUTH_ANDIF_EXPR
,
1026 boolean_type_node
, cond
, tmp
);
1029 if (POINTER_TYPE_P (TREE_TYPE (final_fndecl
)))
1030 final_fndecl
= build_fold_indirect_ref_loc (input_location
, final_fndecl
);
1032 tmp
= build_call_expr_loc (input_location
,
1033 final_fndecl
, 3, array
,
1034 size
, fini_coarray
? boolean_true_node
1035 : boolean_false_node
);
1036 gfc_add_expr_to_block (&block2
, tmp
);
1037 tmp
= gfc_finish_block (&block2
);
1039 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
, cond
, tmp
,
1040 build_empty_stmt (input_location
));
1041 gfc_add_expr_to_block (block
, tmp
);
1047 /* Add a call to the finalizer, using the passed *expr. Returns
1048 true when a finalizer call has been inserted. */
1051 gfc_add_finalizer_call (stmtblock_t
*block
, gfc_expr
*expr2
)
1056 gfc_expr
*final_expr
= NULL
;
1057 gfc_expr
*elem_size
= NULL
;
1058 bool has_finalizer
= false;
1060 if (!expr2
|| (expr2
->ts
.type
!= BT_DERIVED
&& expr2
->ts
.type
!= BT_CLASS
))
1063 if (expr2
->ts
.type
== BT_DERIVED
)
1065 gfc_is_finalizable (expr2
->ts
.u
.derived
, &final_expr
);
1070 /* If we have a class array, we need go back to the class
1072 expr
= gfc_copy_expr (expr2
);
1074 if (expr
->ref
&& expr
->ref
->next
&& !expr
->ref
->next
->next
1075 && expr
->ref
->next
->type
== REF_ARRAY
1076 && expr
->ref
->type
== REF_COMPONENT
1077 && strcmp (expr
->ref
->u
.c
.component
->name
, "_data") == 0)
1079 gfc_free_ref_list (expr
->ref
);
1083 for (ref
= expr
->ref
; ref
; ref
= ref
->next
)
1084 if (ref
->next
&& ref
->next
->next
&& !ref
->next
->next
->next
1085 && ref
->next
->next
->type
== REF_ARRAY
1086 && ref
->next
->type
== REF_COMPONENT
1087 && strcmp (ref
->next
->u
.c
.component
->name
, "_data") == 0)
1089 gfc_free_ref_list (ref
->next
);
1093 if (expr
->ts
.type
== BT_CLASS
)
1095 has_finalizer
= gfc_is_finalizable (expr
->ts
.u
.derived
, NULL
);
1097 if (!expr2
->rank
&& !expr2
->ref
&& CLASS_DATA (expr2
->symtree
->n
.sym
)->as
)
1098 expr
->rank
= CLASS_DATA (expr2
->symtree
->n
.sym
)->as
->rank
;
1100 final_expr
= gfc_copy_expr (expr
);
1101 gfc_add_vptr_component (final_expr
);
1102 gfc_add_component_ref (final_expr
, "_final");
1104 elem_size
= gfc_copy_expr (expr
);
1105 gfc_add_vptr_component (elem_size
);
1106 gfc_add_component_ref (elem_size
, "_size");
1109 gcc_assert (final_expr
->expr_type
== EXPR_VARIABLE
);
1111 tmp
= gfc_build_final_call (expr
->ts
, final_expr
, expr
,
1114 if (expr
->ts
.type
== BT_CLASS
&& !has_finalizer
)
1119 gfc_init_se (&se
, NULL
);
1120 se
.want_pointer
= 1;
1121 gfc_conv_expr (&se
, final_expr
);
1122 cond
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1123 se
.expr
, build_int_cst (TREE_TYPE (se
.expr
), 0));
1125 /* For CLASS(*) not only sym->_vtab->_final can be NULL
1126 but already sym->_vtab itself. */
1127 if (UNLIMITED_POLY (expr
))
1130 gfc_expr
*vptr_expr
;
1132 vptr_expr
= gfc_copy_expr (expr
);
1133 gfc_add_vptr_component (vptr_expr
);
1135 gfc_init_se (&se
, NULL
);
1136 se
.want_pointer
= 1;
1137 gfc_conv_expr (&se
, vptr_expr
);
1138 gfc_free_expr (vptr_expr
);
1140 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1142 build_int_cst (TREE_TYPE (se
.expr
), 0));
1143 cond
= fold_build2_loc (input_location
, TRUTH_ANDIF_EXPR
,
1144 boolean_type_node
, cond2
, cond
);
1147 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1148 cond
, tmp
, build_empty_stmt (input_location
));
1151 gfc_add_expr_to_block (block
, tmp
);
1157 /* User-deallocate; we emit the code directly from the front-end, and the
1158 logic is the same as the previous library function:
1161 deallocate (void *pointer, GFC_INTEGER_4 * stat)
1168 runtime_error ("Attempt to DEALLOCATE unallocated memory.");
1178 In this front-end version, status doesn't have to be GFC_INTEGER_4.
1179 Moreover, if CAN_FAIL is true, then we will not emit a runtime error,
1180 even when no status variable is passed to us (this is used for
1181 unconditional deallocation generated by the front-end at end of
1184 If a runtime-message is possible, `expr' must point to the original
1185 expression being deallocated for its locus and variable name.
1187 For coarrays, "pointer" must be the array descriptor and not its
1188 "data" component. */
1190 gfc_deallocate_with_status (tree pointer
, tree status
, tree errmsg
,
1191 tree errlen
, tree label_finish
,
1192 bool can_fail
, gfc_expr
* expr
, bool coarray
)
1194 stmtblock_t null
, non_null
;
1195 tree cond
, tmp
, error
;
1196 tree status_type
= NULL_TREE
;
1197 tree caf_decl
= NULL_TREE
;
1201 gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (pointer
)));
1203 pointer
= gfc_conv_descriptor_data_get (caf_decl
);
1204 STRIP_NOPS (pointer
);
1207 cond
= fold_build2_loc (input_location
, EQ_EXPR
, boolean_type_node
, pointer
,
1208 build_int_cst (TREE_TYPE (pointer
), 0));
1210 /* When POINTER is NULL, we set STATUS to 1 if it's present, otherwise
1211 we emit a runtime error. */
1212 gfc_start_block (&null
);
1217 gcc_assert (expr
&& expr
->expr_type
== EXPR_VARIABLE
&& expr
->symtree
);
1219 varname
= gfc_build_cstring_const (expr
->symtree
->name
);
1220 varname
= gfc_build_addr_expr (pchar_type_node
, varname
);
1222 error
= gfc_trans_runtime_error (true, &expr
->where
,
1223 "Attempt to DEALLOCATE unallocated '%s'",
1227 error
= build_empty_stmt (input_location
);
1229 if (status
!= NULL_TREE
&& !integer_zerop (status
))
1233 status_type
= TREE_TYPE (TREE_TYPE (status
));
1234 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1235 status
, build_int_cst (TREE_TYPE (status
), 0));
1236 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
1237 fold_build1_loc (input_location
, INDIRECT_REF
,
1238 status_type
, status
),
1239 build_int_cst (status_type
, 1));
1240 error
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1244 gfc_add_expr_to_block (&null
, error
);
1246 /* When POINTER is not NULL, we free it. */
1247 gfc_start_block (&non_null
);
1248 gfc_add_finalizer_call (&non_null
, expr
);
1249 if (!coarray
|| gfc_option
.coarray
!= GFC_FCOARRAY_LIB
)
1251 tmp
= build_call_expr_loc (input_location
,
1252 builtin_decl_explicit (BUILT_IN_FREE
), 1,
1253 fold_convert (pvoid_type_node
, pointer
));
1254 gfc_add_expr_to_block (&non_null
, tmp
);
1256 if (status
!= NULL_TREE
&& !integer_zerop (status
))
1258 /* We set STATUS to zero if it is present. */
1259 tree status_type
= TREE_TYPE (TREE_TYPE (status
));
1262 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1264 build_int_cst (TREE_TYPE (status
), 0));
1265 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
1266 fold_build1_loc (input_location
, INDIRECT_REF
,
1267 status_type
, status
),
1268 build_int_cst (status_type
, 0));
1269 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1270 gfc_unlikely (cond2
), tmp
,
1271 build_empty_stmt (input_location
));
1272 gfc_add_expr_to_block (&non_null
, tmp
);
1277 tree caf_type
, token
, cond2
;
1278 tree pstat
= null_pointer_node
;
1280 if (errmsg
== NULL_TREE
)
1282 gcc_assert (errlen
== NULL_TREE
);
1283 errmsg
= null_pointer_node
;
1284 errlen
= build_zero_cst (integer_type_node
);
1288 gcc_assert (errlen
!= NULL_TREE
);
1289 if (!POINTER_TYPE_P (TREE_TYPE (errmsg
)))
1290 errmsg
= gfc_build_addr_expr (NULL_TREE
, errmsg
);
1293 caf_type
= TREE_TYPE (caf_decl
);
1295 if (status
!= NULL_TREE
&& !integer_zerop (status
))
1297 gcc_assert (status_type
== integer_type_node
);
1301 if (GFC_DESCRIPTOR_TYPE_P (caf_type
)
1302 && GFC_TYPE_ARRAY_AKIND (caf_type
) == GFC_ARRAY_ALLOCATABLE
)
1303 token
= gfc_conv_descriptor_token (caf_decl
);
1304 else if (DECL_LANG_SPECIFIC (caf_decl
)
1305 && GFC_DECL_TOKEN (caf_decl
) != NULL_TREE
)
1306 token
= GFC_DECL_TOKEN (caf_decl
);
1309 gcc_assert (GFC_ARRAY_TYPE_P (caf_type
)
1310 && GFC_TYPE_ARRAY_CAF_TOKEN (caf_type
) != NULL_TREE
);
1311 token
= GFC_TYPE_ARRAY_CAF_TOKEN (caf_type
);
1314 token
= gfc_build_addr_expr (NULL_TREE
, token
);
1315 tmp
= build_call_expr_loc (input_location
,
1316 gfor_fndecl_caf_deregister
, 4,
1317 token
, pstat
, errmsg
, errlen
);
1318 gfc_add_expr_to_block (&non_null
, tmp
);
1320 if (status
!= NULL_TREE
)
1322 tree stat
= build_fold_indirect_ref_loc (input_location
, status
);
1324 TREE_USED (label_finish
) = 1;
1325 tmp
= build1_v (GOTO_EXPR
, label_finish
);
1326 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1327 stat
, build_zero_cst (TREE_TYPE (stat
)));
1328 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1329 gfc_unlikely (cond2
), tmp
,
1330 build_empty_stmt (input_location
));
1331 gfc_add_expr_to_block (&non_null
, tmp
);
1335 return fold_build3_loc (input_location
, COND_EXPR
, void_type_node
, cond
,
1336 gfc_finish_block (&null
),
1337 gfc_finish_block (&non_null
));
1341 /* Generate code for deallocation of allocatable scalars (variables or
1342 components). Before the object itself is freed, any allocatable
1343 subcomponents are being deallocated. */
1346 gfc_deallocate_scalar_with_status (tree pointer
, tree status
, bool can_fail
,
1347 gfc_expr
* expr
, gfc_typespec ts
)
1349 stmtblock_t null
, non_null
;
1350 tree cond
, tmp
, error
;
1353 cond
= fold_build2_loc (input_location
, EQ_EXPR
, boolean_type_node
, pointer
,
1354 build_int_cst (TREE_TYPE (pointer
), 0));
1356 /* When POINTER is NULL, we set STATUS to 1 if it's present, otherwise
1357 we emit a runtime error. */
1358 gfc_start_block (&null
);
1363 gcc_assert (expr
&& expr
->expr_type
== EXPR_VARIABLE
&& expr
->symtree
);
1365 varname
= gfc_build_cstring_const (expr
->symtree
->name
);
1366 varname
= gfc_build_addr_expr (pchar_type_node
, varname
);
1368 error
= gfc_trans_runtime_error (true, &expr
->where
,
1369 "Attempt to DEALLOCATE unallocated '%s'",
1373 error
= build_empty_stmt (input_location
);
1375 if (status
!= NULL_TREE
&& !integer_zerop (status
))
1377 tree status_type
= TREE_TYPE (TREE_TYPE (status
));
1380 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1381 status
, build_int_cst (TREE_TYPE (status
), 0));
1382 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
1383 fold_build1_loc (input_location
, INDIRECT_REF
,
1384 status_type
, status
),
1385 build_int_cst (status_type
, 1));
1386 error
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1390 gfc_add_expr_to_block (&null
, error
);
1392 /* When POINTER is not NULL, we free it. */
1393 gfc_start_block (&non_null
);
1395 /* Free allocatable components. */
1396 finalizable
= gfc_add_finalizer_call (&non_null
, expr
);
1397 if (!finalizable
&& ts
.type
== BT_DERIVED
&& ts
.u
.derived
->attr
.alloc_comp
)
1399 tmp
= build_fold_indirect_ref_loc (input_location
, pointer
);
1400 tmp
= gfc_deallocate_alloc_comp (ts
.u
.derived
, tmp
, 0);
1401 gfc_add_expr_to_block (&non_null
, tmp
);
1404 tmp
= build_call_expr_loc (input_location
,
1405 builtin_decl_explicit (BUILT_IN_FREE
), 1,
1406 fold_convert (pvoid_type_node
, pointer
));
1407 gfc_add_expr_to_block (&non_null
, tmp
);
1409 if (status
!= NULL_TREE
&& !integer_zerop (status
))
1411 /* We set STATUS to zero if it is present. */
1412 tree status_type
= TREE_TYPE (TREE_TYPE (status
));
1415 cond2
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
,
1416 status
, build_int_cst (TREE_TYPE (status
), 0));
1417 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, status_type
,
1418 fold_build1_loc (input_location
, INDIRECT_REF
,
1419 status_type
, status
),
1420 build_int_cst (status_type
, 0));
1421 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
, cond2
,
1422 tmp
, build_empty_stmt (input_location
));
1423 gfc_add_expr_to_block (&non_null
, tmp
);
1426 return fold_build3_loc (input_location
, COND_EXPR
, void_type_node
, cond
,
1427 gfc_finish_block (&null
),
1428 gfc_finish_block (&non_null
));
1432 /* Reallocate MEM so it has SIZE bytes of data. This behaves like the
1433 following pseudo-code:
1436 internal_realloc (void *mem, size_t size)
1438 res = realloc (mem, size);
1439 if (!res && size != 0)
1440 _gfortran_os_error ("Allocation would exceed memory limit");
1445 gfc_call_realloc (stmtblock_t
* block
, tree mem
, tree size
)
1447 tree msg
, res
, nonzero
, null_result
, tmp
;
1448 tree type
= TREE_TYPE (mem
);
1450 size
= gfc_evaluate_now (size
, block
);
1452 if (TREE_TYPE (size
) != TREE_TYPE (size_type_node
))
1453 size
= fold_convert (size_type_node
, size
);
1455 /* Create a variable to hold the result. */
1456 res
= gfc_create_var (type
, NULL
);
1458 /* Call realloc and check the result. */
1459 tmp
= build_call_expr_loc (input_location
,
1460 builtin_decl_explicit (BUILT_IN_REALLOC
), 2,
1461 fold_convert (pvoid_type_node
, mem
), size
);
1462 gfc_add_modify (block
, res
, fold_convert (type
, tmp
));
1463 null_result
= fold_build2_loc (input_location
, EQ_EXPR
, boolean_type_node
,
1464 res
, build_int_cst (pvoid_type_node
, 0));
1465 nonzero
= fold_build2_loc (input_location
, NE_EXPR
, boolean_type_node
, size
,
1466 build_int_cst (size_type_node
, 0));
1467 null_result
= fold_build2_loc (input_location
, TRUTH_AND_EXPR
, boolean_type_node
,
1468 null_result
, nonzero
);
1469 msg
= gfc_build_addr_expr (pchar_type_node
, gfc_build_localized_cstring_const
1470 ("Allocation would exceed memory limit"));
1471 tmp
= fold_build3_loc (input_location
, COND_EXPR
, void_type_node
,
1473 build_call_expr_loc (input_location
,
1474 gfor_fndecl_os_error
, 1, msg
),
1475 build_empty_stmt (input_location
));
1476 gfc_add_expr_to_block (block
, tmp
);
1482 /* Add an expression to another one, either at the front or the back. */
1485 add_expr_to_chain (tree
* chain
, tree expr
, bool front
)
1487 if (expr
== NULL_TREE
|| IS_EMPTY_STMT (expr
))
1492 if (TREE_CODE (*chain
) != STATEMENT_LIST
)
1498 append_to_statement_list (tmp
, chain
);
1503 tree_stmt_iterator i
;
1505 i
= tsi_start (*chain
);
1506 tsi_link_before (&i
, expr
, TSI_CONTINUE_LINKING
);
1509 append_to_statement_list (expr
, chain
);
1516 /* Add a statement at the end of a block. */
1519 gfc_add_expr_to_block (stmtblock_t
* block
, tree expr
)
1522 add_expr_to_chain (&block
->head
, expr
, false);
1526 /* Add a statement at the beginning of a block. */
1529 gfc_prepend_expr_to_block (stmtblock_t
* block
, tree expr
)
1532 add_expr_to_chain (&block
->head
, expr
, true);
1536 /* Add a block the end of a block. */
1539 gfc_add_block_to_block (stmtblock_t
* block
, stmtblock_t
* append
)
1541 gcc_assert (append
);
1542 gcc_assert (!append
->has_scope
);
1544 gfc_add_expr_to_block (block
, append
->head
);
1545 append
->head
= NULL_TREE
;
1549 /* Save the current locus. The structure may not be complete, and should
1550 only be used with gfc_restore_backend_locus. */
1553 gfc_save_backend_locus (locus
* loc
)
1555 loc
->lb
= XCNEW (gfc_linebuf
);
1556 loc
->lb
->location
= input_location
;
1557 loc
->lb
->file
= gfc_current_backend_file
;
1561 /* Set the current locus. */
1564 gfc_set_backend_locus (locus
* loc
)
1566 gfc_current_backend_file
= loc
->lb
->file
;
1567 input_location
= loc
->lb
->location
;
1571 /* Restore the saved locus. Only used in conjunction with
1572 gfc_save_backend_locus, to free the memory when we are done. */
1575 gfc_restore_backend_locus (locus
* loc
)
1577 gfc_set_backend_locus (loc
);
1582 /* Translate an executable statement. The tree cond is used by gfc_trans_do.
1583 This static function is wrapped by gfc_trans_code_cond and
1587 trans_code (gfc_code
* code
, tree cond
)
1593 return build_empty_stmt (input_location
);
1595 gfc_start_block (&block
);
1597 /* Translate statements one by one into GENERIC trees until we reach
1598 the end of this gfc_code branch. */
1599 for (; code
; code
= code
->next
)
1601 if (code
->here
!= 0)
1603 res
= gfc_trans_label_here (code
);
1604 gfc_add_expr_to_block (&block
, res
);
1607 gfc_set_backend_locus (&code
->loc
);
1612 case EXEC_END_BLOCK
:
1613 case EXEC_END_NESTED_BLOCK
:
1614 case EXEC_END_PROCEDURE
:
1619 if (code
->expr1
->ts
.type
== BT_CLASS
)
1620 res
= gfc_trans_class_assign (code
->expr1
, code
->expr2
, code
->op
);
1622 res
= gfc_trans_assign (code
);
1625 case EXEC_LABEL_ASSIGN
:
1626 res
= gfc_trans_label_assign (code
);
1629 case EXEC_POINTER_ASSIGN
:
1630 if (code
->expr1
->ts
.type
== BT_CLASS
)
1631 res
= gfc_trans_class_assign (code
->expr1
, code
->expr2
, code
->op
);
1632 else if (UNLIMITED_POLY (code
->expr2
)
1633 && code
->expr1
->ts
.type
== BT_DERIVED
1634 && (code
->expr1
->ts
.u
.derived
->attr
.sequence
1635 || code
->expr1
->ts
.u
.derived
->attr
.is_bind_c
))
1637 res
= gfc_trans_class_assign (code
->expr1
, code
->expr2
, code
->op
);
1639 res
= gfc_trans_pointer_assign (code
);
1642 case EXEC_INIT_ASSIGN
:
1643 if (code
->expr1
->ts
.type
== BT_CLASS
)
1644 res
= gfc_trans_class_init_assign (code
);
1646 res
= gfc_trans_init_assign (code
);
1654 res
= gfc_trans_critical (code
);
1658 res
= gfc_trans_cycle (code
);
1662 res
= gfc_trans_exit (code
);
1666 res
= gfc_trans_goto (code
);
1670 res
= gfc_trans_entry (code
);
1674 res
= gfc_trans_pause (code
);
1678 case EXEC_ERROR_STOP
:
1679 res
= gfc_trans_stop (code
, code
->op
== EXEC_ERROR_STOP
);
1683 /* For MVBITS we've got the special exception that we need a
1684 dependency check, too. */
1686 bool is_mvbits
= false;
1688 if (code
->resolved_isym
)
1690 res
= gfc_conv_intrinsic_subroutine (code
);
1691 if (res
!= NULL_TREE
)
1695 if (code
->resolved_isym
1696 && code
->resolved_isym
->id
== GFC_ISYM_MVBITS
)
1699 res
= gfc_trans_call (code
, is_mvbits
, NULL_TREE
,
1705 res
= gfc_trans_call (code
, false, NULL_TREE
,
1709 case EXEC_ASSIGN_CALL
:
1710 res
= gfc_trans_call (code
, true, NULL_TREE
,
1715 res
= gfc_trans_return (code
);
1719 res
= gfc_trans_if (code
);
1722 case EXEC_ARITHMETIC_IF
:
1723 res
= gfc_trans_arithmetic_if (code
);
1727 res
= gfc_trans_block_construct (code
);
1731 res
= gfc_trans_do (code
, cond
);
1734 case EXEC_DO_CONCURRENT
:
1735 res
= gfc_trans_do_concurrent (code
);
1739 res
= gfc_trans_do_while (code
);
1743 res
= gfc_trans_select (code
);
1746 case EXEC_SELECT_TYPE
:
1747 /* Do nothing. SELECT TYPE statements should be transformed into
1748 an ordinary SELECT CASE at resolution stage.
1749 TODO: Add an error message here once this is done. */
1754 res
= gfc_trans_flush (code
);
1758 case EXEC_SYNC_IMAGES
:
1759 case EXEC_SYNC_MEMORY
:
1760 res
= gfc_trans_sync (code
, code
->op
);
1765 res
= gfc_trans_lock_unlock (code
, code
->op
);
1769 res
= gfc_trans_forall (code
);
1773 res
= gfc_trans_where (code
);
1777 res
= gfc_trans_allocate (code
);
1780 case EXEC_DEALLOCATE
:
1781 res
= gfc_trans_deallocate (code
);
1785 res
= gfc_trans_open (code
);
1789 res
= gfc_trans_close (code
);
1793 res
= gfc_trans_read (code
);
1797 res
= gfc_trans_write (code
);
1801 res
= gfc_trans_iolength (code
);
1804 case EXEC_BACKSPACE
:
1805 res
= gfc_trans_backspace (code
);
1809 res
= gfc_trans_endfile (code
);
1813 res
= gfc_trans_inquire (code
);
1817 res
= gfc_trans_wait (code
);
1821 res
= gfc_trans_rewind (code
);
1825 res
= gfc_trans_transfer (code
);
1829 res
= gfc_trans_dt_end (code
);
1832 case EXEC_OMP_ATOMIC
:
1833 case EXEC_OMP_BARRIER
:
1834 case EXEC_OMP_CRITICAL
:
1836 case EXEC_OMP_FLUSH
:
1837 case EXEC_OMP_MASTER
:
1838 case EXEC_OMP_ORDERED
:
1839 case EXEC_OMP_PARALLEL
:
1840 case EXEC_OMP_PARALLEL_DO
:
1841 case EXEC_OMP_PARALLEL_SECTIONS
:
1842 case EXEC_OMP_PARALLEL_WORKSHARE
:
1843 case EXEC_OMP_SECTIONS
:
1844 case EXEC_OMP_SINGLE
:
1846 case EXEC_OMP_TASKWAIT
:
1847 case EXEC_OMP_TASKYIELD
:
1848 case EXEC_OMP_WORKSHARE
:
1849 res
= gfc_trans_omp_directive (code
);
1853 internal_error ("gfc_trans_code(): Bad statement code");
1856 gfc_set_backend_locus (&code
->loc
);
1858 if (res
!= NULL_TREE
&& ! IS_EMPTY_STMT (res
))
1860 if (TREE_CODE (res
) != STATEMENT_LIST
)
1861 SET_EXPR_LOCATION (res
, input_location
);
1863 /* Add the new statement to the block. */
1864 gfc_add_expr_to_block (&block
, res
);
1868 /* Return the finished block. */
1869 return gfc_finish_block (&block
);
1873 /* Translate an executable statement with condition, cond. The condition is
1874 used by gfc_trans_do to test for IO result conditions inside implied
1875 DO loops of READ and WRITE statements. See build_dt in trans-io.c. */
1878 gfc_trans_code_cond (gfc_code
* code
, tree cond
)
1880 return trans_code (code
, cond
);
1883 /* Translate an executable statement without condition. */
1886 gfc_trans_code (gfc_code
* code
)
1888 return trans_code (code
, NULL_TREE
);
1892 /* This function is called after a complete program unit has been parsed
1896 gfc_generate_code (gfc_namespace
* ns
)
1899 if (ns
->is_block_data
)
1901 gfc_generate_block_data (ns
);
1905 gfc_generate_function_code (ns
);
1909 /* This function is called after a complete module has been parsed
1913 gfc_generate_module_code (gfc_namespace
* ns
)
1916 struct module_htab_entry
*entry
;
1918 gcc_assert (ns
->proc_name
->backend_decl
== NULL
);
1919 ns
->proc_name
->backend_decl
1920 = build_decl (ns
->proc_name
->declared_at
.lb
->location
,
1921 NAMESPACE_DECL
, get_identifier (ns
->proc_name
->name
),
1923 entry
= gfc_find_module (ns
->proc_name
->name
);
1924 if (entry
->namespace_decl
)
1925 /* Buggy sourcecode, using a module before defining it? */
1926 htab_empty (entry
->decls
);
1927 entry
->namespace_decl
= ns
->proc_name
->backend_decl
;
1929 gfc_generate_module_vars (ns
);
1931 /* We need to generate all module function prototypes first, to allow
1933 for (n
= ns
->contained
; n
; n
= n
->sibling
)
1940 gfc_create_function_decl (n
, false);
1941 DECL_CONTEXT (n
->proc_name
->backend_decl
) = ns
->proc_name
->backend_decl
;
1942 gfc_module_add_decl (entry
, n
->proc_name
->backend_decl
);
1943 for (el
= ns
->entries
; el
; el
= el
->next
)
1945 DECL_CONTEXT (el
->sym
->backend_decl
) = ns
->proc_name
->backend_decl
;
1946 gfc_module_add_decl (entry
, el
->sym
->backend_decl
);
1950 for (n
= ns
->contained
; n
; n
= n
->sibling
)
1955 gfc_generate_function_code (n
);
1960 /* Initialize an init/cleanup block with existing code. */
1963 gfc_start_wrapped_block (gfc_wrapped_block
* block
, tree code
)
1967 block
->init
= NULL_TREE
;
1969 block
->cleanup
= NULL_TREE
;
1973 /* Add a new pair of initializers/clean-up code. */
1976 gfc_add_init_cleanup (gfc_wrapped_block
* block
, tree init
, tree cleanup
)
1980 /* The new pair of init/cleanup should be "wrapped around" the existing
1981 block of code, thus the initialization is added to the front and the
1982 cleanup to the back. */
1983 add_expr_to_chain (&block
->init
, init
, true);
1984 add_expr_to_chain (&block
->cleanup
, cleanup
, false);
1988 /* Finish up a wrapped block by building a corresponding try-finally expr. */
1991 gfc_finish_wrapped_block (gfc_wrapped_block
* block
)
1997 /* Build the final expression. For this, just add init and body together,
1998 and put clean-up with that into a TRY_FINALLY_EXPR. */
1999 result
= block
->init
;
2000 add_expr_to_chain (&result
, block
->code
, false);
2002 result
= build2_loc (input_location
, TRY_FINALLY_EXPR
, void_type_node
,
2003 result
, block
->cleanup
);
2005 /* Clear the block. */
2006 block
->init
= NULL_TREE
;
2007 block
->code
= NULL_TREE
;
2008 block
->cleanup
= NULL_TREE
;
2014 /* Helper function for marking a boolean expression tree as unlikely. */
2017 gfc_unlikely (tree cond
)
2021 cond
= fold_convert (long_integer_type_node
, cond
);
2022 tmp
= build_zero_cst (long_integer_type_node
);
2023 cond
= build_call_expr_loc (input_location
,
2024 builtin_decl_explicit (BUILT_IN_EXPECT
),
2026 cond
= fold_convert (boolean_type_node
, cond
);
2031 /* Helper function for marking a boolean expression tree as likely. */
2034 gfc_likely (tree cond
)
2038 cond
= fold_convert (long_integer_type_node
, cond
);
2039 tmp
= build_one_cst (long_integer_type_node
);
2040 cond
= build_call_expr_loc (input_location
,
2041 builtin_decl_explicit (BUILT_IN_EXPECT
),
2043 cond
= fold_convert (boolean_type_node
, cond
);