trans-array.h 7.78 KB
Newer Older
1
/* Header for array handling functions
2
   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3
   Free Software Foundation, Inc.
4 5
   Contributed by Paul Brook

6
This file is part of GCC.
7

8 9
GCC is free software; you can redistribute it and/or modify it under
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
11
version.
12

13 14 15 16
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
17 18

You should have received a copy of the GNU General Public License
19 20
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
21 22

/* Generate code to free an array.  */
23
tree gfc_array_deallocate (tree, tree, gfc_expr*);
24

25
/* Generate code to initialize and allocate an array.  Statements are added to
26
   se, which should contain an expression for the array descriptor.  */
27
bool gfc_array_allocate (gfc_se *, gfc_expr *, tree, tree, tree, gfc_expr *);
28

29 30 31 32
/* Allow the bounds of a loop to be set from a callee's array spec.  */
void gfc_set_loop_bounds_from_array_spec (gfc_interface_mapping *,
					  gfc_se *, gfc_array_spec *);

33
/* Generate code to create a temporary array.  */
34 35
tree gfc_trans_create_temp_array (stmtblock_t *, stmtblock_t *, gfc_ss *,
				  tree, tree, bool, bool, bool, locus *);
36 37 38

/* Generate function entry code for allocation of compiler allocated array
   variables.  */
39
void gfc_trans_auto_array_allocation (tree, gfc_symbol *, gfc_wrapped_block *);
40
/* Generate entry and exit code for dummy array parameters.  */
41
void gfc_trans_dummy_array_bias (gfc_symbol *, tree, gfc_wrapped_block *);
42
/* Generate entry and exit code for g77 calling convention arrays.  */
43
void gfc_trans_g77_array (gfc_symbol *, gfc_wrapped_block *);
44 45
/* Generate code to deallocate an array, if it is allocated.  */
tree gfc_trans_dealloc_allocated (tree);
Paul Thomas committed
46

47 48 49
tree gfc_duplicate_allocatable (tree dest, tree src, tree type, int rank);

tree gfc_copy_allocatable_data (tree dest, tree src, tree type, int rank);
Paul Thomas committed
50 51 52 53 54 55 56

tree gfc_nullify_alloc_comp (gfc_symbol *, tree, int);

tree gfc_deallocate_alloc_comp (gfc_symbol *, tree, int);

tree gfc_copy_alloc_comp (gfc_symbol *, tree, tree, int);

57 58
tree gfc_copy_only_alloc_comp (gfc_symbol *, tree, tree, int);

59 60 61 62
tree gfc_alloc_allocatable_for_assignment (gfc_loopinfo*, gfc_expr*, gfc_expr*);

bool gfc_is_reallocatable_lhs (gfc_expr *);

63
/* Add initialization for deferred arrays.  */
64
void gfc_trans_deferred_array (gfc_symbol *, gfc_wrapped_block *);
65 66 67 68 69
/* Generate an initializer for a static pointer or allocatable array.  */
void gfc_trans_static_array_pointer (gfc_symbol *);

/* Generate scalarization information for an expression.  */
gfc_ss *gfc_walk_expr (gfc_expr *);
70 71
/* Workhorse for gfc_walk_expr.  */
gfc_ss *gfc_walk_subexpr (gfc_ss *, gfc_expr *);
72 73
/* Workhorse for gfc_walk_variable_expr.  */
gfc_ss *gfc_walk_array_ref (gfc_ss *, gfc_expr *, gfc_ref * ref);
74 75 76
/* Walk the arguments of an elemental function.  */
gfc_ss *gfc_walk_elemental_function_args (gfc_ss *, gfc_actual_arglist *,
					  gfc_ss_type);
77 78 79
/* Walk an intrinsic function.  */
gfc_ss *gfc_walk_intrinsic_function (gfc_ss *, gfc_expr *,
				     gfc_intrinsic_sym *);
80 81
/* Reverse the order of an SS chain.  */
gfc_ss *gfc_reverse_ss (gfc_ss *);
82

83
/* Free the SS associated with a loop.  */
84 85 86 87 88
void gfc_cleanup_loop (gfc_loopinfo *);
/* Associate a SS chain with a loop.  */
void gfc_add_ss_to_loop (gfc_loopinfo *, gfc_ss *);
/* Mark a SS chain as used in this loop.  */
void gfc_mark_ss_chain_used (gfc_ss *, unsigned);
89 90
/* Free a gfc_ss chain.  */
void gfc_free_ss_chain (gfc_ss *);
91 92
/* Free a single gfc_ss element.  */
void gfc_free_ss (gfc_ss *);
93 94
/* Allocate a new array type ss.  */
gfc_ss *gfc_get_array_ss (gfc_ss *, gfc_expr *, int, gfc_ss_type);
95 96
/* Allocate a new temporary type ss.  */
gfc_ss *gfc_get_temp_ss (tree, tree, int);
97 98
/* Allocate a new scalar type ss.  */
gfc_ss *gfc_get_scalar_ss (gfc_ss *, gfc_expr *);
99 100 101 102 103 104 105 106 107

/* Calculates the lower bound and stride of array sections.  */
void gfc_conv_ss_startstride (gfc_loopinfo *);

void gfc_init_loopinfo (gfc_loopinfo *);
void gfc_copy_loopinfo_to_se (gfc_se *, gfc_loopinfo *);

/* Marks the start of a scalarized expression, and declares loop variables.  */
void gfc_start_scalarized_body (gfc_loopinfo *, stmtblock_t *);
108 109
/* Generates one actual loop for a scalarized expression.  */
void  gfc_trans_scalarized_loop_end (gfc_loopinfo *, int, stmtblock_t *);
110 111 112 113
/* Generates the actual loops for a scalarized expression.  */
void gfc_trans_scalarizing_loops (gfc_loopinfo *, stmtblock_t *);
/* Mark the end of the main loop body and the start of the copying loop.  */
void gfc_trans_scalarized_loop_boundary (gfc_loopinfo *, stmtblock_t *);
114
/* Initialize the scalarization loop parameters.  */
115
void gfc_conv_loop_setup (gfc_loopinfo *, locus *);
116 117
/* Set each array's delta.  */
void gfc_set_delta (gfc_loopinfo *);
118 119
/* Resolve array assignment dependencies.  */
void gfc_conv_resolve_dependencies (gfc_loopinfo *, gfc_ss *, gfc_ss *);
120
/* Build a null array descriptor constructor.  */
121
tree gfc_build_null_descriptor (tree);
122 123

/* Get a single array element.  */
124
void gfc_conv_array_ref (gfc_se *, gfc_array_ref *, gfc_symbol *, locus *);
125 126 127 128 129 130 131 132
/* Translate a reference to a temporary array.  */
void gfc_conv_tmp_array_ref (gfc_se * se);
/* Translate a reference to an array temporary.  */
void gfc_conv_tmp_ref (gfc_se *);

/* Evaluate an array expression.  */
void gfc_conv_expr_descriptor (gfc_se *, gfc_expr *, gfc_ss *);
/* Convert an array for passing as an actual function parameter.  */
133
void gfc_conv_array_parameter (gfc_se *, gfc_expr *, gfc_ss *, bool,
134
			       const gfc_symbol *, const char *, tree *);
135 136
/* Evaluate and transpose a matrix expression.  */
void gfc_conv_array_transpose (gfc_se *, gfc_expr *);
137 138 139 140

/* These work with both descriptors and descriptorless arrays.  */
tree gfc_conv_array_data (tree);
tree gfc_conv_array_offset (tree);
141
/* Return either an INT_CST or an expression for that part of the descriptor.  */
142 143 144 145
tree gfc_conv_array_stride (tree, int);
tree gfc_conv_array_lbound (tree, int);
tree gfc_conv_array_ubound (tree, int);

146 147 148
/* Set cobounds of an array.  */
void gfc_trans_array_cobounds (tree, stmtblock_t *, const gfc_symbol *);

149
/* Build expressions for accessing components of an array descriptor.  */
150 151
tree gfc_conv_descriptor_data_get (tree);
tree gfc_conv_descriptor_data_addr (tree);
152
tree gfc_conv_descriptor_offset_get (tree);
153
tree gfc_conv_descriptor_dtype (tree);
154 155 156
tree gfc_conv_descriptor_stride_get (tree, tree);
tree gfc_conv_descriptor_lbound_get (tree, tree);
tree gfc_conv_descriptor_ubound_get (tree, tree);
157
tree gfc_conv_descriptor_token (tree);
158 159 160 161 162 163

void gfc_conv_descriptor_data_set (stmtblock_t *, tree, tree);
void gfc_conv_descriptor_offset_set (stmtblock_t *, tree, tree);
void gfc_conv_descriptor_stride_set (stmtblock_t *, tree, tree, tree);
void gfc_conv_descriptor_lbound_set (stmtblock_t *, tree, tree, tree);
void gfc_conv_descriptor_ubound_set (stmtblock_t *, tree, tree, tree);
164

165 166 167
/* Shift lower bound of descriptor, updating ubound and offset.  */
void gfc_conv_shift_descriptor_lbound (stmtblock_t*, tree, int, tree);

168 169 170
/* Add pre-loop scalarization code for intrinsic functions which require
   special handling.  */
void gfc_add_intrinsic_ss_code (gfc_loopinfo *, gfc_ss *);
171 172

/* Functions for constant array constructor processing.  */
Jerry DeLisle committed
173
unsigned HOST_WIDE_INT gfc_constant_array_constructor_p (gfc_constructor_base);
174
tree gfc_build_constant_array_constructor (gfc_expr *, tree);
175 176

/* Copy a string from src to dest.  */
177
void gfc_trans_string_copy (stmtblock_t *, tree, tree, int, tree, tree, int);
178 179 180 181

/* Calculate extent / size of an array.  */
tree gfc_conv_array_extent_dim (tree, tree, tree*);
tree gfc_conv_descriptor_size (tree, int);
182
tree gfc_conv_descriptor_cosize (tree, int, int);