Skip to content

Commit 531227d

Browse files
[Caching] Clear benign CodeGen options when building modules
Use `resetBenignCodeGenOptions()` from clang dependency scanner to clear the swift explicit module build cc1 arguments. This fixes the problem that CurrentWorkingDirectory is leaking through `-fcoverage-compilation-dir` that can cause extra module variants when caching is enabled. This also avoid the duplicating the logics for clearing CodeGen options inside Swift. rdar://151395300
1 parent a0aad5c commit 531227d

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

lib/ClangImporter/ClangImporter.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
#include "clang/Serialization/ASTReader.h"
9191
#include "clang/Serialization/ASTWriter.h"
9292
#include "clang/Serialization/ObjectFilePCHContainerReader.h"
93+
#include "clang/Tooling/DependencyScanning/ModuleDepCollector.h"
9394
#include "clang/Tooling/DependencyScanning/ScanAndUpdateArgs.h"
9495
#include "llvm/ADT/IntrusiveRefCntPtr.h"
9596
#include "llvm/ADT/STLExtras.h"
@@ -4232,11 +4233,12 @@ ClangImporter::getSwiftExplicitModuleDirectCC1Args() const {
42324233
PPOpts.MacroIncludes.clear();
42334234
PPOpts.Includes.clear();
42344235

4235-
// CodeGenOptions.
4236-
auto &CGOpts = instance.getCodeGenOpts();
4237-
CGOpts.DebugCompilationDir.clear();
4236+
// Clear benign CodeGenOptions.
4237+
clang::tooling::dependencies::resetBenignCodeGenOptions(
4238+
clang::frontend::ActionKind::GenerateModule, instance.getLangOpts(),
4239+
instance.getCodeGenOpts());
42384240

4239-
// FileSystemOptions.
4241+
// FileSystemOptions.
42404242
auto &FSOpts = instance.getFileSystemOpts();
42414243
FSOpts.WorkingDir.clear();
42424244

test/CAS/coverage-dir.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: split-file %s %t
3+
4+
// RUN: %target-swift-frontend -scan-dependencies -module-name Test -O -I %t/include \
5+
// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import \
6+
// RUN: %t/main.swift -o %t/deps.json -cache-compile-job -cas-path %t/cas -profile-coverage-mapping -profile-generate
7+
8+
// RUN: %{python} %S/Inputs/BuildCommandExtractor.py %t/deps.json clang:SwiftShims > %t/shim.cmd
9+
// RUN: %swift_frontend_plain @%t/shim.cmd
10+
// RUN: %{python} %S/Inputs/BuildCommandExtractor.py %t/deps.json A > %t/A.cmd
11+
// RUN: %swift_frontend_plain @%t/A.cmd
12+
13+
// RUN: %FileCheck %s --input-file=%t/shim.cmd
14+
// RUN: %FileCheck %s --input-file=%t/A.cmd
15+
16+
// CHECK: -direct-clang-cc1-module-build
17+
// CHECK-NOT: -fcoverage-compilation-dir
18+
19+
//--- main.swift
20+
import A
21+
func test() {
22+
a();
23+
}
24+
25+
//--- include/A.swiftinterface
26+
// swift-interface-format-version: 1.0
27+
// swift-module-flags: -module-name A -O -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import -parse-stdlib -user-module-version 1.0
28+
public func a() { }

0 commit comments

Comments
 (0)