diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-08-29 12:44:32 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-08-29 12:44:32 +0000 |
commit | 4376b7cf2b7d906c1952205ec3242e689f84f671 (patch) | |
tree | 01404bd7b2cf9f1674f08538ac495ecf3cd28d04 /gcc/fortran/trans-array.c | |
parent | 31fa49984f6d6b2a6f90296867004265ea395e07 (diff) | |
download | gcc-4376b7cf2b7d906c1952205ec3242e689f84f671.zip gcc-4376b7cf2b7d906c1952205ec3242e689f84f671.tar.gz gcc-4376b7cf2b7d906c1952205ec3242e689f84f671.tar.bz2 |
builtin-types.def (BT_FN_PTR_PTR_SIZE): New type.
* builtin-types.def (BT_FN_PTR_PTR_SIZE): New type.
* builtins.def (BUILT_IN_REALLOC): New builtin.
* trans-array.c (gfc_grow_array): Use gfc_call_realloc.
(gfc_array_allocate): Use gfc_allocate_with_status and
gfc_allocate_array_with_status.
(gfc_array_deallocate): Use gfc_deallocate_with_status.
(gfc_trans_dealloc_allocated): Use gfc_deallocate_with_status.
* trans-stmt.c (gfc_trans_allocate): Use gfc_allocate_with_status.
(gfc_trans_deallocate): Use gfc_deallocate_with_status.
* trans.c (gfc_allocate_with_status, gfc_allocate_array_with_status,
gfc_deallocate_with_status, gfc_call_realloc): New functions.
* trans.h (gfc_allocate_with_status, gfc_allocate_array_with_status,
gfc_deallocate_with_status, gfc_call_realloc): New prototypes.
(gfor_fndecl_internal_realloc, gfor_fndecl_allocate,
gfor_fndecl_allocate_array, gfor_fndecl_deallocate): Remove.
* f95-lang.c (gfc_init_builtin_functions): Create decl for
BUILT_IN_REALLOC.
* trans-decl.c (gfor_fndecl_internal_realloc,
gfor_fndecl_allocate, gfor_fndecl_allocate_array,
gfor_fndecl_deallocate): Remove function decls.
(gfc_build_builtin_function_decls): Likewise.
* runtime/memory.c (internal_realloc, allocate, allocate_array,
deallocate): Remove functions.
* gfortran.map (_gfortran_allocate, _gfortran_allocate_array,
_gfortran_deallocate, _gfortran_internal_realloc): Remove symbols.
* libgfortran.h (error_codes): Add comment.
* gfortran.dg/alloc_comp_basics_1.f90: Update check.
* gfortran.dg/alloc_comp_constructor_1.f90: Update check.
From-SVN: r127897
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 39 |
1 files changed, 9 insertions, 30 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 73a57e8..09d20cd 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -843,17 +843,11 @@ gfc_grow_array (stmtblock_t * pblock, tree desc, tree extra) /* Calculate the new array size. */ size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (desc))); tmp = build2 (PLUS_EXPR, gfc_array_index_type, ubound, gfc_index_one_node); - arg1 = build2 (MULT_EXPR, gfc_array_index_type, tmp, - fold_convert (gfc_array_index_type, size)); + arg1 = build2 (MULT_EXPR, size_type_node, fold_convert (size_type_node, tmp), + fold_convert (size_type_node, size)); - /* Pick the realloc function. */ - if (gfc_index_integer_kind == 4 || gfc_index_integer_kind == 8) - tmp = gfor_fndecl_internal_realloc; - else - gcc_unreachable (); - - /* Set the new data pointer. */ - tmp = build_call_expr (tmp, 2, arg0, arg1); + /* Call the realloc() function. */ + tmp = gfc_call_realloc (pblock, arg0, arg1); gfc_conv_descriptor_data_set (pblock, desc, tmp); } @@ -3571,7 +3565,6 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat) { tree tmp; tree pointer; - tree allocate; tree offset; tree size; gfc_expr **lower; @@ -3629,22 +3622,11 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat) pointer = gfc_conv_descriptor_data_get (se->expr); STRIP_NOPS (pointer); - if (TYPE_PRECISION (gfc_array_index_type) == 32 || - TYPE_PRECISION (gfc_array_index_type) == 64) - { - if (allocatable_array) - allocate = gfor_fndecl_allocate_array; - else - allocate = gfor_fndecl_allocate; - } - else - gcc_unreachable (); - /* The allocate_array variants take the old pointer as first argument. */ if (allocatable_array) - tmp = build_call_expr (allocate, 3, pointer, size, pstat); + tmp = gfc_allocate_array_with_status (&se->pre, pointer, size, pstat); else - tmp = build_call_expr (allocate, 2, size, pstat); + tmp = gfc_allocate_with_status (&se->pre, size, pstat); tmp = build2 (MODIFY_EXPR, void_type_node, pointer, tmp); gfc_add_expr_to_block (&se->pre, tmp); @@ -3680,7 +3662,7 @@ gfc_array_deallocate (tree descriptor, tree pstat) STRIP_NOPS (var); /* Parameter is the address of the data component. */ - tmp = build_call_expr (gfor_fndecl_deallocate, 2, var, pstat); + tmp = gfc_deallocate_with_status (var, pstat, false); gfc_add_expr_to_block (&block, tmp); /* Zero the data pointer. */ @@ -4998,7 +4980,6 @@ tree gfc_trans_dealloc_allocated (tree descriptor) { tree tmp; - tree ptr; tree var; stmtblock_t block; @@ -5006,13 +4987,11 @@ gfc_trans_dealloc_allocated (tree descriptor) var = gfc_conv_descriptor_data_get (descriptor); STRIP_NOPS (var); - tmp = gfc_create_var (gfc_array_index_type, NULL); - ptr = build_fold_addr_expr (tmp); - /* Call array_deallocate with an int* present in the second argument. + /* Call array_deallocate with an int * present in the second argument. Although it is ignored here, it's presence ensures that arrays that are already deallocated are ignored. */ - tmp = build_call_expr (gfor_fndecl_deallocate, 2, var, ptr); + tmp = gfc_deallocate_with_status (var, NULL_TREE, true); gfc_add_expr_to_block (&block, tmp); /* Zero the data pointer. */ |