Skip to content

[ModuleInterfaces] Combine the normalized target triple into the cache hash #27469

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions lib/Frontend/ModuleInterfaceLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -391,12 +391,15 @@ class ModuleInterfaceLoaderImpl {
// anyways.
H = hash_combine(H, interfacePath);

// Include the target CPU architecture. In practice, .swiftinterface files
// will be in architecture-specific subdirectories and would have
// architecture-specific pieces #if'd out. However, it doesn't hurt to
// Include the normalized target triple. In practice, .swiftinterface files
// will be in target-specific subdirectories and would have
// target-specific pieces #if'd out. However, it doesn't hurt to
// include it, and it guards against mistakenly reusing cached modules
// across architectures.
H = hash_combine(H, SubInvocation.getLangOptions().Target.getArchName());
// across targets. Note that this normalization explicitly doesn't
// include the minimum deployment target (e.g. the '12.0' in 'ios12.0').
auto normalizedTargetTriple =
getTargetSpecificModuleTriple(SubInvocation.getLangOptions().Target);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@compnerd I notice that Android drops the API version when it normalizes the target triple. Will that behavior be appropriate here?

H = hash_combine(H, normalizedTargetTriple.str());

// The SDK path is going to affect how this module is imported, so include
// it.
Expand Down
28 changes: 28 additions & 0 deletions test/ModuleInterface/multiple-targets-same-interface.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// RUN: %empty-directory(%t)
// RUN: %empty-directory(%t/MCP)

// This test makes sure that the module cache hash properly distinguishes
// between different targets, even when the path to the module interface is
// the same for multiple targets.

// 1. Build a .swiftinterface for a dummy module.

// RUN: %target-swift-frontend -typecheck -target x86_64-apple-macosx10.9 -emit-module-interface-path %t/SwiftModule.swiftinterface.tmp -parse-stdlib %s -module-name SwiftModule

// 2. Remove the -target line from the .swiftinterface. Clients will build using their target.

// RUN: sed -E 's/-target [^ ]+//g' %t/SwiftModule.swiftinterface.tmp > %t/SwiftModule.swiftinterface

// 3. Build for a bunch of different x86_64 targets, and ensure they all succeed by putting something else in the module cache.

// RUN: echo 'import SwiftModule' > %t/test.swift

// RUN: %target-swift-frontend -typecheck -sdk '' -target x86_64-apple-macosx10.9 -module-cache-path %t/MCP -parse-stdlib -I %t %t/test.swift
// RUN: %target-swift-frontend -typecheck -sdk '' -target x86_64-apple-tvos13.0 -module-cache-path %t/MCP -parse-stdlib -I %t %t/test.swift
// RUN: %target-swift-frontend -typecheck -sdk '' -target x86_64-apple-ios10.0 -module-cache-path %t/MCP -parse-stdlib -I %t %t/test.swift

// 4. Test iOS again, but with a newer minimum deployment target
// RUN: %target-swift-frontend -typecheck -sdk '' -target x86_64-apple-ios13.0 -module-cache-path %t/MCP -parse-stdlib -I %t %t/test.swift

// 5. Make sure there are only 3 .swiftmodules in the cache path (because iOS was reused)
// RUN: ls %t/MCP/*.swiftmodule | count 3