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