Skip to content

Commit ce36ccd

Browse files
authored
Merge pull request #68677 from artemcm/FixImportProcessOrderForScan
[Dependency Scanning] Process implicit imports of the source module first, emulating implicit builds
2 parents d6483ae + c9c689a commit ce36ccd

10 files changed

+105
-126
lines changed

lib/DependencyScan/ScanDependencies.cpp

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1703,66 +1703,68 @@ static llvm::ErrorOr<ModuleDependencyInfo> identifyMainModuleDependencies(
17031703
rootID = root->getID().toString();
17041704
}
17051705

1706-
auto mainDependencies =
1706+
auto mainModuleDependencyInfo =
17071707
ModuleDependencyInfo::forSwiftSourceModule(rootID, {}, {}, ExtraPCMArgs);
17081708

1709+
llvm::StringSet<> alreadyAddedModules;
17091710
// Compute Implicit dependencies of the main module
17101711
{
1711-
llvm::StringSet<> alreadyAddedModules;
1712-
for (auto fileUnit : mainModule->getFiles()) {
1713-
auto sf = dyn_cast<SourceFile>(fileUnit);
1714-
if (!sf)
1715-
continue;
1716-
1717-
mainDependencies.addModuleImport(*sf, alreadyAddedModules);
1718-
}
1719-
17201712
const auto &importInfo = mainModule->getImplicitImportInfo();
1721-
17221713
// Swift standard library.
17231714
switch (importInfo.StdlibKind) {
17241715
case ImplicitStdlibKind::None:
17251716
case ImplicitStdlibKind::Builtin:
17261717
break;
17271718

17281719
case ImplicitStdlibKind::Stdlib:
1729-
mainDependencies.addModuleImport("Swift", &alreadyAddedModules);
1720+
mainModuleDependencyInfo.addModuleImport("Swift", &alreadyAddedModules);
17301721
break;
17311722
}
17321723

17331724
// Add any implicit module names.
17341725
for (const auto &import : importInfo.AdditionalUnloadedImports) {
1735-
mainDependencies.addModuleImport(import.module.getModulePath(),
1736-
&alreadyAddedModules);
1726+
mainModuleDependencyInfo.addModuleImport(import.module.getModulePath(),
1727+
&alreadyAddedModules);
17371728
}
17381729

17391730
// Already-loaded, implicitly imported module names.
17401731
for (const auto &import : importInfo.AdditionalImports) {
1741-
mainDependencies.addModuleImport(
1732+
mainModuleDependencyInfo.addModuleImport(
17421733
import.module.importedModule->getNameStr(), &alreadyAddedModules);
17431734
}
17441735

17451736
// Add the bridging header.
17461737
if (!importInfo.BridgingHeaderPath.empty()) {
1747-
mainDependencies.addBridgingHeader(importInfo.BridgingHeaderPath);
1738+
mainModuleDependencyInfo.addBridgingHeader(importInfo.BridgingHeaderPath);
17481739
}
17491740

17501741
// If we are to import the underlying Clang module of the same name,
17511742
// add a dependency with the same name to trigger the search.
17521743
if (importInfo.ShouldImportUnderlyingModule) {
1753-
mainDependencies.addModuleImport(mainModule->getName().str(),
1754-
&alreadyAddedModules);
1744+
mainModuleDependencyInfo.addModuleImport(mainModule->getName().str(),
1745+
&alreadyAddedModules);
17551746
}
17561747

17571748
// All modules specified with `-embed-tbd-for-module` are treated as implicit
17581749
// dependnecies for this compilation since they are not guaranteed to be impored
17591750
// in the source.
17601751
for (const auto &tbdSymbolModule : instance.getInvocation().getTBDGenOptions().embedSymbolsFromModules) {
1761-
mainDependencies.addModuleImport(tbdSymbolModule, &alreadyAddedModules);
1752+
mainModuleDependencyInfo.addModuleImport(tbdSymbolModule, &alreadyAddedModules);
1753+
}
1754+
}
1755+
1756+
// Add user-specified `import` dependencies
1757+
{
1758+
for (auto fileUnit : mainModule->getFiles()) {
1759+
auto sf = dyn_cast<SourceFile>(fileUnit);
1760+
if (!sf)
1761+
continue;
1762+
1763+
mainModuleDependencyInfo.addModuleImport(*sf, alreadyAddedModules);
17621764
}
17631765
}
17641766

1765-
return mainDependencies;
1767+
return mainModuleDependencyInfo;
17661768
}
17671769

17681770
} // namespace

test/CAS/module_deps.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -159,20 +159,6 @@ import SubE
159159
// CHECK: "moduleInterfacePath"
160160
// CHECK-SAME: E.swiftinterface
161161

162-
/// --------Swift module Swift
163-
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}Swift-{{.*}}.swiftmodule",
164-
165-
// CHECK: directDependencies
166-
// CHECK-NEXT: {
167-
// CHECK-NEXT: "clang": "SwiftShims"
168-
169-
/// --------Clang module SwiftShims
170-
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}SwiftShims-{{.*}}.pcm",
171-
// CHECK: "contextHash": "[[SHIMS_CONTEXT:.*]]",
172-
// CHECK: "-o"
173-
// CHECK-NEXT: SwiftShims-{{.*}}[[SHIMS_CONTEXT]].pcm
174-
// CHECK-NO-SEARCH-PATHS-NOT: "-prebuilt-module-cache-path"
175-
176162
/// --------Clang module C
177163
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}C-{{.*}}.pcm",
178164

@@ -205,3 +191,17 @@ import SubE
205191
// CHECK-MAKE-DEPS-SAME: Bridging.h
206192
// CHECK-MAKE-DEPS-SAME: BridgingOther.h
207193
// CHECK-MAKE-DEPS-SAME: module.modulemap
194+
195+
/// --------Swift module Swift
196+
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}Swift-{{.*}}.swiftmodule",
197+
198+
// CHECK: directDependencies
199+
// CHECK-NEXT: {
200+
// CHECK-NEXT: "clang": "SwiftShims"
201+
202+
/// --------Clang module SwiftShims
203+
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}SwiftShims-{{.*}}.pcm",
204+
// CHECK: "contextHash": "[[SHIMS_CONTEXT:.*]]",
205+
// CHECK: "-o"
206+
// CHECK-NEXT: SwiftShims-{{.*}}[[SHIMS_CONTEXT]].pcm
207+
// CHECK-NO-SEARCH-PATHS-NOT: "-prebuilt-module-cache-path"

test/CAS/module_deps_include_tree.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -153,20 +153,6 @@ import SubE
153153
// CHECK: "moduleInterfacePath"
154154
// CHECK-SAME: E.swiftinterface
155155

156-
/// --------Swift module Swift
157-
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}Swift-{{.*}}.swiftmodule",
158-
159-
// CHECK: directDependencies
160-
// CHECK-NEXT: {
161-
// CHECK-NEXT: "clang": "SwiftShims"
162-
163-
/// --------Clang module SwiftShims
164-
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}SwiftShims-{{.*}}.pcm",
165-
// CHECK: "contextHash": "[[SHIMS_CONTEXT:.*]]",
166-
// CHECK: "-o"
167-
// CHECK-NEXT: SwiftShims-{{.*}}[[SHIMS_CONTEXT]].pcm
168-
// CHECK-NO-SEARCH-PATHS-NOT: "-prebuilt-module-cache-path"
169-
170156
/// --------Clang module C
171157
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}C-{{.*}}.pcm",
172158

@@ -199,3 +185,17 @@ import SubE
199185
// CHECK-MAKE-DEPS-SAME: Bridging.h
200186
// CHECK-MAKE-DEPS-SAME: BridgingOther.h
201187
// CHECK-MAKE-DEPS-SAME: module.modulemap
188+
189+
/// --------Swift module Swift
190+
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}Swift-{{.*}}.swiftmodule",
191+
192+
// CHECK: directDependencies
193+
// CHECK-NEXT: {
194+
// CHECK-NEXT: "clang": "SwiftShims"
195+
196+
/// --------Clang module SwiftShims
197+
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}SwiftShims-{{.*}}.pcm",
198+
// CHECK: "contextHash": "[[SHIMS_CONTEXT:.*]]",
199+
// CHECK: "-o"
200+
// CHECK-NEXT: SwiftShims-{{.*}}[[SHIMS_CONTEXT]].pcm
201+
// CHECK-NO-SEARCH-PATHS-NOT: "-prebuilt-module-cache-path"

test/CAS/plugin_cas.swift

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -142,20 +142,6 @@ import SubE
142142
// CHECK: "moduleInterfacePath"
143143
// CHECK-SAME: E.swiftinterface
144144

145-
/// --------Swift module Swift
146-
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}Swift-{{.*}}.swiftmodule",
147-
148-
// CHECK: directDependencies
149-
// CHECK-NEXT: {
150-
// CHECK-NEXT: "clang": "SwiftShims"
151-
152-
/// --------Clang module SwiftShims
153-
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}SwiftShims-{{.*}}.pcm",
154-
// CHECK: "contextHash": "[[SHIMS_CONTEXT:.*]]",
155-
// CHECK: "-o"
156-
// CHECK-NEXT: SwiftShims-{{.*}}[[SHIMS_CONTEXT]].pcm
157-
// CHECK-NO-SEARCH-PATHS-NOT: "-prebuilt-module-cache-path"
158-
159145
/// --------Clang module C
160146
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}C-{{.*}}.pcm",
161147

@@ -188,3 +174,18 @@ import SubE
188174
// CHECK-MAKE-DEPS-SAME: Bridging.h
189175
// CHECK-MAKE-DEPS-SAME: BridgingOther.h
190176
// CHECK-MAKE-DEPS-SAME: module.modulemap
177+
178+
/// --------Swift module Swift
179+
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}Swift-{{.*}}.swiftmodule",
180+
181+
// CHECK: directDependencies
182+
// CHECK-NEXT: {
183+
// CHECK-NEXT: "clang": "SwiftShims"
184+
185+
/// --------Clang module SwiftShims
186+
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}SwiftShims-{{.*}}.pcm",
187+
// CHECK: "contextHash": "[[SHIMS_CONTEXT:.*]]",
188+
// CHECK: "-o"
189+
// CHECK-NEXT: SwiftShims-{{.*}}[[SHIMS_CONTEXT]].pcm
190+
// CHECK-NO-SEARCH-PATHS-NOT: "-prebuilt-module-cache-path"
191+

test/ModuleInterface/clang-args-transitive-availability.swift

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,9 @@
1212
import ImportsMacroSpecificClangModule
1313

1414
// CHECK: "directDependencies": [
15-
// CHECK-NEXT: {
1615
// CHECK-DAG: "swift": "ImportsMacroSpecificClangModule"
17-
// CHECK-NEXT: },
18-
// CHECK-NEXT: {
1916
// CHECK-DAG: "swift": "Swift"
20-
// CHECK-NEXT: },
21-
// CHECK-NEXT: {
2217
// CHECK-DAG: "swift": "SwiftOnoneSupport"
23-
// CHECK-NEXT: }
24-
// CHECK-NEXT: ],
2518

2619
//CHECK: "swift": "ImportsMacroSpecificClangModule"
2720
//CHECK-NEXT: },

test/ModuleInterface/extension-transitive-availability.swift

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,9 @@ func foo() {
1313
}
1414

1515
// CHECK: "directDependencies": [
16-
// CHECK-NEXT: {
17-
// CHECK-NEXT: "swift": "ExtensionAvailable"
18-
// CHECK-NEXT: },
19-
// CHECK-NEXT: {
20-
// CHECK-NEXT: "swift": "Swift"
21-
// CHECK-NEXT: },
22-
// CHECK-NEXT: {
23-
// CHECK-NEXT: "swift": "SwiftOnoneSupport"
24-
// CHECK-NEXT: }
25-
// CHECK-NEXT: ],
26-
16+
// CHECK-DAG: "swift": "ExtensionAvailable"
17+
// CHECK-DAG: "swift": "Swift"
18+
// CHECK-DAG: "swift": "SwiftOnoneSupport"
2719

2820
// CHECK: "swift": "ExtensionAvailable"
2921
// CHECK-NEXT: },

test/ScanDependencies/module_deps_cache_reuse.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -114,22 +114,11 @@ import SubE
114114
// CHECK-LABEL: modulePath": "{{.*}}{{/|\\}}E-{{.*}}.swiftmodule"
115115
// CHECK: "directDependencies"
116116
// CHECK-NEXT: {
117-
// CHECK-NEXT: "swift": "Swift"
117+
// CHECK: "swift": "Swift"
118118

119119
// CHECK: "moduleInterfacePath"
120120
// CHECK-SAME: E.swiftinterface
121121

122-
/// --------Swift module Swift
123-
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}Swift-{{.*}}.swiftmodule",
124-
125-
// CHECK: directDependencies
126-
// CHECK-NEXT: {
127-
// CHECK-NEXT: "clang": "SwiftShims"
128-
129-
130-
/// --------Clang module SwiftShims
131-
// CHECK-LABEL: "modulePath": "{{.*}}/SwiftShims-{{.*}}.pcm",
132-
133122
/// --------Clang module C
134123
// CHECK-LABEL: "modulePath": "{{.*}}/C-{{.*}}.pcm",
135124

@@ -139,7 +128,7 @@ import SubE
139128

140129
// CHECK: directDependencies
141130
// CHECK-NEXT: {
142-
// CHECK-NEXT: "clang": "B"
131+
// CHECK: "clang": "B"
143132

144133
// CHECK: "moduleMapPath"
145134
// CHECK-SAME: module.modulemap
@@ -164,5 +153,16 @@ import SubE
164153

165154
// CHECK: directDependencies
166155
// CHECK-NEXT: {
167-
// CHECK-NEXT: "clang": "A"
156+
// CHECK: "clang": "A"
168157
// CHECK-NEXT: }
158+
159+
/// --------Swift module Swift
160+
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}Swift-{{.*}}.swiftmodule",
161+
162+
// CHECK: directDependencies
163+
// CHECK-NEXT: {
164+
// CHECK: "clang": "SwiftShims"
165+
166+
/// --------Clang module SwiftShims
167+
// CHECK-LABEL: "modulePath": "{{.*}}/SwiftShims-{{.*}}.pcm",
168+

test/ScanDependencies/module_deps_external.swift

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ import SomeExternalModule
7777
// CHECK-NEXT: "-Xcc",
7878
// CHECK: "-fapinotes-swift-version=4"
7979

80+
/// --------Swift external module SomeExternalModule
81+
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}SomeExternalModule.swiftmodule",
82+
// CHECK-NEXT: "details": {
83+
// CHECK-NEXT: "swiftPlaceholder": {
84+
// CHECK-NEXT: "moduleDocPath": "BUILD_DIR/{{.*}}/ScanDependencies/Output/module_deps_external.swift.tmp/inputs/SomeExternalModule.swiftdoc",
85+
// CHECK-NEXT: "moduleSourceInfoPath": "BUILD_DIR/{{.*}}/ScanDependencies/Output/module_deps_external.swift.tmp/inputs/SomeExternalModule.swiftsourceinfo"
86+
8087
/// --------Swift module Swift
8188
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}Swift-{{.*}}.swiftmodule",
8289

@@ -93,9 +100,3 @@ import SomeExternalModule
93100
// CHECK-MAKE-DEPS-SAME: BridgingOther.h
94101
// CHECK-MAKE-DEPS-SAME: module.modulemap
95102

96-
/// --------Swift external module SomeExternalModule
97-
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}SomeExternalModule.swiftmodule",
98-
// CHECK-NEXT: "details": {
99-
// CHECK-NEXT: "swiftPlaceholder": {
100-
// CHECK-NEXT: "moduleDocPath": "BUILD_DIR/{{.*}}/ScanDependencies/Output/module_deps_external.swift.tmp/inputs/SomeExternalModule.swiftdoc",
101-
// CHECK-NEXT: "moduleSourceInfoPath": "BUILD_DIR/{{.*}}/ScanDependencies/Output/module_deps_external.swift.tmp/inputs/SomeExternalModule.swiftsourceinfo"

test/ScanDependencies/module_framework.swift

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,11 @@ import CryptoKit
1313

1414
// CHECK: "mainModuleName": "deps"
1515
// CHECK: directDependencies
16-
// CHECK-NEXT: {
17-
// CHECK-NEXT: "swift": "CryptoKit"
18-
// CHECK-NEXT: }
19-
// CHECK-NEXT: {
20-
// CHECK-NEXT: "swift": "Swift"
21-
// CHECK-NEXT: }
22-
// CHECK-NEXT: {
23-
// CHECK-NEXT: "swift": "SwiftOnoneSupport"
24-
// CHECK-NEXT: },
25-
// CHECK-NEXT: {
26-
// CHECK-NEXT: "swift": "_Concurrency"
27-
// CHECK-NEXT: },
28-
// CHECK-NEXT: {
29-
// CHECK-NEXT: "swift": "_StringProcessing"
30-
// CHECK-NEXT: }
31-
// CHECK-NEXT: ],
16+
// CHECK-DAG: "swift": "CryptoKit"
17+
// CHECK-DAG: "swift": "Swift"
18+
// CHECK-DAG: "swift": "SwiftOnoneSupport"
19+
// CHECK-DAG: "swift": "_Concurrency"
20+
// CHECK-DAG: "swift": "_StringProcessing"
21+
// CHECK: ],
3222

3323
// CHECK: "isFramework": true

test/ScanDependencies/prescan_deps.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ import G
1414
import SubE
1515

1616
// CHECK: "imports": [
17-
// CHECK-NEXT: "C",
18-
// CHECK-NEXT: "E",
19-
// CHECK-NEXT: "G",
20-
// CHECK-NEXT: "SubE",
21-
// CHECK-NEXT: "Swift",
22-
// CHECK-NEXT: "SwiftOnoneSupport",
23-
// CHECK-NEXT: "_Concurrency",
24-
// CHECK-NEXT: "_SwiftConcurrencyShims",
25-
// CHECK-NEXT: "_StringProcessing"
26-
// CHECK-NEXT: ]
17+
// CHECK-DAG: "C"
18+
// CHECK-DAG: "E"
19+
// CHECK-DAG: "G"
20+
// CHECK-DAG: "SubE"
21+
// CHECK-DAG: "Swift"
22+
// CHECK-DAG: "SwiftOnoneSupport"
23+
// CHECK-DAG: "_Concurrency"
24+
// CHECK-DAG: "_SwiftConcurrencyShims"
25+
// CHECK-DAG: "_StringProcessing"
26+
// CHECK: ]

0 commit comments

Comments
 (0)