TextStubCommon.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // Implememts common Text Stub YAML mappings.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "TextStubCommon.h"
  13. #include "TextAPIContext.h"
  14. using namespace llvm::MachO;
  15. namespace llvm {
  16. namespace yaml {
  17. void ScalarTraits<FlowStringRef>::output(const FlowStringRef &Value, void *Ctx,
  18. raw_ostream &OS) {
  19. ScalarTraits<StringRef>::output(Value, Ctx, OS);
  20. }
  21. StringRef ScalarTraits<FlowStringRef>::input(StringRef Value, void *Ctx,
  22. FlowStringRef &Out) {
  23. return ScalarTraits<StringRef>::input(Value, Ctx, Out.value);
  24. }
  25. QuotingType ScalarTraits<FlowStringRef>::mustQuote(StringRef Name) {
  26. return ScalarTraits<StringRef>::mustQuote(Name);
  27. }
  28. void ScalarEnumerationTraits<ObjCConstraintType>::enumeration(
  29. IO &IO, ObjCConstraintType &Constraint) {
  30. IO.enumCase(Constraint, "none", ObjCConstraintType::None);
  31. IO.enumCase(Constraint, "retain_release", ObjCConstraintType::Retain_Release);
  32. IO.enumCase(Constraint, "retain_release_for_simulator",
  33. ObjCConstraintType::Retain_Release_For_Simulator);
  34. IO.enumCase(Constraint, "retain_release_or_gc",
  35. ObjCConstraintType::Retain_Release_Or_GC);
  36. IO.enumCase(Constraint, "gc", ObjCConstraintType::GC);
  37. }
  38. void ScalarTraits<PlatformKind>::output(const PlatformKind &Value, void *,
  39. raw_ostream &OS) {
  40. switch (Value) {
  41. default:
  42. llvm_unreachable("unexpected platform");
  43. break;
  44. case PlatformKind::macOS:
  45. OS << "macosx";
  46. break;
  47. case PlatformKind::iOS:
  48. OS << "ios";
  49. break;
  50. case PlatformKind::watchOS:
  51. OS << "watchos";
  52. break;
  53. case PlatformKind::tvOS:
  54. OS << "tvos";
  55. break;
  56. case PlatformKind::bridgeOS:
  57. OS << "bridgeos";
  58. break;
  59. }
  60. }
  61. StringRef ScalarTraits<PlatformKind>::input(StringRef Scalar, void *,
  62. PlatformKind &Value) {
  63. Value = StringSwitch<PlatformKind>(Scalar)
  64. .Case("macosx", PlatformKind::macOS)
  65. .Case("ios", PlatformKind::iOS)
  66. .Case("watchos", PlatformKind::watchOS)
  67. .Case("tvos", PlatformKind::tvOS)
  68. .Case("bridgeos", PlatformKind::bridgeOS)
  69. .Default(PlatformKind::unknown);
  70. if (Value == PlatformKind::unknown)
  71. return "unknown platform";
  72. return {};
  73. }
  74. QuotingType ScalarTraits<PlatformKind>::mustQuote(StringRef) {
  75. return QuotingType::None;
  76. }
  77. void ScalarBitSetTraits<ArchitectureSet>::bitset(IO &IO,
  78. ArchitectureSet &Archs) {
  79. #define ARCHINFO(arch, type, subtype, numbits) \
  80. IO.bitSetCase(Archs, #arch, 1U << static_cast<int>(AK_##arch));
  81. #include "llvm/TextAPI/MachO/Architecture.def"
  82. #undef ARCHINFO
  83. }
  84. void ScalarTraits<Architecture>::output(const Architecture &Value, void *,
  85. raw_ostream &OS) {
  86. OS << Value;
  87. }
  88. StringRef ScalarTraits<Architecture>::input(StringRef Scalar, void *,
  89. Architecture &Value) {
  90. Value = getArchitectureFromName(Scalar);
  91. return {};
  92. }
  93. QuotingType ScalarTraits<Architecture>::mustQuote(StringRef) {
  94. return QuotingType::None;
  95. }
  96. void ScalarTraits<PackedVersion>::output(const PackedVersion &Value, void *,
  97. raw_ostream &OS) {
  98. OS << Value;
  99. }
  100. StringRef ScalarTraits<PackedVersion>::input(StringRef Scalar, void *,
  101. PackedVersion &Value) {
  102. if (!Value.parse32(Scalar))
  103. return "invalid packed version string.";
  104. return {};
  105. }
  106. QuotingType ScalarTraits<PackedVersion>::mustQuote(StringRef) {
  107. return QuotingType::None;
  108. }
  109. void ScalarTraits<SwiftVersion>::output(const SwiftVersion &Value, void *,
  110. raw_ostream &OS) {
  111. switch (Value) {
  112. case 1:
  113. OS << "1.0";
  114. break;
  115. case 2:
  116. OS << "1.1";
  117. break;
  118. case 3:
  119. OS << "2.0";
  120. break;
  121. case 4:
  122. OS << "3.0";
  123. break;
  124. default:
  125. OS << (unsigned)Value;
  126. break;
  127. }
  128. }
  129. StringRef ScalarTraits<SwiftVersion>::input(StringRef Scalar, void *,
  130. SwiftVersion &Value) {
  131. Value = StringSwitch<SwiftVersion>(Scalar)
  132. .Case("1.0", 1)
  133. .Case("1.1", 2)
  134. .Case("2.0", 3)
  135. .Case("3.0", 4)
  136. .Default(0);
  137. if (Value != SwiftVersion(0))
  138. return {};
  139. if (Scalar.getAsInteger(10, Value))
  140. return "invalid Swift ABI version.";
  141. return StringRef();
  142. }
  143. QuotingType ScalarTraits<SwiftVersion>::mustQuote(StringRef) {
  144. return QuotingType::None;
  145. }
  146. void ScalarTraits<UUID>::output(const UUID &Value, void *, raw_ostream &OS) {
  147. OS << Value.first << ": " << Value.second;
  148. }
  149. StringRef ScalarTraits<UUID>::input(StringRef Scalar, void *, UUID &Value) {
  150. auto Split = Scalar.split(':');
  151. auto Arch = Split.first.trim();
  152. auto UUID = Split.second.trim();
  153. if (UUID.empty())
  154. return "invalid uuid string pair";
  155. Value.first = getArchitectureFromName(Arch);
  156. Value.second = UUID;
  157. return {};
  158. }
  159. QuotingType ScalarTraits<UUID>::mustQuote(StringRef) {
  160. return QuotingType::Single;
  161. }
  162. } // end namespace yaml.
  163. } // end namespace llvm.