Skip to content

Commit 19c0919

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 (cherry picked from commit 531227d)
1 parent ed4e035 commit 19c0919

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"
@@ -4258,11 +4259,12 @@ ClangImporter::getSwiftExplicitModuleDirectCC1Args() const {
42584259
PPOpts.MacroIncludes.clear();
42594260
PPOpts.Includes.clear();
42604261

4261-
// CodeGenOptions.
4262-
auto &CGOpts = instance.getCodeGenOpts();
4263-
CGOpts.DebugCompilationDir.clear();
4262+
// Clear benign CodeGenOptions.
4263+
clang::tooling::dependencies::resetBenignCodeGenOptions(
4264+
clang::frontend::ActionKind::GenerateModule, instance.getLangOpts(),
4265+
instance.getCodeGenOpts());
42644266

4265-
// FileSystemOptions.
4267+
// FileSystemOptions.
42664268
auto &FSOpts = instance.getFileSystemOpts();
42674269
FSOpts.WorkingDir.clear();
42684270

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)