xref: /openbsd-src/gnu/llvm/llvm/lib/TextAPI/TextStubCommon.cpp (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
173471bf0Spatrick //===- TextStubCommon.cpp -------------------------------------------------===//
273471bf0Spatrick //
373471bf0Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
473471bf0Spatrick // See https://llvm.org/LICENSE.txt for license information.
573471bf0Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
673471bf0Spatrick //
773471bf0Spatrick //===----------------------------------------------------------------------===//
873471bf0Spatrick //
973471bf0Spatrick // Implememts common Text Stub YAML mappings.
1073471bf0Spatrick //
1173471bf0Spatrick //===----------------------------------------------------------------------===//
1273471bf0Spatrick 
1373471bf0Spatrick #include "TextStubCommon.h"
1473471bf0Spatrick #include "TextAPIContext.h"
1573471bf0Spatrick #include "llvm/ADT/StringSwitch.h"
1673471bf0Spatrick 
1773471bf0Spatrick using namespace llvm::MachO;
1873471bf0Spatrick 
1973471bf0Spatrick namespace llvm {
2073471bf0Spatrick namespace yaml {
2173471bf0Spatrick 
output(const FlowStringRef & Value,void * Ctx,raw_ostream & OS)2273471bf0Spatrick void ScalarTraits<FlowStringRef>::output(const FlowStringRef &Value, void *Ctx,
2373471bf0Spatrick                                          raw_ostream &OS) {
2473471bf0Spatrick   ScalarTraits<StringRef>::output(Value, Ctx, OS);
2573471bf0Spatrick }
input(StringRef Value,void * Ctx,FlowStringRef & Out)2673471bf0Spatrick StringRef ScalarTraits<FlowStringRef>::input(StringRef Value, void *Ctx,
2773471bf0Spatrick                                              FlowStringRef &Out) {
2873471bf0Spatrick   return ScalarTraits<StringRef>::input(Value, Ctx, Out.value);
2973471bf0Spatrick }
mustQuote(StringRef Name)3073471bf0Spatrick QuotingType ScalarTraits<FlowStringRef>::mustQuote(StringRef Name) {
3173471bf0Spatrick   return ScalarTraits<StringRef>::mustQuote(Name);
3273471bf0Spatrick }
3373471bf0Spatrick 
enumeration(IO & IO,ObjCConstraintType & Constraint)3473471bf0Spatrick void ScalarEnumerationTraits<ObjCConstraintType>::enumeration(
3573471bf0Spatrick     IO &IO, ObjCConstraintType &Constraint) {
3673471bf0Spatrick   IO.enumCase(Constraint, "none", ObjCConstraintType::None);
3773471bf0Spatrick   IO.enumCase(Constraint, "retain_release", ObjCConstraintType::Retain_Release);
3873471bf0Spatrick   IO.enumCase(Constraint, "retain_release_for_simulator",
3973471bf0Spatrick               ObjCConstraintType::Retain_Release_For_Simulator);
4073471bf0Spatrick   IO.enumCase(Constraint, "retain_release_or_gc",
4173471bf0Spatrick               ObjCConstraintType::Retain_Release_Or_GC);
4273471bf0Spatrick   IO.enumCase(Constraint, "gc", ObjCConstraintType::GC);
4373471bf0Spatrick }
4473471bf0Spatrick 
output(const PlatformSet & Values,void * IO,raw_ostream & OS)4573471bf0Spatrick void ScalarTraits<PlatformSet>::output(const PlatformSet &Values, void *IO,
4673471bf0Spatrick                                        raw_ostream &OS) {
4773471bf0Spatrick 
4873471bf0Spatrick   const auto *Ctx = reinterpret_cast<TextAPIContext *>(IO);
4973471bf0Spatrick   assert((!Ctx || Ctx->FileKind != FileType::Invalid) &&
5073471bf0Spatrick          "File type is not set in context");
5173471bf0Spatrick 
52*d415bd75Srobert   if (Ctx && Ctx->FileKind == TBD_V3 && Values.count(PLATFORM_MACOS) &&
53*d415bd75Srobert       Values.count(PLATFORM_MACCATALYST)) {
5473471bf0Spatrick     OS << "zippered";
5573471bf0Spatrick     return;
5673471bf0Spatrick   }
5773471bf0Spatrick 
5873471bf0Spatrick   assert(Values.size() == 1U);
5973471bf0Spatrick   switch (*Values.begin()) {
6073471bf0Spatrick   default:
6173471bf0Spatrick     llvm_unreachable("unexpected platform");
6273471bf0Spatrick     break;
63*d415bd75Srobert   case PLATFORM_MACOS:
6473471bf0Spatrick     OS << "macosx";
6573471bf0Spatrick     break;
66*d415bd75Srobert   case PLATFORM_IOSSIMULATOR:
67*d415bd75Srobert     [[fallthrough]];
68*d415bd75Srobert   case PLATFORM_IOS:
6973471bf0Spatrick     OS << "ios";
7073471bf0Spatrick     break;
71*d415bd75Srobert   case PLATFORM_WATCHOSSIMULATOR:
72*d415bd75Srobert     [[fallthrough]];
73*d415bd75Srobert   case PLATFORM_WATCHOS:
7473471bf0Spatrick     OS << "watchos";
7573471bf0Spatrick     break;
76*d415bd75Srobert   case PLATFORM_TVOSSIMULATOR:
77*d415bd75Srobert     [[fallthrough]];
78*d415bd75Srobert   case PLATFORM_TVOS:
7973471bf0Spatrick     OS << "tvos";
8073471bf0Spatrick     break;
81*d415bd75Srobert   case PLATFORM_BRIDGEOS:
8273471bf0Spatrick     OS << "bridgeos";
8373471bf0Spatrick     break;
84*d415bd75Srobert   case PLATFORM_MACCATALYST:
8573471bf0Spatrick     OS << "iosmac";
8673471bf0Spatrick     break;
87*d415bd75Srobert   case PLATFORM_DRIVERKIT:
8873471bf0Spatrick     OS << "driverkit";
8973471bf0Spatrick     break;
9073471bf0Spatrick   }
9173471bf0Spatrick }
9273471bf0Spatrick 
input(StringRef Scalar,void * IO,PlatformSet & Values)9373471bf0Spatrick StringRef ScalarTraits<PlatformSet>::input(StringRef Scalar, void *IO,
9473471bf0Spatrick                                            PlatformSet &Values) {
9573471bf0Spatrick   const auto *Ctx = reinterpret_cast<TextAPIContext *>(IO);
9673471bf0Spatrick   assert((!Ctx || Ctx->FileKind != FileType::Invalid) &&
9773471bf0Spatrick          "File type is not set in context");
9873471bf0Spatrick 
9973471bf0Spatrick   if (Scalar == "zippered") {
10073471bf0Spatrick     if (Ctx && Ctx->FileKind == FileType::TBD_V3) {
101*d415bd75Srobert       Values.insert(PLATFORM_MACOS);
102*d415bd75Srobert       Values.insert(PLATFORM_MACCATALYST);
10373471bf0Spatrick       return {};
10473471bf0Spatrick     }
10573471bf0Spatrick     return "invalid platform";
10673471bf0Spatrick   }
10773471bf0Spatrick 
108*d415bd75Srobert   auto Platform = StringSwitch<PlatformType>(Scalar)
109*d415bd75Srobert                       .Case("macosx", PLATFORM_MACOS)
110*d415bd75Srobert                       .Case("ios", PLATFORM_IOS)
111*d415bd75Srobert                       .Case("watchos", PLATFORM_WATCHOS)
112*d415bd75Srobert                       .Case("tvos", PLATFORM_TVOS)
113*d415bd75Srobert                       .Case("bridgeos", PLATFORM_BRIDGEOS)
114*d415bd75Srobert                       .Case("iosmac", PLATFORM_MACCATALYST)
115*d415bd75Srobert                       .Case("driverkit", PLATFORM_DRIVERKIT)
116*d415bd75Srobert                       .Default(PLATFORM_UNKNOWN);
11773471bf0Spatrick 
118*d415bd75Srobert   if (Platform == PLATFORM_MACCATALYST)
11973471bf0Spatrick     if (Ctx && Ctx->FileKind != FileType::TBD_V3)
12073471bf0Spatrick       return "invalid platform";
12173471bf0Spatrick 
122*d415bd75Srobert   if (Platform == PLATFORM_UNKNOWN)
12373471bf0Spatrick     return "unknown platform";
12473471bf0Spatrick 
12573471bf0Spatrick   Values.insert(Platform);
12673471bf0Spatrick   return {};
12773471bf0Spatrick }
12873471bf0Spatrick 
mustQuote(StringRef)12973471bf0Spatrick QuotingType ScalarTraits<PlatformSet>::mustQuote(StringRef) {
13073471bf0Spatrick   return QuotingType::None;
13173471bf0Spatrick }
13273471bf0Spatrick 
bitset(IO & IO,ArchitectureSet & Archs)13373471bf0Spatrick void ScalarBitSetTraits<ArchitectureSet>::bitset(IO &IO,
13473471bf0Spatrick                                                  ArchitectureSet &Archs) {
13573471bf0Spatrick #define ARCHINFO(arch, type, subtype, numbits)                                 \
13673471bf0Spatrick   IO.bitSetCase(Archs, #arch, 1U << static_cast<int>(AK_##arch));
13773471bf0Spatrick #include "llvm/TextAPI/Architecture.def"
13873471bf0Spatrick #undef ARCHINFO
13973471bf0Spatrick }
14073471bf0Spatrick 
output(const Architecture & Value,void *,raw_ostream & OS)14173471bf0Spatrick void ScalarTraits<Architecture>::output(const Architecture &Value, void *,
14273471bf0Spatrick                                         raw_ostream &OS) {
14373471bf0Spatrick   OS << Value;
14473471bf0Spatrick }
input(StringRef Scalar,void *,Architecture & Value)14573471bf0Spatrick StringRef ScalarTraits<Architecture>::input(StringRef Scalar, void *,
14673471bf0Spatrick                                             Architecture &Value) {
14773471bf0Spatrick   Value = getArchitectureFromName(Scalar);
14873471bf0Spatrick   return {};
14973471bf0Spatrick }
mustQuote(StringRef)15073471bf0Spatrick QuotingType ScalarTraits<Architecture>::mustQuote(StringRef) {
15173471bf0Spatrick   return QuotingType::None;
15273471bf0Spatrick }
15373471bf0Spatrick 
output(const PackedVersion & Value,void *,raw_ostream & OS)15473471bf0Spatrick void ScalarTraits<PackedVersion>::output(const PackedVersion &Value, void *,
15573471bf0Spatrick                                          raw_ostream &OS) {
15673471bf0Spatrick   OS << Value;
15773471bf0Spatrick }
input(StringRef Scalar,void *,PackedVersion & Value)15873471bf0Spatrick StringRef ScalarTraits<PackedVersion>::input(StringRef Scalar, void *,
15973471bf0Spatrick                                              PackedVersion &Value) {
16073471bf0Spatrick   if (!Value.parse32(Scalar))
16173471bf0Spatrick     return "invalid packed version string.";
16273471bf0Spatrick   return {};
16373471bf0Spatrick }
mustQuote(StringRef)16473471bf0Spatrick QuotingType ScalarTraits<PackedVersion>::mustQuote(StringRef) {
16573471bf0Spatrick   return QuotingType::None;
16673471bf0Spatrick }
16773471bf0Spatrick 
output(const SwiftVersion & Value,void *,raw_ostream & OS)16873471bf0Spatrick void ScalarTraits<SwiftVersion>::output(const SwiftVersion &Value, void *,
16973471bf0Spatrick                                         raw_ostream &OS) {
17073471bf0Spatrick   switch (Value) {
17173471bf0Spatrick   case 1:
17273471bf0Spatrick     OS << "1.0";
17373471bf0Spatrick     break;
17473471bf0Spatrick   case 2:
17573471bf0Spatrick     OS << "1.1";
17673471bf0Spatrick     break;
17773471bf0Spatrick   case 3:
17873471bf0Spatrick     OS << "2.0";
17973471bf0Spatrick     break;
18073471bf0Spatrick   case 4:
18173471bf0Spatrick     OS << "3.0";
18273471bf0Spatrick     break;
18373471bf0Spatrick   default:
18473471bf0Spatrick     OS << (unsigned)Value;
18573471bf0Spatrick     break;
18673471bf0Spatrick   }
18773471bf0Spatrick }
input(StringRef Scalar,void * IO,SwiftVersion & Value)18873471bf0Spatrick StringRef ScalarTraits<SwiftVersion>::input(StringRef Scalar, void *IO,
18973471bf0Spatrick                                             SwiftVersion &Value) {
19073471bf0Spatrick   const auto *Ctx = reinterpret_cast<TextAPIContext *>(IO);
19173471bf0Spatrick   assert((!Ctx || Ctx->FileKind != FileType::Invalid) &&
19273471bf0Spatrick          "File type is not set in context");
19373471bf0Spatrick 
19473471bf0Spatrick   if (Ctx->FileKind == FileType::TBD_V4) {
19573471bf0Spatrick     if (Scalar.getAsInteger(10, Value))
19673471bf0Spatrick       return "invalid Swift ABI version.";
19773471bf0Spatrick     return {};
19873471bf0Spatrick   } else {
19973471bf0Spatrick     Value = StringSwitch<SwiftVersion>(Scalar)
20073471bf0Spatrick                 .Case("1.0", 1)
20173471bf0Spatrick                 .Case("1.1", 2)
20273471bf0Spatrick                 .Case("2.0", 3)
20373471bf0Spatrick                 .Case("3.0", 4)
20473471bf0Spatrick                 .Default(0);
20573471bf0Spatrick   }
20673471bf0Spatrick 
20773471bf0Spatrick   if (Value != SwiftVersion(0))
20873471bf0Spatrick     return {};
20973471bf0Spatrick 
21073471bf0Spatrick   if (Scalar.getAsInteger(10, Value))
21173471bf0Spatrick     return "invalid Swift ABI version.";
21273471bf0Spatrick 
21373471bf0Spatrick   return StringRef();
21473471bf0Spatrick }
mustQuote(StringRef)21573471bf0Spatrick QuotingType ScalarTraits<SwiftVersion>::mustQuote(StringRef) {
21673471bf0Spatrick   return QuotingType::None;
21773471bf0Spatrick }
21873471bf0Spatrick 
output(const UUID & Value,void *,raw_ostream & OS)21973471bf0Spatrick void ScalarTraits<UUID>::output(const UUID &Value, void *, raw_ostream &OS) {
22073471bf0Spatrick   OS << Value.first << ": " << Value.second;
22173471bf0Spatrick }
input(StringRef Scalar,void *,UUID & Value)22273471bf0Spatrick StringRef ScalarTraits<UUID>::input(StringRef Scalar, void *, UUID &Value) {
22373471bf0Spatrick   auto Split = Scalar.split(':');
22473471bf0Spatrick   auto Arch = Split.first.trim();
22573471bf0Spatrick   auto UUID = Split.second.trim();
22673471bf0Spatrick   if (UUID.empty())
22773471bf0Spatrick     return "invalid uuid string pair";
22873471bf0Spatrick   Value.second = std::string(UUID);
229*d415bd75Srobert   Value.first = Target{getArchitectureFromName(Arch), PLATFORM_UNKNOWN};
23073471bf0Spatrick   return {};
23173471bf0Spatrick }
23273471bf0Spatrick 
mustQuote(StringRef)23373471bf0Spatrick QuotingType ScalarTraits<UUID>::mustQuote(StringRef) {
23473471bf0Spatrick   return QuotingType::Single;
23573471bf0Spatrick }
23673471bf0Spatrick 
23773471bf0Spatrick } // end namespace yaml.
23873471bf0Spatrick } // end namespace llvm.
239