Skip to content

Commit 1c8a7bf

Browse files
committed
[flang] Don't duplicate hermetic module file dependencies
When emitting the modules on which a module depends under the -fhermetic-module-files options, eliminate duplicates by name rather than by symbol addresses. This way, when a dependent module is in the symbol table more than once due to the use of a nested hermetic module, it doesn't get emitted multiple times to the new module file.
1 parent 78af498 commit 1c8a7bf

File tree

3 files changed

+81
-7
lines changed

3 files changed

+81
-7
lines changed

flang/lib/Semantics/mod-file.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -143,18 +143,22 @@ void ModFileWriter::Write(const Symbol &symbol) {
143143
std::string path{context_.moduleDirectory() + '/' +
144144
ModFileName(symbol.name(), ancestorName, context_.moduleFileSuffix())};
145145

146-
UnorderedSymbolSet hermeticModules;
147-
hermeticModules.insert(symbol);
146+
std::set<std::string> hermeticModuleNames;
147+
hermeticModuleNames.insert(symbol.name().ToString());
148148
UnorderedSymbolSet additionalModules;
149149
PutSymbols(DEREF(symbol.scope()),
150150
hermeticModuleFileOutput_ ? &additionalModules : nullptr);
151151
auto asStr{GetAsString(symbol)};
152152
while (!additionalModules.empty()) {
153-
for (auto ref : UnorderedSymbolSet{std::move(additionalModules)}) {
154-
if (hermeticModules.insert(*ref).second &&
155-
!ref->owner().IsIntrinsicModules()) {
156-
PutSymbols(DEREF(ref->scope()), &additionalModules);
157-
asStr += GetAsString(*ref);
153+
UnorderedSymbolSet nextPass{std::move(additionalModules)};
154+
additionalModules.clear();
155+
for (const Symbol &modSym : nextPass) {
156+
if (!modSym.owner().IsIntrinsicModules() &&
157+
hermeticModuleNames.find(modSym.name().ToString()) ==
158+
hermeticModuleNames.end()) {
159+
hermeticModuleNames.insert(modSym.name().ToString());
160+
PutSymbols(DEREF(modSym.scope()), &additionalModules);
161+
asStr += GetAsString(modSym);
158162
}
159163
}
160164
}

flang/test/Semantics/modfile76.F90

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
!RUN: %flang -c -fhermetic-module-files -DWHICH=1 %s && %flang -c -fhermetic-module-files -DWHICH=2 %s && %flang -c -fhermetic-module-files %s && cat modfile76c.mod | FileCheck %s
2+
3+
#if WHICH == 1
4+
module modfile76a
5+
integer :: global_variable = 0
6+
end
7+
#elif WHICH == 2
8+
module modfile76b
9+
use modfile76a
10+
contains
11+
subroutine test
12+
end
13+
end
14+
#else
15+
module modfile76c
16+
use modfile76a
17+
use modfile76b
18+
end
19+
#endif
20+
21+
!CHECK: module modfile76c
22+
!CHECK: use modfile76a,only:global_variable
23+
!CHECK: use modfile76b,only:test
24+
!CHECK: end
25+
!CHECK: module modfile76a
26+
!CHECK: integer(4)::global_variable
27+
!CHECK: end
28+
!CHECK: module modfile76b
29+
!CHECK: use modfile76a,only:global_variable
30+
!CHECK: contains
31+
!CHECK: subroutine test()
32+
!CHECK: end
33+
!CHECK: end

flang/test/Semantics/modfile77.F90

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
!RUN: %flang -c -fhermetic-module-files -DWHICH=1 %s && %flang -c -fhermetic-module-files -DWHICH=2 %s && %flang -c -fhermetic-module-files %s && cat modfile77c.mod | FileCheck %s
2+
3+
#if WHICH == 1
4+
module modfile77a
5+
interface gen
6+
procedure proc
7+
end interface
8+
contains
9+
subroutine proc
10+
print *, 'ok'
11+
end
12+
end
13+
#elif WHICH == 2
14+
module modfile77b
15+
use modfile77a
16+
end
17+
#else
18+
module modfile77c
19+
use modfile77a
20+
use modfile77b
21+
end
22+
#endif
23+
24+
!CHECK: module modfile77c
25+
!CHECK: use modfile77a,only:proc
26+
!CHECK: use modfile77a,only:gen
27+
!CHECK: interface gen
28+
!CHECK: end interface
29+
!CHECK: end
30+
!CHECK: module modfile77a
31+
!CHECK: interface gen
32+
!CHECK: procedure::proc
33+
!CHECK: end interface
34+
!CHECK: contains
35+
!CHECK: subroutine proc()
36+
!CHECK: end
37+
!CHECK: end

0 commit comments

Comments
 (0)