1fe6060f1SDimitry Andric //===- TextStubCommon.cpp -------------------------------------------------===//
2fe6060f1SDimitry Andric //
3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fe6060f1SDimitry Andric //
7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8fe6060f1SDimitry Andric //
9*06c3fb27SDimitry Andric // Implements common Text Stub YAML mappings.
10fe6060f1SDimitry Andric //
11fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
12fe6060f1SDimitry Andric
13fe6060f1SDimitry Andric #include "TextStubCommon.h"
14fe6060f1SDimitry Andric #include "TextAPIContext.h"
15fe6060f1SDimitry Andric #include "llvm/ADT/StringSwitch.h"
16fe6060f1SDimitry Andric
17fe6060f1SDimitry Andric using namespace llvm::MachO;
18fe6060f1SDimitry Andric
19fe6060f1SDimitry Andric namespace llvm {
20fe6060f1SDimitry Andric namespace yaml {
21fe6060f1SDimitry Andric
output(const FlowStringRef & Value,void * Ctx,raw_ostream & OS)22fe6060f1SDimitry Andric void ScalarTraits<FlowStringRef>::output(const FlowStringRef &Value, void *Ctx,
23fe6060f1SDimitry Andric raw_ostream &OS) {
24fe6060f1SDimitry Andric ScalarTraits<StringRef>::output(Value, Ctx, OS);
25fe6060f1SDimitry Andric }
input(StringRef Value,void * Ctx,FlowStringRef & Out)26fe6060f1SDimitry Andric StringRef ScalarTraits<FlowStringRef>::input(StringRef Value, void *Ctx,
27fe6060f1SDimitry Andric FlowStringRef &Out) {
28fe6060f1SDimitry Andric return ScalarTraits<StringRef>::input(Value, Ctx, Out.value);
29fe6060f1SDimitry Andric }
mustQuote(StringRef Name)30fe6060f1SDimitry Andric QuotingType ScalarTraits<FlowStringRef>::mustQuote(StringRef Name) {
31fe6060f1SDimitry Andric return ScalarTraits<StringRef>::mustQuote(Name);
32fe6060f1SDimitry Andric }
33fe6060f1SDimitry Andric
enumeration(IO & IO,ObjCConstraintType & Constraint)34fe6060f1SDimitry Andric void ScalarEnumerationTraits<ObjCConstraintType>::enumeration(
35fe6060f1SDimitry Andric IO &IO, ObjCConstraintType &Constraint) {
36fe6060f1SDimitry Andric IO.enumCase(Constraint, "none", ObjCConstraintType::None);
37fe6060f1SDimitry Andric IO.enumCase(Constraint, "retain_release", ObjCConstraintType::Retain_Release);
38fe6060f1SDimitry Andric IO.enumCase(Constraint, "retain_release_for_simulator",
39fe6060f1SDimitry Andric ObjCConstraintType::Retain_Release_For_Simulator);
40fe6060f1SDimitry Andric IO.enumCase(Constraint, "retain_release_or_gc",
41fe6060f1SDimitry Andric ObjCConstraintType::Retain_Release_Or_GC);
42fe6060f1SDimitry Andric IO.enumCase(Constraint, "gc", ObjCConstraintType::GC);
43fe6060f1SDimitry Andric }
44fe6060f1SDimitry Andric
output(const PlatformSet & Values,void * IO,raw_ostream & OS)45fe6060f1SDimitry Andric void ScalarTraits<PlatformSet>::output(const PlatformSet &Values, void *IO,
46fe6060f1SDimitry Andric raw_ostream &OS) {
47fe6060f1SDimitry Andric
48fe6060f1SDimitry Andric const auto *Ctx = reinterpret_cast<TextAPIContext *>(IO);
49fe6060f1SDimitry Andric assert((!Ctx || Ctx->FileKind != FileType::Invalid) &&
50fe6060f1SDimitry Andric "File type is not set in context");
51fe6060f1SDimitry Andric
5204eeddc0SDimitry Andric if (Ctx && Ctx->FileKind == TBD_V3 && Values.count(PLATFORM_MACOS) &&
5304eeddc0SDimitry Andric Values.count(PLATFORM_MACCATALYST)) {
54fe6060f1SDimitry Andric OS << "zippered";
55fe6060f1SDimitry Andric return;
56fe6060f1SDimitry Andric }
57fe6060f1SDimitry Andric
58fe6060f1SDimitry Andric assert(Values.size() == 1U);
59fe6060f1SDimitry Andric switch (*Values.begin()) {
60fe6060f1SDimitry Andric default:
61fe6060f1SDimitry Andric llvm_unreachable("unexpected platform");
62fe6060f1SDimitry Andric break;
6304eeddc0SDimitry Andric case PLATFORM_MACOS:
64fe6060f1SDimitry Andric OS << "macosx";
65fe6060f1SDimitry Andric break;
6604eeddc0SDimitry Andric case PLATFORM_IOSSIMULATOR:
67bdd1243dSDimitry Andric [[fallthrough]];
6804eeddc0SDimitry Andric case PLATFORM_IOS:
69fe6060f1SDimitry Andric OS << "ios";
70fe6060f1SDimitry Andric break;
7104eeddc0SDimitry Andric case PLATFORM_WATCHOSSIMULATOR:
72bdd1243dSDimitry Andric [[fallthrough]];
7304eeddc0SDimitry Andric case PLATFORM_WATCHOS:
74fe6060f1SDimitry Andric OS << "watchos";
75fe6060f1SDimitry Andric break;
7604eeddc0SDimitry Andric case PLATFORM_TVOSSIMULATOR:
77bdd1243dSDimitry Andric [[fallthrough]];
7804eeddc0SDimitry Andric case PLATFORM_TVOS:
79fe6060f1SDimitry Andric OS << "tvos";
80fe6060f1SDimitry Andric break;
8104eeddc0SDimitry Andric case PLATFORM_BRIDGEOS:
82fe6060f1SDimitry Andric OS << "bridgeos";
83fe6060f1SDimitry Andric break;
8404eeddc0SDimitry Andric case PLATFORM_MACCATALYST:
85*06c3fb27SDimitry Andric OS << "maccatalyst";
86fe6060f1SDimitry Andric break;
8704eeddc0SDimitry Andric case PLATFORM_DRIVERKIT:
88fe6060f1SDimitry Andric OS << "driverkit";
89fe6060f1SDimitry Andric break;
90fe6060f1SDimitry Andric }
91fe6060f1SDimitry Andric }
92fe6060f1SDimitry Andric
input(StringRef Scalar,void * IO,PlatformSet & Values)93fe6060f1SDimitry Andric StringRef ScalarTraits<PlatformSet>::input(StringRef Scalar, void *IO,
94fe6060f1SDimitry Andric PlatformSet &Values) {
95fe6060f1SDimitry Andric const auto *Ctx = reinterpret_cast<TextAPIContext *>(IO);
96fe6060f1SDimitry Andric assert((!Ctx || Ctx->FileKind != FileType::Invalid) &&
97fe6060f1SDimitry Andric "File type is not set in context");
98fe6060f1SDimitry Andric
99fe6060f1SDimitry Andric if (Scalar == "zippered") {
100fe6060f1SDimitry Andric if (Ctx && Ctx->FileKind == FileType::TBD_V3) {
10104eeddc0SDimitry Andric Values.insert(PLATFORM_MACOS);
10204eeddc0SDimitry Andric Values.insert(PLATFORM_MACCATALYST);
103fe6060f1SDimitry Andric return {};
104fe6060f1SDimitry Andric }
105fe6060f1SDimitry Andric return "invalid platform";
106fe6060f1SDimitry Andric }
107fe6060f1SDimitry Andric
10804eeddc0SDimitry Andric auto Platform = StringSwitch<PlatformType>(Scalar)
10904eeddc0SDimitry Andric .Case("macosx", PLATFORM_MACOS)
11004eeddc0SDimitry Andric .Case("ios", PLATFORM_IOS)
11104eeddc0SDimitry Andric .Case("watchos", PLATFORM_WATCHOS)
11204eeddc0SDimitry Andric .Case("tvos", PLATFORM_TVOS)
11304eeddc0SDimitry Andric .Case("bridgeos", PLATFORM_BRIDGEOS)
11404eeddc0SDimitry Andric .Case("iosmac", PLATFORM_MACCATALYST)
115*06c3fb27SDimitry Andric .Case("maccatalyst", PLATFORM_MACCATALYST)
116bdd1243dSDimitry Andric .Case("driverkit", PLATFORM_DRIVERKIT)
11704eeddc0SDimitry Andric .Default(PLATFORM_UNKNOWN);
118fe6060f1SDimitry Andric
11904eeddc0SDimitry Andric if (Platform == PLATFORM_MACCATALYST)
120fe6060f1SDimitry Andric if (Ctx && Ctx->FileKind != FileType::TBD_V3)
121fe6060f1SDimitry Andric return "invalid platform";
122fe6060f1SDimitry Andric
12304eeddc0SDimitry Andric if (Platform == PLATFORM_UNKNOWN)
124fe6060f1SDimitry Andric return "unknown platform";
125fe6060f1SDimitry Andric
126fe6060f1SDimitry Andric Values.insert(Platform);
127fe6060f1SDimitry Andric return {};
128fe6060f1SDimitry Andric }
129fe6060f1SDimitry Andric
mustQuote(StringRef)130fe6060f1SDimitry Andric QuotingType ScalarTraits<PlatformSet>::mustQuote(StringRef) {
131fe6060f1SDimitry Andric return QuotingType::None;
132fe6060f1SDimitry Andric }
133fe6060f1SDimitry Andric
bitset(IO & IO,ArchitectureSet & Archs)134fe6060f1SDimitry Andric void ScalarBitSetTraits<ArchitectureSet>::bitset(IO &IO,
135fe6060f1SDimitry Andric ArchitectureSet &Archs) {
136fe6060f1SDimitry Andric #define ARCHINFO(arch, type, subtype, numbits) \
137fe6060f1SDimitry Andric IO.bitSetCase(Archs, #arch, 1U << static_cast<int>(AK_##arch));
138fe6060f1SDimitry Andric #include "llvm/TextAPI/Architecture.def"
139fe6060f1SDimitry Andric #undef ARCHINFO
140fe6060f1SDimitry Andric }
141fe6060f1SDimitry Andric
output(const Architecture & Value,void *,raw_ostream & OS)142fe6060f1SDimitry Andric void ScalarTraits<Architecture>::output(const Architecture &Value, void *,
143fe6060f1SDimitry Andric raw_ostream &OS) {
144fe6060f1SDimitry Andric OS << Value;
145fe6060f1SDimitry Andric }
input(StringRef Scalar,void *,Architecture & Value)146fe6060f1SDimitry Andric StringRef ScalarTraits<Architecture>::input(StringRef Scalar, void *,
147fe6060f1SDimitry Andric Architecture &Value) {
148fe6060f1SDimitry Andric Value = getArchitectureFromName(Scalar);
149fe6060f1SDimitry Andric return {};
150fe6060f1SDimitry Andric }
mustQuote(StringRef)151fe6060f1SDimitry Andric QuotingType ScalarTraits<Architecture>::mustQuote(StringRef) {
152fe6060f1SDimitry Andric return QuotingType::None;
153fe6060f1SDimitry Andric }
154fe6060f1SDimitry Andric
output(const PackedVersion & Value,void *,raw_ostream & OS)155fe6060f1SDimitry Andric void ScalarTraits<PackedVersion>::output(const PackedVersion &Value, void *,
156fe6060f1SDimitry Andric raw_ostream &OS) {
157fe6060f1SDimitry Andric OS << Value;
158fe6060f1SDimitry Andric }
input(StringRef Scalar,void *,PackedVersion & Value)159fe6060f1SDimitry Andric StringRef ScalarTraits<PackedVersion>::input(StringRef Scalar, void *,
160fe6060f1SDimitry Andric PackedVersion &Value) {
161fe6060f1SDimitry Andric if (!Value.parse32(Scalar))
162fe6060f1SDimitry Andric return "invalid packed version string.";
163fe6060f1SDimitry Andric return {};
164fe6060f1SDimitry Andric }
mustQuote(StringRef)165fe6060f1SDimitry Andric QuotingType ScalarTraits<PackedVersion>::mustQuote(StringRef) {
166fe6060f1SDimitry Andric return QuotingType::None;
167fe6060f1SDimitry Andric }
168fe6060f1SDimitry Andric
output(const SwiftVersion & Value,void *,raw_ostream & OS)169fe6060f1SDimitry Andric void ScalarTraits<SwiftVersion>::output(const SwiftVersion &Value, void *,
170fe6060f1SDimitry Andric raw_ostream &OS) {
171fe6060f1SDimitry Andric switch (Value) {
172fe6060f1SDimitry Andric case 1:
173fe6060f1SDimitry Andric OS << "1.0";
174fe6060f1SDimitry Andric break;
175fe6060f1SDimitry Andric case 2:
176fe6060f1SDimitry Andric OS << "1.1";
177fe6060f1SDimitry Andric break;
178fe6060f1SDimitry Andric case 3:
179fe6060f1SDimitry Andric OS << "2.0";
180fe6060f1SDimitry Andric break;
181fe6060f1SDimitry Andric case 4:
182fe6060f1SDimitry Andric OS << "3.0";
183fe6060f1SDimitry Andric break;
184fe6060f1SDimitry Andric default:
185fe6060f1SDimitry Andric OS << (unsigned)Value;
186fe6060f1SDimitry Andric break;
187fe6060f1SDimitry Andric }
188fe6060f1SDimitry Andric }
input(StringRef Scalar,void * IO,SwiftVersion & Value)189fe6060f1SDimitry Andric StringRef ScalarTraits<SwiftVersion>::input(StringRef Scalar, void *IO,
190fe6060f1SDimitry Andric SwiftVersion &Value) {
191fe6060f1SDimitry Andric const auto *Ctx = reinterpret_cast<TextAPIContext *>(IO);
192fe6060f1SDimitry Andric assert((!Ctx || Ctx->FileKind != FileType::Invalid) &&
193fe6060f1SDimitry Andric "File type is not set in context");
194fe6060f1SDimitry Andric
195fe6060f1SDimitry Andric if (Ctx->FileKind == FileType::TBD_V4) {
196fe6060f1SDimitry Andric if (Scalar.getAsInteger(10, Value))
197fe6060f1SDimitry Andric return "invalid Swift ABI version.";
198fe6060f1SDimitry Andric return {};
199fe6060f1SDimitry Andric } else {
200fe6060f1SDimitry Andric Value = StringSwitch<SwiftVersion>(Scalar)
201fe6060f1SDimitry Andric .Case("1.0", 1)
202fe6060f1SDimitry Andric .Case("1.1", 2)
203fe6060f1SDimitry Andric .Case("2.0", 3)
204fe6060f1SDimitry Andric .Case("3.0", 4)
205fe6060f1SDimitry Andric .Default(0);
206fe6060f1SDimitry Andric }
207fe6060f1SDimitry Andric
208fe6060f1SDimitry Andric if (Value != SwiftVersion(0))
209fe6060f1SDimitry Andric return {};
210fe6060f1SDimitry Andric
211fe6060f1SDimitry Andric if (Scalar.getAsInteger(10, Value))
212fe6060f1SDimitry Andric return "invalid Swift ABI version.";
213fe6060f1SDimitry Andric
214fe6060f1SDimitry Andric return StringRef();
215fe6060f1SDimitry Andric }
mustQuote(StringRef)216fe6060f1SDimitry Andric QuotingType ScalarTraits<SwiftVersion>::mustQuote(StringRef) {
217fe6060f1SDimitry Andric return QuotingType::None;
218fe6060f1SDimitry Andric }
219fe6060f1SDimitry Andric
output(const UUID & Value,void *,raw_ostream & OS)220*06c3fb27SDimitry Andric void ScalarTraits<UUID>::output(const UUID &Value, void *, raw_ostream &OS) {}
221*06c3fb27SDimitry Andric
input(StringRef Scalar,void *,UUID & Value)222fe6060f1SDimitry Andric StringRef ScalarTraits<UUID>::input(StringRef Scalar, void *, UUID &Value) {
223*06c3fb27SDimitry Andric Value = {};
224fe6060f1SDimitry Andric return {};
225fe6060f1SDimitry Andric }
226fe6060f1SDimitry Andric
mustQuote(StringRef)227fe6060f1SDimitry Andric QuotingType ScalarTraits<UUID>::mustQuote(StringRef) {
228fe6060f1SDimitry Andric return QuotingType::Single;
229fe6060f1SDimitry Andric }
230fe6060f1SDimitry Andric
231fe6060f1SDimitry Andric } // end namespace yaml.
232fe6060f1SDimitry Andric } // end namespace llvm.
233