Skip to content

Commit 15dd389

Browse files
committed
[flang][NFC] Update module file documentation
The current module file documentation antedates the current implementation of module files and contains many aspirational and conditional statements, all of which can now be resolved with descriptions of how things actually work.
1 parent cd56666 commit 15dd389

File tree

1 file changed

+49
-90
lines changed

1 file changed

+49
-90
lines changed

flang/docs/ModFiles.md

Lines changed: 49 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -14,82 +14,65 @@ local:
1414
---
1515
```
1616

17-
Module files hold information from a module that is necessary to compile
18-
program units that depend on the module.
17+
Module files hold information from a module that is necessary to compile
18+
program units in other source files that depend on that module.
19+
Program units in the same source file as the module do not read
20+
module files, as this compiler parses entire source files and processes
21+
the program units it contains in dependency order.
1922

2023
## Name
2124

22-
Module files must be searchable by module name. They are typically named
23-
`<modulename>.mod`. The advantage of using `.mod` is that it is consistent with
24-
other compilers so users will know what they are. Also, makefiles and scripts
25-
often use `rm *.mod` to clean up.
25+
Module files are named according to the module's name, suffixed with `.mod`.
26+
This is consistent with other compilers and expected by makefiles and
27+
other build systems.
2628

2729
The disadvantage of using the same name as other compilers is that it is not
2830
clear which compiler created a `.mod` file and files from multiple compilers
29-
cannot be in the same directory. This could be solved by adding something
30-
between the module name and extension, e.g. `<modulename>-f18.mod`. If this
31-
is needed, Flang's fc1 accepts the option `-module-suffix` to alter the suffix
32-
used for the module file.
31+
cannot be in the same directory. This can be solved by adding something
32+
between the module name and extension, e.g. `<modulename>-f18.mod`. When
33+
this is needed, Flang accepts the option `-module-suffix` to alter the suffix.
3334

3435
## Format
3536

36-
Module files will be Fortran source.
37-
Declarations of all visible entities will be included, along with private
38-
entities that they depend on.
39-
Entity declarations that span multiple statements will be collapsed into
37+
Module files are Fortran free form source code.
38+
(One can, in principle, copy `foo.mod` into `tmp.f90`, recompile it,
39+
and obtain a matching `foo.mod` file.)
40+
They include the declarations of all visible locally defined entities along
41+
with the private entities on which thef depend.
42+
Entity declarations that span multiple statements are collapsed into
4043
a single *type-declaration-statement*.
41-
Executable statements will be omitted.
44+
Executable statements are omitted.
4245

4346
### Header
4447

45-
There will be a header containing extra information that cannot be expressed
46-
in Fortran. This will take the form of a comment or directive
47-
at the beginning of the file.
48+
Module files begin with a UTF-8 byte order mark and a few lines of
49+
Fortran comments.
50+
(Pro tip: use `dd if=foo.mod bs=1 skip=3 2>/dev/null` to skip the byte order
51+
mark and dump the rest of the module.)
52+
The first comment begins `!mod$` and contains a version number
53+
and hash code.
54+
Further `!need$` comments contain the names and hash codes of other modules
55+
on which this module depends, and whether those modules are intrinsic
56+
or not to Fortran.
4857

49-
If it's a comment, the module file reader would have to strip it out and
50-
perform *ad hoc* parsing on it. If it's a directive the compiler could
51-
parse it like other directives as part of the grammar.
52-
Processing the header before parsing might result in better error messages
53-
when the `.mod` file is invalid.
54-
55-
Regardless of whether the header is a comment or directive we can use the
56-
same string to introduce it: `!mod$`.
57-
58-
Information in the header:
59-
- Magic string to confirm it is an f18 `.mod` file
60-
- Version information: to indicate the version of the file format, in case it changes,
61-
and the version of the compiler that wrote the file, for diagnostics.
62-
- Checksum of the body of the current file
63-
- Modules we depend on and the checksum of their module file when the current
64-
module file is created
65-
- The source file that produced the `.mod` file? This could be used in error messages.
58+
The header comments do not contain timestamps or original source file paths.
6659

6760
### Body
6861

69-
The body will consist of minimal Fortran source for the required declarations.
70-
The order will match the order they first appeared in the source.
71-
72-
Some normalization will take place:
73-
- extraneous spaces will be removed
74-
- implicit types will be made explicit
75-
- attributes will be written in a consistent order
76-
- entity declarations will be combined into a single declaration
77-
- function return types specified in a *prefix-spec* will be replaced by
78-
an entity declaration
79-
- etc.
62+
The body comprises minimal Fortran source for the required declarations.
63+
The order generally matches the order they appeared in the original
64+
source code for the module.
65+
All types are explicit, and all non-character literal constants are
66+
marked with explicit kind values.
8067

8168
#### Symbols included
8269

83-
All public symbols from the module need to be included.
70+
All public symbols from the module are included.
8471

8572
In addition, some private symbols are needed:
8673
- private types that appear in the public API
8774
- private components of non-private derived types
8875
- private parameters used in non-private declarations (initial values, kind parameters)
89-
- others?
90-
91-
It might be possible to anonymize private names if users don't want them exposed
92-
in the `.mod` file. (Currently they are readable in PGI `.mod` files.)
9376

9477
#### USE association
9578

@@ -98,54 +81,38 @@ A module that contains `USE` statements needs them represented in the
9881
Each use-associated symbol will be written as a separate *use-only* statement,
9982
possibly with renaming.
10083

101-
Alternatives:
102-
- Emit a single `USE` for each module, listing all of the symbols that were
103-
use-associated in the *only-list*.
104-
- Detect when all of the symbols from a module are imported (either by a *use-stmt*
105-
without an *only-list* or because all of the public symbols of the module
106-
have been listed in *only-list*s). In that case collapse them into a single *use-stmt*.
107-
- Emit the *use-stmt*s that appeared in the original source.
108-
10984
## Reading and writing module files
11085

11186
### Options
11287

113-
The compiler will have command-line options to specify where to search
88+
The compiler has command-line options to specify where to search
11489
for module files and where to write them. By default it will be the current
11590
directory for both.
11691

117-
For PGI, `-I` specifies directories to search for include files and module
118-
files. `-module` specifics a directory to write module files in as well as to
119-
search for them. gfortran is similar except it uses `-J` instead of `-module`.
120-
121-
The search order for module files is:
122-
1. The `-module` directory (Note: for gfortran the `-J` directory is not searched).
123-
2. The current directory
124-
3. The `-I` directories in the order they appear on the command line
92+
`-I` specifies directories to search for include files and module
93+
files. `-J` specifies a directory into which module files are written
94+
as well as to search for them.
12595

12696
### Writing module files
12797

12898
When writing a module file, if the existing one matches what would be written,
12999
the timestamp is not updated.
130100

131-
Module files will be written after semantics, i.e. after the compiler has
132-
determined the module is valid Fortran.<br>
133-
**NOTE:** PGI does create `.mod` files sometimes even when the module has a
134-
compilation error.
135-
136-
Question: If the compiler can get far enough to determine it is compiling a module
137-
but then encounters an error, should it delete the existing `.mod` file?
138-
PGI does not, gfortran does.
101+
Module files are written only after semantic analysis completes without
102+
a fatal error message.
139103

140104
### Reading module files
141105

142106
When the compiler finds a `.mod` file it needs to read, it firsts checks the first
143-
line and verifies it is a valid module file. It can also verify checksums of
144-
modules it depends on and report if they are out of date.
107+
line and verifies it is a valid module file.
108+
The header checksum must match the file's contents.
109+
(Pro tip: if a developer needs to hack the contents of a module file, they can
110+
recompile it afterwards as Fortran source to regenerate it with its new hash.)
145111

146-
If the header is valid, the module file will be run through the parser and name
147-
resolution to recreate the symbols from the module. Once the symbol table is
148-
populated the parse tree can be discarded.
112+
The known hashes of dependent modules are used to disambiguate modules whose
113+
names match module files in multiple search directories, as well as to
114+
detect dependent modules whose recompilation has rendered a module file
115+
obsolete.
149116

150117
When processing `.mod` files we know they are valid Fortran with these properties:
151118
1. The input (without the header) is already in the "cooked input" format.
@@ -155,15 +122,7 @@ When processing `.mod` files we know they are valid Fortran with these propertie
155122
## Error messages referring to modules
156123

157124
With this design, diagnostics can refer to names in modules and can emit a
158-
normalized declaration of an entity but not point to its location in the
159-
source.
160-
161-
If the header includes the source file it came from, that could be included in
162-
a diagnostic but we still wouldn't have line numbers.
163-
164-
To provide line numbers and character positions or source lines as the user
165-
wrote them we would have to save some amount of provenance information in the
166-
module file as well.
125+
normalized declaration of an entity.
167126

168127
## Hermetic modules files
169128

0 commit comments

Comments
 (0)