[flang] address review comments

Original-commit: flang-compiler/f18@793c15fd04
Reviewed-on: https://github.com/flang-compiler/f18/pull/683
Tree-same-pre-rewrite: false
This commit is contained in:
peter klausler 2019-08-29 10:58:36 -07:00
parent 76337eb4cb
commit 321fcad0a9
1 changed files with 44 additions and 35 deletions

View File

@ -25,8 +25,9 @@ functions, or calls to internal runtime support library routines.
bounds default to 1. These can be passed by with a single address bounds default to 1. These can be passed by with a single address
and their contents are contiguous. and their contents are contiguous.
* An *assumed-size* array is an explicit-shape array with `*` as its * An *assumed-size* array is an explicit-shape array with `*` as its
final dimension, which the most-significant one in Fortran. final dimension, which is the most-significant one in Fortran
* A *deferred-shape* array (`DIMENSION(:)`) is a `POINTER` or `ALLOCATABLE`. and whose value does not affect indexed address calculations.
* A *deferred-shape* array (`DIMENSION::A(:)`) is a `POINTER` or `ALLOCATABLE`.
`POINTER` target data might not be contiguous. `POINTER` target data might not be contiguous.
* An *assumed-shape* (not size!) array is a dummy argument whose * An *assumed-shape* (not size!) array is a dummy argument whose
upper bounds take their values from the *shape* of the effective upper bounds take their values from the *shape* of the effective
@ -36,8 +37,8 @@ functions, or calls to internal runtime support library routines.
takes its length from the effective argument. takes its length from the effective argument.
* An *assumed-length* `CHARACTER(*)` result of an external function (C721) * An *assumed-length* `CHARACTER(*)` result of an external function (C721)
has its length determined by its eventual declaration in a calling scope. has its length determined by its eventual declaration in a calling scope.
* An *assumed-rank* `DIMENSION(..)` dummy argument array has an unknown number * An *assumed-rank* `DIMENSION::A(..)` dummy argument array has an unknown
of dimensions. number of dimensions.
* A *polymorphic* `CLASS(t)` dummy argument has a specific derived type or any * A *polymorphic* `CLASS(t)` dummy argument has a specific derived type or any
possible extension of that type. An *unlimited polymorphic* possible extension of that type. An *unlimited polymorphic*
`CLASS(*)` dummy argument can have intrinsic or derived type. `CLASS(*)` dummy argument can have intrinsic or derived type.
@ -49,15 +50,16 @@ Referenced procedures may or may not have declared interfaces
available to their call sites. available to their call sites.
Procedures with some post-Fortran '77 features *require* an Procedures with some post-Fortran '77 features *require* an
explicit interface to be called (15.4.2.2) or even passed (4.3.4(2)): explicit interface to be called (15.4.2.2) or even passed (4.3.4(5)):
* use of argument keywords in a call * use of argument keywords in a call
* procedures that are `ELEMENTAL` or `BIND(C)` * procedures that are `ELEMENTAL` or `BIND(C)`
* procedures that are required to be `PURE` due to the context of the call * procedures that are required to be `PURE` due to the context of the call
(specification expression, `DO CONCURRENT`, `FORALL`) (specification expression, `DO CONCURRENT`, `FORALL`)
* dummy arguments with these attributes: `ALLOCATABLE`, `POINTER`, * dummy arguments with these attributes: `ALLOCATABLE`, `POINTER`,
`VALUE`, `TARGET`, `OPTIONAL`, `ASYNCHRONOUS`, `VOLATILE` `VALUE`, `TARGET`, `OPTIONAL`, `ASYNCHRONOUS`, `VOLATILE`,
(but *not* `CONTIGUOUS` or `INTENT()`) and, as a consequence of limitations on its use, `CONTIGUOUS`;
`INTENT()`, however, does *not* require an explicit interface
* dummy arguments that are coarrays * dummy arguments that are coarrays
* dummy arguments that are assumed-shape or assumed-rank arrays * dummy arguments that are assumed-shape or assumed-rank arrays
* dummy arguments with parameterized derived types * dummy arguments with parameterized derived types
@ -73,7 +75,7 @@ explicit interface to be called (15.4.2.2) or even passed (4.3.4(2)):
Module procedures, internal procedures, procedure pointers, Module procedures, internal procedures, procedure pointers,
type-bound procedures, and recursive references by a procedure to itself type-bound procedures, and recursive references by a procedure to itself
always have explicit interfaces. always have explicit interfaces.
(Consequentially, they cannot be assumed-length `CHARACTER(*)` functions; (Consequently, they cannot be assumed-length `CHARACTER(*)` functions;
conveniently, assumed-length `CHARACTER(*)` functions are prohibited from conveniently, assumed-length `CHARACTER(*)` functions are prohibited from
recursion (15.6.2.1(3))). recursion (15.6.2.1(3))).
@ -87,7 +89,7 @@ require an explicit interface, even if they are all `KIND` type
parameters. parameters.
15.5.2.9(2) explicitly allows an assumed-length `CHARACTER(*)` function 15.5.2.9(2) explicitly allows an assumed-length `CHARACTER(*)` function
to be passed as an actual argument to an explicit-length dummy); to be passed as an actual argument to an explicit-length dummy;
this has implications for calls to character-valued dummy functions this has implications for calls to character-valued dummy functions
and function pointers. and function pointers.
(In the scopes that reference `CHARACTER` functions, they must have (In the scopes that reference `CHARACTER` functions, they must have
@ -134,14 +136,11 @@ and any internal procedures passed to them as arguments must be
simple addresses of non-internal subprograms or trampolines for simple addresses of non-internal subprograms or trampolines for
internal procedures. internal procedures.
Note that `INTENT` and `CONTIGUOUS` attributes do not, by themselves, Note that the `INTENT` attribute does not, by itself,
require the use of explicit interface; neither does the use of a dummy require the use of explicit interface; neither does the use of a dummy
procedure (implicit or explicit in their interfaces). procedure (implicit or explicit in their interfaces).
So the analyis of calls to F77ish procedures must allow for the
Analyses of calls to F77ish procedures must make invisible use of `INTENT(OUT)`.
allowances or impose restrictions capable of dealing with any of the
invisible `INTENT` and `CONTIGUOUS` attributes of dummy arguments
in the called procedure.
## Protocol overview ## Protocol overview
@ -224,6 +223,10 @@ the subroutine's alternate return.
1. Use the function result in an expression. 1. Use the function result in an expression.
1. Eventually, finalize &/or deallocate the function result. 1. Eventually, finalize &/or deallocate the function result.
(I've omitted some obvious steps, like preserving/restoring callee-saved
registers on entry/exit, dealing with caller-saved registers before/after
calls, and architecture-dependent ABI requirements.)
## The messy details ## The messy details
### Copying effective argument values into temporary storage ### Copying effective argument values into temporary storage
@ -256,18 +259,18 @@ be copied into temporaries in the following situations.
`ALLOCATABLE` components, and may be best implemented with a runtime `ALLOCATABLE` components, and may be best implemented with a runtime
library routine working off a description of the type. library routine working off a description of the type.
1. Effective arguments associated with dummies with the `VALUE` 1. Effective arguments associated with dummies with the `VALUE`
attribute need to copied; this could be done on either attribute need to be copied; this can be done on either
side of the call, but there are optimization opportunities side of the call, but there are optimization opportunities
on the caller's side. available when the caller's side bears the responsibility.
1. In non-elemental calls, the values of array sections with 1. In non-elemental calls, the values of array sections with
vector-valued subscripts need to be gathered into temporaries. vector-valued subscripts need to be gathered into temporaries.
These effective arguments are not definable, and they are not allowed to These effective arguments are not definable, and they are not allowed to
be associated with non-`VALUE` dummy arguments with the attributes be associated with non-`VALUE` dummy arguments with the attributes
`INTENT(IN)`, `INTENT(IN OUT)`, `ASYNCHRONOUS`, or `VOLATILE` `INTENT(OUT)`, `INTENT(IN OUT)`, `ASYNCHRONOUS`, or `VOLATILE`
(15.4.2.4(21)); `INTENT()` can't always be checked. (15.5.2.4(21)); `INTENT()` can't always be checked.
1. Non-simply-contiguous (9.5.4) arrays being passed to non-`POINTER` 1. Non-simply-contiguous (9.5.4) arrays being passed to non-`POINTER`
dummy arguments that must be contiguous due to a `CONTIGUOUS` dummy arguments that must be contiguous (due to a `CONTIGUOUS`
attribute or not being assumed-shape or assumed-rank (which attribute, or not being assumed-shape or assumed-rank; this
is always the case for F77ish procedures). is always the case for F77ish procedures).
This should be a runtime decision, so that effective arguments This should be a runtime decision, so that effective arguments
that turn out to be contiguous can be passed cheaply. that turn out to be contiguous can be passed cheaply.
@ -280,10 +283,10 @@ be copied into temporaries in the following situations.
candidates for being copied back to the original variable after candidates for being copied back to the original variable after
the call* (see below). the call* (see below).
Fortran requires (18.3.6(5)) that interoperable procedure dummy Fortran requires (18.3.6(5)) that calls to interoperable procedures
arguments with `CONTIGUOUS` &/or assumed-length `CHARACTER(*)` with dummy argument arrays with contiguity requirements
explicit-shape/assumed-size arrays handle the compaction of handle the compaction of discontiguous data *in the Fortran callee*,
discontiguous data *in the callee*, at least when called from C. at least when called from C.
And discontiguous data must be compacted on the *caller's* side And discontiguous data must be compacted on the *caller's* side
when passed from Fortran to C (18.3.6(6)). when passed from Fortran to C (18.3.6(6)).
@ -346,22 +349,25 @@ The preparation of effective arguments for `INTENT(OUT)` could be
done on either side of the call. If the preparation is done on either side of the call. If the preparation is
done by the caller, there is an optimization opportunity done by the caller, there is an optimization opportunity
in situations where unmodified incoming `INTENT(OUT)` dummy in situations where unmodified incoming `INTENT(OUT)` dummy
arguments are being passed onward as outgoing `INTENT(OUT)` arguments whose types lack `FINAL` procedures are being passed
arguments. onward as outgoing `INTENT(OUT)` arguments.
### Arguments and function results requiring descriptors ### Arguments and function results requiring descriptors
Dummy arguments are represented with the addresses of descriptors Dummy arguments are represented with the addresses of new descriptors
when they have any of the following characteristics: when they have any of the following characteristics:
1. assumed-shape array (`DIMENSION(:)`) 1. assumed-shape array (`DIMENSION::A(:)`)
1. assumed-rank array (`DIMENSION(..)`) 1. assumed-rank array (`DIMENSION::A(..)`)
1. parameterized derived type with assumed `LEN` parameters 1. parameterized derived type with assumed `LEN` parameters
1. polymorphic (`CLASS(T)`, `CLASS(*)`) 1. polymorphic (`CLASS(T)`, `CLASS(*)`)
1. assumed-type (`TYPE(*)`) 1. assumed-type (`TYPE(*)`)
1. coarray dummy argument 1. coarray dummy argument
1. `INTENT(IN) POINTER` argument (15.5.2.7, C.10.4) 1. `INTENT(IN) POINTER` argument (15.5.2.7, C.10.4)
`ALLOCATABLE` and other `POINTER` arguments can be passed by simple
address.
Non-F77ish procedures use descriptors to represent two further Non-F77ish procedures use descriptors to represent two further
kinds of dummy arguments: kinds of dummy arguments:
@ -422,8 +428,9 @@ must be redistributed back to its original storage by the caller after
the return. the return.
In conjunction with saved cosubscript values, a standard descriptor In conjunction with saved cosubscript values, a standard descriptor
suffices to represent a pointer to the original storage into which the would suffice to represent a pointer to the original storage into which the
temporary data should be redistributed. temporary data should be redistributed;
the descriptor need not be fully populated with type information.
Note that coindexed objects with `ALLOCATABLE` ultimate components Note that coindexed objects with `ALLOCATABLE` ultimate components
are required to be associated only with dummy arguments with the are required to be associated only with dummy arguments with the
@ -533,7 +540,7 @@ The names of non-F77ish external procedures
should be distinguished as such so that incorrect attempts to call or pass should be distinguished as such so that incorrect attempts to call or pass
them with an implicit interface will fail to resolve at link time. them with an implicit interface will fail to resolve at link time.
Fortran 2018 explicitly enables us to do this with a correction to Fortran Fortran 2018 explicitly enables us to do this with a correction to Fortran
2003 in 4.3.4(2). 2003 in 4.3.4(5).
Last, there must be reasonably permanent naming conventions used Last, there must be reasonably permanent naming conventions used
by the F18 runtime library for those unrestricted specific intrinsic by the F18 runtime library for those unrestricted specific intrinsic
@ -572,7 +579,9 @@ subprogram that requires an explicit interface) `Fa.foo`.
* (6) coindexed effective with `ALLOCATABLE` ultimate component requires * (6) coindexed effective with `ALLOCATABLE` ultimate component requires
`INTENT(IN)` &/or `VALUE` dummy `INTENT(IN)` &/or `VALUE` dummy
* (13) a coindexed scalar effective requires a scalar dummy * (13) a coindexed scalar effective requires a scalar dummy
* (14) a non-conindexed scalar usually requires a scalar dummy, with some exceptions * (14) a non-conindexed scalar effective usually requires a scalar dummy,
but there are some exceptions that allow elements of storage sequences
to be passed and treated like arrays
* (15-17) array rank agreement * (15-17) array rank agreement
* (20) `INTENT(OUT)` & `INTENT(IN OUT)` dummies require definable actuals * (20) `INTENT(OUT)` & `INTENT(IN OUT)` dummies require definable actuals
* (21) array sections with vector subscripts can't be passed to definable dummies * (21) array sections with vector subscripts can't be passed to definable dummies
@ -602,7 +611,7 @@ the dummy and effective arguments have the same attributes:
15.5.2.8 corray dummy arguments: 15.5.2.8 corray dummy arguments:
* (1) effective argument must be coarray * (1) effective argument must be coarray
* (1) `VOLATILE` attributes must match * (1) `VOLATILE` attributes must match
* (2) `CONTIGUOUS` dummy (or implicitly contiguous non-assumed-shape/-rank array) requires simply contiguous actual * (2) explicitly or implicitly contiguous dummy array requires a simply contiguous actual
15.5.2.9 dummy procedures: 15.5.2.9 dummy procedures:
* (1) explicit dummy procedure interface must have same characteristics as actual * (1) explicit dummy procedure interface must have same characteristics as actual