예제 #1
0
void MappingTraits<MachOYAML::UniversalBinary>::mapping(
    IO &IO, MachOYAML::UniversalBinary &UniversalBinary) {
  if (!IO.getContext()) {
    IO.setContext(&UniversalBinary);
    IO.mapTag("!fat-mach-o", true);
  }
  IO.mapRequired("FatHeader", UniversalBinary.Header);
  IO.mapRequired("FatArchs", UniversalBinary.FatArchs);
  IO.mapRequired("Slices", UniversalBinary.Slices);

  if (IO.getContext() == &UniversalBinary)
    IO.setContext(nullptr);
}
예제 #2
0
void MappingTraits<MachOYAML::Object>::mapping(IO &IO,
                                               MachOYAML::Object &Object) {
  // If the context isn't already set, tag the document as !mach-o.
  // For Fat files there will be a different tag so they can be differentiated.
  if (!IO.getContext()) {
    IO.setContext(&Object);
  }
  IO.mapTag("!mach-o", true);
  IO.mapRequired("FileHeader", Object.Header);
  IO.mapOptional("LoadCommands", Object.LoadCommands);
  IO.mapOptional("LinkEditData", Object.LinkEdit);

  if (IO.getContext() == &Object)
    IO.setContext(nullptr);
}
예제 #3
0
void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration(
    IO &IO, ELFYAML::ELF_SHT &Value) {
  const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
  assert(Object && "The IO context is not initialized");
#define ECase(X) IO.enumCase(Value, #X, ELF::X)
  ECase(SHT_NULL);
  ECase(SHT_PROGBITS);
  ECase(SHT_SYMTAB);
  // FIXME: Issue a diagnostic with this information.
  ECase(SHT_STRTAB);
  ECase(SHT_RELA);
  ECase(SHT_HASH);
  ECase(SHT_DYNAMIC);
  ECase(SHT_NOTE);
  ECase(SHT_NOBITS);
  ECase(SHT_REL);
  ECase(SHT_SHLIB);
  ECase(SHT_DYNSYM);
  ECase(SHT_INIT_ARRAY);
  ECase(SHT_FINI_ARRAY);
  ECase(SHT_PREINIT_ARRAY);
  ECase(SHT_GROUP);
  ECase(SHT_SYMTAB_SHNDX);
  ECase(SHT_LOOS);
  ECase(SHT_ANDROID_REL);
  ECase(SHT_ANDROID_RELA);
  ECase(SHT_LLVM_ODRTAB);
  ECase(SHT_LLVM_LINKER_OPTIONS);
  ECase(SHT_GNU_ATTRIBUTES);
  ECase(SHT_GNU_HASH);
  ECase(SHT_GNU_verdef);
  ECase(SHT_GNU_verneed);
  ECase(SHT_GNU_versym);
  ECase(SHT_HIOS);
  ECase(SHT_LOPROC);
  switch (Object->Header.Machine) {
  case ELF::EM_ARM:
    ECase(SHT_ARM_EXIDX);
    ECase(SHT_ARM_PREEMPTMAP);
    ECase(SHT_ARM_ATTRIBUTES);
    ECase(SHT_ARM_DEBUGOVERLAY);
    ECase(SHT_ARM_OVERLAYSECTION);
    break;
  case ELF::EM_HEXAGON:
    ECase(SHT_HEX_ORDERED);
    break;
  case ELF::EM_X86_64:
    ECase(SHT_X86_64_UNWIND);
    break;
  case ELF::EM_MIPS:
    ECase(SHT_MIPS_REGINFO);
    ECase(SHT_MIPS_OPTIONS);
    ECase(SHT_MIPS_ABIFLAGS);
    break;
  default:
    // Nothing to do.
    break;
  }
#undef ECase
}
예제 #4
0
파일: DWARFYAML.cpp 프로젝트: kraj/llvm
void MappingTraits<DWARFYAML::PubEntry>::mapping(IO &IO,
                                                 DWARFYAML::PubEntry &Entry) {
  IO.mapRequired("DieOffset", Entry.DieOffset);
  if (reinterpret_cast<DWARFYAML::PubSection *>(IO.getContext())->IsGNUStyle)
    IO.mapRequired("Descriptor", Entry.Descriptor);
  IO.mapRequired("Name", Entry.Name);
}
예제 #5
0
void MappingTraits<ELFYAML::Object>::mapping(IO &IO, ELFYAML::Object &Object) {
  assert(!IO.getContext() && "The IO context is initialized already");
  IO.setContext(&Object);
  IO.mapRequired("FileHeader", Object.Header);
  IO.mapOptional("Sections", Object.Sections);
  IO.mapOptional("Symbols", Object.Symbols);
  IO.setContext(nullptr);
}
예제 #6
0
  static void mapping(IO &io, SourceLoc &Loc) {
    assert(io.outputting() && "input not yet implemented");

    SourceManager *SM = static_cast<SourceManager *>(io.getContext());
    StringRef File = SM->getDisplayNameForLoc(Loc);
    unsigned Line, Col;
    std::tie(Line, Col) = SM->getLineAndColumn(Loc);

    io.mapRequired("File", File);
    io.mapRequired("Line", Line);
    io.mapRequired("Column", Col);
  }
 ArrayRef<uint8_t> denormalize(IO &io) {
   // When reading yaml, allocate byte array owned by NormalizedFile and
   // copy Hex8 vector to byte array.
   YamlContext *info = reinterpret_cast<YamlContext *>(io.getContext());
   assert(info != nullptr);
   NormalizedFile *file = info->_normalizeMachOFile;
   assert(file != nullptr);
   size_t size = _normalizedContent.size();
   uint8_t *bytes = file->ownedAllocations.Allocate<uint8_t>(size);
   std::copy(_normalizedContent.begin(), _normalizedContent.end(), bytes);
   return makeArrayRef(bytes, size);
 }
예제 #8
0
파일: DWARFYAML.cpp 프로젝트: kraj/llvm
void MappingTraits<DWARFYAML::PubSection>::mapping(
    IO &IO, DWARFYAML::PubSection &Section) {
  auto OldContext = IO.getContext();
  IO.setContext(&Section);

  IO.mapRequired("Length", Section.Length);
  IO.mapRequired("Version", Section.Version);
  IO.mapRequired("UnitOffset", Section.UnitOffset);
  IO.mapRequired("UnitSize", Section.UnitSize);
  IO.mapRequired("Entries", Section.Entries);

  IO.setContext(OldContext);
}
예제 #9
0
파일: MachOYAML.cpp 프로젝트: alex-t/llvm
void MappingTraits<MachOYAML::Object>::mapping(IO &IO,
                                               MachOYAML::Object &Object) {
  // If the context isn't already set, tag the document as !mach-o.
  // For Fat files there will be a different tag so they can be differentiated.
  if (!IO.getContext()) {
    IO.setContext(&Object);
  }
  IO.mapTag("!mach-o", true);
  IO.mapOptional("IsLittleEndian", Object.IsLittleEndian,
                 sys::IsLittleEndianHost);
  Object.DWARF.IsLittleEndian = Object.IsLittleEndian;

  IO.mapRequired("FileHeader", Object.Header);
  IO.mapOptional("LoadCommands", Object.LoadCommands);
  if(!Object.LinkEdit.isEmpty() || !IO.outputting())
    IO.mapOptional("LinkEditData", Object.LinkEdit);

  if(!Object.DWARF.isEmpty() || !IO.outputting())
    IO.mapOptional("DWARF", Object.DWARF);

  if (IO.getContext() == &Object)
    IO.setContext(nullptr);
}
예제 #10
0
파일: ELFYAML.cpp 프로젝트: filcab/llvm
void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration(
    IO &IO, ELFYAML::ELF_REL &Value) {
  const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
  assert(Object && "The IO context is not initialized");
#define ELF_RELOC(X, Y) IO.enumCase(Value, #X, ELF::X);
  switch (Object->Header.Machine) {
  case ELF::EM_X86_64:
#include "llvm/BinaryFormat/ELFRelocs/x86_64.def"
    break;
  case ELF::EM_MIPS:
#include "llvm/BinaryFormat/ELFRelocs/Mips.def"
    break;
  case ELF::EM_HEXAGON:
#include "llvm/BinaryFormat/ELFRelocs/Hexagon.def"
    break;
  case ELF::EM_386:
  case ELF::EM_IAMCU:
#include "llvm/BinaryFormat/ELFRelocs/i386.def"
    break;
  case ELF::EM_AARCH64:
#include "llvm/BinaryFormat/ELFRelocs/AArch64.def"
    break;
  case ELF::EM_ARM:
#include "llvm/BinaryFormat/ELFRelocs/ARM.def"
    break;
  case ELF::EM_ARC:
#include "llvm/BinaryFormat/ELFRelocs/ARC.def"
    break;
  case ELF::EM_RISCV:
#include "llvm/BinaryFormat/ELFRelocs/RISCV.def"
    break;
  case ELF::EM_LANAI:
#include "llvm/BinaryFormat/ELFRelocs/Lanai.def"
    break;
  case ELF::EM_AMDGPU:
#include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def"
    break;
  case ELF::EM_BPF:
#include "llvm/BinaryFormat/ELFRelocs/BPF.def"
    break;
  default:
    llvm_unreachable("Unsupported architecture");
  }
#undef ELF_RELOC
  IO.enumFallback<Hex32>(Value);
}
예제 #11
0
파일: ELFYAML.cpp 프로젝트: filcab/llvm
void ScalarBitSetTraits<ELFYAML::ELF_STO>::bitset(IO &IO,
                                                  ELFYAML::ELF_STO &Value) {
  const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
  assert(Object && "The IO context is not initialized");
#define BCase(X) IO.bitSetCase(Value, #X, ELF::X)
  switch (Object->Header.Machine) {
  case ELF::EM_MIPS:
    BCase(STO_MIPS_OPTIONAL);
    BCase(STO_MIPS_PLT);
    BCase(STO_MIPS_PIC);
    BCase(STO_MIPS_MICROMIPS);
    break;
  default:
    break; // Nothing to do
  }
#undef BCase
#undef BCaseMask
}
예제 #12
0
파일: ELFYAML.cpp 프로젝트: filcab/llvm
void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO,
                                                  ELFYAML::ELF_SHF &Value) {
  const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
#define BCase(X) IO.bitSetCase(Value, #X, ELF::X)
  BCase(SHF_WRITE);
  BCase(SHF_ALLOC);
  BCase(SHF_EXCLUDE);
  BCase(SHF_EXECINSTR);
  BCase(SHF_MERGE);
  BCase(SHF_STRINGS);
  BCase(SHF_INFO_LINK);
  BCase(SHF_LINK_ORDER);
  BCase(SHF_OS_NONCONFORMING);
  BCase(SHF_GROUP);
  BCase(SHF_TLS);
  BCase(SHF_COMPRESSED);
  switch (Object->Header.Machine) {
  case ELF::EM_ARM:
    BCase(SHF_ARM_PURECODE);
    break;
  case ELF::EM_HEXAGON:
    BCase(SHF_HEX_GPREL);
    break;
  case ELF::EM_MIPS:
    BCase(SHF_MIPS_NODUPES);
    BCase(SHF_MIPS_NAMES);
    BCase(SHF_MIPS_LOCAL);
    BCase(SHF_MIPS_NOSTRIP);
    BCase(SHF_MIPS_GPREL);
    BCase(SHF_MIPS_MERGE);
    BCase(SHF_MIPS_ADDR);
    BCase(SHF_MIPS_STRING);
    break;
  case ELF::EM_X86_64:
    BCase(SHF_X86_64_LARGE);
    break;
  default:
    // Nothing to do.
    break;
  }
#undef BCase
}
예제 #13
0
파일: ELFYAML.cpp 프로젝트: filcab/llvm
void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO,
                                                 ELFYAML::ELF_EF &Value) {
  const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
  assert(Object && "The IO context is not initialized");
#define BCase(X) IO.bitSetCase(Value, #X, ELF::X)
#define BCaseMask(X, M) IO.maskedBitSetCase(Value, #X, ELF::X, ELF::M)
  switch (Object->Header.Machine) {
  case ELF::EM_ARM:
    BCase(EF_ARM_SOFT_FLOAT);
    BCase(EF_ARM_VFP_FLOAT);
    BCaseMask(EF_ARM_EABI_UNKNOWN, EF_ARM_EABIMASK);
    BCaseMask(EF_ARM_EABI_VER1, EF_ARM_EABIMASK);
    BCaseMask(EF_ARM_EABI_VER2, EF_ARM_EABIMASK);
    BCaseMask(EF_ARM_EABI_VER3, EF_ARM_EABIMASK);
    BCaseMask(EF_ARM_EABI_VER4, EF_ARM_EABIMASK);
    BCaseMask(EF_ARM_EABI_VER5, EF_ARM_EABIMASK);
    break;
  case ELF::EM_MIPS:
    BCase(EF_MIPS_NOREORDER);
    BCase(EF_MIPS_PIC);
    BCase(EF_MIPS_CPIC);
    BCase(EF_MIPS_ABI2);
    BCase(EF_MIPS_32BITMODE);
    BCase(EF_MIPS_FP64);
    BCase(EF_MIPS_NAN2008);
    BCase(EF_MIPS_MICROMIPS);
    BCase(EF_MIPS_ARCH_ASE_M16);
    BCase(EF_MIPS_ARCH_ASE_MDMX);
    BCaseMask(EF_MIPS_ABI_O32, EF_MIPS_ABI);
    BCaseMask(EF_MIPS_ABI_O64, EF_MIPS_ABI);
    BCaseMask(EF_MIPS_ABI_EABI32, EF_MIPS_ABI);
    BCaseMask(EF_MIPS_ABI_EABI64, EF_MIPS_ABI);
    BCaseMask(EF_MIPS_MACH_3900, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_4010, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_4100, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_4650, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_4120, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_4111, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_SB1, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_OCTEON, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_XLR, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_OCTEON2, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_OCTEON3, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_5400, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_5900, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_5500, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_9000, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_LS2E, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_LS2F, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_MACH_LS3A, EF_MIPS_MACH);
    BCaseMask(EF_MIPS_ARCH_1, EF_MIPS_ARCH);
    BCaseMask(EF_MIPS_ARCH_2, EF_MIPS_ARCH);
    BCaseMask(EF_MIPS_ARCH_3, EF_MIPS_ARCH);
    BCaseMask(EF_MIPS_ARCH_4, EF_MIPS_ARCH);
    BCaseMask(EF_MIPS_ARCH_5, EF_MIPS_ARCH);
    BCaseMask(EF_MIPS_ARCH_32, EF_MIPS_ARCH);
    BCaseMask(EF_MIPS_ARCH_64, EF_MIPS_ARCH);
    BCaseMask(EF_MIPS_ARCH_32R2, EF_MIPS_ARCH);
    BCaseMask(EF_MIPS_ARCH_64R2, EF_MIPS_ARCH);
    BCaseMask(EF_MIPS_ARCH_32R6, EF_MIPS_ARCH);
    BCaseMask(EF_MIPS_ARCH_64R6, EF_MIPS_ARCH);
    break;
  case ELF::EM_HEXAGON:
    BCase(EF_HEXAGON_MACH_V2);
    BCase(EF_HEXAGON_MACH_V3);
    BCase(EF_HEXAGON_MACH_V4);
    BCase(EF_HEXAGON_MACH_V5);
    BCase(EF_HEXAGON_ISA_V2);
    BCase(EF_HEXAGON_ISA_V3);
    BCase(EF_HEXAGON_ISA_V4);
    BCase(EF_HEXAGON_ISA_V5);
    break;
  case ELF::EM_AVR:
    BCase(EF_AVR_ARCH_AVR1);
    BCase(EF_AVR_ARCH_AVR2);
    BCase(EF_AVR_ARCH_AVR25);
    BCase(EF_AVR_ARCH_AVR3);
    BCase(EF_AVR_ARCH_AVR31);
    BCase(EF_AVR_ARCH_AVR35);
    BCase(EF_AVR_ARCH_AVR4);
    BCase(EF_AVR_ARCH_AVR51);
    BCase(EF_AVR_ARCH_AVR6);
    BCase(EF_AVR_ARCH_AVRTINY);
    BCase(EF_AVR_ARCH_XMEGA1);
    BCase(EF_AVR_ARCH_XMEGA2);
    BCase(EF_AVR_ARCH_XMEGA3);
    BCase(EF_AVR_ARCH_XMEGA4);
    BCase(EF_AVR_ARCH_XMEGA5);
    BCase(EF_AVR_ARCH_XMEGA6);
    BCase(EF_AVR_ARCH_XMEGA7);
    break;
  case ELF::EM_RISCV:
    BCase(EF_RISCV_RVC);
    BCaseMask(EF_RISCV_FLOAT_ABI_SOFT, EF_RISCV_FLOAT_ABI);
    BCaseMask(EF_RISCV_FLOAT_ABI_SINGLE, EF_RISCV_FLOAT_ABI);
    BCaseMask(EF_RISCV_FLOAT_ABI_DOUBLE, EF_RISCV_FLOAT_ABI);
    BCaseMask(EF_RISCV_FLOAT_ABI_QUAD, EF_RISCV_FLOAT_ABI);
    BCase(EF_RISCV_RVE);
    break;
  case ELF::EM_AMDGPU:
    BCaseMask(EF_AMDGPU_ARCH_R600, EF_AMDGPU_ARCH);
    BCaseMask(EF_AMDGPU_ARCH_GCN, EF_AMDGPU_ARCH);
    break;
  case ELF::EM_X86_64:
    break;
  default:
    llvm_unreachable("Unsupported architecture");
  }
#undef BCase
#undef BCaseMask
}
예제 #14
0
  static void enumeration(IO &io, RelocationInfoType &value) {
    YamlContext *info = reinterpret_cast<YamlContext *>(io.getContext());
    assert(info != nullptr);
    NormalizedFile *file = info->_normalizeMachOFile;
    assert(file != nullptr);
    switch (file->arch) {
    case lld::MachOLinkingContext::arch_x86_64:
      io.enumCase(value, "X86_64_RELOC_UNSIGNED",
                                  llvm::MachO::X86_64_RELOC_UNSIGNED);
      io.enumCase(value, "X86_64_RELOC_SIGNED",
                                  llvm::MachO::X86_64_RELOC_SIGNED);
      io.enumCase(value, "X86_64_RELOC_BRANCH",
                                  llvm::MachO::X86_64_RELOC_BRANCH);
      io.enumCase(value, "X86_64_RELOC_GOT_LOAD",
                                  llvm::MachO::X86_64_RELOC_GOT_LOAD);
      io.enumCase(value, "X86_64_RELOC_GOT",
                                  llvm::MachO::X86_64_RELOC_GOT);
      io.enumCase(value, "X86_64_RELOC_SUBTRACTOR",
                                  llvm::MachO::X86_64_RELOC_SUBTRACTOR);
      io.enumCase(value, "X86_64_RELOC_SIGNED_1",
                                  llvm::MachO::X86_64_RELOC_SIGNED_1);
      io.enumCase(value, "X86_64_RELOC_SIGNED_2",
                                  llvm::MachO::X86_64_RELOC_SIGNED_2);
      io.enumCase(value, "X86_64_RELOC_SIGNED_4",
                                  llvm::MachO::X86_64_RELOC_SIGNED_4);
      io.enumCase(value, "X86_64_RELOC_TLV",
                                  llvm::MachO::X86_64_RELOC_TLV);
      break;
    case lld::MachOLinkingContext::arch_x86:
      io.enumCase(value, "GENERIC_RELOC_VANILLA",
                                  llvm::MachO::GENERIC_RELOC_VANILLA);
      io.enumCase(value, "GENERIC_RELOC_PAIR",
                                  llvm::MachO::GENERIC_RELOC_PAIR);
      io.enumCase(value, "GENERIC_RELOC_SECTDIFF",
                                  llvm::MachO::GENERIC_RELOC_SECTDIFF);
      io.enumCase(value, "GENERIC_RELOC_LOCAL_SECTDIFF",
                                  llvm::MachO::GENERIC_RELOC_LOCAL_SECTDIFF);
      io.enumCase(value, "GENERIC_RELOC_TLV",
                                  llvm::MachO::GENERIC_RELOC_TLV);
      break;
    case lld::MachOLinkingContext::arch_armv6:
    case lld::MachOLinkingContext::arch_armv7:
    case lld::MachOLinkingContext::arch_armv7s:
       io.enumCase(value, "ARM_RELOC_VANILLA",
                                  llvm::MachO::ARM_RELOC_VANILLA);
      io.enumCase(value, "ARM_RELOC_PAIR",
                                  llvm::MachO::ARM_RELOC_PAIR);
      io.enumCase(value, "ARM_RELOC_SECTDIFF",
                                  llvm::MachO::ARM_RELOC_SECTDIFF);
      io.enumCase(value, "ARM_RELOC_LOCAL_SECTDIFF",
                                  llvm::MachO::ARM_RELOC_LOCAL_SECTDIFF);
      io.enumCase(value, "ARM_RELOC_BR24",
                                  llvm::MachO::ARM_RELOC_BR24);
      io.enumCase(value, "ARM_THUMB_RELOC_BR22",
                                  llvm::MachO::ARM_THUMB_RELOC_BR22);
      io.enumCase(value, "ARM_RELOC_HALF",
                                  llvm::MachO::ARM_RELOC_HALF);
      io.enumCase(value, "ARM_RELOC_HALF_SECTDIFF",
                                  llvm::MachO::ARM_RELOC_HALF_SECTDIFF);
      break;
    case lld::MachOLinkingContext::arch_arm64:
      io.enumCase(value, "ARM64_RELOC_UNSIGNED",
                                  llvm::MachO::ARM64_RELOC_UNSIGNED);
      io.enumCase(value, "ARM64_RELOC_SUBTRACTOR",
                                  llvm::MachO::ARM64_RELOC_SUBTRACTOR);
      io.enumCase(value, "ARM64_RELOC_BRANCH26",
                                  llvm::MachO::ARM64_RELOC_BRANCH26);
      io.enumCase(value, "ARM64_RELOC_PAGE21",
                                  llvm::MachO::ARM64_RELOC_PAGE21);
      io.enumCase(value, "ARM64_RELOC_PAGEOFF12",
                                  llvm::MachO::ARM64_RELOC_PAGEOFF12);
      io.enumCase(value, "ARM64_RELOC_GOT_LOAD_PAGE21",
                                  llvm::MachO::ARM64_RELOC_GOT_LOAD_PAGE21);
      io.enumCase(value, "ARM64_RELOC_GOT_LOAD_PAGEOFF12",
                                  llvm::MachO::ARM64_RELOC_GOT_LOAD_PAGEOFF12);
      io.enumCase(value, "ARM64_RELOC_POINTER_TO_GOT",
                                  llvm::MachO::ARM64_RELOC_POINTER_TO_GOT);
      io.enumCase(value, "ARM64_RELOC_TLVP_LOAD_PAGE21",
                                  llvm::MachO::ARM64_RELOC_TLVP_LOAD_PAGE21);
      io.enumCase(value, "ARM64_RELOC_TLVP_LOAD_PAGEOFF12",
                                  llvm::MachO::ARM64_RELOC_TLVP_LOAD_PAGEOFF12);
      io.enumCase(value, "ARM64_RELOC_ADDEND",
                                  llvm::MachO::ARM64_RELOC_ADDEND);
      break;
    default:
      llvm_unreachable("unknown architecture");
    }
 }