Skip to content

Commit 72c4f73

Browse files
authored
Merge pull request #21891 from apple/revert-21436-revert-5.0-right-on-target
[5.0] Re-apply "[Serialization] Use full target architectures for swiftmodule files"
2 parents b460b4b + 20065ab commit 72c4f73

File tree

4 files changed

+87
-31
lines changed

4 files changed

+87
-31
lines changed

lib/Serialization/SerializedModuleLoader.cpp

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,23 @@ static void addDiagnosticInfoForArchitectureMismatch(ASTContext &ctx,
128128
archName, foundArchs);
129129
}
130130

131+
static std::pair<llvm::SmallString<16>, llvm::SmallString<16>>
132+
getArchSpecificModuleFileNames(StringRef archName) {
133+
llvm::SmallString<16> archFile, archDocFile;
134+
135+
if (!archName.empty()) {
136+
archFile += archName;
137+
archFile += '.';
138+
archFile += file_types::getExtension(file_types::TY_SwiftModuleFile);
139+
140+
archDocFile += archName;
141+
archDocFile += '.';
142+
archDocFile += file_types::getExtension(file_types::TY_SwiftModuleDocFile);
143+
}
144+
145+
return {archFile, archDocFile};
146+
}
147+
131148
bool
132149
SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
133150
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
@@ -143,19 +160,19 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
143160
moduleDocFilename +=
144161
file_types::getExtension(file_types::TY_SwiftModuleDocFile);
145162

146-
// FIXME: Which name should we be using here? Do we care about CPU subtypes?
147-
// FIXME: At the very least, don't hardcode "arch".
148-
llvm::SmallString<16> archName{
149-
Ctx.LangOpts.getPlatformConditionValue(PlatformConditionKind::Arch)};
150-
llvm::SmallString<16> archFile{archName};
151-
llvm::SmallString<16> archDocFile{archName};
152-
if (!archFile.empty()) {
153-
archFile += '.';
154-
archFile += file_types::getExtension(file_types::TY_SwiftModuleFile);
163+
StringRef archName = Ctx.LangOpts.Target.getArchName();
164+
auto archFileNames = getArchSpecificModuleFileNames(archName);
155165

156-
archDocFile += '.';
157-
archDocFile += file_types::getExtension(file_types::TY_SwiftModuleDocFile);
158-
}
166+
// FIXME: We used to use "major architecture" names for these files---the
167+
// names checked in "#if arch(...)". Fall back to that name in the one case
168+
// where it's different from what Swift 4.2 supported: 32-bit ARM platforms.
169+
// We should be able to drop this once there's an Xcode that supports the
170+
// new names.
171+
StringRef alternateArchName;
172+
if (Ctx.LangOpts.Target.getArch() == llvm::Triple::ArchType::arm)
173+
alternateArchName = "arm";
174+
auto alternateArchFileNames =
175+
getArchSpecificModuleFileNames(alternateArchName);
159176

160177
llvm::SmallString<128> scratch;
161178
llvm::SmallString<128> currPath;
@@ -169,10 +186,19 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
169186
currPath = path;
170187
llvm::sys::path::append(currPath, moduleFilename.str());
171188
err = openModuleFiles(currPath,
172-
archFile.str(), archDocFile.str(),
189+
archFileNames.first, archFileNames.second,
173190
moduleBuffer, moduleDocBuffer,
174191
scratch);
175192

193+
if (err == std::errc::no_such_file_or_directory &&
194+
!alternateArchName.empty()) {
195+
err = openModuleFiles(currPath,
196+
alternateArchFileNames.first,
197+
alternateArchFileNames.second,
198+
moduleBuffer, moduleDocBuffer,
199+
scratch);
200+
}
201+
176202
if (err == std::errc::no_such_file_or_directory) {
177203
addDiagnosticInfoForArchitectureMismatch(
178204
Ctx, moduleID.second, moduleName, archName, currPath);
@@ -197,9 +223,18 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
197223
}
198224

199225
llvm::sys::path::append(currPath, "Modules", moduleFilename.str());
200-
auto err = openModuleFiles(currPath, archFile.str(), archDocFile.str(),
226+
auto err = openModuleFiles(currPath,
227+
archFileNames.first, archFileNames.second,
201228
moduleBuffer, moduleDocBuffer, scratch);
202229

230+
if (err == std::errc::no_such_file_or_directory &&
231+
!alternateArchName.empty()) {
232+
err = openModuleFiles(currPath,
233+
alternateArchFileNames.first,
234+
alternateArchFileNames.second,
235+
moduleBuffer, moduleDocBuffer, scratch);
236+
}
237+
203238
if (err == std::errc::no_such_file_or_directory) {
204239
addDiagnosticInfoForArchitectureMismatch(
205240
Ctx, moduleID.second, moduleName, archName, currPath);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Test the fallback for 32-bit ARM platforms.
2+
3+
// RUN: %empty-directory(%t)
4+
// RUN: mkdir -p %t/empty.framework/Modules/empty.swiftmodule
5+
// RUN: %target-swift-frontend -emit-module -o %t/empty.framework/Modules/empty.swiftmodule/arm.swiftmodule %S/../Inputs/empty.swift -module-name empty
6+
// RUN: %target-swift-frontend -typecheck %s -F %t
7+
8+
// RUN: mv %t/empty.framework/Modules/empty.swiftmodule/arm.swiftmodule %t/empty.framework/Modules/empty.swiftmodule/%target-swiftmodule-name
9+
// RUN: touch %t/empty.framework/Modules/empty.swiftmodule/arm.swiftmodule
10+
// RUN: %target-swift-frontend -typecheck %s -F %t
11+
12+
// RUN: rm %t/empty.framework/Modules/empty.swiftmodule/%target-swiftmodule-name
13+
// RUN: not %target-swift-frontend -typecheck %s -F %t 2>&1 | %FileCheck %s
14+
15+
// REQUIRES: CPU=armv7 || CPU=armv7k || CPU=armv7s
16+
17+
import empty
18+
// CHECK: :[[@LINE-1]]:8: error: malformed module file: {{.*}}arm.swiftmodule
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Test the fallback for 32-bit ARM platforms.
2+
3+
// RUN: %empty-directory(%t)
4+
// RUN: mkdir %t/empty.swiftmodule
5+
// RUN: %target-swift-frontend -emit-module -o %t/empty.swiftmodule/arm.swiftmodule %S/../Inputs/empty.swift -module-name empty
6+
// RUN: %target-swift-frontend -typecheck %s -I %t
7+
8+
// RUN: mv %t/empty.swiftmodule/arm.swiftmodule %t/empty.swiftmodule/%target-swiftmodule-name
9+
// RUN: touch %t/empty.swiftmodule/arm.swiftmodule
10+
// RUN: %target-swift-frontend -typecheck %s -I %t
11+
12+
// RUN: rm %t/empty.swiftmodule/%target-swiftmodule-name
13+
// RUN: not %target-swift-frontend -typecheck %s -I %t 2>&1 | %FileCheck %s
14+
15+
// REQUIRES: CPU=armv7 || CPU=armv7k || CPU=armv7s
16+
17+
import empty
18+
// CHECK: :[[@LINE-1]]:8: error: malformed module file: {{.*}}arm.swiftmodule

test/lit.cfg

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -569,8 +569,6 @@ elif platform.system() == 'Linux':
569569
if 'swift_interpreter' in config.available_features:
570570
config.available_features.add('swift-remoteast-test')
571571

572-
config.target_swiftmodule_name = "unknown.swiftmodule"
573-
config.target_swiftdoc_name = "unknown.swiftdoc"
574572
config.target_runtime = "unknown"
575573

576574
swift_reflection_test_name = 'swift-reflection-test' + config.variant_suffix
@@ -609,8 +607,6 @@ def use_interpreter_for_simple_runs():
609607

610608
if run_vendor == 'apple':
611609
config.available_features.add('objc_interop')
612-
config.target_swiftmodule_name = run_cpu + ".swiftmodule"
613-
config.target_swiftdoc_name = run_cpu + ".swiftdoc"
614610
config.target_object_format = "macho"
615611
config.target_dylib_extension = "dylib"
616612
config.target_codesign = "codesign -f -s -"
@@ -646,15 +642,6 @@ if run_vendor == 'apple':
646642
lit_config.note('Testing watchOS ' + config.variant_triple)
647643
xcrun_sdk_name = "watchos"
648644

649-
if run_cpu == "armv7" or run_cpu == "armv7s" or run_cpu == "armv7k":
650-
config.target_swiftmodule_name = "arm.swiftmodule"
651-
config.target_swiftdoc_name = "arm.swiftdoc"
652-
elif run_cpu == "arm64":
653-
config.target_swiftmodule_name = "arm64.swiftmodule"
654-
config.target_swiftdoc_name = "arm64.swiftdoc"
655-
else:
656-
lit_config.fatal("Unknown CPU '%s'" % run_cpu)
657-
658645
config.target_cc_options = (
659646
"-arch %s -m%s-version-min=%s %s" %
660647
(run_cpu, run_os, run_vers, clang_mcp_opt))
@@ -809,8 +796,6 @@ elif run_os in ['linux-gnu', 'linux-gnueabihf', 'freebsd', 'windows-cygnus', 'wi
809796
config.target_object_format = "elf"
810797
config.target_dylib_extension = "so"
811798
config.target_sdk_name = "linux"
812-
config.target_swiftmodule_name = run_cpu + ".swiftmodule"
813-
config.target_swiftdoc_name = run_cpu + ".swiftdoc"
814799
config.target_runtime = "native"
815800
config.target_swift_autolink_extract = inferSwiftBinary("swift-autolink-extract")
816801
config.target_build_swift = (
@@ -1270,8 +1255,8 @@ else:
12701255
config.substitutions.insert(0, ('%platform-module-dir', platform_module_dir))
12711256
config.substitutions.insert(0, ('%platform-sdk-overlay-dir', platform_sdk_overlay_dir))
12721257

1273-
config.substitutions.append(('%target-swiftmodule-name', config.target_swiftmodule_name))
1274-
config.substitutions.append(('%target-swiftdoc-name', config.target_swiftdoc_name))
1258+
config.substitutions.append(('%target-swiftmodule-name', run_cpu + '.swiftmodule'))
1259+
config.substitutions.append(('%target-swiftdoc-name', run_cpu + '.swiftdoc'))
12751260

12761261
config.substitutions.append(('%target-object-format', config.target_object_format))
12771262
config.substitutions.append(('%target-dylib-extension', config.target_dylib_extension))

0 commit comments

Comments
 (0)