(root)/
gcc-13.2.0/
gcc/
fortran/
trans-array.h
       1  /* Header for array handling functions
       2     Copyright (C) 2002-2023 Free Software Foundation, Inc.
       3     Contributed by Paul Brook
       4  
       5  This file is part of GCC.
       6  
       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
      10  version.
      11  
      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
      15  for more details.
      16  
      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/>.  */
      20  
      21  /* Generate code to initialize and allocate an array.  Statements are added to
      22     se, which should contain an expression for the array descriptor.  */
      23  bool gfc_array_allocate (gfc_se *, gfc_expr *, tree, tree, tree, tree,
      24  			 tree, tree *, gfc_expr *, tree, bool);
      25  
      26  /* Allow the bounds of a loop to be set from a callee's array spec.  */
      27  void gfc_set_loop_bounds_from_array_spec (gfc_interface_mapping *,
      28  					  gfc_se *, gfc_array_spec *);
      29  
      30  /* Generate code to create a temporary array.  */
      31  tree gfc_trans_create_temp_array (stmtblock_t *, stmtblock_t *, gfc_ss *,
      32  				  tree, tree, bool, bool, bool, locus *);
      33  
      34  /* Generate function entry code for allocation of compiler allocated array
      35     variables.  */
      36  void gfc_trans_auto_array_allocation (tree, gfc_symbol *, gfc_wrapped_block *);
      37  /* Generate entry and exit code for dummy array parameters.  */
      38  void gfc_trans_dummy_array_bias (gfc_symbol *, tree, gfc_wrapped_block *);
      39  /* Generate entry and exit code for g77 calling convention arrays.  */
      40  void gfc_trans_g77_array (gfc_symbol *, gfc_wrapped_block *);
      41  
      42  tree gfc_tree_array_size (stmtblock_t *, tree, gfc_expr *, tree);
      43  
      44  tree gfc_full_array_size (stmtblock_t *, tree, int);
      45  
      46  tree gfc_duplicate_allocatable (tree, tree, tree, int, tree);
      47  
      48  tree gfc_copy_allocatable_data (tree dest, tree src, tree type, int rank);
      49  
      50  tree gfc_duplicate_allocatable_nocopy (tree, tree, tree, int);
      51  
      52  bool gfc_caf_is_dealloc_only (int);
      53  
      54  tree gfc_nullify_alloc_comp (gfc_symbol *, tree, int, int cm = 0);
      55  
      56  tree gfc_deallocate_alloc_comp (gfc_symbol *, tree, int, int cm = 0);
      57  tree gfc_bcast_alloc_comp (gfc_symbol *, gfc_expr *, int, tree,
      58  			   tree, tree, tree);
      59  tree gfc_deallocate_alloc_comp_no_caf (gfc_symbol *, tree, int,
      60  				       bool no_finalization = false);
      61  tree gfc_reassign_alloc_comp_caf (gfc_symbol *, tree, tree);
      62  
      63  tree gfc_copy_alloc_comp (gfc_symbol *, tree, tree, int, int);
      64  
      65  tree gfc_copy_alloc_comp_no_fini (gfc_symbol *, tree, tree, int, int);
      66  
      67  tree gfc_copy_only_alloc_comp (gfc_symbol *, tree, tree, int);
      68  
      69  tree gfc_allocate_pdt_comp (gfc_symbol *, tree, int, gfc_actual_arglist *);
      70  tree gfc_deallocate_pdt_comp (gfc_symbol *, tree, int);
      71  tree gfc_check_pdt_dummy (gfc_symbol *, tree, int, gfc_actual_arglist *);
      72  
      73  tree gfc_alloc_allocatable_for_assignment (gfc_loopinfo*, gfc_expr*, gfc_expr*);
      74  
      75  /* Add initialization for class descriptors  */
      76  void gfc_trans_class_array (gfc_symbol *, gfc_wrapped_block *);
      77  /* Add initialization for deferred arrays.  */
      78  void gfc_trans_deferred_array (gfc_symbol *, gfc_wrapped_block *);
      79  /* Generate an initializer for a static pointer or allocatable array.  */
      80  void gfc_trans_static_array_pointer (gfc_symbol *);
      81  
      82  /* Get the procedure interface for a function call.  */
      83  gfc_symbol *gfc_get_proc_ifc_for_expr (gfc_expr *);
      84  /* Get the intrinsic symbol for an intrinsic function call.  */
      85  gfc_intrinsic_sym *gfc_get_intrinsic_for_expr (gfc_expr *);
      86  /* Generate scalarization information for an expression.  */
      87  gfc_ss *gfc_walk_expr (gfc_expr *);
      88  /* Workhorse for gfc_walk_expr.  */
      89  gfc_ss *gfc_walk_subexpr (gfc_ss *, gfc_expr *);
      90  /* Workhorse for gfc_walk_variable_expr.  */
      91  gfc_ss *gfc_walk_array_ref (gfc_ss *, gfc_expr *, gfc_ref * ref);
      92  /* Walk the arguments of an elemental function.  */
      93  gfc_ss *gfc_walk_elemental_function_args (gfc_ss *, gfc_actual_arglist *,
      94  					  gfc_intrinsic_sym *,
      95  					  gfc_ss_type);
      96  /* Walk an intrinsic function.  */
      97  gfc_ss *gfc_walk_intrinsic_function (gfc_ss *, gfc_expr *,
      98  				     gfc_intrinsic_sym *);
      99  /* Reverse the order of an SS chain.  */
     100  gfc_ss *gfc_reverse_ss (gfc_ss *);
     101  
     102  /* Free the SS associated with a loop.  */
     103  void gfc_cleanup_loop (gfc_loopinfo *);
     104  /* Associate a SS chain with a loop.  */
     105  void gfc_add_ss_to_loop (gfc_loopinfo *, gfc_ss *);
     106  /* Mark a SS chain as used in this loop.  */
     107  void gfc_mark_ss_chain_used (gfc_ss *, unsigned);
     108  /* Free a gfc_ss chain.  */
     109  void gfc_free_ss_chain (gfc_ss *);
     110  /* Free a single gfc_ss element.  */
     111  void gfc_free_ss (gfc_ss *);
     112  /* Allocate a new array type ss.  */
     113  gfc_ss *gfc_get_array_ss (gfc_ss *, gfc_expr *, int, gfc_ss_type);
     114  /* Allocate a new temporary type ss.  */
     115  gfc_ss *gfc_get_temp_ss (tree, tree, int);
     116  /* Allocate a new scalar type ss.  */
     117  gfc_ss *gfc_get_scalar_ss (gfc_ss *, gfc_expr *);
     118  
     119  bool gfc_scalar_elemental_arg_saved_as_reference (gfc_ss_info *);
     120  
     121  /* Calculates the lower bound and stride of array sections.  */
     122  void gfc_conv_ss_startstride (gfc_loopinfo *);
     123  
     124  void gfc_init_loopinfo (gfc_loopinfo *);
     125  void gfc_copy_loopinfo_to_se (gfc_se *, gfc_loopinfo *);
     126  
     127  /* Marks the start of a scalarized expression, and declares loop variables.  */
     128  void gfc_start_scalarized_body (gfc_loopinfo *, stmtblock_t *);
     129  /* Generates the actual loops for a scalarized expression.  */
     130  void gfc_trans_scalarizing_loops (gfc_loopinfo *, stmtblock_t *);
     131  /* Mark the end of the main loop body and the start of the copying loop.  */
     132  void gfc_trans_scalarized_loop_boundary (gfc_loopinfo *, stmtblock_t *);
     133  /* Initialize the scalarization loop parameters.  */
     134  void gfc_conv_loop_setup (gfc_loopinfo *, locus *);
     135  /* Set each array's delta.  */
     136  void gfc_set_delta (gfc_loopinfo *);
     137  /* Resolve array assignment dependencies.  */
     138  void gfc_conv_resolve_dependencies (gfc_loopinfo *, gfc_ss *, gfc_ss *);
     139  /* Build a null array descriptor constructor.  */
     140  tree gfc_build_null_descriptor (tree);
     141  
     142  /* Get a single array element.  */
     143  void gfc_conv_array_ref (gfc_se *, gfc_array_ref *, gfc_expr *, locus *);
     144  /* Translate a reference to a temporary array.  */
     145  void gfc_conv_tmp_array_ref (gfc_se * se);
     146  
     147  /* Calculate the overall offset, including subreferences.  */
     148  void gfc_get_dataptr_offset (stmtblock_t*, tree, tree, tree, bool, gfc_expr*);
     149  /* Obtain the span of an array.  */
     150  tree gfc_get_array_span (tree, gfc_expr *);
     151  /* Evaluate an array expression.  */
     152  void gfc_conv_expr_descriptor (gfc_se *, gfc_expr *);
     153  /* Convert an array for passing as an actual function parameter.  */
     154  void gfc_conv_array_parameter (gfc_se *, gfc_expr *, bool,
     155  			       const gfc_symbol *, const char *, tree *);
     156  
     157  /* These work with both descriptors and descriptorless arrays.  */
     158  tree gfc_conv_array_data (tree);
     159  tree gfc_conv_array_offset (tree);
     160  /* Return either an INT_CST or an expression for that part of the descriptor.  */
     161  tree gfc_conv_array_stride (tree, int);
     162  tree gfc_conv_array_lbound (tree, int);
     163  tree gfc_conv_array_ubound (tree, int);
     164  
     165  /* Set (co)bounds of an array.  */
     166  tree gfc_trans_array_bounds (tree, gfc_symbol *, tree *, stmtblock_t *);
     167  void gfc_trans_array_cobounds (tree, stmtblock_t *, const gfc_symbol *);
     168  
     169  /* Build expressions for accessing components of an array descriptor.  */
     170  void gfc_get_descriptor_offsets_for_info (const_tree, tree *, tree *, tree *, tree *,
     171  					  tree *, tree *, tree *, tree *);
     172  
     173  tree gfc_conv_descriptor_data_get (tree);
     174  tree gfc_conv_descriptor_data_addr (tree);
     175  tree gfc_conv_descriptor_offset_get (tree);
     176  tree gfc_conv_descriptor_span_get (tree);
     177  tree gfc_conv_descriptor_dtype (tree);
     178  tree gfc_conv_descriptor_rank (tree);
     179  tree gfc_conv_descriptor_elem_len (tree);
     180  tree gfc_conv_descriptor_attribute (tree);
     181  tree gfc_conv_descriptor_type (tree);
     182  tree gfc_get_descriptor_dimension (tree);
     183  tree gfc_conv_descriptor_stride_get (tree, tree);
     184  tree gfc_conv_descriptor_lbound_get (tree, tree);
     185  tree gfc_conv_descriptor_ubound_get (tree, tree);
     186  tree gfc_conv_descriptor_token (tree);
     187  
     188  void gfc_conv_descriptor_data_set (stmtblock_t *, tree, tree);
     189  void gfc_conv_descriptor_offset_set (stmtblock_t *, tree, tree);
     190  void gfc_conv_descriptor_span_set (stmtblock_t *, tree, tree);
     191  void gfc_conv_descriptor_stride_set (stmtblock_t *, tree, tree, tree);
     192  void gfc_conv_descriptor_lbound_set (stmtblock_t *, tree, tree, tree);
     193  void gfc_conv_descriptor_ubound_set (stmtblock_t *, tree, tree, tree);
     194  
     195  /* CFI descriptor.  */
     196  tree gfc_get_cfi_desc_base_addr (tree);
     197  tree gfc_get_cfi_desc_elem_len (tree);
     198  tree gfc_get_cfi_desc_version (tree);
     199  tree gfc_get_cfi_desc_rank (tree);
     200  tree gfc_get_cfi_desc_type (tree);
     201  tree gfc_get_cfi_desc_attribute (tree);
     202  tree gfc_get_cfi_dim_lbound (tree, tree);
     203  tree gfc_get_cfi_dim_extent (tree, tree);
     204  tree gfc_get_cfi_dim_sm (tree, tree);
     205  
     206  
     207  /* Shift lower bound of descriptor, updating ubound and offset.  */
     208  void gfc_conv_shift_descriptor_lbound (stmtblock_t*, tree, int, tree);
     209  
     210  /* Add pre-loop scalarization code for intrinsic functions which require
     211     special handling.  */
     212  void gfc_add_intrinsic_ss_code (gfc_loopinfo *, gfc_ss *);
     213  
     214  /* Functions for constant array constructor processing.  */
     215  unsigned HOST_WIDE_INT gfc_constant_array_constructor_p (gfc_constructor_base);
     216  tree gfc_build_constant_array_constructor (gfc_expr *, tree);
     217  
     218  /* Copy a string from src to dest.  */
     219  void gfc_trans_string_copy (stmtblock_t *, tree, tree, int, tree, tree, int);
     220  
     221  /* Calculate extent / size of an array.  */
     222  tree gfc_conv_array_extent_dim (tree, tree, tree*);
     223  tree gfc_conv_descriptor_size (tree, int);
     224  tree gfc_conv_descriptor_cosize (tree, int, int);