@@ -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
2729The disadvantage of using the same name as other compilers is that it is not
2830clear 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
4043a 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
8572In 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
9881Each use-associated symbol will be written as a separate * use-only* statement,
9982possibly 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
11489for module files and where to write them. By default it will be the current
11590directory 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
12898When writing a module file, if the existing one matches what would be written,
12999the 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
142106When 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
150117When processing ` .mod ` files we know they are valid Fortran with these properties:
1511181 . 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
157124With 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