X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ffortran%2Ftrans.h;h=5acab12ad5a32a9d0f9d134c27b146c713cf8a88;hb=91c546541d44cf6b1de95dc80eb8b365519a4a68;hp=7bf58e493d65576be58be216d09ff31ba290dd00;hpb=0611fe7513cbf359835048fb5afdacba5cc429da;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index 7bf58e493d6..5acab12ad5a 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -86,6 +86,8 @@ typedef struct gfc_se args alias. */ unsigned force_tmp:1; + unsigned want_coarray:1; + /* Scalarization parameters. */ struct gfc_se *parent; struct gfc_ss *ss; @@ -94,17 +96,23 @@ typedef struct gfc_se gfc_se; -/* Scalarization State chain. Created by walking an expression tree before - 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 - terminated by gfc_se_terminator, not NULL. A NULL pointer in a gfc_se - indicates to gfc_conv_* that this is a scalar expression. - Note that some member arrays correspond to scalarizer rank and others - are the variable rank. */ +/* 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; -typedef struct gfc_ss_info + +/* The array-specific scalarization informations. The array members of + this struct are indexed by actual array index, and thus can be sparse. */ + +typedef struct gfc_array_info { - int dimen, codimen; /* The ref that holds information on this section. */ gfc_ref *ref; /* The descriptor of this array. */ @@ -125,12 +133,8 @@ typedef struct gfc_ss_info tree end[GFC_MAX_DIMENSIONS]; tree stride[GFC_MAX_DIMENSIONS]; tree delta[GFC_MAX_DIMENSIONS]; - - /* Translation from loop dimensions to actual dimensions. - actual_dim = dim[loop_dim] */ - int dim[GFC_MAX_DIMENSIONS]; } -gfc_ss_info; +gfc_array_info; typedef enum { @@ -176,8 +180,15 @@ typedef enum } gfc_ss_type; -/* SS structures can only belong to a single loopinfo. They must be added + +/* Scalarization State chain. Created by walking an expression tree before + 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 + terminated by gfc_ss_terminator, not NULL. A NULL pointer in a gfc_se + indicates to gfc_conv_* that this is a scalar expression. + SS structures can only belong to a single loopinfo. They must be added otherwise they will not get freed. */ + typedef struct gfc_ss { gfc_ss_type type; @@ -196,17 +207,19 @@ typedef struct gfc_ss /* GFC_SS_TEMP. */ struct { - /* The rank of the temporary. May be less than the rank of the - assigned expression. */ - int dimen, codimen; tree type; } temp; /* All other types. */ - gfc_ss_info info; + gfc_array_info info; } data; + int dimen; + /* Translation from loop dimensions to actual array dimensions. + actual_dim = dim[loop_dim] */ + int dim[GFC_MAX_DIMENSIONS]; + /* All the SS in a loop and linked through loop_chain. The SS for an expression are linked by the next pointer. */ struct gfc_ss *loop_chain; @@ -231,7 +244,7 @@ typedef struct gfc_loopinfo stmtblock_t pre; stmtblock_t post; - int dimen, codimen; + int dimen; /* All the SS involved with this loop. */ gfc_ss *ss; @@ -345,7 +358,8 @@ tree gfc_evaluate_now (tree, stmtblock_t *); /* Find the appropriate variant of a math intrinsic. */ tree gfc_builtin_decl_for_float_kind (enum built_in_function, int); -/* Intrinsic function handling. */ +/* Intrinsic procedure handling. */ +tree gfc_conv_intrinsic_subroutine (gfc_code *); void gfc_conv_intrinsic_function (gfc_se *, gfc_expr *); /* Is the intrinsic expanded inline. */ @@ -356,8 +370,6 @@ bool gfc_inline_intrinsic_function_p (gfc_expr *); gfc_inline_intrinsic_function_p returns true. */ int gfc_is_intrinsic_libcall (gfc_expr *); -tree gfc_conv_intrinsic_move_alloc (gfc_code *); - /* Used to call ordinary functions/subroutines and procedure pointer components. */ int gfc_conv_procedure_call (gfc_se *, gfc_symbol *, gfc_actual_arglist *, @@ -449,9 +461,6 @@ bool gfc_get_module_backend_decl (gfc_symbol *); /* Return the variable decl for a symbol. */ tree gfc_get_symbol_decl (gfc_symbol *); -/* Initialize coarray global variables. */ -void gfc_init_coarray_decl (void); - /* Build a static initializer. */ tree gfc_conv_initializer (gfc_expr *, gfc_typespec *, tree, bool, bool, bool); @@ -509,7 +518,8 @@ void gfc_generate_constructors (void); /* Get the string length of an array constructor. */ bool get_array_ctor_strlen (stmtblock_t *, gfc_constructor_base, tree *); -/* Mark a condition as unlikely. */ +/* Mark a condition as likely or unlikely. */ +tree gfc_likely (tree); tree gfc_unlikely (tree); /* Generate a runtime error call. */ @@ -532,11 +542,12 @@ tree gfc_call_malloc (stmtblock_t *, tree, tree); /* Build a memcpy call. */ tree gfc_build_memcpy_call (tree, tree, tree); -/* Allocate memory for arrays, with optional status variable. */ -tree gfc_allocate_array_with_status (stmtblock_t*, tree, tree, tree, gfc_expr*); +/* Allocate memory for allocatable variables, with optional status variable. */ +void gfc_allocate_allocatable (stmtblock_t*, tree, tree, tree, + tree, tree, tree, gfc_expr*); /* Allocate memory, with optional status variable. */ -tree gfc_allocate_with_status (stmtblock_t *, tree, tree); +void gfc_allocate_using_malloc (stmtblock_t *, tree, tree, tree); /* Generate code to deallocate an array. */ tree gfc_deallocate_with_status (tree, tree, bool, gfc_expr*); @@ -620,6 +631,7 @@ extern GTY(()) tree gfor_fndecl_associated; /* Coarray run-time library function decls. */ extern GTY(()) tree gfor_fndecl_caf_init; extern GTY(()) tree gfor_fndecl_caf_finalize; +extern GTY(()) tree gfor_fndecl_caf_register; extern GTY(()) tree gfor_fndecl_caf_critical; extern GTY(()) tree gfor_fndecl_caf_end_critical; extern GTY(()) tree gfor_fndecl_caf_sync_all; @@ -725,6 +737,8 @@ struct GTY((variable_size)) lang_type { tree span; tree base_decl[2]; tree nonrestricted_type; + tree caf_token; + tree caf_offset; }; struct GTY((variable_size)) lang_decl { @@ -737,12 +751,16 @@ struct GTY((variable_size)) lang_decl { tree stringlen; tree addr; tree span; + /* For assumed-shape coarrays. */ + tree token, caf_offset; }; #define GFC_DECL_ASSIGN_ADDR(node) DECL_LANG_SPECIFIC(node)->addr #define GFC_DECL_STRING_LEN(node) DECL_LANG_SPECIFIC(node)->stringlen #define GFC_DECL_SPAN(node) DECL_LANG_SPECIFIC(node)->span +#define GFC_DECL_TOKEN(node) DECL_LANG_SPECIFIC(node)->token +#define GFC_DECL_CAF_OFFSET(node) DECL_LANG_SPECIFIC(node)->caf_offset #define GFC_DECL_SAVED_DESCRIPTOR(node) \ (DECL_LANG_SPECIFIC(node)->saved_descriptor) #define GFC_DECL_PACKED_ARRAY(node) DECL_LANG_FLAG_0(node) @@ -769,6 +787,8 @@ struct GTY((variable_size)) lang_decl { (TYPE_LANG_SPECIFIC(node)->stride[dim]) #define GFC_TYPE_ARRAY_RANK(node) (TYPE_LANG_SPECIFIC(node)->rank) #define GFC_TYPE_ARRAY_CORANK(node) (TYPE_LANG_SPECIFIC(node)->corank) +#define GFC_TYPE_ARRAY_CAF_TOKEN(node) (TYPE_LANG_SPECIFIC(node)->caf_token) +#define GFC_TYPE_ARRAY_CAF_OFFSET(node) (TYPE_LANG_SPECIFIC(node)->caf_offset) #define GFC_TYPE_ARRAY_SIZE(node) (TYPE_LANG_SPECIFIC(node)->size) #define GFC_TYPE_ARRAY_OFFSET(node) (TYPE_LANG_SPECIFIC(node)->offset) #define GFC_TYPE_ARRAY_AKIND(node) (TYPE_LANG_SPECIFIC(node)->akind)