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