xref: /freebsd-src/contrib/llvm-project/llvm/lib/TextAPI/TextStubCommon.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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 //
9fe6060f1SDimitry Andric // Implememts 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 
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 }
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 }
30fe6060f1SDimitry Andric QuotingType ScalarTraits<FlowStringRef>::mustQuote(StringRef Name) {
31fe6060f1SDimitry Andric   return ScalarTraits<StringRef>::mustQuote(Name);
32fe6060f1SDimitry Andric }
33fe6060f1SDimitry Andric 
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 
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:
67*bdd1243dSDimitry Andric     [[fallthrough]];
6804eeddc0SDimitry Andric   case PLATFORM_IOS:
69fe6060f1SDimitry Andric     OS << "ios";
70fe6060f1SDimitry Andric     break;
7104eeddc0SDimitry Andric   case PLATFORM_WATCHOSSIMULATOR:
72*bdd1243dSDimitry Andric     [[fallthrough]];
7304eeddc0SDimitry Andric   case PLATFORM_WATCHOS:
74fe6060f1SDimitry Andric     OS << "watchos";
75fe6060f1SDimitry Andric     break;
7604eeddc0SDimitry Andric   case PLATFORM_TVOSSIMULATOR:
77*bdd1243dSDimitry 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:
85fe6060f1SDimitry Andric     OS << "iosmac";
86fe6060f1SDimitry Andric     break;
8704eeddc0SDimitry Andric   case PLATFORM_DRIVERKIT:
88fe6060f1SDimitry Andric     OS << "driverkit";
89fe6060f1SDimitry Andric     break;
90fe6060f1SDimitry Andric   }
91fe6060f1SDimitry Andric }
92fe6060f1SDimitry Andric 
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*bdd1243dSDimitry Andric                       .Case("driverkit", PLATFORM_DRIVERKIT)
11604eeddc0SDimitry Andric                       .Default(PLATFORM_UNKNOWN);
117fe6060f1SDimitry Andric 
11804eeddc0SDimitry Andric   if (Platform == PLATFORM_MACCATALYST)
119fe6060f1SDimitry Andric     if (Ctx && Ctx->FileKind != FileType::TBD_V3)
120fe6060f1SDimitry Andric       return "invalid platform";
121fe6060f1SDimitry Andric 
12204eeddc0SDimitry Andric   if (Platform == PLATFORM_UNKNOWN)
123fe6060f1SDimitry Andric     return "unknown platform";
124fe6060f1SDimitry Andric 
125fe6060f1SDimitry Andric   Values.insert(Platform);
126fe6060f1SDimitry Andric   return {};
127fe6060f1SDimitry Andric }
128fe6060f1SDimitry Andric 
129fe6060f1SDimitry Andric QuotingType ScalarTraits<PlatformSet>::mustQuote(StringRef) {
130fe6060f1SDimitry Andric   return QuotingType::None;
131fe6060f1SDimitry Andric }
132fe6060f1SDimitry Andric 
133fe6060f1SDimitry Andric void ScalarBitSetTraits<ArchitectureSet>::bitset(IO &IO,
134fe6060f1SDimitry Andric                                                  ArchitectureSet &Archs) {
135fe6060f1SDimitry Andric #define ARCHINFO(arch, type, subtype, numbits)                                 \
136fe6060f1SDimitry Andric   IO.bitSetCase(Archs, #arch, 1U << static_cast<int>(AK_##arch));
137fe6060f1SDimitry Andric #include "llvm/TextAPI/Architecture.def"
138fe6060f1SDimitry Andric #undef ARCHINFO
139fe6060f1SDimitry Andric }
140fe6060f1SDimitry Andric 
141fe6060f1SDimitry Andric void ScalarTraits<Architecture>::output(const Architecture &Value, void *,
142fe6060f1SDimitry Andric                                         raw_ostream &OS) {
143fe6060f1SDimitry Andric   OS << Value;
144fe6060f1SDimitry Andric }
145fe6060f1SDimitry Andric StringRef ScalarTraits<Architecture>::input(StringRef Scalar, void *,
146fe6060f1SDimitry Andric                                             Architecture &Value) {
147fe6060f1SDimitry Andric   Value = getArchitectureFromName(Scalar);
148fe6060f1SDimitry Andric   return {};
149fe6060f1SDimitry Andric }
150fe6060f1SDimitry Andric QuotingType ScalarTraits<Architecture>::mustQuote(StringRef) {
151fe6060f1SDimitry Andric   return QuotingType::None;
152fe6060f1SDimitry Andric }
153fe6060f1SDimitry Andric 
154fe6060f1SDimitry Andric void ScalarTraits<PackedVersion>::output(const PackedVersion &Value, void *,
155fe6060f1SDimitry Andric                                          raw_ostream &OS) {
156fe6060f1SDimitry Andric   OS << Value;
157fe6060f1SDimitry Andric }
158fe6060f1SDimitry Andric StringRef ScalarTraits<PackedVersion>::input(StringRef Scalar, void *,
159fe6060f1SDimitry Andric                                              PackedVersion &Value) {
160fe6060f1SDimitry Andric   if (!Value.parse32(Scalar))
161fe6060f1SDimitry Andric     return "invalid packed version string.";
162fe6060f1SDimitry Andric   return {};
163fe6060f1SDimitry Andric }
164fe6060f1SDimitry Andric QuotingType ScalarTraits<PackedVersion>::mustQuote(StringRef) {
165fe6060f1SDimitry Andric   return QuotingType::None;
166fe6060f1SDimitry Andric }
167fe6060f1SDimitry Andric 
168fe6060f1SDimitry Andric void ScalarTraits<SwiftVersion>::output(const SwiftVersion &Value, void *,
169fe6060f1SDimitry Andric                                         raw_ostream &OS) {
170fe6060f1SDimitry Andric   switch (Value) {
171fe6060f1SDimitry Andric   case 1:
172fe6060f1SDimitry Andric     OS << "1.0";
173fe6060f1SDimitry Andric     break;
174fe6060f1SDimitry Andric   case 2:
175fe6060f1SDimitry Andric     OS << "1.1";
176fe6060f1SDimitry Andric     break;
177fe6060f1SDimitry Andric   case 3:
178fe6060f1SDimitry Andric     OS << "2.0";
179fe6060f1SDimitry Andric     break;
180fe6060f1SDimitry Andric   case 4:
181fe6060f1SDimitry Andric     OS << "3.0";
182fe6060f1SDimitry Andric     break;
183fe6060f1SDimitry Andric   default:
184fe6060f1SDimitry Andric     OS << (unsigned)Value;
185fe6060f1SDimitry Andric     break;
186fe6060f1SDimitry Andric   }
187fe6060f1SDimitry Andric }
188fe6060f1SDimitry Andric StringRef ScalarTraits<SwiftVersion>::input(StringRef Scalar, void *IO,
189fe6060f1SDimitry Andric                                             SwiftVersion &Value) {
190fe6060f1SDimitry Andric   const auto *Ctx = reinterpret_cast<TextAPIContext *>(IO);
191fe6060f1SDimitry Andric   assert((!Ctx || Ctx->FileKind != FileType::Invalid) &&
192fe6060f1SDimitry Andric          "File type is not set in context");
193fe6060f1SDimitry Andric 
194fe6060f1SDimitry Andric   if (Ctx->FileKind == FileType::TBD_V4) {
195fe6060f1SDimitry Andric     if (Scalar.getAsInteger(10, Value))
196fe6060f1SDimitry Andric       return "invalid Swift ABI version.";
197fe6060f1SDimitry Andric     return {};
198fe6060f1SDimitry Andric   } else {
199fe6060f1SDimitry Andric     Value = StringSwitch<SwiftVersion>(Scalar)
200fe6060f1SDimitry Andric                 .Case("1.0", 1)
201fe6060f1SDimitry Andric                 .Case("1.1", 2)
202fe6060f1SDimitry Andric                 .Case("2.0", 3)
203fe6060f1SDimitry Andric                 .Case("3.0", 4)
204fe6060f1SDimitry Andric                 .Default(0);
205fe6060f1SDimitry Andric   }
206fe6060f1SDimitry Andric 
207fe6060f1SDimitry Andric   if (Value != SwiftVersion(0))
208fe6060f1SDimitry Andric     return {};
209fe6060f1SDimitry Andric 
210fe6060f1SDimitry Andric   if (Scalar.getAsInteger(10, Value))
211fe6060f1SDimitry Andric     return "invalid Swift ABI version.";
212fe6060f1SDimitry Andric 
213fe6060f1SDimitry Andric   return StringRef();
214fe6060f1SDimitry Andric }
215fe6060f1SDimitry Andric QuotingType ScalarTraits<SwiftVersion>::mustQuote(StringRef) {
216fe6060f1SDimitry Andric   return QuotingType::None;
217fe6060f1SDimitry Andric }
218fe6060f1SDimitry Andric 
219fe6060f1SDimitry Andric void ScalarTraits<UUID>::output(const UUID &Value, void *, raw_ostream &OS) {
220fe6060f1SDimitry Andric   OS << Value.first << ": " << Value.second;
221fe6060f1SDimitry Andric }
222fe6060f1SDimitry Andric StringRef ScalarTraits<UUID>::input(StringRef Scalar, void *, UUID &Value) {
223fe6060f1SDimitry Andric   auto Split = Scalar.split(':');
224fe6060f1SDimitry Andric   auto Arch = Split.first.trim();
225fe6060f1SDimitry Andric   auto UUID = Split.second.trim();
226fe6060f1SDimitry Andric   if (UUID.empty())
227fe6060f1SDimitry Andric     return "invalid uuid string pair";
228fe6060f1SDimitry Andric   Value.second = std::string(UUID);
22904eeddc0SDimitry Andric   Value.first = Target{getArchitectureFromName(Arch), PLATFORM_UNKNOWN};
230fe6060f1SDimitry Andric   return {};
231fe6060f1SDimitry Andric }
232fe6060f1SDimitry Andric 
233fe6060f1SDimitry Andric QuotingType ScalarTraits<UUID>::mustQuote(StringRef) {
234fe6060f1SDimitry Andric   return QuotingType::Single;
235fe6060f1SDimitry Andric }
236fe6060f1SDimitry Andric 
237fe6060f1SDimitry Andric } // end namespace yaml.
238fe6060f1SDimitry Andric } // end namespace llvm.
239