mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Merge pull request #85010 from artemcm/AlwaysRebuildExplicitInterface
[Explicit Module Builds] Always rebuild the target module in explicit `-compile-module-from-interface` builds.
This commit is contained in:
@@ -273,9 +273,6 @@ namespace swift {
|
|||||||
/// Emit a remark when indexing a system module.
|
/// Emit a remark when indexing a system module.
|
||||||
bool EnableIndexingSystemModuleRemarks = false;
|
bool EnableIndexingSystemModuleRemarks = false;
|
||||||
|
|
||||||
/// Emit a remark on early exit in explicit interface build
|
|
||||||
bool EnableSkipExplicitInterfaceModuleBuildRemarks = false;
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Support for alternate usage modes
|
/// Support for alternate usage modes
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1485,8 +1485,6 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
|
|||||||
Opts.EnableMacroLoadingRemarks = Args.hasArg(OPT_remark_macro_loading);
|
Opts.EnableMacroLoadingRemarks = Args.hasArg(OPT_remark_macro_loading);
|
||||||
Opts.EnableIndexingSystemModuleRemarks = Args.hasArg(OPT_remark_indexing_system_module);
|
Opts.EnableIndexingSystemModuleRemarks = Args.hasArg(OPT_remark_indexing_system_module);
|
||||||
|
|
||||||
Opts.EnableSkipExplicitInterfaceModuleBuildRemarks = Args.hasArg(OPT_remark_skip_explicit_interface_build);
|
|
||||||
|
|
||||||
if (Args.hasArg(OPT_experimental_skip_non_exportable_decls)) {
|
if (Args.hasArg(OPT_experimental_skip_non_exportable_decls)) {
|
||||||
// Only allow -experimental-skip-non-exportable-decls if either library
|
// Only allow -experimental-skip-non-exportable-decls if either library
|
||||||
// evolution is enabled (in which case the module's ABI is independent of
|
// evolution is enabled (in which case the module's ABI is independent of
|
||||||
|
|||||||
@@ -1609,27 +1609,6 @@ bool ModuleInterfaceLoader::buildExplicitSwiftModuleFromSwiftInterface(
|
|||||||
StringRef outputPath, bool ShouldSerializeDeps,
|
StringRef outputPath, bool ShouldSerializeDeps,
|
||||||
ArrayRef<std::string> CompiledCandidates,
|
ArrayRef<std::string> CompiledCandidates,
|
||||||
DependencyTracker *tracker) {
|
DependencyTracker *tracker) {
|
||||||
|
|
||||||
if (!Instance.getInvocation().getIRGenOptions().AlwaysCompile) {
|
|
||||||
// First, check if the expected output already exists and possibly
|
|
||||||
// up-to-date w.r.t. all of the dependencies it was built with. If so, early
|
|
||||||
// exit.
|
|
||||||
UpToDateModuleCheker checker(
|
|
||||||
Instance.getASTContext());
|
|
||||||
ModuleRebuildInfo rebuildInfo;
|
|
||||||
SmallVector<FileDependency, 3> allDeps;
|
|
||||||
std::unique_ptr<llvm::MemoryBuffer> moduleBuffer;
|
|
||||||
if (checker.swiftModuleIsUpToDate(outputPath, rebuildInfo, allDeps,
|
|
||||||
moduleBuffer)) {
|
|
||||||
if (Instance.getASTContext()
|
|
||||||
.LangOpts.EnableSkipExplicitInterfaceModuleBuildRemarks) {
|
|
||||||
Instance.getDiags().diagnose(
|
|
||||||
SourceLoc(), diag::explicit_interface_build_skipped, outputPath);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read out the compiler version.
|
// Read out the compiler version.
|
||||||
llvm::BumpPtrAllocator alloc;
|
llvm::BumpPtrAllocator alloc;
|
||||||
llvm::StringSaver ArgSaver(alloc);
|
llvm::StringSaver ArgSaver(alloc);
|
||||||
|
|||||||
@@ -14,11 +14,9 @@
|
|||||||
// RUN: %target-swift-frontend -scan-dependencies -module-name test -o %t/test.json %s -enable-deterministic-check 2>&1 | %FileCheck %s --check-prefix=DEPSCAN_OUTPUT
|
// RUN: %target-swift-frontend -scan-dependencies -module-name test -o %t/test.json %s -enable-deterministic-check 2>&1 | %FileCheck %s --check-prefix=DEPSCAN_OUTPUT
|
||||||
/// TODO: Implicit module build use a different compiler instance so it doesn't support checking yet.
|
/// TODO: Implicit module build use a different compiler instance so it doesn't support checking yet.
|
||||||
// RUN: %target-swift-frontend -typecheck -emit-module-interface-path %t/test.swiftinterface %s -O -enable-deterministic-check 2>&1 | %FileCheck %s --check-prefix=INTERFACE_OUTPUT
|
// RUN: %target-swift-frontend -typecheck -emit-module-interface-path %t/test.swiftinterface %s -O -enable-deterministic-check 2>&1 | %FileCheck %s --check-prefix=INTERFACE_OUTPUT
|
||||||
|
|
||||||
/// Hit cache and not emit the second time.
|
/// Hit cache and not emit the second time.
|
||||||
// RUN: rm %t/test.swiftmodule
|
// RUN: %target-swift-frontend -compile-module-from-interface %t/test.swiftinterface -explicit-interface-module-build -o %t/test.swiftmodule -enable-deterministic-check 2>&1 | %FileCheck --check-prefix=MODULE_OUTPUT %s
|
||||||
// RUN: not %target-swift-frontend -compile-module-from-interface %t/test.swiftinterface -explicit-interface-module-build -o %t/test.swiftmodule -enable-deterministic-check 2>&1 | %FileCheck --check-prefix=MODULE_MISMATCH %s
|
|
||||||
/// Force swiftmodule generation.
|
|
||||||
// RUN: %target-swift-frontend -compile-module-from-interface %t/test.swiftinterface -explicit-interface-module-build -o %t/test.swiftmodule -enable-deterministic-check -always-compile-output-files 2>&1 | %FileCheck --check-prefix=MODULE_OUTPUT %s
|
|
||||||
|
|
||||||
// RUN: %target-swift-frontend -emit-pcm -module-name UserClangModule -o %t/test.pcm %S/Inputs/dependencies/module.modulemap -enable-deterministic-check 2>&1 | %FileCheck %s --check-prefix=PCM_OUTPUT
|
// RUN: %target-swift-frontend -emit-pcm -module-name UserClangModule -o %t/test.pcm %S/Inputs/dependencies/module.modulemap -enable-deterministic-check 2>&1 | %FileCheck %s --check-prefix=PCM_OUTPUT
|
||||||
|
|
||||||
@@ -34,7 +32,6 @@
|
|||||||
// OBJECT_MISMATCH: error: output file '{{.*}}{{/|\\}}test.o' is missing from second compilation for deterministic check
|
// OBJECT_MISMATCH: error: output file '{{.*}}{{/|\\}}test.o' is missing from second compilation for deterministic check
|
||||||
// DEPSCAN_OUTPUT: remark: produced matching output file '{{.*}}{{/|\\}}test.json'
|
// DEPSCAN_OUTPUT: remark: produced matching output file '{{.*}}{{/|\\}}test.json'
|
||||||
// INTERFACE_OUTPUT: remark: produced matching output file '{{.*}}{{/|\\}}test.swiftinterface'
|
// INTERFACE_OUTPUT: remark: produced matching output file '{{.*}}{{/|\\}}test.swiftinterface'
|
||||||
// MODULE_MISMATCH: error: output file '{{.*}}{{/|\\}}test.swiftmodule' is missing from second compilation for deterministic check
|
|
||||||
// PCM_OUTPUT: remark: produced matching output file '{{.*}}{{/|\\}}test.pcm'
|
// PCM_OUTPUT: remark: produced matching output file '{{.*}}{{/|\\}}test.pcm'
|
||||||
|
|
||||||
public var x = 1
|
public var x = 1
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
// swift-interface-format-version: 1.0
|
|
||||||
// swift-module-flags: -parse-stdlib
|
|
||||||
|
|
||||||
// RUN: %empty-directory(%t)
|
|
||||||
// RUN: %target-swift-frontend -compile-module-from-interface -module-name ExplicitModule -explicit-interface-module-build -o %/t/ExplicitModule.swiftmodule %s
|
|
||||||
|
|
||||||
// RUN: %target-swift-frontend -compile-module-from-interface -module-name ExplicitModule -explicit-interface-module-build -o %/t/ExplicitModule.swiftmodule %s -Rskip-explicit-interface-build 2>&1 | %FileCheck %s
|
|
||||||
|
|
||||||
import Swift
|
|
||||||
extension Int {
|
|
||||||
public static var fortytwo: Int = 42
|
|
||||||
}
|
|
||||||
|
|
||||||
// CHECK: <unknown>:0: remark: Skipped rebuilding module at {{.*}}ExplicitModule.swiftmodule - up-to-date
|
|
||||||
25
test/ScanDependencies/explicit-interface-build.swift
Normal file
25
test/ScanDependencies/explicit-interface-build.swift
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
// RUN: %empty-directory(%t)
|
||||||
|
// RUN: %empty-directory(%t/module-cache)
|
||||||
|
// RUN: %empty-directory(%t/Foo.swiftmodule)
|
||||||
|
// RUN: split-file %s %t
|
||||||
|
|
||||||
|
// Build module from interface
|
||||||
|
// RUN: %target-swift-frontend -compile-module-from-interface -o %t/Foo.swiftmodule/Foo.swiftmodule -module-name Foo %t/Foo.swiftmodule/Foo.swiftinterface -explicit-interface-module-build
|
||||||
|
|
||||||
|
// Add to the textual interface
|
||||||
|
// RUN: echo "struct GoodBye {}" >> %t/Foo.swiftmodule/Foo.swiftinterface
|
||||||
|
|
||||||
|
// Build module from interface
|
||||||
|
// RUN: %target-swift-frontend -compile-module-from-interface -o %t/Foo.swiftmodule/Foo.swiftmodule -module-name Foo %t/Foo.swiftmodule/Foo.swiftinterface -explicit-interface-module-build
|
||||||
|
|
||||||
|
// Get the list of strings and ensure the binary module reflects the new addition
|
||||||
|
// RUN: %llvm-strings %t/Foo.swiftmodule/Foo.swiftmodule > %t/module_strings.txt
|
||||||
|
|
||||||
|
// RUN: cat %t/module_strings.txt | %FileCheck %s
|
||||||
|
// CHECK-DAG: Hello
|
||||||
|
// CHECK-DAG: GoodBye
|
||||||
|
|
||||||
|
//--- Foo.swiftmodule/Foo.swiftinterface
|
||||||
|
// swift-interface-format-version: 1.0
|
||||||
|
// swift-module-flags: -module-name Foo
|
||||||
|
struct Hello {}
|
||||||
Reference in New Issue
Block a user