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