mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Preload standard library in ModuleInterfaceBuilder
Previously, when the standard library module interface was broken, Swift would try to rebuild it repeatedly during -compile-module-from-interface jobs because `ASTContext::getStdlibModule()` would try to load the standard library again each time it was called. This led to extremely slow compilations that repeatedly emitted the same errors. To avoid this, we make ModuleInterfaceBuilder try to load the standard library right away and bail out if it can’t. Fixes rdar://75669548.
This commit is contained in:
@@ -187,6 +187,13 @@ bool ModuleInterfaceBuilder::buildSwiftModuleInternal(
|
|||||||
InputInfo.getPrimarySpecificPaths().SupplementaryOutputs;
|
InputInfo.getPrimarySpecificPaths().SupplementaryOutputs;
|
||||||
StringRef OutPath = OutputInfo.ModuleOutputPath;
|
StringRef OutPath = OutputInfo.ModuleOutputPath;
|
||||||
|
|
||||||
|
// Bail out if we're going to use the standard library but can't load it. If
|
||||||
|
// we don't do this before we try to build the interface, we could end up
|
||||||
|
// trying to rebuild a broken standard library dozens of times due to
|
||||||
|
// multiple calls to `ASTContext::getStdlibModule()`.
|
||||||
|
if (SubInstance.loadStdlibIfNeeded())
|
||||||
|
return std::make_error_code(std::errc::not_supported);
|
||||||
|
|
||||||
// Build the .swiftmodule; this is a _very_ abridged version of the logic
|
// Build the .swiftmodule; this is a _very_ abridged version of the logic
|
||||||
// in performCompile in libFrontendTool, specialized, to just the one
|
// in performCompile in libFrontendTool, specialized, to just the one
|
||||||
// module-serialization task we're trying to do here.
|
// module-serialization task we're trying to do here.
|
||||||
|
|||||||
16
test/ModuleInterface/BadStdlib.swiftinterface
Normal file
16
test/ModuleInterface/BadStdlib.swiftinterface
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
// swift-interface-format-version: 1.0
|
||||||
|
// swift-module-flags: -target x86_64-apple-macos10.9 -module-name BadStdlib
|
||||||
|
|
||||||
|
// no-error@-3
|
||||||
|
|
||||||
|
// Tests whether -compile-module-from-interface correctly stops early when the
|
||||||
|
// standard library module interface is broken, rather than trying to limp along
|
||||||
|
// without a standard library, which tends to cause ClangImporter crashes (among
|
||||||
|
// other things.)
|
||||||
|
|
||||||
|
// RUN: %empty-directory(%t)
|
||||||
|
// RUN: %target-swift-frontend(mock-sdk: -sdk %/S/Inputs/BadStdlib.sdk -module-cache-path %/t/module-cache -resource-dir %/S/Inputs/BadStdlib.sdk) -compile-module-from-interface -o %/t/BadStdlib.swiftmodule %s -verify -verify-additional-file %/S/Inputs/BadStdlib.sdk/usr/lib/swift/Swift.swiftmodule/x86_64-apple-macos.swiftinterface
|
||||||
|
|
||||||
|
import ClangMod
|
||||||
|
|
||||||
|
public func useHasPointer(_: HasPointer)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
typedef int * HasPointer;
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
module HasPointer {
|
||||||
|
header "HasPointer.h"
|
||||||
|
export *
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// swift-interface-format-version: 1.0
|
||||||
|
// swift-module-flags: -target x86_64-apple-macos10.9 -module-name Swift -parse-stdlib
|
||||||
|
|
||||||
|
// If the test fails, this error will be emitted twice, not once.
|
||||||
|
// expected-error@-4 {{failed to build module 'Swift' for importation due to the errors above}}
|
||||||
|
|
||||||
|
public struct BadType {
|
||||||
|
public var property: UndeclaredType { get set } // expected-error {{cannot find type 'UndeclaredType' in scope}}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user