xref: /freebsd-src/contrib/llvm-project/llvm/lib/TextAPI/TextStubCommon.cpp (revision fe6060f10f634930ff71b7c50291ddc610da2475)
1*fe6060f1SDimitry Andric //===- TextStubCommon.cpp -------------------------------------------------===//
2*fe6060f1SDimitry Andric //
3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*fe6060f1SDimitry Andric //
7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8*fe6060f1SDimitry Andric //
9*fe6060f1SDimitry Andric // Implememts common Text Stub YAML mappings.
10*fe6060f1SDimitry Andric //
11*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
12*fe6060f1SDimitry Andric 
13*fe6060f1SDimitry Andric #include "TextStubCommon.h"
14*fe6060f1SDimitry Andric #include "TextAPIContext.h"
15*fe6060f1SDimitry Andric #include "llvm/ADT/StringSwitch.h"
16*fe6060f1SDimitry Andric 
17*fe6060f1SDimitry Andric using namespace llvm::MachO;
18*fe6060f1SDimitry Andric 
19*fe6060f1SDimitry Andric namespace llvm {
20*fe6060f1SDimitry Andric namespace yaml {
21*fe6060f1SDimitry Andric 
22*fe6060f1SDimitry Andric void ScalarTraits<FlowStringRef>::output(const FlowStringRef &Value, void *Ctx,
23*fe6060f1SDimitry Andric                                          raw_ostream &OS) {
24*fe6060f1SDimitry Andric   ScalarTraits<StringRef>::output(Value, Ctx, OS);
25*fe6060f1SDimitry Andric }
26*fe6060f1SDimitry Andric StringRef ScalarTraits<FlowStringRef>::input(StringRef Value, void *Ctx,
27*fe6060f1SDimitry Andric                                              FlowStringRef &Out) {
28*fe6060f1SDimitry Andric   return ScalarTraits<StringRef>::input(Value, Ctx, Out.value);
29*fe6060f1SDimitry Andric }
30*fe6060f1SDimitry Andric QuotingType ScalarTraits<FlowStringRef>::mustQuote(StringRef Name) {
31*fe6060f1SDimitry Andric   return ScalarTraits<StringRef>::mustQuote(Name);
32*fe6060f1SDimitry Andric }
33*fe6060f1SDimitry Andric 
34*fe6060f1SDimitry Andric void ScalarEnumerationTraits<ObjCConstraintType>::enumeration(
35*fe6060f1SDimitry Andric     IO &IO, ObjCConstraintType &Constraint) {
36*fe6060f1SDimitry Andric   IO.enumCase(Constraint, "none", ObjCConstraintType::None);
37*fe6060f1SDimitry Andric   IO.enumCase(Constraint, "retain_release", ObjCConstraintType::Retain_Release);
38*fe6060f1SDimitry Andric   IO.enumCase(Constraint, "retain_release_for_simulator",
39*fe6060f1SDimitry Andric               ObjCConstraintType::Retain_Release_For_Simulator);
40*fe6060f1SDimitry Andric   IO.enumCase(Constraint, "retain_release_or_gc",
41*fe6060f1SDimitry Andric               ObjCConstraintType::Retain_Release_Or_GC);
42*fe6060f1SDimitry Andric   IO.enumCase(Constraint, "gc", ObjCConstraintType::GC);
43*fe6060f1SDimitry Andric }
44*fe6060f1SDimitry Andric 
45*fe6060f1SDimitry Andric void ScalarTraits<PlatformSet>::output(const PlatformSet &Values, void *IO,
46*fe6060f1SDimitry Andric                                        raw_ostream &OS) {
47*fe6060f1SDimitry Andric 
48*fe6060f1SDimitry Andric   const auto *Ctx = reinterpret_cast<TextAPIContext *>(IO);
49*fe6060f1SDimitry Andric   assert((!Ctx || Ctx->FileKind != FileType::Invalid) &&
50*fe6060f1SDimitry Andric          "File type is not set in context");
51*fe6060f1SDimitry Andric 
52*fe6060f1SDimitry Andric   if (Ctx && Ctx->FileKind == TBD_V3 && Values.count(PlatformKind::macOS) &&
53*fe6060f1SDimitry Andric       Values.count(PlatformKind::macCatalyst)) {
54*fe6060f1SDimitry Andric     OS << "zippered";
55*fe6060f1SDimitry Andric     return;
56*fe6060f1SDimitry Andric   }
57*fe6060f1SDimitry Andric 
58*fe6060f1SDimitry Andric   assert(Values.size() == 1U);
59*fe6060f1SDimitry Andric   switch (*Values.begin()) {
60*fe6060f1SDimitry Andric   default:
61*fe6060f1SDimitry Andric     llvm_unreachable("unexpected platform");
62*fe6060f1SDimitry Andric     break;
63*fe6060f1SDimitry Andric   case PlatformKind::macOS:
64*fe6060f1SDimitry Andric     OS << "macosx";
65*fe6060f1SDimitry Andric     break;
66*fe6060f1SDimitry Andric   case PlatformKind::iOSSimulator:
67*fe6060f1SDimitry Andric     LLVM_FALLTHROUGH;
68*fe6060f1SDimitry Andric   case PlatformKind::iOS:
69*fe6060f1SDimitry Andric     OS << "ios";
70*fe6060f1SDimitry Andric     break;
71*fe6060f1SDimitry Andric   case PlatformKind::watchOSSimulator:
72*fe6060f1SDimitry Andric     LLVM_FALLTHROUGH;
73*fe6060f1SDimitry Andric   case PlatformKind::watchOS:
74*fe6060f1SDimitry Andric     OS << "watchos";
75*fe6060f1SDimitry Andric     break;
76*fe6060f1SDimitry Andric   case PlatformKind::tvOSSimulator:
77*fe6060f1SDimitry Andric     LLVM_FALLTHROUGH;
78*fe6060f1SDimitry Andric   case PlatformKind::tvOS:
79*fe6060f1SDimitry Andric     OS << "tvos";
80*fe6060f1SDimitry Andric     break;
81*fe6060f1SDimitry Andric   case PlatformKind::bridgeOS:
82*fe6060f1SDimitry Andric     OS << "bridgeos";
83*fe6060f1SDimitry Andric     break;
84*fe6060f1SDimitry Andric   case PlatformKind::macCatalyst:
85*fe6060f1SDimitry Andric     OS << "iosmac";
86*fe6060f1SDimitry Andric     break;
87*fe6060f1SDimitry Andric   case PlatformKind::driverKit:
88*fe6060f1SDimitry Andric     OS << "driverkit";
89*fe6060f1SDimitry Andric     break;
90*fe6060f1SDimitry Andric   }
91*fe6060f1SDimitry Andric }
92*fe6060f1SDimitry Andric 
93*fe6060f1SDimitry Andric StringRef ScalarTraits<PlatformSet>::input(StringRef Scalar, void *IO,
94*fe6060f1SDimitry Andric                                            PlatformSet &Values) {
95*fe6060f1SDimitry Andric   const auto *Ctx = reinterpret_cast<TextAPIContext *>(IO);
96*fe6060f1SDimitry Andric   assert((!Ctx || Ctx->FileKind != FileType::Invalid) &&
97*fe6060f1SDimitry Andric          "File type is not set in context");
98*fe6060f1SDimitry Andric 
99*fe6060f1SDimitry Andric   if (Scalar == "zippered") {
100*fe6060f1SDimitry Andric     if (Ctx && Ctx->FileKind == FileType::TBD_V3) {
101*fe6060f1SDimitry Andric       Values.insert(PlatformKind::macOS);
102*fe6060f1SDimitry Andric       Values.insert(PlatformKind::macCatalyst);
103*fe6060f1SDimitry Andric       return {};
104*fe6060f1SDimitry Andric     }
105*fe6060f1SDimitry Andric     return "invalid platform";
106*fe6060f1SDimitry Andric   }
107*fe6060f1SDimitry Andric 
108*fe6060f1SDimitry Andric   auto Platform = StringSwitch<PlatformKind>(Scalar)
109*fe6060f1SDimitry Andric                       .Case("unknown", PlatformKind::unknown)
110*fe6060f1SDimitry Andric                       .Case("macosx", PlatformKind::macOS)
111*fe6060f1SDimitry Andric                       .Case("ios", PlatformKind::iOS)
112*fe6060f1SDimitry Andric                       .Case("watchos", PlatformKind::watchOS)
113*fe6060f1SDimitry Andric                       .Case("tvos", PlatformKind::tvOS)
114*fe6060f1SDimitry Andric                       .Case("bridgeos", PlatformKind::bridgeOS)
115*fe6060f1SDimitry Andric                       .Case("iosmac", PlatformKind::macCatalyst)
116*fe6060f1SDimitry Andric                       .Default(PlatformKind::unknown);
117*fe6060f1SDimitry Andric 
118*fe6060f1SDimitry Andric   if (Platform == PlatformKind::macCatalyst)
119*fe6060f1SDimitry Andric     if (Ctx && Ctx->FileKind != FileType::TBD_V3)
120*fe6060f1SDimitry Andric       return "invalid platform";
121*fe6060f1SDimitry Andric 
122*fe6060f1SDimitry Andric   if (Platform == PlatformKind::unknown)
123*fe6060f1SDimitry Andric     return "unknown platform";
124*fe6060f1SDimitry Andric 
125*fe6060f1SDimitry Andric   Values.insert(Platform);
126*fe6060f1SDimitry Andric   return {};
127*fe6060f1SDimitry Andric }
128*fe6060f1SDimitry Andric 
129*fe6060f1SDimitry Andric QuotingType ScalarTraits<PlatformSet>::mustQuote(StringRef) {
130*fe6060f1SDimitry Andric   return QuotingType::None;
131*fe6060f1SDimitry Andric }
132*fe6060f1SDimitry Andric 
133*fe6060f1SDimitry Andric void ScalarBitSetTraits<ArchitectureSet>::bitset(IO &IO,
134*fe6060f1SDimitry Andric                                                  ArchitectureSet &Archs) {
135*fe6060f1SDimitry Andric #define ARCHINFO(arch, type, subtype, numbits)                                 \
136*fe6060f1SDimitry Andric   IO.bitSetCase(Archs, #arch, 1U << static_cast<int>(AK_##arch));
137*fe6060f1SDimitry Andric #include "llvm/TextAPI/Architecture.def"
138*fe6060f1SDimitry Andric #undef ARCHINFO
139*fe6060f1SDimitry Andric }
140*fe6060f1SDimitry Andric 
141*fe6060f1SDimitry Andric void ScalarTraits<Architecture>::output(const Architecture &Value, void *,
142*fe6060f1SDimitry Andric                                         raw_ostream &OS) {
143*fe6060f1SDimitry Andric   OS << Value;
144*fe6060f1SDimitry Andric }
145*fe6060f1SDimitry Andric StringRef ScalarTraits<Architecture>::input(StringRef Scalar, void *,
146*fe6060f1SDimitry Andric                                             Architecture &Value) {
147*fe6060f1SDimitry Andric   Value = getArchitectureFromName(Scalar);
148*fe6060f1SDimitry Andric   return {};
149*fe6060f1SDimitry Andric }
150*fe6060f1SDimitry Andric QuotingType ScalarTraits<Architecture>::mustQuote(StringRef) {
151*fe6060f1SDimitry Andric   return QuotingType::None;
152*fe6060f1SDimitry Andric }
153*fe6060f1SDimitry Andric 
154*fe6060f1SDimitry Andric void ScalarTraits<PackedVersion>::output(const PackedVersion &Value, void *,
155*fe6060f1SDimitry Andric                                          raw_ostream &OS) {
156*fe6060f1SDimitry Andric   OS << Value;
157*fe6060f1SDimitry Andric }
158*fe6060f1SDimitry Andric StringRef ScalarTraits<PackedVersion>::input(StringRef Scalar, void *,
159*fe6060f1SDimitry Andric                                              PackedVersion &Value) {
160*fe6060f1SDimitry Andric   if (!Value.parse32(Scalar))
161*fe6060f1SDimitry Andric     return "invalid packed version string.";
162*fe6060f1SDimitry Andric   return {};
163*fe6060f1SDimitry Andric }
164*fe6060f1SDimitry Andric QuotingType ScalarTraits<PackedVersion>::mustQuote(StringRef) {
165*fe6060f1SDimitry Andric   return QuotingType::None;
166*fe6060f1SDimitry Andric }
167*fe6060f1SDimitry Andric 
168*fe6060f1SDimitry Andric void ScalarTraits<SwiftVersion>::output(const SwiftVersion &Value, void *,
169*fe6060f1SDimitry Andric                                         raw_ostream &OS) {
170*fe6060f1SDimitry Andric   switch (Value) {
171*fe6060f1SDimitry Andric   case 1:
172*fe6060f1SDimitry Andric     OS << "1.0";
173*fe6060f1SDimitry Andric     break;
174*fe6060f1SDimitry Andric   case 2:
175*fe6060f1SDimitry Andric     OS << "1.1";
176*fe6060f1SDimitry Andric     break;
177*fe6060f1SDimitry Andric   case 3:
178*fe6060f1SDimitry Andric     OS << "2.0";
179*fe6060f1SDimitry Andric     break;
180*fe6060f1SDimitry Andric   case 4:
181*fe6060f1SDimitry Andric     OS << "3.0";
182*fe6060f1SDimitry Andric     break;
183*fe6060f1SDimitry Andric   default:
184*fe6060f1SDimitry Andric     OS << (unsigned)Value;
185*fe6060f1SDimitry Andric     break;
186*fe6060f1SDimitry Andric   }
187*fe6060f1SDimitry Andric }
188*fe6060f1SDimitry Andric StringRef ScalarTraits<SwiftVersion>::input(StringRef Scalar, void *IO,
189*fe6060f1SDimitry Andric                                             SwiftVersion &Value) {
190*fe6060f1SDimitry Andric   const auto *Ctx = reinterpret_cast<TextAPIContext *>(IO);
191*fe6060f1SDimitry Andric   assert((!Ctx || Ctx->FileKind != FileType::Invalid) &&
192*fe6060f1SDimitry Andric          "File type is not set in context");
193*fe6060f1SDimitry Andric 
194*fe6060f1SDimitry Andric   if (Ctx->FileKind == FileType::TBD_V4) {
195*fe6060f1SDimitry Andric     if (Scalar.getAsInteger(10, Value))
196*fe6060f1SDimitry Andric       return "invalid Swift ABI version.";
197*fe6060f1SDimitry Andric     return {};
198*fe6060f1SDimitry Andric   } else {
199*fe6060f1SDimitry Andric     Value = StringSwitch<SwiftVersion>(Scalar)
200*fe6060f1SDimitry Andric                 .Case("1.0", 1)
201*fe6060f1SDimitry Andric                 .Case("1.1", 2)
202*fe6060f1SDimitry Andric                 .Case("2.0", 3)
203*fe6060f1SDimitry Andric                 .Case("3.0", 4)
204*fe6060f1SDimitry Andric                 .Default(0);
205*fe6060f1SDimitry Andric   }
206*fe6060f1SDimitry Andric 
207*fe6060f1SDimitry Andric   if (Value != SwiftVersion(0))
208*fe6060f1SDimitry Andric     return {};
209*fe6060f1SDimitry Andric 
210*fe6060f1SDimitry Andric   if (Scalar.getAsInteger(10, Value))
211*fe6060f1SDimitry Andric     return "invalid Swift ABI version.";
212*fe6060f1SDimitry Andric 
213*fe6060f1SDimitry Andric   return StringRef();
214*fe6060f1SDimitry Andric }
215*fe6060f1SDimitry Andric QuotingType ScalarTraits<SwiftVersion>::mustQuote(StringRef) {
216*fe6060f1SDimitry Andric   return QuotingType::None;
217*fe6060f1SDimitry Andric }
218*fe6060f1SDimitry Andric 
219*fe6060f1SDimitry Andric void ScalarTraits<UUID>::output(const UUID &Value, void *, raw_ostream &OS) {
220*fe6060f1SDimitry Andric   OS << Value.first << ": " << Value.second;
221*fe6060f1SDimitry Andric }
222*fe6060f1SDimitry Andric StringRef ScalarTraits<UUID>::input(StringRef Scalar, void *, UUID &Value) {
223*fe6060f1SDimitry Andric   auto Split = Scalar.split(':');
224*fe6060f1SDimitry Andric   auto Arch = Split.first.trim();
225*fe6060f1SDimitry Andric   auto UUID = Split.second.trim();
226*fe6060f1SDimitry Andric   if (UUID.empty())
227*fe6060f1SDimitry Andric     return "invalid uuid string pair";
228*fe6060f1SDimitry Andric   Value.second = std::string(UUID);
229*fe6060f1SDimitry Andric   Value.first = Target{getArchitectureFromName(Arch), PlatformKind::unknown};
230*fe6060f1SDimitry Andric   return {};
231*fe6060f1SDimitry Andric }
232*fe6060f1SDimitry Andric 
233*fe6060f1SDimitry Andric QuotingType ScalarTraits<UUID>::mustQuote(StringRef) {
234*fe6060f1SDimitry Andric   return QuotingType::Single;
235*fe6060f1SDimitry Andric }
236*fe6060f1SDimitry Andric 
237*fe6060f1SDimitry Andric } // end namespace yaml.
238*fe6060f1SDimitry Andric } // end namespace llvm.
239