Fortran compiler
Hi there, I am interested in your company's Fortran Compiler. Is it free? If not, how much for a permanent license? Thanks, Zhenjin
Re: [Patch, PR Fortran/90072] Polymorphic Dispatch to Polymophic Return Type Memory Leak
Andre Vehreschild wrote: PS That's good news about the funding. Maybe we will get to see "built in" coarrays soon? You hopefully will see Nikolas work on the shared memory coarray support, if that is what you mean by "built in" coarrays. I will be working on the distributed memory coarray support esp. fixing the module issues and some other team related things. Cool! (Both of it.) I assume "distributed memory coarray support" is still based on Open Coarrays? * * * I am asking because there is coarray API being defined: Parallel Runtime Interface for Fortran (PRIF), https://go.lbl.gov/prif with an implementation called Caffeine – CoArray Fortran Framework of Efficient Interfaces to Network Environments, https://crd.lbl.gov/caffeine which uses GASNet or POSIX processes. Well, the among the implementers is (unsurprising?) Damian – and the idea seems to be that LLVM's FLANG will use the API. Tobias PS: I think it might be useful in the long run to support both PRIF/Caffeine and OpenCoarrays. I have attached my hello-world patch for -fcoarray=prif that I wrote after ISC-HPC; it only handles this_image() / num_images() + init/stop. I got confirmation by the PRIF developers that the next revision will permit calling __prif_MOD_prif_init multiple times such that one can use it in the constructor for static coarrays, which won't work otherwise. gcc/ChangeLog: * flag-types.h (enum gfc_fcoarray): gcc/fortran/ChangeLog: * invoke.texi: * lang.opt: * trans-decl.cc (gfc_build_builtin_function_decls): (create_main_function): * trans-intrinsic.cc (trans_this_image): (trans_num_images): * trans.h (GTY): gcc/flag-types.h | 3 ++- gcc/fortran/invoke.texi| 7 +- gcc/fortran/lang.opt | 5 +++- gcc/fortran/trans-decl.cc | 56 -- gcc/fortran/trans-intrinsic.cc | 42 +++ gcc/fortran/trans.h| 5 6 files changed, 108 insertions(+), 10 deletions(-) diff --git a/gcc/flag-types.h b/gcc/flag-types.h index 5a2b461fa75..babd747c01d 100644 --- a/gcc/flag-types.h +++ b/gcc/flag-types.h @@ -427,7 +427,8 @@ enum gfc_fcoarray { GFC_FCOARRAY_NONE = 0, GFC_FCOARRAY_SINGLE, - GFC_FCOARRAY_LIB + GFC_FCOARRAY_LIB, + GFC_FCOARRAY_PRIF }; diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi index 40e8e4a7cdd..331a40d31db 100644 --- a/gcc/fortran/invoke.texi +++ b/gcc/fortran/invoke.texi @@ -1753,7 +1753,12 @@ Single-image mode, i.e. @code{num_images()} is always one. @item @samp{lib} Library-based coarray parallelization; a suitable GNU Fortran coarray -library needs to be linked. +library needs to be linked such as @url{http://opencoarrays.org}. + +@item @samp{prif} +Using the Parallel Runtime Interface for Fortran (PRIF), +@url{https://go.lbl.gov/@/prif}; for instance, via Caffeine, +@url{https://go.lbl.gov/@/caffeine}. @end table diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt index 5efd4a0129a..9ba957d5571 100644 --- a/gcc/fortran/lang.opt +++ b/gcc/fortran/lang.opt @@ -786,7 +786,7 @@ Copy array sections into a contiguous block on procedure entry. fcoarray= Fortran RejectNegative Joined Enum(gfc_fcoarray) Var(flag_coarray) Init(GFC_FCOARRAY_NONE) --fcoarray= Specify which coarray parallelization should be used. +-fcoarray= Specify which coarray parallelization should be used. Enum Name(gfc_fcoarray) Type(enum gfc_fcoarray) UnknownError(Unrecognized option: %qs) @@ -800,6 +800,9 @@ Enum(gfc_fcoarray) String(single) Value(GFC_FCOARRAY_SINGLE) EnumValue Enum(gfc_fcoarray) String(lib) Value(GFC_FCOARRAY_LIB) +EnumValue +Enum(gfc_fcoarray) String(prif) Value(GFC_FCOARRAY_PRIF) + fcheck= Fortran RejectNegative JoinedOrMissing -fcheck=[...] Specify which runtime checks are to be performed. diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc index dca7779528b..d1c0e2ee997 100644 --- a/gcc/fortran/trans-decl.cc +++ b/gcc/fortran/trans-decl.cc @@ -170,6 +170,10 @@ tree gfor_fndecl_co_sum; tree gfor_fndecl_caf_is_present; tree gfor_fndecl_caf_random_init; +tree gfor_fndecl_prif_init; +tree gfor_fndecl_prif_stop; +tree gfor_fndecl_prif_this_image_no_coarray; +tree gfor_fndecl_prif_num_images; /* Math functions. Many other math functions are handled in trans-intrinsic.cc. */ @@ -4147,6 +4151,31 @@ gfc_build_builtin_function_decls (void) get_identifier (PREFIX("caf_random_init")), void_type_node, 2, logical_type_node, logical_type_node); } + else if (flag_coarray == GFC_FCOARRAY_PRIF) +{ + tree pint_type = build_pointer_type (integer_type_node); + tree pbool_type = build_pointer_type (boolean_type_node); + tree pintmax_type_node = get_typenode_from_name (INTMAX_TYPE); + pintmax_type_node = build_pointer_type (pintmax_type_node); + + gfor_fndecl_prif_init = gfc_build_library_function_decl_with_spec ( + get_identifier ("__prif_MOD_prif_init"), ". W ", + void_type_node, 1, pint
Fortran compiler
Hi there, I am interested in your company's Fortran compiler. Is it free? If not, how much is it for a permanent license? Thanks, Zhenjin
[Patch, fortran] PR59104
Hi All, The attached fixes a problem that, judging by the comments, has been looked at periodically over the last ten years but just looked to be too fiendishly complicated to fix. This is not in small part because of the confusing ordering of dummies in the tlink chain and the unintuitive placement of all deferred initializations to the front of the init chain in the wrapped block. The result of the existing ordering is that the initialization code for non-dummy variables that depends on the function result occurs before any initialization code for the function result itself. The fix ensures that: (i) These variables are placed correctly in the tlink chain, respecting inter-dependencies; and (ii) The dependent initializations are placed at the end of the wrapped block init chain. The details appear in the comments in the patch. It is entirely possible that a less clunky fix exists but I failed to find it. OK for mainline? Regards Paul Change.Logs Description: Binary data diff --git a/gcc/fortran/dependency.cc b/gcc/fortran/dependency.cc index bafe8cbc5bc..97ace8c778e 100644 --- a/gcc/fortran/dependency.cc +++ b/gcc/fortran/dependency.cc @@ -2497,3 +2497,63 @@ gfc_omp_expr_prefix_same (gfc_expr *lexpr, gfc_expr *rexpr) return true; } + + +/* gfc_function_dependency returns true for non-dummy symbols with dependencies + on an old-fashioned function result (ie. proc_name = proc_name->result). + This is used to ensure that initialization code appears after the function + result is treated and that any mutual dependencies between these symbols are + respected. */ + +static bool +dependency_fcn (gfc_expr *e, gfc_symbol *sym, + int *f ATTRIBUTE_UNUSED) +{ + if (e == NULL) +return false; + + if (e && e->expr_type == EXPR_VARIABLE + && e->symtree + && e->symtree->n.sym == sym) +return true; + + return false; +} + + +bool +gfc_function_dependency (gfc_symbol *sym, gfc_symbol *proc_name) +{ + bool front = false; + + if (proc_name && proc_name->attr.function + && proc_name == proc_name->result + && !(sym->attr.dummy || sym->attr.result)) +{ + if (sym->as && sym->as->type == AS_EXPLICIT) + { + for (int dim = 0; dim < sym->as->rank; dim++) + { + if (sym->as->lower[dim] + && sym->as->lower[dim]->expr_type != EXPR_CONSTANT) + front = gfc_traverse_expr (sym->as->lower[dim], proc_name, + dependency_fcn, 0); + if (front) + break; + if (sym->as->upper[dim] + && sym->as->upper[dim]->expr_type != EXPR_CONSTANT) + front = gfc_traverse_expr (sym->as->upper[dim], proc_name, + dependency_fcn, 0); + if (front) + break; + } + } + + if (sym->ts.type == BT_CHARACTER + && sym->ts.u.cl && sym->ts.u.cl->length + && sym->ts.u.cl->length->expr_type != EXPR_CONSTANT) + front = gfc_traverse_expr (sym->ts.u.cl->length, proc_name, + dependency_fcn, 0); +} + return front; + } diff --git a/gcc/fortran/dependency.h b/gcc/fortran/dependency.h index ea4bd04b0e8..0fa5f93d0fc 100644 --- a/gcc/fortran/dependency.h +++ b/gcc/fortran/dependency.h @@ -23,7 +23,7 @@ enum gfc_dep_check { NOT_ELEMENTAL,/* Not elemental case: normal dependency check. */ ELEM_CHECK_VARIABLE, /* Test whether variables overlap. */ - ELEM_DONT_CHECK_VARIABLE /* Test whether variables overlap only if used + ELEM_DONT_CHECK_VARIABLE /* Test whether variables overlap only if used in an expression. */ }; @@ -43,3 +43,5 @@ bool gfc_are_equivalenced_arrays (gfc_expr *, gfc_expr *); bool gfc_omp_expr_prefix_same (gfc_expr *, gfc_expr *); gfc_expr * gfc_discard_nops (gfc_expr *); + +bool gfc_function_dependency (gfc_symbol *, gfc_symbol *); \ No newline at end of file diff --git a/gcc/fortran/error.cc b/gcc/fortran/error.cc index 65e38b0e866..60f607ecc4f 100644 --- a/gcc/fortran/error.cc +++ b/gcc/fortran/error.cc @@ -892,7 +892,7 @@ error_print (const char *type, const char *format0, va_list argp) #else m = INTTYPE_MAXIMUM (ptrdiff_t); #endif - m = 2 * m + 1; + m = 2 * m + 1; error_uinteger (a & m); } else diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc index 0a1646def67..7e39981e843 100644 --- a/gcc/fortran/symbol.cc +++ b/gcc/fortran/symbol.cc @@ -27,6 +27,7 @@ along with GCC; see the file COPYING3. If not see #include "parse.h" #include "match.h" #include "constructor.h" +#include "dependency.h" /* Strings for all symbol attributes. We use these for dumping the @@ -948,15 +949,18 @@ conflict_std: void gfc_set_sym_referenced (gfc_symbol *sym) { + gfc_symbol *proc_name = sym->ns->proc_name ? sym->ns->proc_name : NULL; if (sym->attr.referenced) return; sym->attr.referenced = 1; - /* Remember which order dummy variables are accessed in. */ - if (sym->attr.dummy) -sym->dummy_order = next_dummy_order++; + /* Remember which order dummy variables and symbols with function result + dependencies are accessed in. *