Index: trans.h =================================================================== --- trans.h (revision 173301) +++ trans.h (working copy) @@ -456 +456 @@ tree gfc_get_symbol_decl (gfc_symbol *); -void gfc_init_coarray_decl (void); +void gfc_init_coarray_decl (bool); Index: trans-decl.c =================================================================== --- trans-decl.c (revision 173301) +++ trans-decl.c (working copy) @@ -4465,0 +4466,6 @@ add_argument_checking (stmtblock_t *bloc +/* Generate the _gfortran_caf_this_image and _gfortran_caf_num_images + global variables for -fcoarray=lib. They are placed into the translation + unit of the main program. Make sure that in one TU (the one of the main + program), the first call to gfc_init_coarray_decl is done with true. + Otherwise, expect link errors. */ + @@ -4467 +4473 @@ void -gfc_init_coarray_decl (void) +gfc_init_coarray_decl (bool external_tu) @@ -4469 +4475 @@ gfc_init_coarray_decl (void) - tree save_fn_decl = current_function_decl; + tree save_fn_decl; @@ -4481,2 +4487,3 @@ gfc_init_coarray_decl (void) - gfort_gvar_caf_this_image = gfc_create_var (integer_type_node, - PREFIX("caf_this_image")); + gfort_gvar_caf_this_image = build_decl (input_location, VAR_DECL, + PREFIX("caf_this_image"), + integer_type_node); @@ -4486 +4493,8 @@ gfc_init_coarray_decl (void) - TREE_STATIC (gfort_gvar_caf_this_image) = 1; + TREE_READONLY (gfort_gvar_caf_this_image) = 0; + + if (external_tu) + TREE_STATIC (gfort_gvar_caf_this_image) = 1; + else + DECL_EXTERNAL (gfort_gvar_caf_this_image) = 1 + + pushdecl_top_level (gfort_gvar_caf_num_images); @@ -4488,2 +4502,3 @@ gfc_init_coarray_decl (void) - gfort_gvar_caf_num_images = gfc_create_var (integer_type_node, - PREFIX("caf_num_images")); + gfort_gvar_caf_num_images = build_decl (input_location, VAR_DECL, + PREFIX("caf_num_images"), + integer_type_node); @@ -4493 +4508,8 @@ gfc_init_coarray_decl (void) - TREE_STATIC (gfort_gvar_caf_num_images) = 1; + TREE_READONLY (gfort_gvar_caf_num_images) = 0; + + if (external_tu) + TREE_STATIC (gfort_gvar_caf_num_images) = 1; + else + DECL_EXTERNAL (gfort_gvar_caf_num_images) = 1 + + pushdecl_top_level (gfort_gvar_caf_num_images); @@ -4587 +4609 @@ create_main_function (tree fndecl) - gfc_init_coarray_decl (); + gfc_init_coarray_decl (true); Index: parse.c =================================================================== --- parse.c (revision 173301) +++ parse.c (working copy) @@ -4234 +4234,2 @@ static void -translate_all_program_units (gfc_namespace *gfc_global_ns_list) +translate_all_program_units (gfc_namespace *gfc_global_ns_list, + bool main_in_tu) @@ -4240,0 +4242,5 @@ translate_all_program_units (gfc_namespa + /* If the main program is in the translation unit and we have + -fcoarray=libs, generate the static variables. */ + if (gfc_option.coarray == GFC_FCOARRAY_LIB && main_in_tu) + gfc_init_coarray_decl (false); + @@ -4478 +4484 @@ prog_units: - translate_all_program_units (gfc_global_ns_list); + translate_all_program_units (gfc_global_ns_list, seen_program); Index: trans-intrinsic.c =================================================================== --- trans-intrinsic.c (revision 173301) +++ trans-intrinsic.c (working copy) @@ -928 +928 @@ trans_this_image (gfc_se * se, gfc_expr - gfc_init_coarray_decl (); + gfc_init_coarray_decl (false); @@ -1042 +1042 @@ trans_image_index (gfc_se * se, gfc_expr - gfc_init_coarray_decl (); + gfc_init_coarray_decl (false); @@ -1062 +1062 @@ trans_num_images (gfc_se * se) - gfc_init_coarray_decl (); + gfc_init_coarray_decl (false); @@ -1371 +1371 @@ conv_intrinsic_cobound (gfc_se * se, gfc - gfc_init_coarray_decl (); + gfc_init_coarray_decl (false); @@ -1387 +1387 @@ conv_intrinsic_cobound (gfc_se * se, gfc - gfc_init_coarray_decl (); + gfc_init_coarray_decl (false);