Skip to content

Commit c17c19a

Browse files
authored
Merge pull request #72109 from tshortli/maccatalyst-ldprevious
TBDGen: Specify the correct macCatalyst platform ID in `$ld$previous` directives
2 parents b0a4c94 + f49dbb0 commit c17c19a

File tree

6 files changed

+58
-45
lines changed

6 files changed

+58
-45
lines changed

include/swift/AST/Attr.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1863,8 +1863,8 @@ class OriginallyDefinedInAttr: public DeclAttribute {
18631863
struct ActiveVersion {
18641864
StringRef ModuleName;
18651865
PlatformKind Platform;
1866-
bool IsSimulator;
18671866
llvm::VersionTuple Version;
1867+
bool ForTargetVariant = false;
18681868
};
18691869

18701870
/// Returns non-optional if this attribute is active given the current platform.

lib/AST/Attr.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,7 +2215,6 @@ OriginallyDefinedInAttr::isActivePlatform(const ASTContext &ctx) const {
22152215
Result.Version = MovedVersion;
22162216
Result.ModuleName = OriginalModuleName;
22172217
if (isPlatformActive(Platform, ctx.LangOpts, /*TargetVariant*/false)) {
2218-
Result.IsSimulator = ctx.LangOpts.Target.isSimulatorEnvironment();
22192218
return Result;
22202219
}
22212220

@@ -2224,7 +2223,7 @@ OriginallyDefinedInAttr::isActivePlatform(const ASTContext &ctx) const {
22242223
// libraries.
22252224
if (ctx.LangOpts.TargetVariant.has_value() &&
22262225
isPlatformActive(Platform, ctx.LangOpts, /*TargetVariant*/true)) {
2227-
Result.IsSimulator = ctx.LangOpts.TargetVariant->isSimulatorEnvironment();
2226+
Result.ForTargetVariant = true;
22282227
return Result;
22292228
}
22302229
return std::nullopt;

lib/IRGen/TBDGen.cpp

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -100,24 +100,23 @@ getAllMovedPlatformVersions(Decl *D) {
100100
return Results;
101101
}
102102

103-
static StringRef getLinkerPlatformName(uint8_t Id) {
103+
static StringRef getLinkerPlatformName(LinkerPlatformId Id) {
104104
switch (Id) {
105-
#define LD_PLATFORM(Name, Id) case Id: return #Name;
105+
#define LD_PLATFORM(Name, Id) case LinkerPlatformId::Name: return #Name;
106106
#include "ldPlatformKinds.def"
107-
default:
108-
llvm_unreachable("unrecognized platform id");
109107
}
108+
llvm_unreachable("unrecognized platform id");
110109
}
111110

112-
static std::optional<uint8_t> getLinkerPlatformId(StringRef Platform) {
113-
return llvm::StringSwitch<std::optional<uint8_t>>(Platform)
114-
#define LD_PLATFORM(Name, Id) .Case(#Name, Id)
111+
static std::optional<LinkerPlatformId> getLinkerPlatformId(StringRef Platform) {
112+
return llvm::StringSwitch<std::optional<LinkerPlatformId>>(Platform)
113+
#define LD_PLATFORM(Name, Id) .Case(#Name, LinkerPlatformId::Name)
115114
#include "ldPlatformKinds.def"
116115
.Default(std::nullopt);
117116
}
118117

119118
StringRef InstallNameStore::getInstallName(LinkerPlatformId Id) const {
120-
auto It = PlatformInstallName.find((uint8_t)Id);
119+
auto It = PlatformInstallName.find(Id);
121120
if (It == PlatformInstallName.end())
122121
return InstallName;
123122
else
@@ -129,8 +128,9 @@ static std::string getScalaNodeText(Node *N) {
129128
return cast<ScalarNode>(N)->getValue(Buffer).str();
130129
}
131130

132-
static std::set<int8_t> getSequenceNodePlatformList(ASTContext &Ctx, Node *N) {
133-
std::set<int8_t> Results;
131+
static std::set<LinkerPlatformId> getSequenceNodePlatformList(ASTContext &Ctx,
132+
Node *N) {
133+
std::set<LinkerPlatformId> Results;
134134
for (auto &E: *cast<SequenceNode>(N)) {
135135
auto Platform = getScalaNodeText(&E);
136136
auto Id = getLinkerPlatformId(Platform);
@@ -158,7 +158,7 @@ parseEntry(ASTContext &Ctx,
158158
auto *MN = cast<MappingNode>(&*It);
159159
std::string ModuleName;
160160
std::string InstallName;
161-
std::optional<std::set<int8_t>> Platforms;
161+
std::optional<std::set<LinkerPlatformId>> Platforms;
162162
for (auto &Pair: *MN) {
163163
auto Key = getScalaNodeText(Pair.getKey());
164164
auto* Value = Pair.getValue();
@@ -233,7 +233,12 @@ TBDGenVisitor::parsePreviousModuleInstallNameMap() {
233233
}
234234

235235
static LinkerPlatformId
236-
getLinkerPlatformId(OriginallyDefinedInAttr::ActiveVersion Ver) {
236+
getLinkerPlatformId(OriginallyDefinedInAttr::ActiveVersion Ver,
237+
ASTContext &Ctx) {
238+
auto target =
239+
Ver.ForTargetVariant ? Ctx.LangOpts.TargetVariant : Ctx.LangOpts.Target;
240+
bool isSimulator = target ? target->isSimulatorEnvironment() : false;
241+
237242
switch(Ver.Platform) {
238243
case swift::PlatformKind::none:
239244
llvm_unreachable("cannot find platform kind");
@@ -243,16 +248,16 @@ getLinkerPlatformId(OriginallyDefinedInAttr::ActiveVersion Ver) {
243248
llvm_unreachable("not used for this platform");
244249
case swift::PlatformKind::iOS:
245250
case swift::PlatformKind::iOSApplicationExtension:
246-
return Ver.IsSimulator ? LinkerPlatformId::iOS_sim:
247-
LinkerPlatformId::iOS;
251+
if (target && target->isMacCatalystEnvironment())
252+
return LinkerPlatformId::macCatalyst;
253+
return isSimulator ? LinkerPlatformId::iOS_sim : LinkerPlatformId::iOS;
248254
case swift::PlatformKind::tvOS:
249255
case swift::PlatformKind::tvOSApplicationExtension:
250-
return Ver.IsSimulator ? LinkerPlatformId::tvOS_sim:
251-
LinkerPlatformId::tvOS;
256+
return isSimulator ? LinkerPlatformId::tvOS_sim : LinkerPlatformId::tvOS;
252257
case swift::PlatformKind::watchOS:
253258
case swift::PlatformKind::watchOSApplicationExtension:
254-
return Ver.IsSimulator ? LinkerPlatformId::watchOS_sim:
255-
LinkerPlatformId::watchOS;
259+
return isSimulator ? LinkerPlatformId::watchOS_sim
260+
: LinkerPlatformId::watchOS;
256261
case swift::PlatformKind::macOS:
257262
case swift::PlatformKind::macOSApplicationExtension:
258263
return LinkerPlatformId::macOS;
@@ -264,8 +269,9 @@ getLinkerPlatformId(OriginallyDefinedInAttr::ActiveVersion Ver) {
264269
}
265270

266271
static StringRef
267-
getLinkerPlatformName(OriginallyDefinedInAttr::ActiveVersion Ver) {
268-
return getLinkerPlatformName((uint8_t)getLinkerPlatformId(Ver));
272+
getLinkerPlatformName(OriginallyDefinedInAttr::ActiveVersion Ver,
273+
ASTContext &Ctx) {
274+
return getLinkerPlatformName(getLinkerPlatformId(Ver, Ctx));
269275
}
270276

271277
/// Find the most relevant introducing version of the decl stack we have visited
@@ -313,17 +319,17 @@ void TBDGenVisitor::addLinkerDirectiveSymbolsLdPrevious(
313319
// so we don't need the linker directives.
314320
if (*IntroVer >= Ver.Version)
315321
continue;
316-
auto PlatformNumber = getLinkerPlatformId(Ver);
322+
auto PlatformNumber = getLinkerPlatformId(Ver, Ctx);
317323
auto It = previousInstallNameMap->find(Ver.ModuleName.str());
318324
if (It == previousInstallNameMap->end()) {
319325
Ctx.Diags.diagnose(SourceLoc(), diag::cannot_find_install_name,
320-
Ver.ModuleName, getLinkerPlatformName(Ver));
326+
Ver.ModuleName, getLinkerPlatformName(Ver, Ctx));
321327
continue;
322328
}
323329
auto InstallName = It->second.getInstallName(PlatformNumber);
324330
if (InstallName.empty()) {
325331
Ctx.Diags.diagnose(SourceLoc(), diag::cannot_find_install_name,
326-
Ver.ModuleName, getLinkerPlatformName(Ver));
332+
Ver.ModuleName, getLinkerPlatformName(Ver, Ctx));
327333
continue;
328334
}
329335
llvm::SmallString<64> Buffer;
@@ -333,7 +339,7 @@ void TBDGenVisitor::addLinkerDirectiveSymbolsLdPrevious(
333339
OS << "$ld$previous$";
334340
OS << InstallName << "$";
335341
OS << ComptibleVersion << "$";
336-
OS << std::to_string((uint8_t)PlatformNumber) << "$";
342+
OS << std::to_string(static_cast<uint8_t>(PlatformNumber)) << "$";
337343
static auto getMinor = [](std::optional<unsigned> Minor) {
338344
return Minor.has_value() ? *Minor : 0;
339345
};

lib/IRGen/TBDGenVisitor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ struct InstallNameStore {
5252
std::string InstallName;
5353
// The install name specific to the platform id. This takes precedence over
5454
// the default install name.
55-
std::map<uint8_t, std::string> PlatformInstallName;
55+
std::map<LinkerPlatformId, std::string> PlatformInstallName;
5656
StringRef getInstallName(LinkerPlatformId Id) const;
5757
};
5858

test/TBD/Inputs/install-name-map-toasterkit.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,10 @@
88
"module": "ToasterKit",
99
"install_name": "/System/Previous/iOS/ToasterKit.dylib",
1010
"platforms": ["iOS", "iOS_sim"]
11+
},
12+
{
13+
"module": "ToasterKit",
14+
"install_name": "/System/Previous/macCatalyst/ToasterKit.dylib",
15+
"platforms": ["macCatalyst"]
1116
}
1217
]

test/TBD/linker-directives-ld-previous-macos.swift

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,27 @@
22

33
// RUN: %empty-directory(%t)
44

5-
// RUN: %target-swift-frontend -typecheck %S/Inputs/linker-directive.swift -tbd-is-installapi -emit-tbd -emit-tbd-path %t/linker_directives.tbd -previous-module-installname-map-file %S/Inputs/install-name-map-toasterkit.json -tbd-install_name toasterkit
6-
// RUN: %llvm-nm %t/linker_directives.tbd | %FileCheck %s
7-
// RUN: %llvm-nm %t/linker_directives.tbd | %FileCheck -check-prefix=CHECK-NO-NEW-SYMBOL %s
8-
// RUN: %target-swift-frontend -typecheck %S/Inputs/linker-directive.swift -emit-tbd -emit-tbd-path %t/linker_directives.tbd -previous-module-installname-map-file %S/Inputs/install-name-map-toasterkit.json -tbd-install_name toasterkit
9-
// RUN: %llvm-nm %t/linker_directives.tbd | %FileCheck %s
10-
// RUN: %llvm-nm %t/linker_directives.tbd | %FileCheck -check-prefix=CHECK-NO-NEW-SYMBOL %s
5+
// RUN: %target-swift-frontend -typecheck %S/Inputs/linker-directive.swift -tbd-is-installapi -emit-tbd -emit-tbd-path %t/linker_directives_installapi.tbd -previous-module-installname-map-file %S/Inputs/install-name-map-toasterkit.json -tbd-install_name toasterkit
6+
// RUN: %llvm-nm %t/linker_directives_installapi.tbd | %FileCheck %s --check-prefixes=CHECK,CHECK-MAC --implicit-check-not "System/Previous/macCatalyst"
7+
// RUN: %target-swift-frontend -typecheck %S/Inputs/linker-directive.swift -emit-tbd -emit-tbd-path %t/linker_directives_macos.tbd -previous-module-installname-map-file %S/Inputs/install-name-map-toasterkit.json -tbd-install_name toasterkit
8+
// RUN: %llvm-nm %t/linker_directives_macos.tbd | %FileCheck %s --check-prefixes=CHECK,CHECK-MAC --implicit-check-not "System/Previous/macCatalyst"
119

12-
// RUN: %target-swift-frontend -target-variant x86_64-apple-ios13.1-macabi -typecheck %S/Inputs/linker-directive.swift -emit-tbd -emit-tbd-path %t/linker_directives.tbd -previous-module-installname-map-file %S/Inputs/install-name-map-toasterkit.json -tbd-install_name toasterkit
13-
// RUN: %llvm-nm %t/linker_directives.tbd | %FileCheck -check-prefix=CHECK-ZIPPERED %s
14-
// RUN: %llvm-nm %t/linker_directives.tbd | %FileCheck -check-prefix=CHECK-NO-NEW-SYMBOL %s
10+
// RUN: %target-swift-frontend -target-variant x86_64-apple-ios13.1-macabi -typecheck %S/Inputs/linker-directive.swift -emit-tbd -emit-tbd-path %t/linker_directives_macos_macabi.tbd -previous-module-installname-map-file %S/Inputs/install-name-map-toasterkit.json -tbd-install_name toasterkit
11+
// RUN: %llvm-nm %t/linker_directives_macos_macabi.tbd | %FileCheck -check-prefixes=CHECK,CHECK-MAC,CHECK-MACCATALYST %s
1512

16-
// CHECK: D $ld$previous$/System/Previous/macOS/ToasterKit.dylib$$1$10.8$10.15$_$s10ToasterKit5toastyyF$
17-
// CHECK: D $ld$previous$/System/Previous/macOS/ToasterKit.dylib$$1$10.8$10.15$_$s10ToasterKit7VehicleV4moveyyF$
18-
// CHECK: D $ld$previous$/System/Previous/macOS/ToasterKit.dylib$$1$10.8$10.15$_$s10ToasterKit7VehicleVMa$
19-
// CHECK: D $ld$previous$/System/Previous/macOS/ToasterKit.dylib$$1$10.8$10.15$_$s10ToasterKit7VehicleVMn$
20-
// CHECK: D $ld$previous$/System/Previous/macOS/ToasterKit.dylib$$1$10.8$10.15$_$s10ToasterKit7VehicleVN$
13+
// RUN: %target-swift-frontend -target x86_64-apple-ios13.1-macabi -typecheck %S/Inputs/linker-directive.swift -emit-tbd -emit-tbd-path %t/linker_directives_macabi.tbd -previous-module-installname-map-file %S/Inputs/install-name-map-toasterkit.json -tbd-install_name toasterkit
14+
// R/UN: %llvm-nm %t/linker_directives_macabi.tbd | %FileCheck -check-prefixes=CHECK,CHECK-MACCATALYST %s --implicit-check-not "System/Previous/macOS"
2115

22-
// CHECK-ZIPPERED: $ld$previous$/System/Previous/iOS/ToasterKit.dylib$$2$10.2$13.0$_$s10ToasterKit5toastyyF$
23-
// CHECK-ZIPPERED: $ld$previous$/System/Previous/macOS/ToasterKit.dylib$$1$10.8$10.15$_$s10ToasterKit5toastyyF$
16+
// CHECK-MACCATALYST: D $ld$previous$/System/Previous/macCatalyst/ToasterKit.dylib$$6$10.2$13.0$_$s10ToasterKit5toastyyF$
17+
// CHECK-MACCATALYST: D $ld$previous$/System/Previous/macCatalyst/ToasterKit.dylib$$6$10.2$13.0$_$s10ToasterKit7VehicleV4moveyyF$
18+
// CHECK-MACCATALYST: D $ld$previous$/System/Previous/macCatalyst/ToasterKit.dylib$$6$10.2$13.0$_$s10ToasterKit7VehicleVMa$
19+
// CHECK-MACCATALYST: D $ld$previous$/System/Previous/macCatalyst/ToasterKit.dylib$$6$10.2$13.0$_$s10ToasterKit7VehicleVMn$
20+
// CHECK-MACCATALYST: D $ld$previous$/System/Previous/macCatalyst/ToasterKit.dylib$$6$10.2$13.0$_$s10ToasterKit7VehicleVN$
2421

25-
// CHECK-NO-NEW-SYMBOL-NOT: $_$s10ToasterKit7VehicleV32originallyDefinedInCurrentModuleyyF
22+
// CHECK-MAC: D $ld$previous$/System/Previous/macOS/ToasterKit.dylib$$1$10.8$10.15$_$s10ToasterKit5toastyyF$
23+
// CHECK-MAC: D $ld$previous$/System/Previous/macOS/ToasterKit.dylib$$1$10.8$10.15$_$s10ToasterKit7VehicleV4moveyyF$
24+
// CHECK-MAC: D $ld$previous$/System/Previous/macOS/ToasterKit.dylib$$1$10.8$10.15$_$s10ToasterKit7VehicleVMa$
25+
// CHECK-MAC: D $ld$previous$/System/Previous/macOS/ToasterKit.dylib$$1$10.8$10.15$_$s10ToasterKit7VehicleVMn$
26+
// CHECK-MAC: D $ld$previous$/System/Previous/macOS/ToasterKit.dylib$$1$10.8$10.15$_$s10ToasterKit7VehicleVN$
27+
28+
// CHECK-NOT: $_$s10ToasterKit7VehicleV32originallyDefinedInCurrentModuleyyF

0 commit comments

Comments
 (0)