Commit ea6363a3 by Daniel Carrera Committed by Tobias Burnus

trans-array.c (gfc_array_allocate): Rename allocatable_array

2011-07-06  Daniel Carrera <dcarrera@gmail.com>

        * trans-array.c (gfc_array_allocate): Rename allocatable_array
        * to
        allocatable. Rename function gfc_allocate_array_with_status to
        gfc_allocate_allocatable_with_status. Update function call for
        gfc_allocate_with_status.
        * trans-opemp.c (gfc_omp_clause_default_ctor): Rename function
        gfc_allocate_array_with_status to gfc_allocate_allocatable_with_status.
        * trans-stmt.c (gfc_trans_allocate): Update function call for
        gfc_allocate_with_status. Rename function gfc_allocate_array_with_status
        to gfc_allocate_allocatable_with_status.
        * trans.c (gfc_call_malloc): Add new parameter
        * gfc_allocate_with_status
        so it uses the library for memory allocation when -fcoarray=lib.
        (gfc_allocate_allocatable_with_status): Renamed from
        gfc_allocate_array_with_status.
        (gfc_allocate_allocatable_with_status): Update function call for
        gfc_allocate_with_status.
        * trans.h (gfc_coarray_type): New enum.
        (gfc_allocate_with_status): Update prototype.
        (gfc_allocate_allocatable_with_status): Renamed from
        gfc_allocate_array_with_status.
        * trans-decl.c (generate_coarray_sym_init): Use the new constant
        GFC_CAF_COARRAY_ALLOC in the call to gfor_fndecl_caf_register.

From-SVN: r175937
parent b7758f22
2011-07-06 Daniel Carrera <dcarrera@gmail.com>
* trans-array.c (gfc_array_allocate): Rename allocatable_array to
allocatable. Rename function gfc_allocate_array_with_status to
gfc_allocate_allocatable_with_status. Update function call for
gfc_allocate_with_status.
* trans-opemp.c (gfc_omp_clause_default_ctor): Rename function
gfc_allocate_array_with_status to gfc_allocate_allocatable_with_status.
* trans-stmt.c (gfc_trans_allocate): Update function call for
gfc_allocate_with_status. Rename function gfc_allocate_array_with_status
to gfc_allocate_allocatable_with_status.
* trans.c (gfc_call_malloc): Add new parameter gfc_allocate_with_status
so it uses the library for memory allocation when -fcoarray=lib.
(gfc_allocate_allocatable_with_status): Renamed from
gfc_allocate_array_with_status.
(gfc_allocate_allocatable_with_status): Update function call for
gfc_allocate_with_status.
* trans.h (gfc_coarray_type): New enum.
(gfc_allocate_with_status): Update prototype.
(gfc_allocate_allocatable_with_status): Renamed from
gfc_allocate_array_with_status.
* trans-decl.c (generate_coarray_sym_init): Use the new constant
GFC_CAF_COARRAY_ALLOC in the call to gfor_fndecl_caf_register.
2011-07-06 Richard Guenther <rguenther@suse.de> 2011-07-06 Richard Guenther <rguenther@suse.de>
* f95-lang.c (gfc_init_decl_processing): * f95-lang.c (gfc_init_decl_processing):
......
...@@ -4381,7 +4381,7 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat) ...@@ -4381,7 +4381,7 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat)
gfc_expr **lower; gfc_expr **lower;
gfc_expr **upper; gfc_expr **upper;
gfc_ref *ref, *prev_ref = NULL; gfc_ref *ref, *prev_ref = NULL;
bool allocatable_array, coarray; bool allocatable, coarray;
ref = expr->ref; ref = expr->ref;
...@@ -4399,12 +4399,12 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat) ...@@ -4399,12 +4399,12 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat)
if (!prev_ref) if (!prev_ref)
{ {
allocatable_array = expr->symtree->n.sym->attr.allocatable; allocatable = expr->symtree->n.sym->attr.allocatable;
coarray = expr->symtree->n.sym->attr.codimension; coarray = expr->symtree->n.sym->attr.codimension;
} }
else else
{ {
allocatable_array = prev_ref->u.c.component->attr.allocatable; allocatable = prev_ref->u.c.component->attr.allocatable;
coarray = prev_ref->u.c.component->attr.codimension; coarray = prev_ref->u.c.component->attr.codimension;
} }
...@@ -4485,10 +4485,11 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat) ...@@ -4485,10 +4485,11 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat)
STRIP_NOPS (pointer); STRIP_NOPS (pointer);
/* The allocate_array variants take the old pointer as first argument. */ /* The allocate_array variants take the old pointer as first argument. */
if (allocatable_array) if (allocatable)
tmp = gfc_allocate_array_with_status (&elseblock, pointer, size, pstat, expr); tmp = gfc_allocate_allocatable_with_status (&elseblock,
pointer, size, pstat, expr);
else else
tmp = gfc_allocate_with_status (&elseblock, size, pstat); tmp = gfc_allocate_with_status (&elseblock, size, pstat, false);
tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, pointer, tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, pointer,
tmp); tmp);
......
...@@ -4167,7 +4167,8 @@ generate_coarray_sym_init (gfc_symbol *sym) ...@@ -4167,7 +4167,8 @@ generate_coarray_sym_init (gfc_symbol *sym)
GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE(decl))); GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE(decl)));
tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_register, 6, size, tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_register, 6, size,
build_int_cst (integer_type_node, 0), /* type. */ build_int_cst (integer_type_node,
GFC_CAF_COARRAY_ALLOC), /* type. */
token, null_pointer_node, /* token, stat. */ token, null_pointer_node, /* token, stat. */
null_pointer_node, /* errgmsg, errmsg_len. */ null_pointer_node, /* errgmsg, errmsg_len. */
build_int_cst (integer_type_node, 0)); build_int_cst (integer_type_node, 0));
......
...@@ -188,9 +188,9 @@ gfc_omp_clause_default_ctor (tree clause, tree decl, tree outer) ...@@ -188,9 +188,9 @@ gfc_omp_clause_default_ctor (tree clause, tree decl, tree outer)
size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
size, esize); size, esize);
size = gfc_evaluate_now (fold_convert (size_type_node, size), &cond_block); size = gfc_evaluate_now (fold_convert (size_type_node, size), &cond_block);
ptr = gfc_allocate_array_with_status (&cond_block, ptr = gfc_allocate_allocatable_with_status (&cond_block,
build_int_cst (pvoid_type_node, 0), build_int_cst (pvoid_type_node, 0),
size, NULL, NULL); size, NULL, NULL);
gfc_conv_descriptor_data_set (&cond_block, decl, ptr); gfc_conv_descriptor_data_set (&cond_block, decl, ptr);
then_b = gfc_finish_block (&cond_block); then_b = gfc_finish_block (&cond_block);
...@@ -241,9 +241,9 @@ gfc_omp_clause_copy_ctor (tree clause, tree dest, tree src) ...@@ -241,9 +241,9 @@ gfc_omp_clause_copy_ctor (tree clause, tree dest, tree src)
size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
size, esize); size, esize);
size = gfc_evaluate_now (fold_convert (size_type_node, size), &block); size = gfc_evaluate_now (fold_convert (size_type_node, size), &block);
ptr = gfc_allocate_array_with_status (&block, ptr = gfc_allocate_allocatable_with_status (&block,
build_int_cst (pvoid_type_node, 0), build_int_cst (pvoid_type_node, 0),
size, NULL, NULL); size, NULL, NULL);
gfc_conv_descriptor_data_set (&block, dest, ptr); gfc_conv_descriptor_data_set (&block, dest, ptr);
call = build_call_expr_loc (input_location, call = build_call_expr_loc (input_location,
built_in_decls[BUILT_IN_MEMCPY], 3, ptr, built_in_decls[BUILT_IN_MEMCPY], 3, ptr,
...@@ -663,9 +663,9 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where) ...@@ -663,9 +663,9 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
size, esize); size, esize);
size = gfc_evaluate_now (fold_convert (size_type_node, size), &block); size = gfc_evaluate_now (fold_convert (size_type_node, size), &block);
ptr = gfc_allocate_array_with_status (&block, ptr = gfc_allocate_allocatable_with_status (&block,
build_int_cst (pvoid_type_node, 0), build_int_cst (pvoid_type_node, 0),
size, NULL, NULL); size, NULL, NULL);
gfc_conv_descriptor_data_set (&block, decl, ptr); gfc_conv_descriptor_data_set (&block, decl, ptr);
gfc_add_expr_to_block (&block, gfc_trans_assignment (e1, e2, false, gfc_add_expr_to_block (&block, gfc_trans_assignment (e1, e2, false,
false)); false));
......
...@@ -4847,10 +4847,10 @@ gfc_trans_allocate (gfc_code * code) ...@@ -4847,10 +4847,10 @@ gfc_trans_allocate (gfc_code * code)
/* Allocate - for non-pointers with re-alloc checking. */ /* Allocate - for non-pointers with re-alloc checking. */
if (gfc_expr_attr (expr).allocatable) if (gfc_expr_attr (expr).allocatable)
tmp = gfc_allocate_array_with_status (&se.pre, se.expr, memsz, tmp = gfc_allocate_allocatable_with_status (&se.pre, se.expr, memsz,
pstat, expr); pstat, expr);
else else
tmp = gfc_allocate_with_status (&se.pre, memsz, pstat); tmp = gfc_allocate_with_status (&se.pre, memsz, pstat, false);
tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node,
se.expr, se.expr,
......
...@@ -585,7 +585,8 @@ gfc_call_malloc (stmtblock_t * block, tree type, tree size) ...@@ -585,7 +585,8 @@ gfc_call_malloc (stmtblock_t * block, tree type, tree size)
return newmem; return newmem;
} */ } */
tree tree
gfc_allocate_with_status (stmtblock_t * block, tree size, tree status) gfc_allocate_with_status (stmtblock_t * block, tree size, tree status,
bool coarray_lib)
{ {
stmtblock_t alloc_block; stmtblock_t alloc_block;
tree res, tmp, msg, cond; tree res, tmp, msg, cond;
...@@ -616,14 +617,29 @@ gfc_allocate_with_status (stmtblock_t * block, tree size, tree status) ...@@ -616,14 +617,29 @@ gfc_allocate_with_status (stmtblock_t * block, tree size, tree status)
/* The allocation itself. */ /* The allocation itself. */
gfc_start_block (&alloc_block); gfc_start_block (&alloc_block);
gfc_add_modify (&alloc_block, res, if (coarray_lib)
fold_convert (prvoid_type_node, {
build_call_expr_loc (input_location, gfc_add_modify (&alloc_block, res,
built_in_decls[BUILT_IN_MALLOC], 1, fold_convert (prvoid_type_node,
fold_build2_loc (input_location, build_call_expr_loc (input_location,
MAX_EXPR, size_type_node, size, gfor_fndecl_caf_register, 3,
build_int_cst (size_type_node, fold_build2_loc (input_location,
1))))); MAX_EXPR, size_type_node, size,
build_int_cst (size_type_node, 1)),
build_int_cst (integer_type_node,
GFC_CAF_COARRAY_ALLOC),
null_pointer_node))); /* Token */
}
else
{
gfc_add_modify (&alloc_block, res,
fold_convert (prvoid_type_node,
build_call_expr_loc (input_location,
built_in_decls[BUILT_IN_MALLOC], 1,
fold_build2_loc (input_location,
MAX_EXPR, size_type_node, size,
build_int_cst (size_type_node, 1)))));
}
msg = gfc_build_addr_expr (pchar_type_node, gfc_build_localized_cstring_const msg = gfc_build_addr_expr (pchar_type_node, gfc_build_localized_cstring_const
("Allocation would exceed memory limit")); ("Allocation would exceed memory limit"));
...@@ -658,13 +674,13 @@ gfc_allocate_with_status (stmtblock_t * block, tree size, tree status) ...@@ -658,13 +674,13 @@ gfc_allocate_with_status (stmtblock_t * block, tree size, tree status)
/* Generate code for an ALLOCATE statement when the argument is an /* Generate code for an ALLOCATE statement when the argument is an
allocatable array. If the array is currently allocated, it is an allocatable variable. If the variable is currently allocated, it is an
error to allocate it again. error to allocate it again.
This function follows the following pseudo-code: This function follows the following pseudo-code:
void * void *
allocate_array (void *mem, size_t size, integer_type *stat) allocate_allocatable (void *mem, size_t size, integer_type *stat)
{ {
if (mem == NULL) if (mem == NULL)
return allocate (size, stat); return allocate (size, stat);
...@@ -685,8 +701,8 @@ gfc_allocate_with_status (stmtblock_t * block, tree size, tree status) ...@@ -685,8 +701,8 @@ gfc_allocate_with_status (stmtblock_t * block, tree size, tree status)
expr must be set to the original expression being allocated for its locus expr must be set to the original expression being allocated for its locus
and variable name in case a runtime error has to be printed. */ and variable name in case a runtime error has to be printed. */
tree tree
gfc_allocate_array_with_status (stmtblock_t * block, tree mem, tree size, gfc_allocate_allocatable_with_status (stmtblock_t * block, tree mem, tree size,
tree status, gfc_expr* expr) tree status, gfc_expr* expr)
{ {
stmtblock_t alloc_block; stmtblock_t alloc_block;
tree res, tmp, null_mem, alloc, error; tree res, tmp, null_mem, alloc, error;
...@@ -703,11 +719,15 @@ gfc_allocate_array_with_status (stmtblock_t * block, tree mem, tree size, ...@@ -703,11 +719,15 @@ gfc_allocate_array_with_status (stmtblock_t * block, tree mem, tree size,
/* If mem is NULL, we call gfc_allocate_with_status. */ /* If mem is NULL, we call gfc_allocate_with_status. */
gfc_start_block (&alloc_block); gfc_start_block (&alloc_block);
tmp = gfc_allocate_with_status (&alloc_block, size, status); tmp = gfc_allocate_with_status (&alloc_block, size, status,
gfc_option.coarray == GFC_FCOARRAY_LIB
&& gfc_expr_attr (expr).codimension);
gfc_add_modify (&alloc_block, res, fold_convert (type, tmp)); gfc_add_modify (&alloc_block, res, fold_convert (type, tmp));
alloc = gfc_finish_block (&alloc_block); alloc = gfc_finish_block (&alloc_block);
/* Otherwise, we issue a runtime error or set the status variable. */ /* If mem is not NULL, we issue a runtime error or set the
status variable. */
if (expr) if (expr)
{ {
tree varname; tree varname;
...@@ -737,7 +757,7 @@ gfc_allocate_array_with_status (stmtblock_t * block, tree mem, tree size, ...@@ -737,7 +757,7 @@ gfc_allocate_array_with_status (stmtblock_t * block, tree mem, tree size,
fold_convert (pvoid_type_node, mem)); fold_convert (pvoid_type_node, mem));
gfc_add_expr_to_block (&set_status_block, tmp); gfc_add_expr_to_block (&set_status_block, tmp);
tmp = gfc_allocate_with_status (&set_status_block, size, status); tmp = gfc_allocate_with_status (&set_status_block, size, status, false);
gfc_add_modify (&set_status_block, res, fold_convert (type, tmp)); gfc_add_modify (&set_status_block, res, fold_convert (type, tmp));
gfc_add_modify (&set_status_block, gfc_add_modify (&set_status_block,
......
...@@ -94,6 +94,18 @@ typedef struct gfc_se ...@@ -94,6 +94,18 @@ typedef struct gfc_se
gfc_se; gfc_se;
/* Denotes different types of coarray.
Please keep in sync with libgfortran/caf/libcaf.h. */
typedef enum
{
GFC_CAF_COARRAY_STATIC,
GFC_CAF_COARRAY_ALLOC,
GFC_CAF_LOCK,
GFC_CAF_LOCK_COMP
}
gfc_coarray_type;
/* Scalarization State chain. Created by walking an expression tree before /* Scalarization State chain. Created by walking an expression tree before
creating the scalarization loops. Then passed as part of a gfc_se structure creating the scalarization loops. Then passed as part of a gfc_se structure
to translate the expression inside the loop. Note that these chains are to translate the expression inside the loop. Note that these chains are
...@@ -528,11 +540,12 @@ tree gfc_call_malloc (stmtblock_t *, tree, tree); ...@@ -528,11 +540,12 @@ tree gfc_call_malloc (stmtblock_t *, tree, tree);
/* Build a memcpy call. */ /* Build a memcpy call. */
tree gfc_build_memcpy_call (tree, tree, tree); tree gfc_build_memcpy_call (tree, tree, tree);
/* Allocate memory for arrays, with optional status variable. */ /* Allocate memory for allocatable variables, with optional status variable. */
tree gfc_allocate_array_with_status (stmtblock_t*, tree, tree, tree, gfc_expr*); tree gfc_allocate_allocatable_with_status (stmtblock_t*,
tree, tree, tree, gfc_expr*);
/* Allocate memory, with optional status variable. */ /* Allocate memory, with optional status variable. */
tree gfc_allocate_with_status (stmtblock_t *, tree, tree); tree gfc_allocate_with_status (stmtblock_t *, tree, tree, bool);
/* Generate code to deallocate an array. */ /* Generate code to deallocate an array. */
tree gfc_deallocate_with_status (tree, tree, bool, gfc_expr*); tree gfc_deallocate_with_status (tree, tree, bool, gfc_expr*);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment