1 //===- TextStubCommon.cpp -------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // Implements common Text Stub YAML mappings.
11 //===----------------------------------------------------------------------===//
13 #include "TextStubCommon.h"
14 #include "TextAPIContext.h"
15 #include "llvm/ADT/StringSwitch.h"
17 using namespace llvm::MachO
;
22 void ScalarTraits
<FlowStringRef
>::output(const FlowStringRef
&Value
, void *Ctx
,
24 ScalarTraits
<StringRef
>::output(Value
, Ctx
, OS
);
26 StringRef ScalarTraits
<FlowStringRef
>::input(StringRef Value
, void *Ctx
,
28 return ScalarTraits
<StringRef
>::input(Value
, Ctx
, Out
.value
);
30 QuotingType ScalarTraits
<FlowStringRef
>::mustQuote(StringRef Name
) {
31 return ScalarTraits
<StringRef
>::mustQuote(Name
);
34 void ScalarEnumerationTraits
<ObjCConstraintType
>::enumeration(
35 IO
&IO
, ObjCConstraintType
&Constraint
) {
36 IO
.enumCase(Constraint
, "none", ObjCConstraintType::None
);
37 IO
.enumCase(Constraint
, "retain_release", ObjCConstraintType::Retain_Release
);
38 IO
.enumCase(Constraint
, "retain_release_for_simulator",
39 ObjCConstraintType::Retain_Release_For_Simulator
);
40 IO
.enumCase(Constraint
, "retain_release_or_gc",
41 ObjCConstraintType::Retain_Release_Or_GC
);
42 IO
.enumCase(Constraint
, "gc", ObjCConstraintType::GC
);
45 void ScalarTraits
<PlatformSet
>::output(const PlatformSet
&Values
, void *IO
,
48 const auto *Ctx
= reinterpret_cast<TextAPIContext
*>(IO
);
49 assert((!Ctx
|| Ctx
->FileKind
!= FileType::Invalid
) &&
50 "File type is not set in context");
52 if (Ctx
&& Ctx
->FileKind
== TBD_V3
&& Values
.count(PLATFORM_MACOS
) &&
53 Values
.count(PLATFORM_MACCATALYST
)) {
58 assert(Values
.size() == 1U);
59 switch (*Values
.begin()) {
61 llvm_unreachable("unexpected platform");
66 case PLATFORM_IOSSIMULATOR
:
71 case PLATFORM_WATCHOSSIMULATOR
:
73 case PLATFORM_WATCHOS
:
76 case PLATFORM_TVOSSIMULATOR
:
81 case PLATFORM_BRIDGEOS
:
84 case PLATFORM_MACCATALYST
:
87 case PLATFORM_DRIVERKIT
:
93 StringRef ScalarTraits
<PlatformSet
>::input(StringRef Scalar
, void *IO
,
94 PlatformSet
&Values
) {
95 const auto *Ctx
= reinterpret_cast<TextAPIContext
*>(IO
);
96 assert((!Ctx
|| Ctx
->FileKind
!= FileType::Invalid
) &&
97 "File type is not set in context");
99 if (Scalar
== "zippered") {
100 if (Ctx
&& Ctx
->FileKind
== FileType::TBD_V3
) {
101 Values
.insert(PLATFORM_MACOS
);
102 Values
.insert(PLATFORM_MACCATALYST
);
105 return "invalid platform";
108 auto Platform
= StringSwitch
<PlatformType
>(Scalar
)
109 .Case("macosx", PLATFORM_MACOS
)
110 .Case("ios", PLATFORM_IOS
)
111 .Case("watchos", PLATFORM_WATCHOS
)
112 .Case("tvos", PLATFORM_TVOS
)
113 .Case("bridgeos", PLATFORM_BRIDGEOS
)
114 .Case("iosmac", PLATFORM_MACCATALYST
)
115 .Case("maccatalyst", PLATFORM_MACCATALYST
)
116 .Case("driverkit", PLATFORM_DRIVERKIT
)
117 .Default(PLATFORM_UNKNOWN
);
119 if (Platform
== PLATFORM_MACCATALYST
)
120 if (Ctx
&& Ctx
->FileKind
!= FileType::TBD_V3
)
121 return "invalid platform";
123 if (Platform
== PLATFORM_UNKNOWN
)
124 return "unknown platform";
126 Values
.insert(Platform
);
130 QuotingType ScalarTraits
<PlatformSet
>::mustQuote(StringRef
) {
131 return QuotingType::None
;
134 void ScalarBitSetTraits
<ArchitectureSet
>::bitset(IO
&IO
,
135 ArchitectureSet
&Archs
) {
136 #define ARCHINFO(arch, type, subtype, numbits) \
137 IO.bitSetCase(Archs, #arch, 1U << static_cast<int>(AK_##arch));
138 #include "llvm/TextAPI/Architecture.def"
142 void ScalarTraits
<Architecture
>::output(const Architecture
&Value
, void *,
146 StringRef ScalarTraits
<Architecture
>::input(StringRef Scalar
, void *,
147 Architecture
&Value
) {
148 Value
= getArchitectureFromName(Scalar
);
151 QuotingType ScalarTraits
<Architecture
>::mustQuote(StringRef
) {
152 return QuotingType::None
;
155 void ScalarTraits
<PackedVersion
>::output(const PackedVersion
&Value
, void *,
159 StringRef ScalarTraits
<PackedVersion
>::input(StringRef Scalar
, void *,
160 PackedVersion
&Value
) {
161 if (!Value
.parse32(Scalar
))
162 return "invalid packed version string.";
165 QuotingType ScalarTraits
<PackedVersion
>::mustQuote(StringRef
) {
166 return QuotingType::None
;
169 void ScalarTraits
<SwiftVersion
>::output(const SwiftVersion
&Value
, void *,
185 OS
<< (unsigned)Value
;
189 StringRef ScalarTraits
<SwiftVersion
>::input(StringRef Scalar
, void *IO
,
190 SwiftVersion
&Value
) {
191 const auto *Ctx
= reinterpret_cast<TextAPIContext
*>(IO
);
192 assert((!Ctx
|| Ctx
->FileKind
!= FileType::Invalid
) &&
193 "File type is not set in context");
195 if (Ctx
->FileKind
== FileType::TBD_V4
) {
196 if (Scalar
.getAsInteger(10, Value
))
197 return "invalid Swift ABI version.";
200 Value
= StringSwitch
<SwiftVersion
>(Scalar
)
208 if (Value
!= SwiftVersion(0))
211 if (Scalar
.getAsInteger(10, Value
))
212 return "invalid Swift ABI version.";
216 QuotingType ScalarTraits
<SwiftVersion
>::mustQuote(StringRef
) {
217 return QuotingType::None
;
220 void ScalarTraits
<UUID
>::output(const UUID
&Value
, void *, raw_ostream
&OS
) {}
222 StringRef ScalarTraits
<UUID
>::input(StringRef Scalar
, void *, UUID
&Value
) {
227 QuotingType ScalarTraits
<UUID
>::mustQuote(StringRef
) {
228 return QuotingType::Single
;
231 } // end namespace yaml.
232 } // end namespace llvm.