//===- EnumTables.cpp - Enum to string conversion tables ------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "llvm/DebugInfo/CodeView/EnumTables.h"
#include "llvm/ADT/Enum.h"
#include <type_traits>

using namespace llvm;
using namespace codeview;

#define CV_ENUM_CLASS_ENT(enum_class, enum)                                    \
  {{#enum}, std::underlying_type_t<enum_class>(enum_class::enum)}

#define CV_ENUM_ENT(ns, enum) {{#enum}, ns::enum}

namespace llvm {
namespace codeview {

EnumStrings<SymbolKind> getSymbolTypeNames() {
  constexpr EnumStringDef<SymbolKind> SymbolTypeNameDefs[] = {
#define CV_SYMBOL(enum, val) {{#enum}, enum},
#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
#undef CV_SYMBOL
  };
  static constexpr auto SymbolTypeNames =
      BUILD_ENUM_STRINGS(SymbolTypeNameDefs);
  return SymbolTypeNames;
}

EnumStrings<TypeLeafKind> getTypeLeafNames() {
  constexpr EnumStringDef<TypeLeafKind> TypeLeafNameDefs[] = {
#define CV_TYPE(name, val) {{#name}, name},
#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
#undef CV_TYPE
  };
  static constexpr auto TypeLeafNames = BUILD_ENUM_STRINGS(TypeLeafNameDefs);
  return TypeLeafNames;
}

EnumStrings<uint16_t> getRegisterNames(CPUType Cpu) {
  constexpr EnumStringDef<uint16_t> RegisterNameDefs_X86[] = {
#define CV_REGISTERS_X86
#define CV_REGISTER(name, val) CV_ENUM_CLASS_ENT(RegisterId, name),
#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def"
#undef CV_REGISTER
#undef CV_REGISTERS_X86
  };
  static constexpr auto RegisterNames_X86 =
      BUILD_ENUM_STRINGS(RegisterNameDefs_X86);

  constexpr EnumStringDef<uint16_t> RegisterNameDefs_ARM[] = {
#define CV_REGISTERS_ARM
#define CV_REGISTER(name, val) CV_ENUM_CLASS_ENT(RegisterId, name),
#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def"
#undef CV_REGISTER
#undef CV_REGISTERS_ARM
  };
  static constexpr auto RegisterNames_ARM =
      BUILD_ENUM_STRINGS(RegisterNameDefs_ARM);

  constexpr EnumStringDef<uint16_t> RegisterNameDefs_ARM64[] = {
#define CV_REGISTERS_ARM64
#define CV_REGISTER(name, val) CV_ENUM_CLASS_ENT(RegisterId, name),
#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def"
#undef CV_REGISTER
#undef CV_REGISTERS_ARM64
  };
  static constexpr auto RegisterNames_ARM64 =
      BUILD_ENUM_STRINGS(RegisterNameDefs_ARM64);

  if (Cpu == CPUType::ARMNT) {
    return RegisterNames_ARM;
  } else if (Cpu == CPUType::ARM64) {
    return RegisterNames_ARM64;
  }
  return RegisterNames_X86;
}

EnumStrings<uint32_t> getPublicSymFlagNames() {
  constexpr EnumStringDef<uint32_t> PublicSymFlagNameDefs[] = {
      CV_ENUM_CLASS_ENT(PublicSymFlags, Code),
      CV_ENUM_CLASS_ENT(PublicSymFlags, Function),
      CV_ENUM_CLASS_ENT(PublicSymFlags, Managed),
      CV_ENUM_CLASS_ENT(PublicSymFlags, MSIL),
  };
  static constexpr auto PublicSymFlagNames =
      BUILD_ENUM_STRINGS(PublicSymFlagNameDefs);
  return PublicSymFlagNames;
}

EnumStrings<uint8_t> getProcSymFlagNames() {
  constexpr EnumStringDef<uint8_t> ProcSymFlagNameDefs[] = {
      CV_ENUM_CLASS_ENT(ProcSymFlags, HasFP),
      CV_ENUM_CLASS_ENT(ProcSymFlags, HasIRET),
      CV_ENUM_CLASS_ENT(ProcSymFlags, HasFRET),
      CV_ENUM_CLASS_ENT(ProcSymFlags, IsNoReturn),
      CV_ENUM_CLASS_ENT(ProcSymFlags, IsUnreachable),
      CV_ENUM_CLASS_ENT(ProcSymFlags, HasCustomCallingConv),
      CV_ENUM_CLASS_ENT(ProcSymFlags, IsNoInline),
      CV_ENUM_CLASS_ENT(ProcSymFlags, HasOptimizedDebugInfo),
  };
  static constexpr auto ProcSymFlagNames =
      BUILD_ENUM_STRINGS(ProcSymFlagNameDefs);
  return ProcSymFlagNames;
}

EnumStrings<uint16_t> getLocalFlagNames() {
  constexpr EnumStringDef<uint16_t> LocalFlagDefs[] = {
      CV_ENUM_CLASS_ENT(LocalSymFlags, IsParameter),
      CV_ENUM_CLASS_ENT(LocalSymFlags, IsAddressTaken),
      CV_ENUM_CLASS_ENT(LocalSymFlags, IsCompilerGenerated),
      CV_ENUM_CLASS_ENT(LocalSymFlags, IsAggregate),
      CV_ENUM_CLASS_ENT(LocalSymFlags, IsAggregated),
      CV_ENUM_CLASS_ENT(LocalSymFlags, IsAliased),
      CV_ENUM_CLASS_ENT(LocalSymFlags, IsAlias),
      CV_ENUM_CLASS_ENT(LocalSymFlags, IsReturnValue),
      CV_ENUM_CLASS_ENT(LocalSymFlags, IsOptimizedOut),
      CV_ENUM_CLASS_ENT(LocalSymFlags, IsEnregisteredGlobal),
      CV_ENUM_CLASS_ENT(LocalSymFlags, IsEnregisteredStatic),
  };
  static constexpr auto LocalFlags = BUILD_ENUM_STRINGS(LocalFlagDefs);
  return LocalFlags;
}

EnumStrings<uint8_t> getFrameCookieKindNames() {
  constexpr EnumStringDef<uint8_t> FrameCookieKindDefs[] = {
      CV_ENUM_CLASS_ENT(FrameCookieKind, Copy),
      CV_ENUM_CLASS_ENT(FrameCookieKind, XorStackPointer),
      CV_ENUM_CLASS_ENT(FrameCookieKind, XorFramePointer),
      CV_ENUM_CLASS_ENT(FrameCookieKind, XorR13),
  };
  static constexpr auto FrameCookieKinds =
      BUILD_ENUM_STRINGS(FrameCookieKindDefs);
  return FrameCookieKinds;
}

EnumStrings<SourceLanguage> getSourceLanguageNames() {
  constexpr EnumStringDef<codeview::SourceLanguage> SourceLanguageDefs[] = {
      CV_ENUM_ENT(SourceLanguage, C),
      CV_ENUM_ENT(SourceLanguage, Cpp),
      CV_ENUM_ENT(SourceLanguage, Fortran),
      CV_ENUM_ENT(SourceLanguage, Masm),
      CV_ENUM_ENT(SourceLanguage, Pascal),
      CV_ENUM_ENT(SourceLanguage, Basic),
      CV_ENUM_ENT(SourceLanguage, Cobol),
      CV_ENUM_ENT(SourceLanguage, Link),
      CV_ENUM_ENT(SourceLanguage, Cvtres),
      CV_ENUM_ENT(SourceLanguage, Cvtpgd),
      CV_ENUM_ENT(SourceLanguage, CSharp),
      CV_ENUM_ENT(SourceLanguage, VB),
      CV_ENUM_ENT(SourceLanguage, ILAsm),
      CV_ENUM_ENT(SourceLanguage, Java),
      CV_ENUM_ENT(SourceLanguage, JScript),
      CV_ENUM_ENT(SourceLanguage, MSIL),
      CV_ENUM_ENT(SourceLanguage, HLSL),
      CV_ENUM_ENT(SourceLanguage, D),
      CV_ENUM_ENT(SourceLanguage, Swift),
      CV_ENUM_ENT(SourceLanguage, Rust),
      CV_ENUM_ENT(SourceLanguage, ObjC),
      CV_ENUM_ENT(SourceLanguage, ObjCpp),
      CV_ENUM_ENT(SourceLanguage, AliasObj),
      CV_ENUM_ENT(SourceLanguage, Go),
      {{"Swift"}, SourceLanguage::OldSwift},
  };
  static constexpr auto SourceLanguages =
      BUILD_ENUM_STRINGS(SourceLanguageDefs);
  return SourceLanguages;
}

EnumStrings<uint32_t> getCompileSym2FlagNames() {
  constexpr EnumStringDef<uint32_t> CompileSym2FlagNameDefs[] = {
      CV_ENUM_CLASS_ENT(CompileSym2Flags, EC),
      CV_ENUM_CLASS_ENT(CompileSym2Flags, NoDbgInfo),
      CV_ENUM_CLASS_ENT(CompileSym2Flags, LTCG),
      CV_ENUM_CLASS_ENT(CompileSym2Flags, NoDataAlign),
      CV_ENUM_CLASS_ENT(CompileSym2Flags, ManagedPresent),
      CV_ENUM_CLASS_ENT(CompileSym2Flags, SecurityChecks),
      CV_ENUM_CLASS_ENT(CompileSym2Flags, HotPatch),
      CV_ENUM_CLASS_ENT(CompileSym2Flags, CVTCIL),
      CV_ENUM_CLASS_ENT(CompileSym2Flags, MSILModule),
  };
  static constexpr auto CompileSym2FlagNames =
      BUILD_ENUM_STRINGS(CompileSym2FlagNameDefs);
  return CompileSym2FlagNames;
}

EnumStrings<uint32_t> getCompileSym3FlagNames() {
  constexpr EnumStringDef<uint32_t> CompileSym3FlagNameDefs[] = {
      CV_ENUM_CLASS_ENT(CompileSym3Flags, EC),
      CV_ENUM_CLASS_ENT(CompileSym3Flags, NoDbgInfo),
      CV_ENUM_CLASS_ENT(CompileSym3Flags, LTCG),
      CV_ENUM_CLASS_ENT(CompileSym3Flags, NoDataAlign),
      CV_ENUM_CLASS_ENT(CompileSym3Flags, ManagedPresent),
      CV_ENUM_CLASS_ENT(CompileSym3Flags, SecurityChecks),
      CV_ENUM_CLASS_ENT(CompileSym3Flags, HotPatch),
      CV_ENUM_CLASS_ENT(CompileSym3Flags, CVTCIL),
      CV_ENUM_CLASS_ENT(CompileSym3Flags, MSILModule),
      CV_ENUM_CLASS_ENT(CompileSym3Flags, Sdl),
      CV_ENUM_CLASS_ENT(CompileSym3Flags, PGO),
      CV_ENUM_CLASS_ENT(CompileSym3Flags, Exp),
  };
  static constexpr auto CompileSym3FlagNames =
      BUILD_ENUM_STRINGS(CompileSym3FlagNameDefs);
  return CompileSym3FlagNames;
}

EnumStrings<uint32_t> getFileChecksumNames() {
  constexpr EnumStringDef<uint32_t> FileChecksumNameDefs[] = {
      CV_ENUM_CLASS_ENT(FileChecksumKind, None),
      CV_ENUM_CLASS_ENT(FileChecksumKind, MD5),
      CV_ENUM_CLASS_ENT(FileChecksumKind, SHA1),
      CV_ENUM_CLASS_ENT(FileChecksumKind, SHA256),
  };
  static constexpr auto FileChecksumNames =
      BUILD_ENUM_STRINGS(FileChecksumNameDefs);
  return FileChecksumNames;
}

EnumStrings<unsigned> getCPUTypeNames() {
  constexpr EnumStringDef<unsigned> CPUTypeNameDefs[] = {
      CV_ENUM_CLASS_ENT(CPUType, Intel8080),
      CV_ENUM_CLASS_ENT(CPUType, Intel8086),
      CV_ENUM_CLASS_ENT(CPUType, Intel80286),
      CV_ENUM_CLASS_ENT(CPUType, Intel80386),
      CV_ENUM_CLASS_ENT(CPUType, Intel80486),
      CV_ENUM_CLASS_ENT(CPUType, Pentium),
      CV_ENUM_CLASS_ENT(CPUType, PentiumPro),
      CV_ENUM_CLASS_ENT(CPUType, Pentium3),
      CV_ENUM_CLASS_ENT(CPUType, MIPS),
      CV_ENUM_CLASS_ENT(CPUType, MIPS16),
      CV_ENUM_CLASS_ENT(CPUType, MIPS32),
      CV_ENUM_CLASS_ENT(CPUType, MIPS64),
      CV_ENUM_CLASS_ENT(CPUType, MIPSI),
      CV_ENUM_CLASS_ENT(CPUType, MIPSII),
      CV_ENUM_CLASS_ENT(CPUType, MIPSIII),
      CV_ENUM_CLASS_ENT(CPUType, MIPSIV),
      CV_ENUM_CLASS_ENT(CPUType, MIPSV),
      CV_ENUM_CLASS_ENT(CPUType, M68000),
      CV_ENUM_CLASS_ENT(CPUType, M68010),
      CV_ENUM_CLASS_ENT(CPUType, M68020),
      CV_ENUM_CLASS_ENT(CPUType, M68030),
      CV_ENUM_CLASS_ENT(CPUType, M68040),
      CV_ENUM_CLASS_ENT(CPUType, Alpha),
      CV_ENUM_CLASS_ENT(CPUType, Alpha21164),
      CV_ENUM_CLASS_ENT(CPUType, Alpha21164A),
      CV_ENUM_CLASS_ENT(CPUType, Alpha21264),
      CV_ENUM_CLASS_ENT(CPUType, Alpha21364),
      CV_ENUM_CLASS_ENT(CPUType, PPC601),
      CV_ENUM_CLASS_ENT(CPUType, PPC603),
      CV_ENUM_CLASS_ENT(CPUType, PPC604),
      CV_ENUM_CLASS_ENT(CPUType, PPC620),
      CV_ENUM_CLASS_ENT(CPUType, PPCFP),
      CV_ENUM_CLASS_ENT(CPUType, PPCBE),
      CV_ENUM_CLASS_ENT(CPUType, SH3),
      CV_ENUM_CLASS_ENT(CPUType, SH3E),
      CV_ENUM_CLASS_ENT(CPUType, SH3DSP),
      CV_ENUM_CLASS_ENT(CPUType, SH4),
      CV_ENUM_CLASS_ENT(CPUType, SHMedia),
      CV_ENUM_CLASS_ENT(CPUType, ARM3),
      CV_ENUM_CLASS_ENT(CPUType, ARM4),
      CV_ENUM_CLASS_ENT(CPUType, ARM4T),
      CV_ENUM_CLASS_ENT(CPUType, ARM5),
      CV_ENUM_CLASS_ENT(CPUType, ARM5T),
      CV_ENUM_CLASS_ENT(CPUType, ARM6),
      CV_ENUM_CLASS_ENT(CPUType, ARM_XMAC),
      CV_ENUM_CLASS_ENT(CPUType, ARM_WMMX),
      CV_ENUM_CLASS_ENT(CPUType, ARM7),
      CV_ENUM_CLASS_ENT(CPUType, Omni),
      CV_ENUM_CLASS_ENT(CPUType, Ia64),
      CV_ENUM_CLASS_ENT(CPUType, Ia64_2),
      CV_ENUM_CLASS_ENT(CPUType, CEE),
      CV_ENUM_CLASS_ENT(CPUType, AM33),
      CV_ENUM_CLASS_ENT(CPUType, M32R),
      CV_ENUM_CLASS_ENT(CPUType, TriCore),
      CV_ENUM_CLASS_ENT(CPUType, X64),
      CV_ENUM_CLASS_ENT(CPUType, EBC),
      CV_ENUM_CLASS_ENT(CPUType, Thumb),
      CV_ENUM_CLASS_ENT(CPUType, ARMNT),
      CV_ENUM_CLASS_ENT(CPUType, ARM64),
      CV_ENUM_CLASS_ENT(CPUType, HybridX86ARM64),
      CV_ENUM_CLASS_ENT(CPUType, ARM64EC),
      CV_ENUM_CLASS_ENT(CPUType, ARM64X),
      CV_ENUM_CLASS_ENT(CPUType, Unknown),
      CV_ENUM_CLASS_ENT(CPUType, D3D11_Shader),
  };
  static constexpr auto CPUTypeNames = BUILD_ENUM_STRINGS(CPUTypeNameDefs);
  return CPUTypeNames;
}

EnumStrings<uint32_t> getFrameProcSymFlagNames() {
  constexpr EnumStringDef<uint32_t> FrameProcSymFlagNameDefs[] = {
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasAlloca),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasSetJmp),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasLongJmp),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasInlineAssembly),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasExceptionHandling),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, MarkedInline),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasStructuredExceptionHandling),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, Naked),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, SecurityChecks),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, AsynchronousExceptionHandling),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions,
                        NoStackOrderingForSecurityChecks),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, Inlined),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, StrictSecurityChecks),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, SafeBuffers),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, EncodedLocalBasePointerMask),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, EncodedParamBasePointerMask),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, ProfileGuidedOptimization),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, ValidProfileCounts),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, OptimizedForSpeed),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, GuardCfg),
      CV_ENUM_CLASS_ENT(FrameProcedureOptions, GuardCfw),
  };
  static constexpr auto FrameProcSymFlagNames =
      BUILD_ENUM_STRINGS(FrameProcSymFlagNameDefs);
  return FrameProcSymFlagNames;
}

EnumStrings<uint16_t> getExportSymFlagNames() {
  constexpr EnumStringDef<uint16_t> ExportSymFlagNameDefs[] = {
      CV_ENUM_CLASS_ENT(ExportFlags, IsConstant),
      CV_ENUM_CLASS_ENT(ExportFlags, IsData),
      CV_ENUM_CLASS_ENT(ExportFlags, IsPrivate),
      CV_ENUM_CLASS_ENT(ExportFlags, HasNoName),
      CV_ENUM_CLASS_ENT(ExportFlags, HasExplicitOrdinal),
      CV_ENUM_CLASS_ENT(ExportFlags, IsForwarder),
  };
  static constexpr auto ExportSymFlagNames =
      BUILD_ENUM_STRINGS(ExportSymFlagNameDefs);
  return ExportSymFlagNames;
}

EnumStrings<uint32_t> getModuleSubstreamKindNames() {
  constexpr EnumStringDef<uint32_t> ModuleSubstreamKindNameDefs[] = {
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, None),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, Symbols),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, Lines),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, StringTable),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, FileChecksums),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, FrameData),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, InlineeLines),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, CrossScopeImports),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, CrossScopeExports),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, ILLines),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, FuncMDTokenMap),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, TypeMDTokenMap),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, MergedAssemblyInput),
      CV_ENUM_CLASS_ENT(DebugSubsectionKind, CoffSymbolRVA),
  };
  static constexpr auto ModuleSubstreamKindNames =
      BUILD_ENUM_STRINGS(ModuleSubstreamKindNameDefs);
  return ModuleSubstreamKindNames;
}

EnumStrings<uint8_t> getThunkOrdinalNames() {
  constexpr EnumStringDef<uint8_t> ThunkOrdinalNameDefs[] = {
      CV_ENUM_CLASS_ENT(ThunkOrdinal, Standard),
      CV_ENUM_CLASS_ENT(ThunkOrdinal, ThisAdjustor),
      CV_ENUM_CLASS_ENT(ThunkOrdinal, Vcall),
      CV_ENUM_CLASS_ENT(ThunkOrdinal, Pcode),
      CV_ENUM_CLASS_ENT(ThunkOrdinal, UnknownLoad),
      CV_ENUM_CLASS_ENT(ThunkOrdinal, TrampIncremental),
      CV_ENUM_CLASS_ENT(ThunkOrdinal, BranchIsland),
  };
  static constexpr auto ThunkOrdinalNames =
      BUILD_ENUM_STRINGS(ThunkOrdinalNameDefs);
  return ThunkOrdinalNames;
}

EnumStrings<uint8_t> getEncodedFramePtrRegNames() {
  constexpr EnumStringDef<uint8_t> EncodedFramePtrRegNameDefs[] = {
      CV_ENUM_CLASS_ENT(EncodedFramePtrReg, None),
      CV_ENUM_CLASS_ENT(EncodedFramePtrReg, StackPtr),
      CV_ENUM_CLASS_ENT(EncodedFramePtrReg, FramePtr),
      CV_ENUM_CLASS_ENT(EncodedFramePtrReg, BasePtr),
  };
  static constexpr auto EncodedFramePtrRegNames =
      BUILD_ENUM_STRINGS(EncodedFramePtrRegNameDefs);
  return EncodedFramePtrRegNames;
}

EnumStrings<uint16_t> getTrampolineNames() {
  constexpr EnumStringDef<uint16_t> TrampolineNameDefs[] = {
      CV_ENUM_CLASS_ENT(TrampolineType, TrampIncremental),
      CV_ENUM_CLASS_ENT(TrampolineType, BranchIsland),
  };
  static constexpr auto TrampolineNames =
      BUILD_ENUM_STRINGS(TrampolineNameDefs);
  return TrampolineNames;
}

EnumStrings<COFF::SectionCharacteristics> getImageSectionCharacteristicNames() {
  constexpr EnumStringDef<COFF::SectionCharacteristics>
      ImageSectionCharacteristicNameDefs[] = {
          CV_ENUM_ENT(COFF, IMAGE_SCN_TYPE_NOLOAD),
          CV_ENUM_ENT(COFF, IMAGE_SCN_TYPE_NO_PAD),
          CV_ENUM_ENT(COFF, IMAGE_SCN_CNT_CODE),
          CV_ENUM_ENT(COFF, IMAGE_SCN_CNT_INITIALIZED_DATA),
          CV_ENUM_ENT(COFF, IMAGE_SCN_CNT_UNINITIALIZED_DATA),
          CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_OTHER),
          CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_INFO),
          CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_REMOVE),
          CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_COMDAT),
          CV_ENUM_ENT(COFF, IMAGE_SCN_GPREL),
          CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_PURGEABLE),
          CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_16BIT),
          CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_LOCKED),
          CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_PRELOAD),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_1BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_2BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_4BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_8BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_16BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_32BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_64BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_128BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_256BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_512BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_1024BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_2048BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_4096BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_8192BYTES),
          CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_NRELOC_OVFL),
          CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_DISCARDABLE),
          CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_NOT_CACHED),
          CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_NOT_PAGED),
          CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_SHARED),
          CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_EXECUTE),
          CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_READ),
          CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_WRITE)};
  static constexpr auto ImageSectionCharacteristicNames =
      BUILD_ENUM_STRINGS(ImageSectionCharacteristicNameDefs);
  return ImageSectionCharacteristicNames;
}

EnumStrings<uint16_t> getClassOptionNames() {
  constexpr EnumStringDef<uint16_t> ClassOptionNameDefs[] = {
      CV_ENUM_CLASS_ENT(ClassOptions, Packed),
      CV_ENUM_CLASS_ENT(ClassOptions, HasConstructorOrDestructor),
      CV_ENUM_CLASS_ENT(ClassOptions, HasOverloadedOperator),
      CV_ENUM_CLASS_ENT(ClassOptions, Nested),
      CV_ENUM_CLASS_ENT(ClassOptions, ContainsNestedClass),
      CV_ENUM_CLASS_ENT(ClassOptions, HasOverloadedAssignmentOperator),
      CV_ENUM_CLASS_ENT(ClassOptions, HasConversionOperator),
      CV_ENUM_CLASS_ENT(ClassOptions, ForwardReference),
      CV_ENUM_CLASS_ENT(ClassOptions, Scoped),
      CV_ENUM_CLASS_ENT(ClassOptions, HasUniqueName),
      CV_ENUM_CLASS_ENT(ClassOptions, Sealed),
      CV_ENUM_CLASS_ENT(ClassOptions, Intrinsic),
  };
  static constexpr auto ClassOptionNames =
      BUILD_ENUM_STRINGS(ClassOptionNameDefs);
  return ClassOptionNames;
}

EnumStrings<uint8_t> getMemberAccessNames() {
  constexpr EnumStringDef<uint8_t> MemberAccessNameDefs[] = {
      CV_ENUM_CLASS_ENT(MemberAccess, None),
      CV_ENUM_CLASS_ENT(MemberAccess, Private),
      CV_ENUM_CLASS_ENT(MemberAccess, Protected),
      CV_ENUM_CLASS_ENT(MemberAccess, Public),
  };
  static constexpr auto MemberAccessNames =
      BUILD_ENUM_STRINGS(MemberAccessNameDefs);
  return MemberAccessNames;
}

EnumStrings<uint16_t> getMethodOptionNames() {
  constexpr EnumStringDef<uint16_t> MethodOptionNameDefs[] = {
      CV_ENUM_CLASS_ENT(MethodOptions, Pseudo),
      CV_ENUM_CLASS_ENT(MethodOptions, NoInherit),
      CV_ENUM_CLASS_ENT(MethodOptions, NoConstruct),
      CV_ENUM_CLASS_ENT(MethodOptions, CompilerGenerated),
      CV_ENUM_CLASS_ENT(MethodOptions, Sealed),
  };
  static constexpr auto MethodOptionNames =
      BUILD_ENUM_STRINGS(MethodOptionNameDefs);
  return MethodOptionNames;
}

EnumStrings<uint16_t> getMemberKindNames() {
  constexpr EnumStringDef<uint16_t> MemberKindNameDefs[] = {
      CV_ENUM_CLASS_ENT(MethodKind, Vanilla),
      CV_ENUM_CLASS_ENT(MethodKind, Virtual),
      CV_ENUM_CLASS_ENT(MethodKind, Static),
      CV_ENUM_CLASS_ENT(MethodKind, Friend),
      CV_ENUM_CLASS_ENT(MethodKind, IntroducingVirtual),
      CV_ENUM_CLASS_ENT(MethodKind, PureVirtual),
      CV_ENUM_CLASS_ENT(MethodKind, PureIntroducingVirtual),
  };
  static constexpr auto MemberKindNames =
      BUILD_ENUM_STRINGS(MemberKindNameDefs);
  return MemberKindNames;
}

EnumStrings<uint8_t> getPtrKindNames() {
  constexpr EnumStringDef<uint8_t> PtrKindNameDefs[] = {
      CV_ENUM_CLASS_ENT(PointerKind, Near16),
      CV_ENUM_CLASS_ENT(PointerKind, Far16),
      CV_ENUM_CLASS_ENT(PointerKind, Huge16),
      CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegment),
      CV_ENUM_CLASS_ENT(PointerKind, BasedOnValue),
      CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegmentValue),
      CV_ENUM_CLASS_ENT(PointerKind, BasedOnAddress),
      CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegmentAddress),
      CV_ENUM_CLASS_ENT(PointerKind, BasedOnType),
      CV_ENUM_CLASS_ENT(PointerKind, BasedOnSelf),
      CV_ENUM_CLASS_ENT(PointerKind, Near32),
      CV_ENUM_CLASS_ENT(PointerKind, Far32),
      CV_ENUM_CLASS_ENT(PointerKind, Near64),
  };
  static constexpr auto PtrKindNames = BUILD_ENUM_STRINGS(PtrKindNameDefs);
  return PtrKindNames;
}

EnumStrings<uint8_t> getPtrModeNames() {
  constexpr EnumStringDef<uint8_t> PtrModeNameDefs[] = {
      CV_ENUM_CLASS_ENT(PointerMode, Pointer),
      CV_ENUM_CLASS_ENT(PointerMode, LValueReference),
      CV_ENUM_CLASS_ENT(PointerMode, PointerToDataMember),
      CV_ENUM_CLASS_ENT(PointerMode, PointerToMemberFunction),
      CV_ENUM_CLASS_ENT(PointerMode, RValueReference),
  };
  static constexpr auto PtrModeNames = BUILD_ENUM_STRINGS(PtrModeNameDefs);
  return PtrModeNames;
}

EnumStrings<uint16_t> getPtrMemberRepNames() {
  constexpr EnumStringDef<uint16_t> PtrMemberRepNameDefs[] = {
      CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, Unknown),
      CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, SingleInheritanceData),
      CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, MultipleInheritanceData),
      CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, VirtualInheritanceData),
      CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, GeneralData),
      CV_ENUM_CLASS_ENT(PointerToMemberRepresentation,
                        SingleInheritanceFunction),
      CV_ENUM_CLASS_ENT(PointerToMemberRepresentation,
                        MultipleInheritanceFunction),
      CV_ENUM_CLASS_ENT(PointerToMemberRepresentation,
                        VirtualInheritanceFunction),
      CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, GeneralFunction),
  };
  static constexpr auto PtrMemberRepNames =
      BUILD_ENUM_STRINGS(PtrMemberRepNameDefs);
  return PtrMemberRepNames;
}

EnumStrings<uint16_t> getTypeModifierNames() {
  constexpr EnumStringDef<uint16_t> TypeModifierNameDefs[] = {
      CV_ENUM_CLASS_ENT(ModifierOptions, Const),
      CV_ENUM_CLASS_ENT(ModifierOptions, Volatile),
      CV_ENUM_CLASS_ENT(ModifierOptions, Unaligned),
  };
  static constexpr auto TypeModifierNames =
      BUILD_ENUM_STRINGS(TypeModifierNameDefs);
  return TypeModifierNames;
}

EnumStrings<uint8_t> getCallingConventions() {
  constexpr EnumStringDef<uint8_t> CallingConventionDefs[] = {
      CV_ENUM_CLASS_ENT(CallingConvention, NearC),
      CV_ENUM_CLASS_ENT(CallingConvention, FarC),
      CV_ENUM_CLASS_ENT(CallingConvention, NearPascal),
      CV_ENUM_CLASS_ENT(CallingConvention, FarPascal),
      CV_ENUM_CLASS_ENT(CallingConvention, NearFast),
      CV_ENUM_CLASS_ENT(CallingConvention, FarFast),
      CV_ENUM_CLASS_ENT(CallingConvention, NearStdCall),
      CV_ENUM_CLASS_ENT(CallingConvention, FarStdCall),
      CV_ENUM_CLASS_ENT(CallingConvention, NearSysCall),
      CV_ENUM_CLASS_ENT(CallingConvention, FarSysCall),
      CV_ENUM_CLASS_ENT(CallingConvention, ThisCall),
      CV_ENUM_CLASS_ENT(CallingConvention, MipsCall),
      CV_ENUM_CLASS_ENT(CallingConvention, Generic),
      CV_ENUM_CLASS_ENT(CallingConvention, AlphaCall),
      CV_ENUM_CLASS_ENT(CallingConvention, PpcCall),
      CV_ENUM_CLASS_ENT(CallingConvention, SHCall),
      CV_ENUM_CLASS_ENT(CallingConvention, ArmCall),
      CV_ENUM_CLASS_ENT(CallingConvention, AM33Call),
      CV_ENUM_CLASS_ENT(CallingConvention, TriCall),
      CV_ENUM_CLASS_ENT(CallingConvention, SH5Call),
      CV_ENUM_CLASS_ENT(CallingConvention, M32RCall),
      CV_ENUM_CLASS_ENT(CallingConvention, ClrCall),
      CV_ENUM_CLASS_ENT(CallingConvention, Inline),
      CV_ENUM_CLASS_ENT(CallingConvention, NearVector),
      CV_ENUM_CLASS_ENT(CallingConvention, Swift),
  };
  static constexpr auto CallingConventions =
      BUILD_ENUM_STRINGS(CallingConventionDefs);
  return CallingConventions;
}

EnumStrings<uint8_t> getFunctionOptionEnum() {
  constexpr EnumStringDef<uint8_t> FunctionOptionEnumDefs[] = {
      CV_ENUM_CLASS_ENT(FunctionOptions, CxxReturnUdt),
      CV_ENUM_CLASS_ENT(FunctionOptions, Constructor),
      CV_ENUM_CLASS_ENT(FunctionOptions, ConstructorWithVirtualBases),
  };
  static constexpr auto FunctionOptionEnum =
      BUILD_ENUM_STRINGS(FunctionOptionEnumDefs);
  return FunctionOptionEnum;
}

EnumStrings<uint16_t> getLabelTypeEnum() {
  constexpr EnumStringDef<uint16_t> LabelTypeEnumDefs[] = {
      CV_ENUM_CLASS_ENT(LabelType, Near),
      CV_ENUM_CLASS_ENT(LabelType, Far),
  };
  static constexpr auto LabelTypeEnum = BUILD_ENUM_STRINGS(LabelTypeEnumDefs);
  return LabelTypeEnum;
}

EnumStrings<uint16_t> getJumpTableEntrySizeNames() {
  constexpr EnumStringDef<uint16_t> JumpTableEntrySizeNameDefs[] = {
      CV_ENUM_CLASS_ENT(JumpTableEntrySize, Int8),
      CV_ENUM_CLASS_ENT(JumpTableEntrySize, UInt8),
      CV_ENUM_CLASS_ENT(JumpTableEntrySize, Int16),
      CV_ENUM_CLASS_ENT(JumpTableEntrySize, UInt16),
      CV_ENUM_CLASS_ENT(JumpTableEntrySize, Int32),
      CV_ENUM_CLASS_ENT(JumpTableEntrySize, UInt32),
      CV_ENUM_CLASS_ENT(JumpTableEntrySize, Pointer),
      CV_ENUM_CLASS_ENT(JumpTableEntrySize, UInt8ShiftLeft),
      CV_ENUM_CLASS_ENT(JumpTableEntrySize, UInt16ShiftLeft),
      CV_ENUM_CLASS_ENT(JumpTableEntrySize, Int8ShiftLeft),
      CV_ENUM_CLASS_ENT(JumpTableEntrySize, Int16ShiftLeft),
  };
  static constexpr auto JumpTableEntrySizeNames =
      BUILD_ENUM_STRINGS(JumpTableEntrySizeNameDefs);
  return JumpTableEntrySizeNames;
}

EnumStrings<uint16_t> getAssociationKindNames() {
  constexpr EnumStringDef<uint16_t> AssociationKindNameDefs[] = {
      CV_ENUM_CLASS_ENT(AssociationKind, None),
      CV_ENUM_CLASS_ENT(AssociationKind, Coroutine),
  };
  static constexpr auto AssociationKindNames =
      BUILD_ENUM_STRINGS(AssociationKindNameDefs);
  return AssociationKindNames;
}

} // end namespace codeview
} // end namespace llvm
