233 lines · cpp
1//===- TextStubCommon.cpp -------------------------------------------------===//2//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-exception6//7//===----------------------------------------------------------------------===//8//9// Implements common Text Stub YAML mappings.10//11//===----------------------------------------------------------------------===//12 13#include "TextStubCommon.h"14#include "TextAPIContext.h"15#include "llvm/ADT/StringSwitch.h"16 17using namespace llvm::MachO;18 19namespace llvm {20namespace yaml {21 22void ScalarTraits<FlowStringRef>::output(const FlowStringRef &Value, void *Ctx,23 raw_ostream &OS) {24 ScalarTraits<StringRef>::output(Value, Ctx, OS);25}26StringRef ScalarTraits<FlowStringRef>::input(StringRef Value, void *Ctx,27 FlowStringRef &Out) {28 return ScalarTraits<StringRef>::input(Value, Ctx, Out.value);29}30QuotingType ScalarTraits<FlowStringRef>::mustQuote(StringRef Name) {31 return ScalarTraits<StringRef>::mustQuote(Name);32}33 34void 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);43}44 45void ScalarTraits<PlatformSet>::output(const PlatformSet &Values, void *IO,46 raw_ostream &OS) {47 48 const auto *Ctx = reinterpret_cast<TextAPIContext *>(IO);49 assert((!Ctx || Ctx->FileKind != FileType::Invalid) &&50 "File type is not set in context");51 52 if (Ctx && Ctx->FileKind == TBD_V3 && Values.count(PLATFORM_MACOS) &&53 Values.count(PLATFORM_MACCATALYST)) {54 OS << "zippered";55 return;56 }57 58 assert(Values.size() == 1U);59 switch (*Values.begin()) {60 default:61 llvm_unreachable("unexpected platform");62 break;63 case PLATFORM_MACOS:64 OS << "macosx";65 break;66 case PLATFORM_IOSSIMULATOR:67 [[fallthrough]];68 case PLATFORM_IOS:69 OS << "ios";70 break;71 case PLATFORM_WATCHOSSIMULATOR:72 [[fallthrough]];73 case PLATFORM_WATCHOS:74 OS << "watchos";75 break;76 case PLATFORM_TVOSSIMULATOR:77 [[fallthrough]];78 case PLATFORM_TVOS:79 OS << "tvos";80 break;81 case PLATFORM_BRIDGEOS:82 OS << "bridgeos";83 break;84 case PLATFORM_MACCATALYST:85 OS << "maccatalyst";86 break;87 case PLATFORM_DRIVERKIT:88 OS << "driverkit";89 break;90 }91}92 93StringRef 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");98 99 if (Scalar == "zippered") {100 if (Ctx && Ctx->FileKind == FileType::TBD_V3) {101 Values.insert(PLATFORM_MACOS);102 Values.insert(PLATFORM_MACCATALYST);103 return {};104 }105 return "invalid platform";106 }107 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);118 119 if (Platform == PLATFORM_MACCATALYST)120 if (Ctx && Ctx->FileKind != FileType::TBD_V3)121 return "invalid platform";122 123 if (Platform == PLATFORM_UNKNOWN)124 return "unknown platform";125 126 Values.insert(Platform);127 return {};128}129 130QuotingType ScalarTraits<PlatformSet>::mustQuote(StringRef) {131 return QuotingType::None;132}133 134void ScalarBitSetTraits<ArchitectureSet>::bitset(IO &IO,135 ArchitectureSet &Archs) {136#define ARCHINFO(arch, name, type, subtype, numbits) \137 IO.bitSetCase(Archs, #arch, 1U << static_cast<int>(AK_##arch));138#include "llvm/TextAPI/Architecture.def"139#undef ARCHINFO140}141 142void ScalarTraits<Architecture>::output(const Architecture &Value, void *,143 raw_ostream &OS) {144 OS << Value;145}146StringRef ScalarTraits<Architecture>::input(StringRef Scalar, void *,147 Architecture &Value) {148 Value = getArchitectureFromName(Scalar);149 return {};150}151QuotingType ScalarTraits<Architecture>::mustQuote(StringRef) {152 return QuotingType::None;153}154 155void ScalarTraits<PackedVersion>::output(const PackedVersion &Value, void *,156 raw_ostream &OS) {157 OS << Value;158}159StringRef ScalarTraits<PackedVersion>::input(StringRef Scalar, void *,160 PackedVersion &Value) {161 if (!Value.parse32(Scalar))162 return "invalid packed version string.";163 return {};164}165QuotingType ScalarTraits<PackedVersion>::mustQuote(StringRef) {166 return QuotingType::None;167}168 169void ScalarTraits<SwiftVersion>::output(const SwiftVersion &Value, void *,170 raw_ostream &OS) {171 switch (Value) {172 case 1:173 OS << "1.0";174 break;175 case 2:176 OS << "1.1";177 break;178 case 3:179 OS << "2.0";180 break;181 case 4:182 OS << "3.0";183 break;184 default:185 OS << (unsigned)Value;186 break;187 }188}189StringRef 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");194 195 if (Ctx->FileKind == FileType::TBD_V4) {196 if (Scalar.getAsInteger(10, Value))197 return "invalid Swift ABI version.";198 return {};199 } else {200 Value = StringSwitch<SwiftVersion>(Scalar)201 .Case("1.0", 1)202 .Case("1.1", 2)203 .Case("2.0", 3)204 .Case("3.0", 4)205 .Default(0);206 }207 208 if (Value != SwiftVersion(0))209 return {};210 211 if (Scalar.getAsInteger(10, Value))212 return "invalid Swift ABI version.";213 214 return StringRef();215}216QuotingType ScalarTraits<SwiftVersion>::mustQuote(StringRef) {217 return QuotingType::None;218}219 220void ScalarTraits<UUID>::output(const UUID &Value, void *, raw_ostream &OS) {}221 222StringRef ScalarTraits<UUID>::input(StringRef Scalar, void *, UUID &Value) {223 Value = {};224 return {};225}226 227QuotingType ScalarTraits<UUID>::mustQuote(StringRef) {228 return QuotingType::Single;229}230 231} // end namespace yaml.232} // end namespace llvm.233