10b57cec5SDimitry Andric //===- ELFYAML.cpp - ELF YAMLIO implementation ----------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file defines classes for handling the YAML representation of ELF. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #include "llvm/ObjectYAML/ELFYAML.h" 14fe6060f1SDimitry Andric #include "llvm/ADT/APInt.h" 158bcb0991SDimitry Andric #include "llvm/ADT/MapVector.h" 160b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 170b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELF.h" 18e8d8bef9SDimitry Andric #include "llvm/Support/ARMEHABI.h" 190b57cec5SDimitry Andric #include "llvm/Support/Casting.h" 200b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 210b57cec5SDimitry Andric #include "llvm/Support/MipsABIFlags.h" 220b57cec5SDimitry Andric #include "llvm/Support/YAMLTraits.h" 238bcb0991SDimitry Andric #include "llvm/Support/WithColor.h" 240b57cec5SDimitry Andric #include <cassert> 250b57cec5SDimitry Andric #include <cstdint> 26bdd1243dSDimitry Andric #include <optional> 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric namespace llvm { 290b57cec5SDimitry Andric 30480093f4SDimitry Andric ELFYAML::Chunk::~Chunk() = default; 310b57cec5SDimitry Andric 32e8d8bef9SDimitry Andric namespace ELFYAML { 3381ad6265SDimitry Andric ELF_ELFOSABI Object::getOSAbi() const { return Header.OSABI; } 3481ad6265SDimitry Andric 35e8d8bef9SDimitry Andric unsigned Object::getMachine() const { 36e8d8bef9SDimitry Andric if (Header.Machine) 37e8d8bef9SDimitry Andric return *Header.Machine; 38e8d8bef9SDimitry Andric return llvm::ELF::EM_NONE; 39e8d8bef9SDimitry Andric } 40e8d8bef9SDimitry Andric 41e8d8bef9SDimitry Andric constexpr StringRef SectionHeaderTable::TypeStr; 42e8d8bef9SDimitry Andric } // namespace ELFYAML 43e8d8bef9SDimitry Andric 440b57cec5SDimitry Andric namespace yaml { 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_ET>::enumeration( 470b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_ET &Value) { 480b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 490b57cec5SDimitry Andric ECase(ET_NONE); 500b57cec5SDimitry Andric ECase(ET_REL); 510b57cec5SDimitry Andric ECase(ET_EXEC); 520b57cec5SDimitry Andric ECase(ET_DYN); 530b57cec5SDimitry Andric ECase(ET_CORE); 540b57cec5SDimitry Andric #undef ECase 550b57cec5SDimitry Andric IO.enumFallback<Hex16>(Value); 560b57cec5SDimitry Andric } 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_PT>::enumeration( 590b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_PT &Value) { 600b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 610b57cec5SDimitry Andric ECase(PT_NULL); 620b57cec5SDimitry Andric ECase(PT_LOAD); 630b57cec5SDimitry Andric ECase(PT_DYNAMIC); 640b57cec5SDimitry Andric ECase(PT_INTERP); 650b57cec5SDimitry Andric ECase(PT_NOTE); 660b57cec5SDimitry Andric ECase(PT_SHLIB); 670b57cec5SDimitry Andric ECase(PT_PHDR); 680b57cec5SDimitry Andric ECase(PT_TLS); 690b57cec5SDimitry Andric ECase(PT_GNU_EH_FRAME); 708bcb0991SDimitry Andric ECase(PT_GNU_STACK); 718bcb0991SDimitry Andric ECase(PT_GNU_RELRO); 72480093f4SDimitry Andric ECase(PT_GNU_PROPERTY); 730b57cec5SDimitry Andric #undef ECase 740b57cec5SDimitry Andric IO.enumFallback<Hex32>(Value); 750b57cec5SDimitry Andric } 760b57cec5SDimitry Andric 77fe6060f1SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_NT>::enumeration( 78fe6060f1SDimitry Andric IO &IO, ELFYAML::ELF_NT &Value) { 79fe6060f1SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 80fe6060f1SDimitry Andric // Generic note types. 81fe6060f1SDimitry Andric ECase(NT_VERSION); 82fe6060f1SDimitry Andric ECase(NT_ARCH); 83fe6060f1SDimitry Andric ECase(NT_GNU_BUILD_ATTRIBUTE_OPEN); 84fe6060f1SDimitry Andric ECase(NT_GNU_BUILD_ATTRIBUTE_FUNC); 85fe6060f1SDimitry Andric // Core note types. 86fe6060f1SDimitry Andric ECase(NT_PRSTATUS); 87fe6060f1SDimitry Andric ECase(NT_FPREGSET); 88fe6060f1SDimitry Andric ECase(NT_PRPSINFO); 89fe6060f1SDimitry Andric ECase(NT_TASKSTRUCT); 90fe6060f1SDimitry Andric ECase(NT_AUXV); 91fe6060f1SDimitry Andric ECase(NT_PSTATUS); 92fe6060f1SDimitry Andric ECase(NT_FPREGS); 93fe6060f1SDimitry Andric ECase(NT_PSINFO); 94fe6060f1SDimitry Andric ECase(NT_LWPSTATUS); 95fe6060f1SDimitry Andric ECase(NT_LWPSINFO); 96fe6060f1SDimitry Andric ECase(NT_WIN32PSTATUS); 97fe6060f1SDimitry Andric ECase(NT_PPC_VMX); 98fe6060f1SDimitry Andric ECase(NT_PPC_VSX); 99fe6060f1SDimitry Andric ECase(NT_PPC_TAR); 100fe6060f1SDimitry Andric ECase(NT_PPC_PPR); 101fe6060f1SDimitry Andric ECase(NT_PPC_DSCR); 102fe6060f1SDimitry Andric ECase(NT_PPC_EBB); 103fe6060f1SDimitry Andric ECase(NT_PPC_PMU); 104fe6060f1SDimitry Andric ECase(NT_PPC_TM_CGPR); 105fe6060f1SDimitry Andric ECase(NT_PPC_TM_CFPR); 106fe6060f1SDimitry Andric ECase(NT_PPC_TM_CVMX); 107fe6060f1SDimitry Andric ECase(NT_PPC_TM_CVSX); 108fe6060f1SDimitry Andric ECase(NT_PPC_TM_SPR); 109fe6060f1SDimitry Andric ECase(NT_PPC_TM_CTAR); 110fe6060f1SDimitry Andric ECase(NT_PPC_TM_CPPR); 111fe6060f1SDimitry Andric ECase(NT_PPC_TM_CDSCR); 112fe6060f1SDimitry Andric ECase(NT_386_TLS); 113fe6060f1SDimitry Andric ECase(NT_386_IOPERM); 114fe6060f1SDimitry Andric ECase(NT_X86_XSTATE); 115fe6060f1SDimitry Andric ECase(NT_S390_HIGH_GPRS); 116fe6060f1SDimitry Andric ECase(NT_S390_TIMER); 117fe6060f1SDimitry Andric ECase(NT_S390_TODCMP); 118fe6060f1SDimitry Andric ECase(NT_S390_TODPREG); 119fe6060f1SDimitry Andric ECase(NT_S390_CTRS); 120fe6060f1SDimitry Andric ECase(NT_S390_PREFIX); 121fe6060f1SDimitry Andric ECase(NT_S390_LAST_BREAK); 122fe6060f1SDimitry Andric ECase(NT_S390_SYSTEM_CALL); 123fe6060f1SDimitry Andric ECase(NT_S390_TDB); 124fe6060f1SDimitry Andric ECase(NT_S390_VXRS_LOW); 125fe6060f1SDimitry Andric ECase(NT_S390_VXRS_HIGH); 126fe6060f1SDimitry Andric ECase(NT_S390_GS_CB); 127fe6060f1SDimitry Andric ECase(NT_S390_GS_BC); 128fe6060f1SDimitry Andric ECase(NT_ARM_VFP); 129fe6060f1SDimitry Andric ECase(NT_ARM_TLS); 130fe6060f1SDimitry Andric ECase(NT_ARM_HW_BREAK); 131fe6060f1SDimitry Andric ECase(NT_ARM_HW_WATCH); 132fe6060f1SDimitry Andric ECase(NT_ARM_SVE); 133fe6060f1SDimitry Andric ECase(NT_ARM_PAC_MASK); 1345f757f3fSDimitry Andric ECase(NT_ARM_TAGGED_ADDR_CTRL); 13506c3fb27SDimitry Andric ECase(NT_ARM_SSVE); 13606c3fb27SDimitry Andric ECase(NT_ARM_ZA); 13706c3fb27SDimitry Andric ECase(NT_ARM_ZT); 138fe6060f1SDimitry Andric ECase(NT_FILE); 139fe6060f1SDimitry Andric ECase(NT_PRXFPREG); 140fe6060f1SDimitry Andric ECase(NT_SIGINFO); 141fe6060f1SDimitry Andric // LLVM-specific notes. 142fe6060f1SDimitry Andric ECase(NT_LLVM_HWASAN_GLOBALS); 143fe6060f1SDimitry Andric // GNU note types 144fe6060f1SDimitry Andric ECase(NT_GNU_ABI_TAG); 145fe6060f1SDimitry Andric ECase(NT_GNU_HWCAP); 146fe6060f1SDimitry Andric ECase(NT_GNU_BUILD_ID); 147fe6060f1SDimitry Andric ECase(NT_GNU_GOLD_VERSION); 148fe6060f1SDimitry Andric ECase(NT_GNU_PROPERTY_TYPE_0); 149fe6060f1SDimitry Andric // FreeBSD note types. 150fe6060f1SDimitry Andric ECase(NT_FREEBSD_ABI_TAG); 151fe6060f1SDimitry Andric ECase(NT_FREEBSD_NOINIT_TAG); 152fe6060f1SDimitry Andric ECase(NT_FREEBSD_ARCH_TAG); 153fe6060f1SDimitry Andric ECase(NT_FREEBSD_FEATURE_CTL); 154fe6060f1SDimitry Andric // FreeBSD core note types. 155fe6060f1SDimitry Andric ECase(NT_FREEBSD_THRMISC); 156fe6060f1SDimitry Andric ECase(NT_FREEBSD_PROCSTAT_PROC); 157fe6060f1SDimitry Andric ECase(NT_FREEBSD_PROCSTAT_FILES); 158fe6060f1SDimitry Andric ECase(NT_FREEBSD_PROCSTAT_VMMAP); 159fe6060f1SDimitry Andric ECase(NT_FREEBSD_PROCSTAT_GROUPS); 160fe6060f1SDimitry Andric ECase(NT_FREEBSD_PROCSTAT_UMASK); 161fe6060f1SDimitry Andric ECase(NT_FREEBSD_PROCSTAT_RLIMIT); 162fe6060f1SDimitry Andric ECase(NT_FREEBSD_PROCSTAT_OSREL); 163fe6060f1SDimitry Andric ECase(NT_FREEBSD_PROCSTAT_PSSTRINGS); 164fe6060f1SDimitry Andric ECase(NT_FREEBSD_PROCSTAT_AUXV); 1654824e7fdSDimitry Andric // NetBSD core note types. 1664824e7fdSDimitry Andric ECase(NT_NETBSDCORE_PROCINFO); 1674824e7fdSDimitry Andric ECase(NT_NETBSDCORE_AUXV); 1684824e7fdSDimitry Andric ECase(NT_NETBSDCORE_LWPSTATUS); 169349cc55cSDimitry Andric // OpenBSD core note types. 170349cc55cSDimitry Andric ECase(NT_OPENBSD_PROCINFO); 171349cc55cSDimitry Andric ECase(NT_OPENBSD_AUXV); 172349cc55cSDimitry Andric ECase(NT_OPENBSD_REGS); 173349cc55cSDimitry Andric ECase(NT_OPENBSD_FPREGS); 174349cc55cSDimitry Andric ECase(NT_OPENBSD_XFPREGS); 175349cc55cSDimitry Andric ECase(NT_OPENBSD_WCOOKIE); 176fe6060f1SDimitry Andric // AMD specific notes. (Code Object V2) 177fe6060f1SDimitry Andric ECase(NT_AMD_HSA_CODE_OBJECT_VERSION); 178fe6060f1SDimitry Andric ECase(NT_AMD_HSA_HSAIL); 179fe6060f1SDimitry Andric ECase(NT_AMD_HSA_ISA_VERSION); 180fe6060f1SDimitry Andric ECase(NT_AMD_HSA_METADATA); 181fe6060f1SDimitry Andric ECase(NT_AMD_HSA_ISA_NAME); 182fe6060f1SDimitry Andric ECase(NT_AMD_PAL_METADATA); 183fe6060f1SDimitry Andric // AMDGPU specific notes. (Code Object V3) 184fe6060f1SDimitry Andric ECase(NT_AMDGPU_METADATA); 18581ad6265SDimitry Andric // Android specific notes. 18681ad6265SDimitry Andric ECase(NT_ANDROID_TYPE_IDENT); 18781ad6265SDimitry Andric ECase(NT_ANDROID_TYPE_KUSER); 18881ad6265SDimitry Andric ECase(NT_ANDROID_TYPE_MEMTAG); 189fe6060f1SDimitry Andric #undef ECase 190fe6060f1SDimitry Andric IO.enumFallback<Hex32>(Value); 191fe6060f1SDimitry Andric } 192fe6060f1SDimitry Andric 1930b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration( 1940b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_EM &Value) { 1950b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 1960b57cec5SDimitry Andric ECase(EM_NONE); 1970b57cec5SDimitry Andric ECase(EM_M32); 1980b57cec5SDimitry Andric ECase(EM_SPARC); 1990b57cec5SDimitry Andric ECase(EM_386); 2000b57cec5SDimitry Andric ECase(EM_68K); 2010b57cec5SDimitry Andric ECase(EM_88K); 2020b57cec5SDimitry Andric ECase(EM_IAMCU); 2030b57cec5SDimitry Andric ECase(EM_860); 2040b57cec5SDimitry Andric ECase(EM_MIPS); 2050b57cec5SDimitry Andric ECase(EM_S370); 2060b57cec5SDimitry Andric ECase(EM_MIPS_RS3_LE); 2070b57cec5SDimitry Andric ECase(EM_PARISC); 2080b57cec5SDimitry Andric ECase(EM_VPP500); 2090b57cec5SDimitry Andric ECase(EM_SPARC32PLUS); 2100b57cec5SDimitry Andric ECase(EM_960); 2110b57cec5SDimitry Andric ECase(EM_PPC); 2120b57cec5SDimitry Andric ECase(EM_PPC64); 2130b57cec5SDimitry Andric ECase(EM_S390); 2140b57cec5SDimitry Andric ECase(EM_SPU); 2150b57cec5SDimitry Andric ECase(EM_V800); 2160b57cec5SDimitry Andric ECase(EM_FR20); 2170b57cec5SDimitry Andric ECase(EM_RH32); 2180b57cec5SDimitry Andric ECase(EM_RCE); 2190b57cec5SDimitry Andric ECase(EM_ARM); 2200b57cec5SDimitry Andric ECase(EM_ALPHA); 2210b57cec5SDimitry Andric ECase(EM_SH); 2220b57cec5SDimitry Andric ECase(EM_SPARCV9); 2230b57cec5SDimitry Andric ECase(EM_TRICORE); 2240b57cec5SDimitry Andric ECase(EM_ARC); 2250b57cec5SDimitry Andric ECase(EM_H8_300); 2260b57cec5SDimitry Andric ECase(EM_H8_300H); 2270b57cec5SDimitry Andric ECase(EM_H8S); 2280b57cec5SDimitry Andric ECase(EM_H8_500); 2290b57cec5SDimitry Andric ECase(EM_IA_64); 2300b57cec5SDimitry Andric ECase(EM_MIPS_X); 2310b57cec5SDimitry Andric ECase(EM_COLDFIRE); 2320b57cec5SDimitry Andric ECase(EM_68HC12); 2330b57cec5SDimitry Andric ECase(EM_MMA); 2340b57cec5SDimitry Andric ECase(EM_PCP); 2350b57cec5SDimitry Andric ECase(EM_NCPU); 2360b57cec5SDimitry Andric ECase(EM_NDR1); 2370b57cec5SDimitry Andric ECase(EM_STARCORE); 2380b57cec5SDimitry Andric ECase(EM_ME16); 2390b57cec5SDimitry Andric ECase(EM_ST100); 2400b57cec5SDimitry Andric ECase(EM_TINYJ); 2410b57cec5SDimitry Andric ECase(EM_X86_64); 2420b57cec5SDimitry Andric ECase(EM_PDSP); 2430b57cec5SDimitry Andric ECase(EM_PDP10); 2440b57cec5SDimitry Andric ECase(EM_PDP11); 2450b57cec5SDimitry Andric ECase(EM_FX66); 2460b57cec5SDimitry Andric ECase(EM_ST9PLUS); 2470b57cec5SDimitry Andric ECase(EM_ST7); 2480b57cec5SDimitry Andric ECase(EM_68HC16); 2490b57cec5SDimitry Andric ECase(EM_68HC11); 2500b57cec5SDimitry Andric ECase(EM_68HC08); 2510b57cec5SDimitry Andric ECase(EM_68HC05); 2520b57cec5SDimitry Andric ECase(EM_SVX); 2530b57cec5SDimitry Andric ECase(EM_ST19); 2540b57cec5SDimitry Andric ECase(EM_VAX); 2550b57cec5SDimitry Andric ECase(EM_CRIS); 2560b57cec5SDimitry Andric ECase(EM_JAVELIN); 2570b57cec5SDimitry Andric ECase(EM_FIREPATH); 2580b57cec5SDimitry Andric ECase(EM_ZSP); 2590b57cec5SDimitry Andric ECase(EM_MMIX); 2600b57cec5SDimitry Andric ECase(EM_HUANY); 2610b57cec5SDimitry Andric ECase(EM_PRISM); 2620b57cec5SDimitry Andric ECase(EM_AVR); 2630b57cec5SDimitry Andric ECase(EM_FR30); 2640b57cec5SDimitry Andric ECase(EM_D10V); 2650b57cec5SDimitry Andric ECase(EM_D30V); 2660b57cec5SDimitry Andric ECase(EM_V850); 2670b57cec5SDimitry Andric ECase(EM_M32R); 2680b57cec5SDimitry Andric ECase(EM_MN10300); 2690b57cec5SDimitry Andric ECase(EM_MN10200); 2700b57cec5SDimitry Andric ECase(EM_PJ); 2710b57cec5SDimitry Andric ECase(EM_OPENRISC); 2720b57cec5SDimitry Andric ECase(EM_ARC_COMPACT); 2730b57cec5SDimitry Andric ECase(EM_XTENSA); 2740b57cec5SDimitry Andric ECase(EM_VIDEOCORE); 2750b57cec5SDimitry Andric ECase(EM_TMM_GPP); 2760b57cec5SDimitry Andric ECase(EM_NS32K); 2770b57cec5SDimitry Andric ECase(EM_TPC); 2780b57cec5SDimitry Andric ECase(EM_SNP1K); 2790b57cec5SDimitry Andric ECase(EM_ST200); 2800b57cec5SDimitry Andric ECase(EM_IP2K); 2810b57cec5SDimitry Andric ECase(EM_MAX); 2820b57cec5SDimitry Andric ECase(EM_CR); 2830b57cec5SDimitry Andric ECase(EM_F2MC16); 2840b57cec5SDimitry Andric ECase(EM_MSP430); 2850b57cec5SDimitry Andric ECase(EM_BLACKFIN); 2860b57cec5SDimitry Andric ECase(EM_SE_C33); 2870b57cec5SDimitry Andric ECase(EM_SEP); 2880b57cec5SDimitry Andric ECase(EM_ARCA); 2890b57cec5SDimitry Andric ECase(EM_UNICORE); 2900b57cec5SDimitry Andric ECase(EM_EXCESS); 2910b57cec5SDimitry Andric ECase(EM_DXP); 2920b57cec5SDimitry Andric ECase(EM_ALTERA_NIOS2); 2930b57cec5SDimitry Andric ECase(EM_CRX); 2940b57cec5SDimitry Andric ECase(EM_XGATE); 2950b57cec5SDimitry Andric ECase(EM_C166); 2960b57cec5SDimitry Andric ECase(EM_M16C); 2970b57cec5SDimitry Andric ECase(EM_DSPIC30F); 2980b57cec5SDimitry Andric ECase(EM_CE); 2990b57cec5SDimitry Andric ECase(EM_M32C); 3000b57cec5SDimitry Andric ECase(EM_TSK3000); 3010b57cec5SDimitry Andric ECase(EM_RS08); 3020b57cec5SDimitry Andric ECase(EM_SHARC); 3030b57cec5SDimitry Andric ECase(EM_ECOG2); 3040b57cec5SDimitry Andric ECase(EM_SCORE7); 3050b57cec5SDimitry Andric ECase(EM_DSP24); 3060b57cec5SDimitry Andric ECase(EM_VIDEOCORE3); 3070b57cec5SDimitry Andric ECase(EM_LATTICEMICO32); 3080b57cec5SDimitry Andric ECase(EM_SE_C17); 3090b57cec5SDimitry Andric ECase(EM_TI_C6000); 3100b57cec5SDimitry Andric ECase(EM_TI_C2000); 3110b57cec5SDimitry Andric ECase(EM_TI_C5500); 3120b57cec5SDimitry Andric ECase(EM_MMDSP_PLUS); 3130b57cec5SDimitry Andric ECase(EM_CYPRESS_M8C); 3140b57cec5SDimitry Andric ECase(EM_R32C); 3150b57cec5SDimitry Andric ECase(EM_TRIMEDIA); 3160b57cec5SDimitry Andric ECase(EM_HEXAGON); 3170b57cec5SDimitry Andric ECase(EM_8051); 3180b57cec5SDimitry Andric ECase(EM_STXP7X); 3190b57cec5SDimitry Andric ECase(EM_NDS32); 3200b57cec5SDimitry Andric ECase(EM_ECOG1); 3210b57cec5SDimitry Andric ECase(EM_ECOG1X); 3220b57cec5SDimitry Andric ECase(EM_MAXQ30); 3230b57cec5SDimitry Andric ECase(EM_XIMO16); 3240b57cec5SDimitry Andric ECase(EM_MANIK); 3250b57cec5SDimitry Andric ECase(EM_CRAYNV2); 3260b57cec5SDimitry Andric ECase(EM_RX); 3270b57cec5SDimitry Andric ECase(EM_METAG); 3280b57cec5SDimitry Andric ECase(EM_MCST_ELBRUS); 3290b57cec5SDimitry Andric ECase(EM_ECOG16); 3300b57cec5SDimitry Andric ECase(EM_CR16); 3310b57cec5SDimitry Andric ECase(EM_ETPU); 3320b57cec5SDimitry Andric ECase(EM_SLE9X); 3330b57cec5SDimitry Andric ECase(EM_L10M); 3340b57cec5SDimitry Andric ECase(EM_K10M); 3350b57cec5SDimitry Andric ECase(EM_AARCH64); 3360b57cec5SDimitry Andric ECase(EM_AVR32); 3370b57cec5SDimitry Andric ECase(EM_STM8); 3380b57cec5SDimitry Andric ECase(EM_TILE64); 3390b57cec5SDimitry Andric ECase(EM_TILEPRO); 340fe6060f1SDimitry Andric ECase(EM_MICROBLAZE); 3410b57cec5SDimitry Andric ECase(EM_CUDA); 3420b57cec5SDimitry Andric ECase(EM_TILEGX); 3430b57cec5SDimitry Andric ECase(EM_CLOUDSHIELD); 3440b57cec5SDimitry Andric ECase(EM_COREA_1ST); 3450b57cec5SDimitry Andric ECase(EM_COREA_2ND); 3460b57cec5SDimitry Andric ECase(EM_ARC_COMPACT2); 3470b57cec5SDimitry Andric ECase(EM_OPEN8); 3480b57cec5SDimitry Andric ECase(EM_RL78); 3490b57cec5SDimitry Andric ECase(EM_VIDEOCORE5); 3500b57cec5SDimitry Andric ECase(EM_78KOR); 3510b57cec5SDimitry Andric ECase(EM_56800EX); 3520b57cec5SDimitry Andric ECase(EM_AMDGPU); 3530b57cec5SDimitry Andric ECase(EM_RISCV); 3540b57cec5SDimitry Andric ECase(EM_LANAI); 3550b57cec5SDimitry Andric ECase(EM_BPF); 3565ffd83dbSDimitry Andric ECase(EM_VE); 357e8d8bef9SDimitry Andric ECase(EM_CSKY); 35881ad6265SDimitry Andric ECase(EM_LOONGARCH); 3590b57cec5SDimitry Andric #undef ECase 3608bcb0991SDimitry Andric IO.enumFallback<Hex16>(Value); 3610b57cec5SDimitry Andric } 3620b57cec5SDimitry Andric 3630b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_ELFCLASS>::enumeration( 3640b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_ELFCLASS &Value) { 3650b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 3660b57cec5SDimitry Andric // Since the semantics of ELFCLASSNONE is "invalid", just don't accept it 3670b57cec5SDimitry Andric // here. 3680b57cec5SDimitry Andric ECase(ELFCLASS32); 3690b57cec5SDimitry Andric ECase(ELFCLASS64); 3700b57cec5SDimitry Andric #undef ECase 3710b57cec5SDimitry Andric } 3720b57cec5SDimitry Andric 3730b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_ELFDATA>::enumeration( 3740b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_ELFDATA &Value) { 3750b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 3760b57cec5SDimitry Andric // ELFDATANONE is an invalid data encoding, but we accept it because 3770b57cec5SDimitry Andric // we want to be able to produce invalid binaries for the tests. 3780b57cec5SDimitry Andric ECase(ELFDATANONE); 3790b57cec5SDimitry Andric ECase(ELFDATA2LSB); 3800b57cec5SDimitry Andric ECase(ELFDATA2MSB); 3810b57cec5SDimitry Andric #undef ECase 3820b57cec5SDimitry Andric } 3830b57cec5SDimitry Andric 3840b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_ELFOSABI>::enumeration( 3850b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_ELFOSABI &Value) { 3860b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 3870b57cec5SDimitry Andric ECase(ELFOSABI_NONE); 3880b57cec5SDimitry Andric ECase(ELFOSABI_HPUX); 3890b57cec5SDimitry Andric ECase(ELFOSABI_NETBSD); 3900b57cec5SDimitry Andric ECase(ELFOSABI_GNU); 391480093f4SDimitry Andric ECase(ELFOSABI_LINUX); 3920b57cec5SDimitry Andric ECase(ELFOSABI_HURD); 3930b57cec5SDimitry Andric ECase(ELFOSABI_SOLARIS); 3940b57cec5SDimitry Andric ECase(ELFOSABI_AIX); 3950b57cec5SDimitry Andric ECase(ELFOSABI_IRIX); 3960b57cec5SDimitry Andric ECase(ELFOSABI_FREEBSD); 3970b57cec5SDimitry Andric ECase(ELFOSABI_TRU64); 3980b57cec5SDimitry Andric ECase(ELFOSABI_MODESTO); 3990b57cec5SDimitry Andric ECase(ELFOSABI_OPENBSD); 4000b57cec5SDimitry Andric ECase(ELFOSABI_OPENVMS); 4010b57cec5SDimitry Andric ECase(ELFOSABI_NSK); 4020b57cec5SDimitry Andric ECase(ELFOSABI_AROS); 4030b57cec5SDimitry Andric ECase(ELFOSABI_FENIXOS); 4040b57cec5SDimitry Andric ECase(ELFOSABI_CLOUDABI); 4050b57cec5SDimitry Andric ECase(ELFOSABI_AMDGPU_HSA); 4060b57cec5SDimitry Andric ECase(ELFOSABI_AMDGPU_PAL); 4070b57cec5SDimitry Andric ECase(ELFOSABI_AMDGPU_MESA3D); 4080b57cec5SDimitry Andric ECase(ELFOSABI_ARM); 409*0fca6ea1SDimitry Andric ECase(ELFOSABI_ARM_FDPIC); 4100b57cec5SDimitry Andric ECase(ELFOSABI_C6000_ELFABI); 4110b57cec5SDimitry Andric ECase(ELFOSABI_C6000_LINUX); 4120b57cec5SDimitry Andric ECase(ELFOSABI_STANDALONE); 4130b57cec5SDimitry Andric #undef ECase 414480093f4SDimitry Andric IO.enumFallback<Hex8>(Value); 4150b57cec5SDimitry Andric } 4160b57cec5SDimitry Andric 4170b57cec5SDimitry Andric void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO, 4180b57cec5SDimitry Andric ELFYAML::ELF_EF &Value) { 4190b57cec5SDimitry Andric const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); 4200b57cec5SDimitry Andric assert(Object && "The IO context is not initialized"); 4210b57cec5SDimitry Andric #define BCase(X) IO.bitSetCase(Value, #X, ELF::X) 4220b57cec5SDimitry Andric #define BCaseMask(X, M) IO.maskedBitSetCase(Value, #X, ELF::X, ELF::M) 423e8d8bef9SDimitry Andric switch (Object->getMachine()) { 4240b57cec5SDimitry Andric case ELF::EM_ARM: 4250b57cec5SDimitry Andric BCase(EF_ARM_SOFT_FLOAT); 4260b57cec5SDimitry Andric BCase(EF_ARM_VFP_FLOAT); 4270b57cec5SDimitry Andric BCaseMask(EF_ARM_EABI_UNKNOWN, EF_ARM_EABIMASK); 4280b57cec5SDimitry Andric BCaseMask(EF_ARM_EABI_VER1, EF_ARM_EABIMASK); 4290b57cec5SDimitry Andric BCaseMask(EF_ARM_EABI_VER2, EF_ARM_EABIMASK); 4300b57cec5SDimitry Andric BCaseMask(EF_ARM_EABI_VER3, EF_ARM_EABIMASK); 4310b57cec5SDimitry Andric BCaseMask(EF_ARM_EABI_VER4, EF_ARM_EABIMASK); 4320b57cec5SDimitry Andric BCaseMask(EF_ARM_EABI_VER5, EF_ARM_EABIMASK); 433bdd1243dSDimitry Andric BCaseMask(EF_ARM_BE8, EF_ARM_BE8); 4340b57cec5SDimitry Andric break; 4350b57cec5SDimitry Andric case ELF::EM_MIPS: 4360b57cec5SDimitry Andric BCase(EF_MIPS_NOREORDER); 4370b57cec5SDimitry Andric BCase(EF_MIPS_PIC); 4380b57cec5SDimitry Andric BCase(EF_MIPS_CPIC); 4390b57cec5SDimitry Andric BCase(EF_MIPS_ABI2); 4400b57cec5SDimitry Andric BCase(EF_MIPS_32BITMODE); 4410b57cec5SDimitry Andric BCase(EF_MIPS_FP64); 4420b57cec5SDimitry Andric BCase(EF_MIPS_NAN2008); 4430b57cec5SDimitry Andric BCase(EF_MIPS_MICROMIPS); 4440b57cec5SDimitry Andric BCase(EF_MIPS_ARCH_ASE_M16); 4450b57cec5SDimitry Andric BCase(EF_MIPS_ARCH_ASE_MDMX); 4460b57cec5SDimitry Andric BCaseMask(EF_MIPS_ABI_O32, EF_MIPS_ABI); 4470b57cec5SDimitry Andric BCaseMask(EF_MIPS_ABI_O64, EF_MIPS_ABI); 4480b57cec5SDimitry Andric BCaseMask(EF_MIPS_ABI_EABI32, EF_MIPS_ABI); 4490b57cec5SDimitry Andric BCaseMask(EF_MIPS_ABI_EABI64, EF_MIPS_ABI); 4500b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_3900, EF_MIPS_MACH); 4510b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_4010, EF_MIPS_MACH); 4520b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_4100, EF_MIPS_MACH); 4530b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_4650, EF_MIPS_MACH); 4540b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_4120, EF_MIPS_MACH); 4550b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_4111, EF_MIPS_MACH); 4560b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_SB1, EF_MIPS_MACH); 4570b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_OCTEON, EF_MIPS_MACH); 4580b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_XLR, EF_MIPS_MACH); 4590b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_OCTEON2, EF_MIPS_MACH); 4600b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_OCTEON3, EF_MIPS_MACH); 4610b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_5400, EF_MIPS_MACH); 4620b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_5900, EF_MIPS_MACH); 4630b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_5500, EF_MIPS_MACH); 4640b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_9000, EF_MIPS_MACH); 4650b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_LS2E, EF_MIPS_MACH); 4660b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_LS2F, EF_MIPS_MACH); 4670b57cec5SDimitry Andric BCaseMask(EF_MIPS_MACH_LS3A, EF_MIPS_MACH); 4680b57cec5SDimitry Andric BCaseMask(EF_MIPS_ARCH_1, EF_MIPS_ARCH); 4690b57cec5SDimitry Andric BCaseMask(EF_MIPS_ARCH_2, EF_MIPS_ARCH); 4700b57cec5SDimitry Andric BCaseMask(EF_MIPS_ARCH_3, EF_MIPS_ARCH); 4710b57cec5SDimitry Andric BCaseMask(EF_MIPS_ARCH_4, EF_MIPS_ARCH); 4720b57cec5SDimitry Andric BCaseMask(EF_MIPS_ARCH_5, EF_MIPS_ARCH); 4730b57cec5SDimitry Andric BCaseMask(EF_MIPS_ARCH_32, EF_MIPS_ARCH); 4740b57cec5SDimitry Andric BCaseMask(EF_MIPS_ARCH_64, EF_MIPS_ARCH); 4750b57cec5SDimitry Andric BCaseMask(EF_MIPS_ARCH_32R2, EF_MIPS_ARCH); 4760b57cec5SDimitry Andric BCaseMask(EF_MIPS_ARCH_64R2, EF_MIPS_ARCH); 4770b57cec5SDimitry Andric BCaseMask(EF_MIPS_ARCH_32R6, EF_MIPS_ARCH); 4780b57cec5SDimitry Andric BCaseMask(EF_MIPS_ARCH_64R6, EF_MIPS_ARCH); 4790b57cec5SDimitry Andric break; 4800b57cec5SDimitry Andric case ELF::EM_HEXAGON: 4810eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V2, EF_HEXAGON_MACH); 4820eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V3, EF_HEXAGON_MACH); 4830eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V4, EF_HEXAGON_MACH); 4840eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V5, EF_HEXAGON_MACH); 4850eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V55, EF_HEXAGON_MACH); 4860eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V60, EF_HEXAGON_MACH); 4870eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V62, EF_HEXAGON_MACH); 4880eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V65, EF_HEXAGON_MACH); 4890eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V66, EF_HEXAGON_MACH); 4900eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V67, EF_HEXAGON_MACH); 4910eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V67T, EF_HEXAGON_MACH); 4920eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V68, EF_HEXAGON_MACH); 4930eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V69, EF_HEXAGON_MACH); 494bdd1243dSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V71, EF_HEXAGON_MACH); 495bdd1243dSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V71T, EF_HEXAGON_MACH); 496bdd1243dSDimitry Andric BCaseMask(EF_HEXAGON_MACH_V73, EF_HEXAGON_MACH); 4970eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V2, EF_HEXAGON_ISA); 4980eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V3, EF_HEXAGON_ISA); 4990eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V4, EF_HEXAGON_ISA); 5000eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V5, EF_HEXAGON_ISA); 5010eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V55, EF_HEXAGON_ISA); 5020eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V60, EF_HEXAGON_ISA); 5030eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V62, EF_HEXAGON_ISA); 5040eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V65, EF_HEXAGON_ISA); 5050eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V66, EF_HEXAGON_ISA); 5060eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V67, EF_HEXAGON_ISA); 5070eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V68, EF_HEXAGON_ISA); 5080eae32dcSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V69, EF_HEXAGON_ISA); 509bdd1243dSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V71, EF_HEXAGON_ISA); 510bdd1243dSDimitry Andric BCaseMask(EF_HEXAGON_ISA_V73, EF_HEXAGON_ISA); 5110b57cec5SDimitry Andric break; 5120b57cec5SDimitry Andric case ELF::EM_AVR: 513fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_AVR1, EF_AVR_ARCH_MASK); 514fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_AVR2, EF_AVR_ARCH_MASK); 515fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_AVR25, EF_AVR_ARCH_MASK); 516fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_AVR3, EF_AVR_ARCH_MASK); 517fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_AVR31, EF_AVR_ARCH_MASK); 518fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_AVR35, EF_AVR_ARCH_MASK); 519fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_AVR4, EF_AVR_ARCH_MASK); 520fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_AVR5, EF_AVR_ARCH_MASK); 521fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_AVR51, EF_AVR_ARCH_MASK); 522fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_AVR6, EF_AVR_ARCH_MASK); 523fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_AVRTINY, EF_AVR_ARCH_MASK); 524fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_XMEGA1, EF_AVR_ARCH_MASK); 525fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_XMEGA2, EF_AVR_ARCH_MASK); 526fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_XMEGA3, EF_AVR_ARCH_MASK); 527fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_XMEGA4, EF_AVR_ARCH_MASK); 528fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_XMEGA5, EF_AVR_ARCH_MASK); 529fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_XMEGA6, EF_AVR_ARCH_MASK); 530fe6060f1SDimitry Andric BCaseMask(EF_AVR_ARCH_XMEGA7, EF_AVR_ARCH_MASK); 531fe6060f1SDimitry Andric BCase(EF_AVR_LINKRELAX_PREPARED); 5320b57cec5SDimitry Andric break; 533972a253aSDimitry Andric case ELF::EM_LOONGARCH: 534bdd1243dSDimitry Andric BCaseMask(EF_LOONGARCH_ABI_SOFT_FLOAT, EF_LOONGARCH_ABI_MODIFIER_MASK); 535bdd1243dSDimitry Andric BCaseMask(EF_LOONGARCH_ABI_SINGLE_FLOAT, EF_LOONGARCH_ABI_MODIFIER_MASK); 536bdd1243dSDimitry Andric BCaseMask(EF_LOONGARCH_ABI_DOUBLE_FLOAT, EF_LOONGARCH_ABI_MODIFIER_MASK); 537bdd1243dSDimitry Andric BCaseMask(EF_LOONGARCH_OBJABI_V0, EF_LOONGARCH_OBJABI_MASK); 538bdd1243dSDimitry Andric BCaseMask(EF_LOONGARCH_OBJABI_V1, EF_LOONGARCH_OBJABI_MASK); 539972a253aSDimitry Andric break; 5400b57cec5SDimitry Andric case ELF::EM_RISCV: 5410b57cec5SDimitry Andric BCase(EF_RISCV_RVC); 5420b57cec5SDimitry Andric BCaseMask(EF_RISCV_FLOAT_ABI_SOFT, EF_RISCV_FLOAT_ABI); 5430b57cec5SDimitry Andric BCaseMask(EF_RISCV_FLOAT_ABI_SINGLE, EF_RISCV_FLOAT_ABI); 5440b57cec5SDimitry Andric BCaseMask(EF_RISCV_FLOAT_ABI_DOUBLE, EF_RISCV_FLOAT_ABI); 5450b57cec5SDimitry Andric BCaseMask(EF_RISCV_FLOAT_ABI_QUAD, EF_RISCV_FLOAT_ABI); 5460b57cec5SDimitry Andric BCase(EF_RISCV_RVE); 54704eeddc0SDimitry Andric BCase(EF_RISCV_TSO); 5480b57cec5SDimitry Andric break; 549bdd1243dSDimitry Andric case ELF::EM_XTENSA: 550bdd1243dSDimitry Andric BCase(EF_XTENSA_XT_INSN); 551bdd1243dSDimitry Andric BCaseMask(EF_XTENSA_MACH_NONE, EF_XTENSA_MACH); 552bdd1243dSDimitry Andric BCase(EF_XTENSA_XT_LIT); 553bdd1243dSDimitry Andric break; 5540b57cec5SDimitry Andric case ELF::EM_AMDGPU: 5550b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_NONE, EF_AMDGPU_MACH); 5560b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_R600, EF_AMDGPU_MACH); 5570b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_R630, EF_AMDGPU_MACH); 5580b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_RS880, EF_AMDGPU_MACH); 5590b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_RV670, EF_AMDGPU_MACH); 5600b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_RV710, EF_AMDGPU_MACH); 5610b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_RV730, EF_AMDGPU_MACH); 5620b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_RV770, EF_AMDGPU_MACH); 5630b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_CEDAR, EF_AMDGPU_MACH); 5640b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_CYPRESS, EF_AMDGPU_MACH); 5650b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_JUNIPER, EF_AMDGPU_MACH); 5660b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_REDWOOD, EF_AMDGPU_MACH); 5670b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_SUMO, EF_AMDGPU_MACH); 5680b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_BARTS, EF_AMDGPU_MACH); 5690b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_CAICOS, EF_AMDGPU_MACH); 5700b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_CAYMAN, EF_AMDGPU_MACH); 5710b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_R600_TURKS, EF_AMDGPU_MACH); 5720b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX600, EF_AMDGPU_MACH); 5730b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX601, EF_AMDGPU_MACH); 574e8d8bef9SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX602, EF_AMDGPU_MACH); 5750b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX700, EF_AMDGPU_MACH); 5760b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX701, EF_AMDGPU_MACH); 5770b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX702, EF_AMDGPU_MACH); 5780b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX703, EF_AMDGPU_MACH); 5790b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX704, EF_AMDGPU_MACH); 580e8d8bef9SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX705, EF_AMDGPU_MACH); 5810b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX801, EF_AMDGPU_MACH); 5820b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX802, EF_AMDGPU_MACH); 5830b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX803, EF_AMDGPU_MACH); 584e8d8bef9SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX805, EF_AMDGPU_MACH); 5850b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX810, EF_AMDGPU_MACH); 5860b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX900, EF_AMDGPU_MACH); 5870b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX902, EF_AMDGPU_MACH); 5880b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX904, EF_AMDGPU_MACH); 5890b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX906, EF_AMDGPU_MACH); 5900b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX908, EF_AMDGPU_MACH); 5910b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX909, EF_AMDGPU_MACH); 592fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX90A, EF_AMDGPU_MACH); 593e8d8bef9SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX90C, EF_AMDGPU_MACH); 59481ad6265SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX940, EF_AMDGPU_MACH); 59506c3fb27SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX941, EF_AMDGPU_MACH); 59606c3fb27SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX942, EF_AMDGPU_MACH); 5970b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1010, EF_AMDGPU_MACH); 5980b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1011, EF_AMDGPU_MACH); 5990b57cec5SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1012, EF_AMDGPU_MACH); 600fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1013, EF_AMDGPU_MACH); 6015ffd83dbSDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1030, EF_AMDGPU_MACH); 602e8d8bef9SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1031, EF_AMDGPU_MACH); 603e8d8bef9SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1032, EF_AMDGPU_MACH); 604e8d8bef9SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1033, EF_AMDGPU_MACH); 605fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1034, EF_AMDGPU_MACH); 606fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1035, EF_AMDGPU_MACH); 60781ad6265SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1036, EF_AMDGPU_MACH); 60881ad6265SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1100, EF_AMDGPU_MACH); 60981ad6265SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1101, EF_AMDGPU_MACH); 61081ad6265SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1102, EF_AMDGPU_MACH); 61181ad6265SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1103, EF_AMDGPU_MACH); 61206c3fb27SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1150, EF_AMDGPU_MACH); 61306c3fb27SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1151, EF_AMDGPU_MACH); 614*0fca6ea1SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1152, EF_AMDGPU_MACH); 6155f757f3fSDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1200, EF_AMDGPU_MACH); 6165f757f3fSDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1201, EF_AMDGPU_MACH); 617*0fca6ea1SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX9_GENERIC, EF_AMDGPU_MACH); 618*0fca6ea1SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC, EF_AMDGPU_MACH); 619*0fca6ea1SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX10_3_GENERIC, EF_AMDGPU_MACH); 620*0fca6ea1SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC, EF_AMDGPU_MACH); 621*0fca6ea1SDimitry Andric BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX12_GENERIC, EF_AMDGPU_MACH); 622fe6060f1SDimitry Andric switch (Object->Header.ABIVersion) { 623fe6060f1SDimitry Andric default: 624fe6060f1SDimitry Andric // ELFOSABI_AMDGPU_PAL, ELFOSABI_AMDGPU_MESA3D support *_V3 flags. 625bdd1243dSDimitry Andric [[fallthrough]]; 626fe6060f1SDimitry Andric case ELF::ELFABIVERSION_AMDGPU_HSA_V3: 627fe6060f1SDimitry Andric BCase(EF_AMDGPU_FEATURE_XNACK_V3); 628fe6060f1SDimitry Andric BCase(EF_AMDGPU_FEATURE_SRAMECC_V3); 629fe6060f1SDimitry Andric break; 630*0fca6ea1SDimitry Andric case ELF::ELFABIVERSION_AMDGPU_HSA_V6: 631*0fca6ea1SDimitry Andric for (unsigned K = ELF::EF_AMDGPU_GENERIC_VERSION_MIN; 632*0fca6ea1SDimitry Andric K <= ELF::EF_AMDGPU_GENERIC_VERSION_MAX; ++K) { 633*0fca6ea1SDimitry Andric std::string Key = "EF_AMDGPU_GENERIC_VERSION_V" + std::to_string(K); 634*0fca6ea1SDimitry Andric IO.maskedBitSetCase(Value, Key.c_str(), 635*0fca6ea1SDimitry Andric K << ELF::EF_AMDGPU_GENERIC_VERSION_OFFSET, 636*0fca6ea1SDimitry Andric ELF::EF_AMDGPU_GENERIC_VERSION); 637*0fca6ea1SDimitry Andric } 638*0fca6ea1SDimitry Andric [[fallthrough]]; 639fe6060f1SDimitry Andric case ELF::ELFABIVERSION_AMDGPU_HSA_V4: 6401fd87a68SDimitry Andric case ELF::ELFABIVERSION_AMDGPU_HSA_V5: 641fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4, 642fe6060f1SDimitry Andric EF_AMDGPU_FEATURE_XNACK_V4); 643fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_FEATURE_XNACK_ANY_V4, 644fe6060f1SDimitry Andric EF_AMDGPU_FEATURE_XNACK_V4); 645fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_FEATURE_XNACK_OFF_V4, 646fe6060f1SDimitry Andric EF_AMDGPU_FEATURE_XNACK_V4); 647fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_FEATURE_XNACK_ON_V4, 648fe6060f1SDimitry Andric EF_AMDGPU_FEATURE_XNACK_V4); 649fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4, 650fe6060f1SDimitry Andric EF_AMDGPU_FEATURE_SRAMECC_V4); 651fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_FEATURE_SRAMECC_ANY_V4, 652fe6060f1SDimitry Andric EF_AMDGPU_FEATURE_SRAMECC_V4); 653fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_FEATURE_SRAMECC_OFF_V4, 654fe6060f1SDimitry Andric EF_AMDGPU_FEATURE_SRAMECC_V4); 655fe6060f1SDimitry Andric BCaseMask(EF_AMDGPU_FEATURE_SRAMECC_ON_V4, 656fe6060f1SDimitry Andric EF_AMDGPU_FEATURE_SRAMECC_V4); 657fe6060f1SDimitry Andric break; 658fe6060f1SDimitry Andric } 6590b57cec5SDimitry Andric break; 6600b57cec5SDimitry Andric default: 661e8d8bef9SDimitry Andric break; 6620b57cec5SDimitry Andric } 6630b57cec5SDimitry Andric #undef BCase 6640b57cec5SDimitry Andric #undef BCaseMask 6650b57cec5SDimitry Andric } 6660b57cec5SDimitry Andric 6670b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration( 6680b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_SHT &Value) { 6690b57cec5SDimitry Andric const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); 6700b57cec5SDimitry Andric assert(Object && "The IO context is not initialized"); 6710b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 6720b57cec5SDimitry Andric ECase(SHT_NULL); 6730b57cec5SDimitry Andric ECase(SHT_PROGBITS); 6740b57cec5SDimitry Andric ECase(SHT_SYMTAB); 6750b57cec5SDimitry Andric // FIXME: Issue a diagnostic with this information. 6760b57cec5SDimitry Andric ECase(SHT_STRTAB); 6770b57cec5SDimitry Andric ECase(SHT_RELA); 6780b57cec5SDimitry Andric ECase(SHT_HASH); 6790b57cec5SDimitry Andric ECase(SHT_DYNAMIC); 6800b57cec5SDimitry Andric ECase(SHT_NOTE); 6810b57cec5SDimitry Andric ECase(SHT_NOBITS); 6820b57cec5SDimitry Andric ECase(SHT_REL); 6830b57cec5SDimitry Andric ECase(SHT_SHLIB); 6840b57cec5SDimitry Andric ECase(SHT_DYNSYM); 6850b57cec5SDimitry Andric ECase(SHT_INIT_ARRAY); 6860b57cec5SDimitry Andric ECase(SHT_FINI_ARRAY); 6870b57cec5SDimitry Andric ECase(SHT_PREINIT_ARRAY); 6880b57cec5SDimitry Andric ECase(SHT_GROUP); 6890b57cec5SDimitry Andric ECase(SHT_SYMTAB_SHNDX); 6900b57cec5SDimitry Andric ECase(SHT_RELR); 691*0fca6ea1SDimitry Andric ECase(SHT_CREL); 6920b57cec5SDimitry Andric ECase(SHT_ANDROID_REL); 6930b57cec5SDimitry Andric ECase(SHT_ANDROID_RELA); 6940b57cec5SDimitry Andric ECase(SHT_ANDROID_RELR); 6950b57cec5SDimitry Andric ECase(SHT_LLVM_ODRTAB); 6960b57cec5SDimitry Andric ECase(SHT_LLVM_LINKER_OPTIONS); 6970b57cec5SDimitry Andric ECase(SHT_LLVM_CALL_GRAPH_PROFILE); 6980b57cec5SDimitry Andric ECase(SHT_LLVM_ADDRSIG); 6990b57cec5SDimitry Andric ECase(SHT_LLVM_DEPENDENT_LIBRARIES); 7008bcb0991SDimitry Andric ECase(SHT_LLVM_SYMPART); 7018bcb0991SDimitry Andric ECase(SHT_LLVM_PART_EHDR); 7028bcb0991SDimitry Andric ECase(SHT_LLVM_PART_PHDR); 70381ad6265SDimitry Andric ECase(SHT_LLVM_BB_ADDR_MAP_V0); 704e8d8bef9SDimitry Andric ECase(SHT_LLVM_BB_ADDR_MAP); 705753f127fSDimitry Andric ECase(SHT_LLVM_OFFLOADING); 70606c3fb27SDimitry Andric ECase(SHT_LLVM_LTO); 7070b57cec5SDimitry Andric ECase(SHT_GNU_ATTRIBUTES); 7080b57cec5SDimitry Andric ECase(SHT_GNU_HASH); 7090b57cec5SDimitry Andric ECase(SHT_GNU_verdef); 7100b57cec5SDimitry Andric ECase(SHT_GNU_verneed); 7110b57cec5SDimitry Andric ECase(SHT_GNU_versym); 712e8d8bef9SDimitry Andric switch (Object->getMachine()) { 7130b57cec5SDimitry Andric case ELF::EM_ARM: 7140b57cec5SDimitry Andric ECase(SHT_ARM_EXIDX); 7150b57cec5SDimitry Andric ECase(SHT_ARM_PREEMPTMAP); 7160b57cec5SDimitry Andric ECase(SHT_ARM_ATTRIBUTES); 7170b57cec5SDimitry Andric ECase(SHT_ARM_DEBUGOVERLAY); 7180b57cec5SDimitry Andric ECase(SHT_ARM_OVERLAYSECTION); 7190b57cec5SDimitry Andric break; 7200b57cec5SDimitry Andric case ELF::EM_HEXAGON: 7210b57cec5SDimitry Andric ECase(SHT_HEX_ORDERED); 722*0fca6ea1SDimitry Andric ECase(SHT_HEXAGON_ATTRIBUTES); 7230b57cec5SDimitry Andric break; 7240b57cec5SDimitry Andric case ELF::EM_X86_64: 7250b57cec5SDimitry Andric ECase(SHT_X86_64_UNWIND); 7260b57cec5SDimitry Andric break; 7270b57cec5SDimitry Andric case ELF::EM_MIPS: 7280b57cec5SDimitry Andric ECase(SHT_MIPS_REGINFO); 7290b57cec5SDimitry Andric ECase(SHT_MIPS_OPTIONS); 7300b57cec5SDimitry Andric ECase(SHT_MIPS_DWARF); 7310b57cec5SDimitry Andric ECase(SHT_MIPS_ABIFLAGS); 7320b57cec5SDimitry Andric break; 7335ffd83dbSDimitry Andric case ELF::EM_RISCV: 7345ffd83dbSDimitry Andric ECase(SHT_RISCV_ATTRIBUTES); 7355ffd83dbSDimitry Andric break; 736349cc55cSDimitry Andric case ELF::EM_MSP430: 737349cc55cSDimitry Andric ECase(SHT_MSP430_ATTRIBUTES); 738349cc55cSDimitry Andric break; 73906c3fb27SDimitry Andric case ELF::EM_AARCH64: 7405f757f3fSDimitry Andric ECase(SHT_AARCH64_AUTH_RELR); 74106c3fb27SDimitry Andric ECase(SHT_AARCH64_MEMTAG_GLOBALS_STATIC); 74206c3fb27SDimitry Andric ECase(SHT_AARCH64_MEMTAG_GLOBALS_DYNAMIC); 74306c3fb27SDimitry Andric break; 7440b57cec5SDimitry Andric default: 7450b57cec5SDimitry Andric // Nothing to do. 7460b57cec5SDimitry Andric break; 7470b57cec5SDimitry Andric } 7480b57cec5SDimitry Andric #undef ECase 7490b57cec5SDimitry Andric IO.enumFallback<Hex32>(Value); 7500b57cec5SDimitry Andric } 7510b57cec5SDimitry Andric 7520b57cec5SDimitry Andric void ScalarBitSetTraits<ELFYAML::ELF_PF>::bitset(IO &IO, 7530b57cec5SDimitry Andric ELFYAML::ELF_PF &Value) { 7540b57cec5SDimitry Andric #define BCase(X) IO.bitSetCase(Value, #X, ELF::X) 7550b57cec5SDimitry Andric BCase(PF_X); 7560b57cec5SDimitry Andric BCase(PF_W); 7570b57cec5SDimitry Andric BCase(PF_R); 7580b57cec5SDimitry Andric } 7590b57cec5SDimitry Andric 7600b57cec5SDimitry Andric void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO, 7610b57cec5SDimitry Andric ELFYAML::ELF_SHF &Value) { 7620b57cec5SDimitry Andric const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); 7630b57cec5SDimitry Andric #define BCase(X) IO.bitSetCase(Value, #X, ELF::X) 7640b57cec5SDimitry Andric BCase(SHF_WRITE); 7650b57cec5SDimitry Andric BCase(SHF_ALLOC); 7660b57cec5SDimitry Andric BCase(SHF_EXCLUDE); 7670b57cec5SDimitry Andric BCase(SHF_EXECINSTR); 7680b57cec5SDimitry Andric BCase(SHF_MERGE); 7690b57cec5SDimitry Andric BCase(SHF_STRINGS); 7700b57cec5SDimitry Andric BCase(SHF_INFO_LINK); 7710b57cec5SDimitry Andric BCase(SHF_LINK_ORDER); 7720b57cec5SDimitry Andric BCase(SHF_OS_NONCONFORMING); 7730b57cec5SDimitry Andric BCase(SHF_GROUP); 7740b57cec5SDimitry Andric BCase(SHF_TLS); 7750b57cec5SDimitry Andric BCase(SHF_COMPRESSED); 77681ad6265SDimitry Andric switch (Object->getOSAbi()) { 77781ad6265SDimitry Andric case ELF::ELFOSABI_SOLARIS: 77881ad6265SDimitry Andric BCase(SHF_SUNW_NODISCARD); 77981ad6265SDimitry Andric break; 78081ad6265SDimitry Andric default: 781fe6060f1SDimitry Andric BCase(SHF_GNU_RETAIN); 78281ad6265SDimitry Andric break; 78381ad6265SDimitry Andric } 784e8d8bef9SDimitry Andric switch (Object->getMachine()) { 7850b57cec5SDimitry Andric case ELF::EM_ARM: 7860b57cec5SDimitry Andric BCase(SHF_ARM_PURECODE); 7870b57cec5SDimitry Andric break; 7880b57cec5SDimitry Andric case ELF::EM_HEXAGON: 7890b57cec5SDimitry Andric BCase(SHF_HEX_GPREL); 7900b57cec5SDimitry Andric break; 7910b57cec5SDimitry Andric case ELF::EM_MIPS: 7920b57cec5SDimitry Andric BCase(SHF_MIPS_NODUPES); 7930b57cec5SDimitry Andric BCase(SHF_MIPS_NAMES); 7940b57cec5SDimitry Andric BCase(SHF_MIPS_LOCAL); 7950b57cec5SDimitry Andric BCase(SHF_MIPS_NOSTRIP); 7960b57cec5SDimitry Andric BCase(SHF_MIPS_GPREL); 7970b57cec5SDimitry Andric BCase(SHF_MIPS_MERGE); 7980b57cec5SDimitry Andric BCase(SHF_MIPS_ADDR); 7990b57cec5SDimitry Andric BCase(SHF_MIPS_STRING); 8000b57cec5SDimitry Andric break; 8010b57cec5SDimitry Andric case ELF::EM_X86_64: 8020b57cec5SDimitry Andric BCase(SHF_X86_64_LARGE); 8030b57cec5SDimitry Andric break; 8040b57cec5SDimitry Andric default: 8050b57cec5SDimitry Andric // Nothing to do. 8060b57cec5SDimitry Andric break; 8070b57cec5SDimitry Andric } 8080b57cec5SDimitry Andric #undef BCase 8090b57cec5SDimitry Andric } 8100b57cec5SDimitry Andric 8110b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_SHN>::enumeration( 8120b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_SHN &Value) { 81381ad6265SDimitry Andric const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); 81481ad6265SDimitry Andric assert(Object && "The IO context is not initialized"); 8150b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 8160b57cec5SDimitry Andric ECase(SHN_UNDEF); 8170b57cec5SDimitry Andric ECase(SHN_LORESERVE); 8180b57cec5SDimitry Andric ECase(SHN_LOPROC); 8190b57cec5SDimitry Andric ECase(SHN_HIPROC); 8200b57cec5SDimitry Andric ECase(SHN_LOOS); 8210b57cec5SDimitry Andric ECase(SHN_HIOS); 8220b57cec5SDimitry Andric ECase(SHN_ABS); 8230b57cec5SDimitry Andric ECase(SHN_COMMON); 8240b57cec5SDimitry Andric ECase(SHN_XINDEX); 8250b57cec5SDimitry Andric ECase(SHN_HIRESERVE); 8260b57cec5SDimitry Andric ECase(SHN_AMDGPU_LDS); 82781ad6265SDimitry Andric 82881ad6265SDimitry Andric if (!IO.outputting() || Object->getMachine() == ELF::EM_MIPS) { 82981ad6265SDimitry Andric ECase(SHN_MIPS_ACOMMON); 83081ad6265SDimitry Andric ECase(SHN_MIPS_TEXT); 83181ad6265SDimitry Andric ECase(SHN_MIPS_DATA); 83281ad6265SDimitry Andric ECase(SHN_MIPS_SCOMMON); 83381ad6265SDimitry Andric ECase(SHN_MIPS_SUNDEFINED); 83481ad6265SDimitry Andric } 83581ad6265SDimitry Andric 8360b57cec5SDimitry Andric ECase(SHN_HEXAGON_SCOMMON); 8370b57cec5SDimitry Andric ECase(SHN_HEXAGON_SCOMMON_1); 8380b57cec5SDimitry Andric ECase(SHN_HEXAGON_SCOMMON_2); 8390b57cec5SDimitry Andric ECase(SHN_HEXAGON_SCOMMON_4); 8400b57cec5SDimitry Andric ECase(SHN_HEXAGON_SCOMMON_8); 8410b57cec5SDimitry Andric #undef ECase 8428bcb0991SDimitry Andric IO.enumFallback<Hex16>(Value); 8430b57cec5SDimitry Andric } 8440b57cec5SDimitry Andric 8450b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_STB>::enumeration( 8460b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_STB &Value) { 8470b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 8480b57cec5SDimitry Andric ECase(STB_LOCAL); 8490b57cec5SDimitry Andric ECase(STB_GLOBAL); 8500b57cec5SDimitry Andric ECase(STB_WEAK); 8510b57cec5SDimitry Andric ECase(STB_GNU_UNIQUE); 8520b57cec5SDimitry Andric #undef ECase 8530b57cec5SDimitry Andric IO.enumFallback<Hex8>(Value); 8540b57cec5SDimitry Andric } 8550b57cec5SDimitry Andric 8560b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_STT>::enumeration( 8570b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_STT &Value) { 8580b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 8590b57cec5SDimitry Andric ECase(STT_NOTYPE); 8600b57cec5SDimitry Andric ECase(STT_OBJECT); 8610b57cec5SDimitry Andric ECase(STT_FUNC); 8620b57cec5SDimitry Andric ECase(STT_SECTION); 8630b57cec5SDimitry Andric ECase(STT_FILE); 8640b57cec5SDimitry Andric ECase(STT_COMMON); 8650b57cec5SDimitry Andric ECase(STT_TLS); 8660b57cec5SDimitry Andric ECase(STT_GNU_IFUNC); 8670b57cec5SDimitry Andric #undef ECase 8680b57cec5SDimitry Andric IO.enumFallback<Hex8>(Value); 8690b57cec5SDimitry Andric } 8700b57cec5SDimitry Andric 8710b57cec5SDimitry Andric 8720b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_RSS>::enumeration( 8730b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_RSS &Value) { 8740b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, ELF::X) 8750b57cec5SDimitry Andric ECase(RSS_UNDEF); 8760b57cec5SDimitry Andric ECase(RSS_GP); 8770b57cec5SDimitry Andric ECase(RSS_GP0); 8780b57cec5SDimitry Andric ECase(RSS_LOC); 8790b57cec5SDimitry Andric #undef ECase 8800b57cec5SDimitry Andric } 8810b57cec5SDimitry Andric 8820b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration( 8830b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_REL &Value) { 8840b57cec5SDimitry Andric const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); 8850b57cec5SDimitry Andric assert(Object && "The IO context is not initialized"); 8860b57cec5SDimitry Andric #define ELF_RELOC(X, Y) IO.enumCase(Value, #X, ELF::X); 887e8d8bef9SDimitry Andric switch (Object->getMachine()) { 8880b57cec5SDimitry Andric case ELF::EM_X86_64: 8890b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/x86_64.def" 8900b57cec5SDimitry Andric break; 8910b57cec5SDimitry Andric case ELF::EM_MIPS: 8920b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/Mips.def" 8930b57cec5SDimitry Andric break; 8940b57cec5SDimitry Andric case ELF::EM_HEXAGON: 8950b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/Hexagon.def" 8960b57cec5SDimitry Andric break; 8970b57cec5SDimitry Andric case ELF::EM_386: 8980b57cec5SDimitry Andric case ELF::EM_IAMCU: 8990b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/i386.def" 9000b57cec5SDimitry Andric break; 9010b57cec5SDimitry Andric case ELF::EM_AARCH64: 9020b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/AArch64.def" 9030b57cec5SDimitry Andric break; 9040b57cec5SDimitry Andric case ELF::EM_ARM: 9050b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/ARM.def" 9060b57cec5SDimitry Andric break; 9070b57cec5SDimitry Andric case ELF::EM_ARC: 9080b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/ARC.def" 9090b57cec5SDimitry Andric break; 9100b57cec5SDimitry Andric case ELF::EM_RISCV: 9110b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/RISCV.def" 9120b57cec5SDimitry Andric break; 9130b57cec5SDimitry Andric case ELF::EM_LANAI: 9140b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/Lanai.def" 9150b57cec5SDimitry Andric break; 9160b57cec5SDimitry Andric case ELF::EM_AMDGPU: 9170b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def" 9180b57cec5SDimitry Andric break; 9190b57cec5SDimitry Andric case ELF::EM_BPF: 9200b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/BPF.def" 9210b57cec5SDimitry Andric break; 9225ffd83dbSDimitry Andric case ELF::EM_VE: 9235ffd83dbSDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/VE.def" 9245ffd83dbSDimitry Andric break; 925e8d8bef9SDimitry Andric case ELF::EM_CSKY: 926e8d8bef9SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/CSKY.def" 927e8d8bef9SDimitry Andric break; 9281838bd0fSDimitry Andric case ELF::EM_PPC: 9291838bd0fSDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/PowerPC.def" 9301838bd0fSDimitry Andric break; 9318bcb0991SDimitry Andric case ELF::EM_PPC64: 9328bcb0991SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def" 9338bcb0991SDimitry Andric break; 934fe6060f1SDimitry Andric case ELF::EM_68K: 935fe6060f1SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/M68k.def" 936fe6060f1SDimitry Andric break; 93781ad6265SDimitry Andric case ELF::EM_LOONGARCH: 93881ad6265SDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/LoongArch.def" 93981ad6265SDimitry Andric break; 940bdd1243dSDimitry Andric case ELF::EM_XTENSA: 941bdd1243dSDimitry Andric #include "llvm/BinaryFormat/ELFRelocs/Xtensa.def" 942bdd1243dSDimitry Andric break; 9430b57cec5SDimitry Andric default: 9448bcb0991SDimitry Andric // Nothing to do. 9458bcb0991SDimitry Andric break; 9460b57cec5SDimitry Andric } 9470b57cec5SDimitry Andric #undef ELF_RELOC 9480b57cec5SDimitry Andric IO.enumFallback<Hex32>(Value); 9490b57cec5SDimitry Andric } 9500b57cec5SDimitry Andric 9510b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::ELF_DYNTAG>::enumeration( 9520b57cec5SDimitry Andric IO &IO, ELFYAML::ELF_DYNTAG &Value) { 9530b57cec5SDimitry Andric const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); 9540b57cec5SDimitry Andric assert(Object && "The IO context is not initialized"); 9550b57cec5SDimitry Andric 9560b57cec5SDimitry Andric // Disable architecture specific tags by default. We might enable them below. 9570b57cec5SDimitry Andric #define AARCH64_DYNAMIC_TAG(name, value) 9580b57cec5SDimitry Andric #define MIPS_DYNAMIC_TAG(name, value) 9590b57cec5SDimitry Andric #define HEXAGON_DYNAMIC_TAG(name, value) 9600b57cec5SDimitry Andric #define PPC_DYNAMIC_TAG(name, value) 9610b57cec5SDimitry Andric #define PPC64_DYNAMIC_TAG(name, value) 9620b57cec5SDimitry Andric // Ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc. 9630b57cec5SDimitry Andric #define DYNAMIC_TAG_MARKER(name, value) 9640b57cec5SDimitry Andric 9650b57cec5SDimitry Andric #define STRINGIFY(X) (#X) 9660b57cec5SDimitry Andric #define DYNAMIC_TAG(X, Y) IO.enumCase(Value, STRINGIFY(DT_##X), ELF::DT_##X); 967e8d8bef9SDimitry Andric switch (Object->getMachine()) { 9680b57cec5SDimitry Andric case ELF::EM_AARCH64: 9690b57cec5SDimitry Andric #undef AARCH64_DYNAMIC_TAG 9700b57cec5SDimitry Andric #define AARCH64_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 9710b57cec5SDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 9720b57cec5SDimitry Andric #undef AARCH64_DYNAMIC_TAG 9730b57cec5SDimitry Andric #define AARCH64_DYNAMIC_TAG(name, value) 9740b57cec5SDimitry Andric break; 9750b57cec5SDimitry Andric case ELF::EM_MIPS: 9760b57cec5SDimitry Andric #undef MIPS_DYNAMIC_TAG 9770b57cec5SDimitry Andric #define MIPS_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 9780b57cec5SDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 9790b57cec5SDimitry Andric #undef MIPS_DYNAMIC_TAG 9800b57cec5SDimitry Andric #define MIPS_DYNAMIC_TAG(name, value) 9810b57cec5SDimitry Andric break; 9820b57cec5SDimitry Andric case ELF::EM_HEXAGON: 9830b57cec5SDimitry Andric #undef HEXAGON_DYNAMIC_TAG 9840b57cec5SDimitry Andric #define HEXAGON_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 9850b57cec5SDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 9860b57cec5SDimitry Andric #undef HEXAGON_DYNAMIC_TAG 9870b57cec5SDimitry Andric #define HEXAGON_DYNAMIC_TAG(name, value) 9880b57cec5SDimitry Andric break; 9890b57cec5SDimitry Andric case ELF::EM_PPC: 9900b57cec5SDimitry Andric #undef PPC_DYNAMIC_TAG 9910b57cec5SDimitry Andric #define PPC_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 9920b57cec5SDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 9930b57cec5SDimitry Andric #undef PPC_DYNAMIC_TAG 9940b57cec5SDimitry Andric #define PPC_DYNAMIC_TAG(name, value) 9950b57cec5SDimitry Andric break; 9960b57cec5SDimitry Andric case ELF::EM_PPC64: 9970b57cec5SDimitry Andric #undef PPC64_DYNAMIC_TAG 9980b57cec5SDimitry Andric #define PPC64_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 9990b57cec5SDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 10000b57cec5SDimitry Andric #undef PPC64_DYNAMIC_TAG 10010b57cec5SDimitry Andric #define PPC64_DYNAMIC_TAG(name, value) 10020b57cec5SDimitry Andric break; 1003349cc55cSDimitry Andric case ELF::EM_RISCV: 1004349cc55cSDimitry Andric #undef RISCV_DYNAMIC_TAG 1005349cc55cSDimitry Andric #define RISCV_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 1006349cc55cSDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 1007349cc55cSDimitry Andric #undef RISCV_DYNAMIC_TAG 1008349cc55cSDimitry Andric #define RISCV_DYNAMIC_TAG(name, value) 1009349cc55cSDimitry Andric break; 10100b57cec5SDimitry Andric default: 10110b57cec5SDimitry Andric #include "llvm/BinaryFormat/DynamicTags.def" 10120b57cec5SDimitry Andric break; 10130b57cec5SDimitry Andric } 10140b57cec5SDimitry Andric #undef AARCH64_DYNAMIC_TAG 10150b57cec5SDimitry Andric #undef MIPS_DYNAMIC_TAG 10160b57cec5SDimitry Andric #undef HEXAGON_DYNAMIC_TAG 10170b57cec5SDimitry Andric #undef PPC_DYNAMIC_TAG 10180b57cec5SDimitry Andric #undef PPC64_DYNAMIC_TAG 10190b57cec5SDimitry Andric #undef DYNAMIC_TAG_MARKER 10200b57cec5SDimitry Andric #undef STRINGIFY 10210b57cec5SDimitry Andric #undef DYNAMIC_TAG 10220b57cec5SDimitry Andric 10230b57cec5SDimitry Andric IO.enumFallback<Hex64>(Value); 10240b57cec5SDimitry Andric } 10250b57cec5SDimitry Andric 10260b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::MIPS_AFL_REG>::enumeration( 10270b57cec5SDimitry Andric IO &IO, ELFYAML::MIPS_AFL_REG &Value) { 10280b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, Mips::AFL_##X) 10290b57cec5SDimitry Andric ECase(REG_NONE); 10300b57cec5SDimitry Andric ECase(REG_32); 10310b57cec5SDimitry Andric ECase(REG_64); 10320b57cec5SDimitry Andric ECase(REG_128); 10330b57cec5SDimitry Andric #undef ECase 10340b57cec5SDimitry Andric } 10350b57cec5SDimitry Andric 10360b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::MIPS_ABI_FP>::enumeration( 10370b57cec5SDimitry Andric IO &IO, ELFYAML::MIPS_ABI_FP &Value) { 10380b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, Mips::Val_GNU_MIPS_ABI_##X) 10390b57cec5SDimitry Andric ECase(FP_ANY); 10400b57cec5SDimitry Andric ECase(FP_DOUBLE); 10410b57cec5SDimitry Andric ECase(FP_SINGLE); 10420b57cec5SDimitry Andric ECase(FP_SOFT); 10430b57cec5SDimitry Andric ECase(FP_OLD_64); 10440b57cec5SDimitry Andric ECase(FP_XX); 10450b57cec5SDimitry Andric ECase(FP_64); 10460b57cec5SDimitry Andric ECase(FP_64A); 10470b57cec5SDimitry Andric #undef ECase 10480b57cec5SDimitry Andric } 10490b57cec5SDimitry Andric 10500b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::MIPS_AFL_EXT>::enumeration( 10510b57cec5SDimitry Andric IO &IO, ELFYAML::MIPS_AFL_EXT &Value) { 10520b57cec5SDimitry Andric #define ECase(X) IO.enumCase(Value, #X, Mips::AFL_##X) 10530b57cec5SDimitry Andric ECase(EXT_NONE); 10540b57cec5SDimitry Andric ECase(EXT_XLR); 10550b57cec5SDimitry Andric ECase(EXT_OCTEON2); 10560b57cec5SDimitry Andric ECase(EXT_OCTEONP); 10570b57cec5SDimitry Andric ECase(EXT_LOONGSON_3A); 10580b57cec5SDimitry Andric ECase(EXT_OCTEON); 10590b57cec5SDimitry Andric ECase(EXT_5900); 10600b57cec5SDimitry Andric ECase(EXT_4650); 10610b57cec5SDimitry Andric ECase(EXT_4010); 10620b57cec5SDimitry Andric ECase(EXT_4100); 10630b57cec5SDimitry Andric ECase(EXT_3900); 10640b57cec5SDimitry Andric ECase(EXT_10000); 10650b57cec5SDimitry Andric ECase(EXT_SB1); 10660b57cec5SDimitry Andric ECase(EXT_4111); 10670b57cec5SDimitry Andric ECase(EXT_4120); 10680b57cec5SDimitry Andric ECase(EXT_5400); 10690b57cec5SDimitry Andric ECase(EXT_5500); 10700b57cec5SDimitry Andric ECase(EXT_LOONGSON_2E); 10710b57cec5SDimitry Andric ECase(EXT_LOONGSON_2F); 10720b57cec5SDimitry Andric ECase(EXT_OCTEON3); 10730b57cec5SDimitry Andric #undef ECase 10740b57cec5SDimitry Andric } 10750b57cec5SDimitry Andric 10760b57cec5SDimitry Andric void ScalarEnumerationTraits<ELFYAML::MIPS_ISA>::enumeration( 10770b57cec5SDimitry Andric IO &IO, ELFYAML::MIPS_ISA &Value) { 10780b57cec5SDimitry Andric IO.enumCase(Value, "MIPS1", 1); 10790b57cec5SDimitry Andric IO.enumCase(Value, "MIPS2", 2); 10800b57cec5SDimitry Andric IO.enumCase(Value, "MIPS3", 3); 10810b57cec5SDimitry Andric IO.enumCase(Value, "MIPS4", 4); 10820b57cec5SDimitry Andric IO.enumCase(Value, "MIPS5", 5); 10830b57cec5SDimitry Andric IO.enumCase(Value, "MIPS32", 32); 10840b57cec5SDimitry Andric IO.enumCase(Value, "MIPS64", 64); 1085e8d8bef9SDimitry Andric IO.enumFallback<Hex32>(Value); 10860b57cec5SDimitry Andric } 10870b57cec5SDimitry Andric 10880b57cec5SDimitry Andric void ScalarBitSetTraits<ELFYAML::MIPS_AFL_ASE>::bitset( 10890b57cec5SDimitry Andric IO &IO, ELFYAML::MIPS_AFL_ASE &Value) { 10900b57cec5SDimitry Andric #define BCase(X) IO.bitSetCase(Value, #X, Mips::AFL_ASE_##X) 10910b57cec5SDimitry Andric BCase(DSP); 10920b57cec5SDimitry Andric BCase(DSPR2); 10930b57cec5SDimitry Andric BCase(EVA); 10940b57cec5SDimitry Andric BCase(MCU); 10950b57cec5SDimitry Andric BCase(MDMX); 10960b57cec5SDimitry Andric BCase(MIPS3D); 10970b57cec5SDimitry Andric BCase(MT); 10980b57cec5SDimitry Andric BCase(SMARTMIPS); 10990b57cec5SDimitry Andric BCase(VIRT); 11000b57cec5SDimitry Andric BCase(MSA); 11010b57cec5SDimitry Andric BCase(MIPS16); 11020b57cec5SDimitry Andric BCase(MICROMIPS); 11030b57cec5SDimitry Andric BCase(XPA); 1104e8d8bef9SDimitry Andric BCase(CRC); 1105e8d8bef9SDimitry Andric BCase(GINV); 11060b57cec5SDimitry Andric #undef BCase 11070b57cec5SDimitry Andric } 11080b57cec5SDimitry Andric 11090b57cec5SDimitry Andric void ScalarBitSetTraits<ELFYAML::MIPS_AFL_FLAGS1>::bitset( 11100b57cec5SDimitry Andric IO &IO, ELFYAML::MIPS_AFL_FLAGS1 &Value) { 11110b57cec5SDimitry Andric #define BCase(X) IO.bitSetCase(Value, #X, Mips::AFL_FLAGS1_##X) 11120b57cec5SDimitry Andric BCase(ODDSPREG); 11130b57cec5SDimitry Andric #undef BCase 11140b57cec5SDimitry Andric } 11150b57cec5SDimitry Andric 11165ffd83dbSDimitry Andric void MappingTraits<ELFYAML::SectionHeader>::mapping( 11175ffd83dbSDimitry Andric IO &IO, ELFYAML::SectionHeader &SHdr) { 11185ffd83dbSDimitry Andric IO.mapRequired("Name", SHdr.Name); 11195ffd83dbSDimitry Andric } 11205ffd83dbSDimitry Andric 11210b57cec5SDimitry Andric void MappingTraits<ELFYAML::FileHeader>::mapping(IO &IO, 11220b57cec5SDimitry Andric ELFYAML::FileHeader &FileHdr) { 11230b57cec5SDimitry Andric IO.mapRequired("Class", FileHdr.Class); 11240b57cec5SDimitry Andric IO.mapRequired("Data", FileHdr.Data); 11250b57cec5SDimitry Andric IO.mapOptional("OSABI", FileHdr.OSABI, ELFYAML::ELF_ELFOSABI(0)); 11260b57cec5SDimitry Andric IO.mapOptional("ABIVersion", FileHdr.ABIVersion, Hex8(0)); 11270b57cec5SDimitry Andric IO.mapRequired("Type", FileHdr.Type); 1128e8d8bef9SDimitry Andric IO.mapOptional("Machine", FileHdr.Machine); 11290b57cec5SDimitry Andric IO.mapOptional("Flags", FileHdr.Flags, ELFYAML::ELF_EF(0)); 11300b57cec5SDimitry Andric IO.mapOptional("Entry", FileHdr.Entry, Hex64(0)); 1131fe6060f1SDimitry Andric IO.mapOptional("SectionHeaderStringTable", FileHdr.SectionHeaderStringTable); 11320b57cec5SDimitry Andric 11335ffd83dbSDimitry Andric // obj2yaml does not dump these fields. 11345ffd83dbSDimitry Andric assert(!IO.outputting() || 11355ffd83dbSDimitry Andric (!FileHdr.EPhOff && !FileHdr.EPhEntSize && !FileHdr.EPhNum)); 11365ffd83dbSDimitry Andric IO.mapOptional("EPhOff", FileHdr.EPhOff); 11375ffd83dbSDimitry Andric IO.mapOptional("EPhEntSize", FileHdr.EPhEntSize); 11385ffd83dbSDimitry Andric IO.mapOptional("EPhNum", FileHdr.EPhNum); 11395ffd83dbSDimitry Andric IO.mapOptional("EShEntSize", FileHdr.EShEntSize); 11405ffd83dbSDimitry Andric IO.mapOptional("EShOff", FileHdr.EShOff); 11415ffd83dbSDimitry Andric IO.mapOptional("EShNum", FileHdr.EShNum); 11425ffd83dbSDimitry Andric IO.mapOptional("EShStrNdx", FileHdr.EShStrNdx); 11430b57cec5SDimitry Andric } 11440b57cec5SDimitry Andric 11450b57cec5SDimitry Andric void MappingTraits<ELFYAML::ProgramHeader>::mapping( 11460b57cec5SDimitry Andric IO &IO, ELFYAML::ProgramHeader &Phdr) { 11470b57cec5SDimitry Andric IO.mapRequired("Type", Phdr.Type); 11480b57cec5SDimitry Andric IO.mapOptional("Flags", Phdr.Flags, ELFYAML::ELF_PF(0)); 1149e8d8bef9SDimitry Andric IO.mapOptional("FirstSec", Phdr.FirstSec); 1150e8d8bef9SDimitry Andric IO.mapOptional("LastSec", Phdr.LastSec); 11510b57cec5SDimitry Andric IO.mapOptional("VAddr", Phdr.VAddr, Hex64(0)); 11525ffd83dbSDimitry Andric IO.mapOptional("PAddr", Phdr.PAddr, Phdr.VAddr); 11530b57cec5SDimitry Andric IO.mapOptional("Align", Phdr.Align); 11540b57cec5SDimitry Andric IO.mapOptional("FileSize", Phdr.FileSize); 11550b57cec5SDimitry Andric IO.mapOptional("MemSize", Phdr.MemSize); 11560b57cec5SDimitry Andric IO.mapOptional("Offset", Phdr.Offset); 11570b57cec5SDimitry Andric } 11580b57cec5SDimitry Andric 1159e8d8bef9SDimitry Andric std::string MappingTraits<ELFYAML::ProgramHeader>::validate( 1160e8d8bef9SDimitry Andric IO &IO, ELFYAML::ProgramHeader &FileHdr) { 1161e8d8bef9SDimitry Andric if (!FileHdr.FirstSec && FileHdr.LastSec) 1162e8d8bef9SDimitry Andric return "the \"LastSec\" key can't be used without the \"FirstSec\" key"; 1163e8d8bef9SDimitry Andric if (FileHdr.FirstSec && !FileHdr.LastSec) 1164e8d8bef9SDimitry Andric return "the \"FirstSec\" key can't be used without the \"LastSec\" key"; 1165e8d8bef9SDimitry Andric return ""; 1166e8d8bef9SDimitry Andric } 1167e8d8bef9SDimitry Andric 11688bcb0991SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(StringRef, StOtherPiece) 11698bcb0991SDimitry Andric 11708bcb0991SDimitry Andric template <> struct ScalarTraits<StOtherPiece> { 11718bcb0991SDimitry Andric static void output(const StOtherPiece &Val, void *, raw_ostream &Out) { 11728bcb0991SDimitry Andric Out << Val; 11738bcb0991SDimitry Andric } 11748bcb0991SDimitry Andric static StringRef input(StringRef Scalar, void *, StOtherPiece &Val) { 11758bcb0991SDimitry Andric Val = Scalar; 11768bcb0991SDimitry Andric return {}; 11778bcb0991SDimitry Andric } 11788bcb0991SDimitry Andric static QuotingType mustQuote(StringRef) { return QuotingType::None; } 11798bcb0991SDimitry Andric }; 11808bcb0991SDimitry Andric template <> struct SequenceElementTraits<StOtherPiece> { 11818bcb0991SDimitry Andric static const bool flow = true; 11828bcb0991SDimitry Andric }; 11838bcb0991SDimitry Andric 1184480093f4SDimitry Andric template <> struct ScalarTraits<ELFYAML::YAMLFlowString> { 1185480093f4SDimitry Andric static void output(const ELFYAML::YAMLFlowString &Val, void *, 1186480093f4SDimitry Andric raw_ostream &Out) { 1187480093f4SDimitry Andric Out << Val; 1188480093f4SDimitry Andric } 1189480093f4SDimitry Andric static StringRef input(StringRef Scalar, void *, 1190480093f4SDimitry Andric ELFYAML::YAMLFlowString &Val) { 1191480093f4SDimitry Andric Val = Scalar; 1192480093f4SDimitry Andric return {}; 1193480093f4SDimitry Andric } 1194480093f4SDimitry Andric static QuotingType mustQuote(StringRef S) { 1195480093f4SDimitry Andric return ScalarTraits<StringRef>::mustQuote(S); 1196480093f4SDimitry Andric } 1197480093f4SDimitry Andric }; 1198480093f4SDimitry Andric template <> struct SequenceElementTraits<ELFYAML::YAMLFlowString> { 1199480093f4SDimitry Andric static const bool flow = true; 1200480093f4SDimitry Andric }; 1201480093f4SDimitry Andric 12020b57cec5SDimitry Andric namespace { 12030b57cec5SDimitry Andric 12040b57cec5SDimitry Andric struct NormalizedOther { 12058bcb0991SDimitry Andric NormalizedOther(IO &IO) : YamlIO(IO) {} 1206bdd1243dSDimitry Andric NormalizedOther(IO &IO, std::optional<uint8_t> Original) : YamlIO(IO) { 12078bcb0991SDimitry Andric assert(Original && "This constructor is only used for outputting YAML and " 12088bcb0991SDimitry Andric "assumes a non-empty Original"); 12098bcb0991SDimitry Andric std::vector<StOtherPiece> Ret; 12108bcb0991SDimitry Andric const auto *Object = static_cast<ELFYAML::Object *>(YamlIO.getContext()); 12118bcb0991SDimitry Andric for (std::pair<StringRef, uint8_t> &P : 1212e8d8bef9SDimitry Andric getFlags(Object->getMachine()).takeVector()) { 12138bcb0991SDimitry Andric uint8_t FlagValue = P.second; 12148bcb0991SDimitry Andric if ((*Original & FlagValue) != FlagValue) 12158bcb0991SDimitry Andric continue; 12168bcb0991SDimitry Andric *Original &= ~FlagValue; 12178bcb0991SDimitry Andric Ret.push_back({P.first}); 12188bcb0991SDimitry Andric } 12190b57cec5SDimitry Andric 12208bcb0991SDimitry Andric if (*Original != 0) { 12218bcb0991SDimitry Andric UnknownFlagsHolder = std::to_string(*Original); 12228bcb0991SDimitry Andric Ret.push_back({UnknownFlagsHolder}); 12238bcb0991SDimitry Andric } 12240b57cec5SDimitry Andric 12258bcb0991SDimitry Andric if (!Ret.empty()) 12268bcb0991SDimitry Andric Other = std::move(Ret); 12278bcb0991SDimitry Andric } 12288bcb0991SDimitry Andric 12298bcb0991SDimitry Andric uint8_t toValue(StringRef Name) { 12308bcb0991SDimitry Andric const auto *Object = static_cast<ELFYAML::Object *>(YamlIO.getContext()); 1231e8d8bef9SDimitry Andric MapVector<StringRef, uint8_t> Flags = getFlags(Object->getMachine()); 12328bcb0991SDimitry Andric 12338bcb0991SDimitry Andric auto It = Flags.find(Name); 12348bcb0991SDimitry Andric if (It != Flags.end()) 12358bcb0991SDimitry Andric return It->second; 12368bcb0991SDimitry Andric 12378bcb0991SDimitry Andric uint8_t Val; 12388bcb0991SDimitry Andric if (to_integer(Name, Val)) 12398bcb0991SDimitry Andric return Val; 12408bcb0991SDimitry Andric 12418bcb0991SDimitry Andric YamlIO.setError("an unknown value is used for symbol's 'Other' field: " + 12428bcb0991SDimitry Andric Name); 12438bcb0991SDimitry Andric return 0; 12448bcb0991SDimitry Andric } 12458bcb0991SDimitry Andric 1246bdd1243dSDimitry Andric std::optional<uint8_t> denormalize(IO &) { 12478bcb0991SDimitry Andric if (!Other) 1248bdd1243dSDimitry Andric return std::nullopt; 12498bcb0991SDimitry Andric uint8_t Ret = 0; 12508bcb0991SDimitry Andric for (StOtherPiece &Val : *Other) 12518bcb0991SDimitry Andric Ret |= toValue(Val); 12528bcb0991SDimitry Andric return Ret; 12538bcb0991SDimitry Andric } 12548bcb0991SDimitry Andric 12558bcb0991SDimitry Andric // st_other field is used to encode symbol visibility and platform-dependent 12568bcb0991SDimitry Andric // flags and values. This method returns a name to value map that is used for 12578bcb0991SDimitry Andric // parsing and encoding this field. 12588bcb0991SDimitry Andric MapVector<StringRef, uint8_t> getFlags(unsigned EMachine) { 12598bcb0991SDimitry Andric MapVector<StringRef, uint8_t> Map; 12608bcb0991SDimitry Andric // STV_* values are just enumeration values. We add them in a reversed order 12618bcb0991SDimitry Andric // because when we convert the st_other to named constants when printing 12628bcb0991SDimitry Andric // YAML we want to use a maximum number of bits on each step: 12638bcb0991SDimitry Andric // when we have st_other == 3, we want to print it as STV_PROTECTED (3), but 12648bcb0991SDimitry Andric // not as STV_HIDDEN (2) + STV_INTERNAL (1). 12658bcb0991SDimitry Andric Map["STV_PROTECTED"] = ELF::STV_PROTECTED; 12668bcb0991SDimitry Andric Map["STV_HIDDEN"] = ELF::STV_HIDDEN; 12678bcb0991SDimitry Andric Map["STV_INTERNAL"] = ELF::STV_INTERNAL; 12688bcb0991SDimitry Andric // STV_DEFAULT is used to represent the default visibility and has a value 12698bcb0991SDimitry Andric // 0. We want to be able to read it from YAML documents, but there is no 12708bcb0991SDimitry Andric // reason to print it. 12718bcb0991SDimitry Andric if (!YamlIO.outputting()) 12728bcb0991SDimitry Andric Map["STV_DEFAULT"] = ELF::STV_DEFAULT; 12738bcb0991SDimitry Andric 12748bcb0991SDimitry Andric // MIPS is not consistent. All of the STO_MIPS_* values are bit flags, 12758bcb0991SDimitry Andric // except STO_MIPS_MIPS16 which overlaps them. It should be checked and 12768bcb0991SDimitry Andric // consumed first when we print the output, because we do not want to print 12778bcb0991SDimitry Andric // any other flags that have the same bits instead. 12788bcb0991SDimitry Andric if (EMachine == ELF::EM_MIPS) { 12798bcb0991SDimitry Andric Map["STO_MIPS_MIPS16"] = ELF::STO_MIPS_MIPS16; 12808bcb0991SDimitry Andric Map["STO_MIPS_MICROMIPS"] = ELF::STO_MIPS_MICROMIPS; 12818bcb0991SDimitry Andric Map["STO_MIPS_PIC"] = ELF::STO_MIPS_PIC; 12828bcb0991SDimitry Andric Map["STO_MIPS_PLT"] = ELF::STO_MIPS_PLT; 12838bcb0991SDimitry Andric Map["STO_MIPS_OPTIONAL"] = ELF::STO_MIPS_OPTIONAL; 12848bcb0991SDimitry Andric } 1285e8d8bef9SDimitry Andric 1286e8d8bef9SDimitry Andric if (EMachine == ELF::EM_AARCH64) 1287e8d8bef9SDimitry Andric Map["STO_AARCH64_VARIANT_PCS"] = ELF::STO_AARCH64_VARIANT_PCS; 1288349cc55cSDimitry Andric if (EMachine == ELF::EM_RISCV) 1289349cc55cSDimitry Andric Map["STO_RISCV_VARIANT_CC"] = ELF::STO_RISCV_VARIANT_CC; 12908bcb0991SDimitry Andric return Map; 12918bcb0991SDimitry Andric } 12928bcb0991SDimitry Andric 12938bcb0991SDimitry Andric IO &YamlIO; 1294bdd1243dSDimitry Andric std::optional<std::vector<StOtherPiece>> Other; 12958bcb0991SDimitry Andric std::string UnknownFlagsHolder; 12960b57cec5SDimitry Andric }; 12970b57cec5SDimitry Andric 12980b57cec5SDimitry Andric } // end anonymous namespace 12990b57cec5SDimitry Andric 13005ffd83dbSDimitry Andric void ScalarTraits<ELFYAML::YAMLIntUInt>::output(const ELFYAML::YAMLIntUInt &Val, 13015ffd83dbSDimitry Andric void *Ctx, raw_ostream &Out) { 13025ffd83dbSDimitry Andric Out << Val; 13035ffd83dbSDimitry Andric } 13045ffd83dbSDimitry Andric 13055ffd83dbSDimitry Andric StringRef ScalarTraits<ELFYAML::YAMLIntUInt>::input(StringRef Scalar, void *Ctx, 13065ffd83dbSDimitry Andric ELFYAML::YAMLIntUInt &Val) { 13075ffd83dbSDimitry Andric const bool Is64 = static_cast<ELFYAML::Object *>(Ctx)->Header.Class == 13085ffd83dbSDimitry Andric ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64); 13095ffd83dbSDimitry Andric StringRef ErrMsg = "invalid number"; 13105ffd83dbSDimitry Andric // We do not accept negative hex numbers because their meaning is ambiguous. 13115ffd83dbSDimitry Andric // For example, would -0xfffffffff mean 1 or INT32_MIN? 13125f757f3fSDimitry Andric if (Scalar.empty() || Scalar.starts_with("-0x")) 13135ffd83dbSDimitry Andric return ErrMsg; 13145ffd83dbSDimitry Andric 13155f757f3fSDimitry Andric if (Scalar.starts_with("-")) { 13165ffd83dbSDimitry Andric const int64_t MinVal = Is64 ? INT64_MIN : INT32_MIN; 13175ffd83dbSDimitry Andric long long Int; 13185ffd83dbSDimitry Andric if (getAsSignedInteger(Scalar, /*Radix=*/0, Int) || (Int < MinVal)) 13195ffd83dbSDimitry Andric return ErrMsg; 13205ffd83dbSDimitry Andric Val = Int; 13215ffd83dbSDimitry Andric return ""; 13225ffd83dbSDimitry Andric } 13235ffd83dbSDimitry Andric 13245ffd83dbSDimitry Andric const uint64_t MaxVal = Is64 ? UINT64_MAX : UINT32_MAX; 13255ffd83dbSDimitry Andric unsigned long long UInt; 13265ffd83dbSDimitry Andric if (getAsUnsignedInteger(Scalar, /*Radix=*/0, UInt) || (UInt > MaxVal)) 13275ffd83dbSDimitry Andric return ErrMsg; 13285ffd83dbSDimitry Andric Val = UInt; 13295ffd83dbSDimitry Andric return ""; 13305ffd83dbSDimitry Andric } 13315ffd83dbSDimitry Andric 13320b57cec5SDimitry Andric void MappingTraits<ELFYAML::Symbol>::mapping(IO &IO, ELFYAML::Symbol &Symbol) { 13330b57cec5SDimitry Andric IO.mapOptional("Name", Symbol.Name, StringRef()); 13345ffd83dbSDimitry Andric IO.mapOptional("StName", Symbol.StName); 13350b57cec5SDimitry Andric IO.mapOptional("Type", Symbol.Type, ELFYAML::ELF_STT(0)); 1336e8d8bef9SDimitry Andric IO.mapOptional("Section", Symbol.Section); 13370b57cec5SDimitry Andric IO.mapOptional("Index", Symbol.Index); 13380b57cec5SDimitry Andric IO.mapOptional("Binding", Symbol.Binding, ELFYAML::ELF_STB(0)); 1339e8d8bef9SDimitry Andric IO.mapOptional("Value", Symbol.Value); 1340e8d8bef9SDimitry Andric IO.mapOptional("Size", Symbol.Size); 13418bcb0991SDimitry Andric 13428bcb0991SDimitry Andric // Symbol's Other field is a bit special. It is usually a field that 13438bcb0991SDimitry Andric // represents st_other and holds the symbol visibility. However, on some 1344bdd1243dSDimitry Andric // platforms, it can contain bit fields and regular values, or even sometimes 1345bdd1243dSDimitry Andric // a crazy mix of them (see comments for NormalizedOther). Because of this, we 13468bcb0991SDimitry Andric // need special handling. 1347bdd1243dSDimitry Andric MappingNormalization<NormalizedOther, std::optional<uint8_t>> Keys( 1348bdd1243dSDimitry Andric IO, Symbol.Other); 13498bcb0991SDimitry Andric IO.mapOptional("Other", Keys->Other); 13500b57cec5SDimitry Andric } 13510b57cec5SDimitry Andric 1352e8d8bef9SDimitry Andric std::string MappingTraits<ELFYAML::Symbol>::validate(IO &IO, 13530b57cec5SDimitry Andric ELFYAML::Symbol &Symbol) { 1354e8d8bef9SDimitry Andric if (Symbol.Index && Symbol.Section) 13550b57cec5SDimitry Andric return "Index and Section cannot both be specified for Symbol"; 1356e8d8bef9SDimitry Andric return ""; 13570b57cec5SDimitry Andric } 13580b57cec5SDimitry Andric 13590b57cec5SDimitry Andric static void commonSectionMapping(IO &IO, ELFYAML::Section &Section) { 13600b57cec5SDimitry Andric IO.mapOptional("Name", Section.Name, StringRef()); 13610b57cec5SDimitry Andric IO.mapRequired("Type", Section.Type); 13620b57cec5SDimitry Andric IO.mapOptional("Flags", Section.Flags); 13635ffd83dbSDimitry Andric IO.mapOptional("Address", Section.Address); 1364e8d8bef9SDimitry Andric IO.mapOptional("Link", Section.Link); 13650b57cec5SDimitry Andric IO.mapOptional("AddressAlign", Section.AddressAlign, Hex64(0)); 13660b57cec5SDimitry Andric IO.mapOptional("EntSize", Section.EntSize); 13675ffd83dbSDimitry Andric IO.mapOptional("Offset", Section.Offset); 13680b57cec5SDimitry Andric 1369e8d8bef9SDimitry Andric IO.mapOptional("Content", Section.Content); 1370e8d8bef9SDimitry Andric IO.mapOptional("Size", Section.Size); 1371e8d8bef9SDimitry Andric 13720b57cec5SDimitry Andric // obj2yaml does not dump these fields. They are expected to be empty when we 13738bcb0991SDimitry Andric // are producing YAML, because yaml2obj sets appropriate values for them 13748bcb0991SDimitry Andric // automatically when they are not explicitly defined. 13750b57cec5SDimitry Andric assert(!IO.outputting() || 1376e8d8bef9SDimitry Andric (!Section.ShOffset && !Section.ShSize && !Section.ShName && 1377e8d8bef9SDimitry Andric !Section.ShFlags && !Section.ShType && !Section.ShAddrAlign)); 1378e8d8bef9SDimitry Andric IO.mapOptional("ShAddrAlign", Section.ShAddrAlign); 13798bcb0991SDimitry Andric IO.mapOptional("ShName", Section.ShName); 13800b57cec5SDimitry Andric IO.mapOptional("ShOffset", Section.ShOffset); 13810b57cec5SDimitry Andric IO.mapOptional("ShSize", Section.ShSize); 1382480093f4SDimitry Andric IO.mapOptional("ShFlags", Section.ShFlags); 1383e8d8bef9SDimitry Andric IO.mapOptional("ShType", Section.ShType); 13840b57cec5SDimitry Andric } 13850b57cec5SDimitry Andric 13860b57cec5SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::DynamicSection &Section) { 13870b57cec5SDimitry Andric commonSectionMapping(IO, Section); 13880b57cec5SDimitry Andric IO.mapOptional("Entries", Section.Entries); 13890b57cec5SDimitry Andric } 13900b57cec5SDimitry Andric 13910b57cec5SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) { 13920b57cec5SDimitry Andric commonSectionMapping(IO, Section); 13935ffd83dbSDimitry Andric 13945ffd83dbSDimitry Andric // We also support reading a content as array of bytes using the ContentArray 13955ffd83dbSDimitry Andric // key. obj2yaml never prints this field. 139681ad6265SDimitry Andric assert(!IO.outputting() || !Section.ContentBuf); 13975ffd83dbSDimitry Andric IO.mapOptional("ContentArray", Section.ContentBuf); 13985ffd83dbSDimitry Andric if (Section.ContentBuf) { 13995ffd83dbSDimitry Andric if (Section.Content) 14005ffd83dbSDimitry Andric IO.setError("Content and ContentArray can't be used together"); 14015ffd83dbSDimitry Andric Section.Content = yaml::BinaryRef(*Section.ContentBuf); 14025ffd83dbSDimitry Andric } 14035ffd83dbSDimitry Andric 14040b57cec5SDimitry Andric IO.mapOptional("Info", Section.Info); 14050b57cec5SDimitry Andric } 14060b57cec5SDimitry Andric 1407e8d8bef9SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::BBAddrMapSection &Section) { 1408e8d8bef9SDimitry Andric commonSectionMapping(IO, Section); 1409e8d8bef9SDimitry Andric IO.mapOptional("Content", Section.Content); 1410e8d8bef9SDimitry Andric IO.mapOptional("Entries", Section.Entries); 14115f757f3fSDimitry Andric IO.mapOptional("PGOAnalyses", Section.PGOAnalyses); 1412e8d8bef9SDimitry Andric } 1413e8d8bef9SDimitry Andric 14148bcb0991SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::StackSizesSection &Section) { 14158bcb0991SDimitry Andric commonSectionMapping(IO, Section); 14168bcb0991SDimitry Andric IO.mapOptional("Entries", Section.Entries); 14178bcb0991SDimitry Andric } 14188bcb0991SDimitry Andric 14198bcb0991SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::HashSection &Section) { 14208bcb0991SDimitry Andric commonSectionMapping(IO, Section); 14218bcb0991SDimitry Andric IO.mapOptional("Bucket", Section.Bucket); 14228bcb0991SDimitry Andric IO.mapOptional("Chain", Section.Chain); 14235ffd83dbSDimitry Andric 14245ffd83dbSDimitry Andric // obj2yaml does not dump these fields. They can be used to override nchain 14255ffd83dbSDimitry Andric // and nbucket values for creating broken sections. 142681ad6265SDimitry Andric assert(!IO.outputting() || (!Section.NBucket && !Section.NChain)); 14275ffd83dbSDimitry Andric IO.mapOptional("NChain", Section.NChain); 14285ffd83dbSDimitry Andric IO.mapOptional("NBucket", Section.NBucket); 14298bcb0991SDimitry Andric } 14308bcb0991SDimitry Andric 1431480093f4SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::NoteSection &Section) { 1432480093f4SDimitry Andric commonSectionMapping(IO, Section); 1433480093f4SDimitry Andric IO.mapOptional("Notes", Section.Notes); 1434480093f4SDimitry Andric } 1435480093f4SDimitry Andric 1436480093f4SDimitry Andric 1437480093f4SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::GnuHashSection &Section) { 1438480093f4SDimitry Andric commonSectionMapping(IO, Section); 1439480093f4SDimitry Andric IO.mapOptional("Header", Section.Header); 1440480093f4SDimitry Andric IO.mapOptional("BloomFilter", Section.BloomFilter); 1441480093f4SDimitry Andric IO.mapOptional("HashBuckets", Section.HashBuckets); 1442480093f4SDimitry Andric IO.mapOptional("HashValues", Section.HashValues); 1443480093f4SDimitry Andric } 14440b57cec5SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::NoBitsSection &Section) { 14450b57cec5SDimitry Andric commonSectionMapping(IO, Section); 14460b57cec5SDimitry Andric } 14470b57cec5SDimitry Andric 14480b57cec5SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::VerdefSection &Section) { 14490b57cec5SDimitry Andric commonSectionMapping(IO, Section); 1450e8d8bef9SDimitry Andric IO.mapOptional("Info", Section.Info); 1451480093f4SDimitry Andric IO.mapOptional("Entries", Section.Entries); 14520b57cec5SDimitry Andric } 14530b57cec5SDimitry Andric 14540b57cec5SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::SymverSection &Section) { 14550b57cec5SDimitry Andric commonSectionMapping(IO, Section); 1456e8d8bef9SDimitry Andric IO.mapOptional("Entries", Section.Entries); 14570b57cec5SDimitry Andric } 14580b57cec5SDimitry Andric 14590b57cec5SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::VerneedSection &Section) { 14600b57cec5SDimitry Andric commonSectionMapping(IO, Section); 1461e8d8bef9SDimitry Andric IO.mapOptional("Info", Section.Info); 1462480093f4SDimitry Andric IO.mapOptional("Dependencies", Section.VerneedV); 14630b57cec5SDimitry Andric } 14640b57cec5SDimitry Andric 14650b57cec5SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) { 14660b57cec5SDimitry Andric commonSectionMapping(IO, Section); 14670b57cec5SDimitry Andric IO.mapOptional("Info", Section.RelocatableSec, StringRef()); 14680b57cec5SDimitry Andric IO.mapOptional("Relocations", Section.Relocations); 14690b57cec5SDimitry Andric } 14700b57cec5SDimitry Andric 1471480093f4SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::RelrSection &Section) { 1472480093f4SDimitry Andric commonSectionMapping(IO, Section); 1473480093f4SDimitry Andric IO.mapOptional("Entries", Section.Entries); 1474480093f4SDimitry Andric } 1475480093f4SDimitry Andric 1476e8d8bef9SDimitry Andric static void groupSectionMapping(IO &IO, ELFYAML::GroupSection &Group) { 14770b57cec5SDimitry Andric commonSectionMapping(IO, Group); 1478480093f4SDimitry Andric IO.mapOptional("Info", Group.Signature); 1479e8d8bef9SDimitry Andric IO.mapOptional("Members", Group.Members); 14800b57cec5SDimitry Andric } 14810b57cec5SDimitry Andric 14828bcb0991SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::SymtabShndxSection &Section) { 14838bcb0991SDimitry Andric commonSectionMapping(IO, Section); 1484e8d8bef9SDimitry Andric IO.mapOptional("Entries", Section.Entries); 14858bcb0991SDimitry Andric } 14868bcb0991SDimitry Andric 14878bcb0991SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::AddrsigSection &Section) { 14888bcb0991SDimitry Andric commonSectionMapping(IO, Section); 14898bcb0991SDimitry Andric IO.mapOptional("Symbols", Section.Symbols); 14908bcb0991SDimitry Andric } 14918bcb0991SDimitry Andric 1492480093f4SDimitry Andric static void fillMapping(IO &IO, ELFYAML::Fill &Fill) { 1493480093f4SDimitry Andric IO.mapOptional("Name", Fill.Name, StringRef()); 1494480093f4SDimitry Andric IO.mapOptional("Pattern", Fill.Pattern); 14955ffd83dbSDimitry Andric IO.mapOptional("Offset", Fill.Offset); 1496480093f4SDimitry Andric IO.mapRequired("Size", Fill.Size); 1497480093f4SDimitry Andric } 1498480093f4SDimitry Andric 1499e8d8bef9SDimitry Andric static void sectionHeaderTableMapping(IO &IO, 1500e8d8bef9SDimitry Andric ELFYAML::SectionHeaderTable &SHT) { 1501e8d8bef9SDimitry Andric IO.mapOptional("Offset", SHT.Offset); 1502e8d8bef9SDimitry Andric IO.mapOptional("Sections", SHT.Sections); 1503e8d8bef9SDimitry Andric IO.mapOptional("Excluded", SHT.Excluded); 1504e8d8bef9SDimitry Andric IO.mapOptional("NoHeaders", SHT.NoHeaders); 1505e8d8bef9SDimitry Andric } 1506e8d8bef9SDimitry Andric 1507480093f4SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::LinkerOptionsSection &Section) { 1508480093f4SDimitry Andric commonSectionMapping(IO, Section); 1509480093f4SDimitry Andric IO.mapOptional("Options", Section.Options); 1510480093f4SDimitry Andric } 1511480093f4SDimitry Andric 1512480093f4SDimitry Andric static void sectionMapping(IO &IO, 1513480093f4SDimitry Andric ELFYAML::DependentLibrariesSection &Section) { 1514480093f4SDimitry Andric commonSectionMapping(IO, Section); 1515480093f4SDimitry Andric IO.mapOptional("Libraries", Section.Libs); 1516480093f4SDimitry Andric } 1517480093f4SDimitry Andric 15185ffd83dbSDimitry Andric static void sectionMapping(IO &IO, ELFYAML::CallGraphProfileSection &Section) { 15195ffd83dbSDimitry Andric commonSectionMapping(IO, Section); 15205ffd83dbSDimitry Andric IO.mapOptional("Entries", Section.Entries); 15215ffd83dbSDimitry Andric } 15225ffd83dbSDimitry Andric 15230b57cec5SDimitry Andric void MappingTraits<ELFYAML::SectionOrType>::mapping( 15240b57cec5SDimitry Andric IO &IO, ELFYAML::SectionOrType §ionOrType) { 15250b57cec5SDimitry Andric IO.mapRequired("SectionOrType", sectionOrType.sectionNameOrType); 15260b57cec5SDimitry Andric } 15270b57cec5SDimitry Andric 1528e8d8bef9SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::ARMIndexTableSection &Section) { 1529e8d8bef9SDimitry Andric commonSectionMapping(IO, Section); 1530e8d8bef9SDimitry Andric IO.mapOptional("Entries", Section.Entries); 15310b57cec5SDimitry Andric } 15320b57cec5SDimitry Andric 15330b57cec5SDimitry Andric static void sectionMapping(IO &IO, ELFYAML::MipsABIFlags &Section) { 15340b57cec5SDimitry Andric commonSectionMapping(IO, Section); 15350b57cec5SDimitry Andric IO.mapOptional("Version", Section.Version, Hex16(0)); 15360b57cec5SDimitry Andric IO.mapRequired("ISA", Section.ISALevel); 15370b57cec5SDimitry Andric IO.mapOptional("ISARevision", Section.ISARevision, Hex8(0)); 15380b57cec5SDimitry Andric IO.mapOptional("ISAExtension", Section.ISAExtension, 15390b57cec5SDimitry Andric ELFYAML::MIPS_AFL_EXT(Mips::AFL_EXT_NONE)); 15400b57cec5SDimitry Andric IO.mapOptional("ASEs", Section.ASEs, ELFYAML::MIPS_AFL_ASE(0)); 15410b57cec5SDimitry Andric IO.mapOptional("FpABI", Section.FpABI, 15420b57cec5SDimitry Andric ELFYAML::MIPS_ABI_FP(Mips::Val_GNU_MIPS_ABI_FP_ANY)); 15430b57cec5SDimitry Andric IO.mapOptional("GPRSize", Section.GPRSize, 15440b57cec5SDimitry Andric ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE)); 15450b57cec5SDimitry Andric IO.mapOptional("CPR1Size", Section.CPR1Size, 15460b57cec5SDimitry Andric ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE)); 15470b57cec5SDimitry Andric IO.mapOptional("CPR2Size", Section.CPR2Size, 15480b57cec5SDimitry Andric ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE)); 15490b57cec5SDimitry Andric IO.mapOptional("Flags1", Section.Flags1, ELFYAML::MIPS_AFL_FLAGS1(0)); 15500b57cec5SDimitry Andric IO.mapOptional("Flags2", Section.Flags2, Hex32(0)); 15510b57cec5SDimitry Andric } 15520b57cec5SDimitry Andric 1553e8d8bef9SDimitry Andric static StringRef getStringValue(IO &IO, const char *Key) { 1554e8d8bef9SDimitry Andric StringRef Val; 1555e8d8bef9SDimitry Andric IO.mapRequired(Key, Val); 1556e8d8bef9SDimitry Andric return Val; 1557e8d8bef9SDimitry Andric } 1558e8d8bef9SDimitry Andric 1559e8d8bef9SDimitry Andric static void setStringValue(IO &IO, const char *Key, StringRef Val) { 1560e8d8bef9SDimitry Andric IO.mapRequired(Key, Val); 1561e8d8bef9SDimitry Andric } 1562e8d8bef9SDimitry Andric 1563e8d8bef9SDimitry Andric static bool isInteger(StringRef Val) { 1564e8d8bef9SDimitry Andric APInt Tmp; 1565e8d8bef9SDimitry Andric return !Val.getAsInteger(0, Tmp); 1566e8d8bef9SDimitry Andric } 1567e8d8bef9SDimitry Andric 1568480093f4SDimitry Andric void MappingTraits<std::unique_ptr<ELFYAML::Chunk>>::mapping( 1569480093f4SDimitry Andric IO &IO, std::unique_ptr<ELFYAML::Chunk> &Section) { 1570480093f4SDimitry Andric ELFYAML::ELF_SHT Type; 1571e8d8bef9SDimitry Andric StringRef TypeStr; 1572480093f4SDimitry Andric if (IO.outputting()) { 1573e8d8bef9SDimitry Andric if (auto *S = dyn_cast<ELFYAML::Section>(Section.get())) 1574e8d8bef9SDimitry Andric Type = S->Type; 1575e8d8bef9SDimitry Andric else if (auto *SHT = dyn_cast<ELFYAML::SectionHeaderTable>(Section.get())) 1576e8d8bef9SDimitry Andric TypeStr = SHT->TypeStr; 1577480093f4SDimitry Andric } else { 1578480093f4SDimitry Andric // When the Type string does not have a "SHT_" prefix, we know it is not a 1579e8d8bef9SDimitry Andric // description of a regular ELF output section. 1580e8d8bef9SDimitry Andric TypeStr = getStringValue(IO, "Type"); 15815f757f3fSDimitry Andric if (TypeStr.starts_with("SHT_") || isInteger(TypeStr)) 1582e8d8bef9SDimitry Andric IO.mapRequired("Type", Type); 1583e8d8bef9SDimitry Andric } 1584e8d8bef9SDimitry Andric 1585e8d8bef9SDimitry Andric if (TypeStr == "Fill") { 1586e8d8bef9SDimitry Andric assert(!IO.outputting()); // We don't dump fills currently. 1587480093f4SDimitry Andric Section.reset(new ELFYAML::Fill()); 1588480093f4SDimitry Andric fillMapping(IO, *cast<ELFYAML::Fill>(Section.get())); 1589480093f4SDimitry Andric return; 1590480093f4SDimitry Andric } 15910b57cec5SDimitry Andric 1592e8d8bef9SDimitry Andric if (TypeStr == ELFYAML::SectionHeaderTable::TypeStr) { 1593e8d8bef9SDimitry Andric if (IO.outputting()) 1594e8d8bef9SDimitry Andric setStringValue(IO, "Type", TypeStr); 1595e8d8bef9SDimitry Andric else 1596e8d8bef9SDimitry Andric Section.reset(new ELFYAML::SectionHeaderTable(/*IsImplicit=*/false)); 1597e8d8bef9SDimitry Andric 1598e8d8bef9SDimitry Andric sectionHeaderTableMapping( 1599e8d8bef9SDimitry Andric IO, *cast<ELFYAML::SectionHeaderTable>(Section.get())); 1600e8d8bef9SDimitry Andric return; 1601e8d8bef9SDimitry Andric } 1602e8d8bef9SDimitry Andric 1603e8d8bef9SDimitry Andric const auto &Obj = *static_cast<ELFYAML::Object *>(IO.getContext()); 1604e8d8bef9SDimitry Andric if (Obj.getMachine() == ELF::EM_MIPS && Type == ELF::SHT_MIPS_ABIFLAGS) { 1605e8d8bef9SDimitry Andric if (!IO.outputting()) 1606e8d8bef9SDimitry Andric Section.reset(new ELFYAML::MipsABIFlags()); 1607e8d8bef9SDimitry Andric sectionMapping(IO, *cast<ELFYAML::MipsABIFlags>(Section.get())); 1608e8d8bef9SDimitry Andric return; 1609e8d8bef9SDimitry Andric } 1610e8d8bef9SDimitry Andric 1611e8d8bef9SDimitry Andric if (Obj.getMachine() == ELF::EM_ARM && Type == ELF::SHT_ARM_EXIDX) { 1612e8d8bef9SDimitry Andric if (!IO.outputting()) 1613e8d8bef9SDimitry Andric Section.reset(new ELFYAML::ARMIndexTableSection()); 1614e8d8bef9SDimitry Andric sectionMapping(IO, *cast<ELFYAML::ARMIndexTableSection>(Section.get())); 1615e8d8bef9SDimitry Andric return; 1616480093f4SDimitry Andric } 1617480093f4SDimitry Andric 1618480093f4SDimitry Andric switch (Type) { 16190b57cec5SDimitry Andric case ELF::SHT_DYNAMIC: 16200b57cec5SDimitry Andric if (!IO.outputting()) 16210b57cec5SDimitry Andric Section.reset(new ELFYAML::DynamicSection()); 16220b57cec5SDimitry Andric sectionMapping(IO, *cast<ELFYAML::DynamicSection>(Section.get())); 16230b57cec5SDimitry Andric break; 16240b57cec5SDimitry Andric case ELF::SHT_REL: 16250b57cec5SDimitry Andric case ELF::SHT_RELA: 1626*0fca6ea1SDimitry Andric case ELF::SHT_CREL: 16270b57cec5SDimitry Andric if (!IO.outputting()) 16280b57cec5SDimitry Andric Section.reset(new ELFYAML::RelocationSection()); 16290b57cec5SDimitry Andric sectionMapping(IO, *cast<ELFYAML::RelocationSection>(Section.get())); 16300b57cec5SDimitry Andric break; 1631480093f4SDimitry Andric case ELF::SHT_RELR: 1632480093f4SDimitry Andric if (!IO.outputting()) 1633480093f4SDimitry Andric Section.reset(new ELFYAML::RelrSection()); 1634480093f4SDimitry Andric sectionMapping(IO, *cast<ELFYAML::RelrSection>(Section.get())); 1635480093f4SDimitry Andric break; 16360b57cec5SDimitry Andric case ELF::SHT_GROUP: 16370b57cec5SDimitry Andric if (!IO.outputting()) 1638e8d8bef9SDimitry Andric Section.reset(new ELFYAML::GroupSection()); 1639e8d8bef9SDimitry Andric groupSectionMapping(IO, *cast<ELFYAML::GroupSection>(Section.get())); 16400b57cec5SDimitry Andric break; 16410b57cec5SDimitry Andric case ELF::SHT_NOBITS: 16420b57cec5SDimitry Andric if (!IO.outputting()) 16430b57cec5SDimitry Andric Section.reset(new ELFYAML::NoBitsSection()); 16440b57cec5SDimitry Andric sectionMapping(IO, *cast<ELFYAML::NoBitsSection>(Section.get())); 16450b57cec5SDimitry Andric break; 16468bcb0991SDimitry Andric case ELF::SHT_HASH: 16478bcb0991SDimitry Andric if (!IO.outputting()) 16488bcb0991SDimitry Andric Section.reset(new ELFYAML::HashSection()); 16498bcb0991SDimitry Andric sectionMapping(IO, *cast<ELFYAML::HashSection>(Section.get())); 16508bcb0991SDimitry Andric break; 1651480093f4SDimitry Andric case ELF::SHT_NOTE: 1652480093f4SDimitry Andric if (!IO.outputting()) 1653480093f4SDimitry Andric Section.reset(new ELFYAML::NoteSection()); 1654480093f4SDimitry Andric sectionMapping(IO, *cast<ELFYAML::NoteSection>(Section.get())); 1655480093f4SDimitry Andric break; 1656480093f4SDimitry Andric case ELF::SHT_GNU_HASH: 1657480093f4SDimitry Andric if (!IO.outputting()) 1658480093f4SDimitry Andric Section.reset(new ELFYAML::GnuHashSection()); 1659480093f4SDimitry Andric sectionMapping(IO, *cast<ELFYAML::GnuHashSection>(Section.get())); 1660480093f4SDimitry Andric break; 16610b57cec5SDimitry Andric case ELF::SHT_GNU_verdef: 16620b57cec5SDimitry Andric if (!IO.outputting()) 16630b57cec5SDimitry Andric Section.reset(new ELFYAML::VerdefSection()); 16640b57cec5SDimitry Andric sectionMapping(IO, *cast<ELFYAML::VerdefSection>(Section.get())); 16650b57cec5SDimitry Andric break; 16660b57cec5SDimitry Andric case ELF::SHT_GNU_versym: 16670b57cec5SDimitry Andric if (!IO.outputting()) 16680b57cec5SDimitry Andric Section.reset(new ELFYAML::SymverSection()); 16690b57cec5SDimitry Andric sectionMapping(IO, *cast<ELFYAML::SymverSection>(Section.get())); 16700b57cec5SDimitry Andric break; 16710b57cec5SDimitry Andric case ELF::SHT_GNU_verneed: 16720b57cec5SDimitry Andric if (!IO.outputting()) 16730b57cec5SDimitry Andric Section.reset(new ELFYAML::VerneedSection()); 16740b57cec5SDimitry Andric sectionMapping(IO, *cast<ELFYAML::VerneedSection>(Section.get())); 16750b57cec5SDimitry Andric break; 16768bcb0991SDimitry Andric case ELF::SHT_SYMTAB_SHNDX: 16770b57cec5SDimitry Andric if (!IO.outputting()) 16788bcb0991SDimitry Andric Section.reset(new ELFYAML::SymtabShndxSection()); 16798bcb0991SDimitry Andric sectionMapping(IO, *cast<ELFYAML::SymtabShndxSection>(Section.get())); 16808bcb0991SDimitry Andric break; 16818bcb0991SDimitry Andric case ELF::SHT_LLVM_ADDRSIG: 16828bcb0991SDimitry Andric if (!IO.outputting()) 16838bcb0991SDimitry Andric Section.reset(new ELFYAML::AddrsigSection()); 16848bcb0991SDimitry Andric sectionMapping(IO, *cast<ELFYAML::AddrsigSection>(Section.get())); 16858bcb0991SDimitry Andric break; 1686480093f4SDimitry Andric case ELF::SHT_LLVM_LINKER_OPTIONS: 1687480093f4SDimitry Andric if (!IO.outputting()) 1688480093f4SDimitry Andric Section.reset(new ELFYAML::LinkerOptionsSection()); 1689480093f4SDimitry Andric sectionMapping(IO, *cast<ELFYAML::LinkerOptionsSection>(Section.get())); 1690480093f4SDimitry Andric break; 1691480093f4SDimitry Andric case ELF::SHT_LLVM_DEPENDENT_LIBRARIES: 1692480093f4SDimitry Andric if (!IO.outputting()) 1693480093f4SDimitry Andric Section.reset(new ELFYAML::DependentLibrariesSection()); 1694480093f4SDimitry Andric sectionMapping(IO, 1695480093f4SDimitry Andric *cast<ELFYAML::DependentLibrariesSection>(Section.get())); 1696480093f4SDimitry Andric break; 16975ffd83dbSDimitry Andric case ELF::SHT_LLVM_CALL_GRAPH_PROFILE: 16985ffd83dbSDimitry Andric if (!IO.outputting()) 16995ffd83dbSDimitry Andric Section.reset(new ELFYAML::CallGraphProfileSection()); 17005ffd83dbSDimitry Andric sectionMapping(IO, *cast<ELFYAML::CallGraphProfileSection>(Section.get())); 17015ffd83dbSDimitry Andric break; 1702e8d8bef9SDimitry Andric case ELF::SHT_LLVM_BB_ADDR_MAP: 1703e8d8bef9SDimitry Andric if (!IO.outputting()) 1704e8d8bef9SDimitry Andric Section.reset(new ELFYAML::BBAddrMapSection()); 1705e8d8bef9SDimitry Andric sectionMapping(IO, *cast<ELFYAML::BBAddrMapSection>(Section.get())); 1706e8d8bef9SDimitry Andric break; 17078bcb0991SDimitry Andric default: 17088bcb0991SDimitry Andric if (!IO.outputting()) { 17098bcb0991SDimitry Andric StringRef Name; 17108bcb0991SDimitry Andric IO.mapOptional("Name", Name, StringRef()); 17118bcb0991SDimitry Andric Name = ELFYAML::dropUniqueSuffix(Name); 17128bcb0991SDimitry Andric 17138bcb0991SDimitry Andric if (ELFYAML::StackSizesSection::nameMatches(Name)) 17148bcb0991SDimitry Andric Section = std::make_unique<ELFYAML::StackSizesSection>(); 17158bcb0991SDimitry Andric else 17168bcb0991SDimitry Andric Section = std::make_unique<ELFYAML::RawContentSection>(); 17178bcb0991SDimitry Andric } 17188bcb0991SDimitry Andric 17198bcb0991SDimitry Andric if (auto S = dyn_cast<ELFYAML::RawContentSection>(Section.get())) 17208bcb0991SDimitry Andric sectionMapping(IO, *S); 17218bcb0991SDimitry Andric else 17228bcb0991SDimitry Andric sectionMapping(IO, *cast<ELFYAML::StackSizesSection>(Section.get())); 17230b57cec5SDimitry Andric } 17240b57cec5SDimitry Andric } 17250b57cec5SDimitry Andric 1726e8d8bef9SDimitry Andric std::string MappingTraits<std::unique_ptr<ELFYAML::Chunk>>::validate( 1727480093f4SDimitry Andric IO &io, std::unique_ptr<ELFYAML::Chunk> &C) { 1728e8d8bef9SDimitry Andric if (const auto *F = dyn_cast<ELFYAML::Fill>(C.get())) { 1729e8d8bef9SDimitry Andric if (F->Pattern && F->Pattern->binary_size() != 0 && !F->Size) 1730e8d8bef9SDimitry Andric return "\"Size\" can't be 0 when \"Pattern\" is not empty"; 1731e8d8bef9SDimitry Andric return ""; 1732e8d8bef9SDimitry Andric } 1733e8d8bef9SDimitry Andric 1734e8d8bef9SDimitry Andric if (const auto *SHT = dyn_cast<ELFYAML::SectionHeaderTable>(C.get())) { 1735e8d8bef9SDimitry Andric if (SHT->NoHeaders && (SHT->Sections || SHT->Excluded || SHT->Offset)) 1736e8d8bef9SDimitry Andric return "NoHeaders can't be used together with Offset/Sections/Excluded"; 1737e8d8bef9SDimitry Andric return ""; 1738e8d8bef9SDimitry Andric } 1739e8d8bef9SDimitry Andric 1740e8d8bef9SDimitry Andric const ELFYAML::Section &Sec = *cast<ELFYAML::Section>(C.get()); 1741e8d8bef9SDimitry Andric if (Sec.Size && Sec.Content && 1742e8d8bef9SDimitry Andric (uint64_t)(*Sec.Size) < Sec.Content->binary_size()) 17430b57cec5SDimitry Andric return "Section size must be greater than or equal to the content size"; 1744e8d8bef9SDimitry Andric 1745e8d8bef9SDimitry Andric auto BuildErrPrefix = [](ArrayRef<std::pair<StringRef, bool>> EntV) { 1746e8d8bef9SDimitry Andric std::string Msg; 1747e8d8bef9SDimitry Andric for (size_t I = 0, E = EntV.size(); I != E; ++I) { 1748e8d8bef9SDimitry Andric StringRef Name = EntV[I].first; 1749e8d8bef9SDimitry Andric if (I == 0) { 1750e8d8bef9SDimitry Andric Msg = "\"" + Name.str() + "\""; 1751e8d8bef9SDimitry Andric continue; 1752e8d8bef9SDimitry Andric } 1753e8d8bef9SDimitry Andric if (I != EntV.size() - 1) 1754e8d8bef9SDimitry Andric Msg += ", \"" + Name.str() + "\""; 1755e8d8bef9SDimitry Andric else 1756e8d8bef9SDimitry Andric Msg += " and \"" + Name.str() + "\""; 1757e8d8bef9SDimitry Andric } 1758e8d8bef9SDimitry Andric return Msg; 1759e8d8bef9SDimitry Andric }; 1760e8d8bef9SDimitry Andric 1761e8d8bef9SDimitry Andric std::vector<std::pair<StringRef, bool>> Entries = Sec.getEntries(); 1762e8d8bef9SDimitry Andric const size_t NumUsedEntries = llvm::count_if( 1763e8d8bef9SDimitry Andric Entries, [](const std::pair<StringRef, bool> &P) { return P.second; }); 1764e8d8bef9SDimitry Andric 1765e8d8bef9SDimitry Andric if ((Sec.Size || Sec.Content) && NumUsedEntries > 0) 1766e8d8bef9SDimitry Andric return BuildErrPrefix(Entries) + 1767e8d8bef9SDimitry Andric " cannot be used with \"Content\" or \"Size\""; 1768e8d8bef9SDimitry Andric 1769e8d8bef9SDimitry Andric if (NumUsedEntries > 0 && Entries.size() != NumUsedEntries) 1770e8d8bef9SDimitry Andric return BuildErrPrefix(Entries) + " must be used together"; 1771e8d8bef9SDimitry Andric 1772e8d8bef9SDimitry Andric if (const auto *RawSection = dyn_cast<ELFYAML::RawContentSection>(C.get())) { 1773480093f4SDimitry Andric if (RawSection->Flags && RawSection->ShFlags) 1774480093f4SDimitry Andric return "ShFlags and Flags cannot be used together"; 1775e8d8bef9SDimitry Andric return ""; 17760b57cec5SDimitry Andric } 17770b57cec5SDimitry Andric 1778e8d8bef9SDimitry Andric if (const auto *NB = dyn_cast<ELFYAML::NoBitsSection>(C.get())) { 1779e8d8bef9SDimitry Andric if (NB->Content) 1780e8d8bef9SDimitry Andric return "SHT_NOBITS section cannot have \"Content\""; 1781e8d8bef9SDimitry Andric return ""; 17828bcb0991SDimitry Andric } 17838bcb0991SDimitry Andric 1784e8d8bef9SDimitry Andric if (const auto *MF = dyn_cast<ELFYAML::MipsABIFlags>(C.get())) { 1785e8d8bef9SDimitry Andric if (MF->Content) 1786e8d8bef9SDimitry Andric return "\"Content\" key is not implemented for SHT_MIPS_ABIFLAGS " 1787e8d8bef9SDimitry Andric "sections"; 1788e8d8bef9SDimitry Andric if (MF->Size) 1789e8d8bef9SDimitry Andric return "\"Size\" key is not implemented for SHT_MIPS_ABIFLAGS sections"; 1790e8d8bef9SDimitry Andric return ""; 17918bcb0991SDimitry Andric } 17928bcb0991SDimitry Andric 1793e8d8bef9SDimitry Andric return ""; 17948bcb0991SDimitry Andric } 17958bcb0991SDimitry Andric 17960b57cec5SDimitry Andric namespace { 17970b57cec5SDimitry Andric 17980b57cec5SDimitry Andric struct NormalizedMips64RelType { 17990b57cec5SDimitry Andric NormalizedMips64RelType(IO &) 18000b57cec5SDimitry Andric : Type(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)), 18010b57cec5SDimitry Andric Type2(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)), 18020b57cec5SDimitry Andric Type3(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)), 18030b57cec5SDimitry Andric SpecSym(ELFYAML::ELF_REL(ELF::RSS_UNDEF)) {} 18040b57cec5SDimitry Andric NormalizedMips64RelType(IO &, ELFYAML::ELF_REL Original) 18050b57cec5SDimitry Andric : Type(Original & 0xFF), Type2(Original >> 8 & 0xFF), 18060b57cec5SDimitry Andric Type3(Original >> 16 & 0xFF), SpecSym(Original >> 24 & 0xFF) {} 18070b57cec5SDimitry Andric 18080b57cec5SDimitry Andric ELFYAML::ELF_REL denormalize(IO &) { 18090b57cec5SDimitry Andric ELFYAML::ELF_REL Res = Type | Type2 << 8 | Type3 << 16 | SpecSym << 24; 18100b57cec5SDimitry Andric return Res; 18110b57cec5SDimitry Andric } 18120b57cec5SDimitry Andric 18130b57cec5SDimitry Andric ELFYAML::ELF_REL Type; 18140b57cec5SDimitry Andric ELFYAML::ELF_REL Type2; 18150b57cec5SDimitry Andric ELFYAML::ELF_REL Type3; 18160b57cec5SDimitry Andric ELFYAML::ELF_RSS SpecSym; 18170b57cec5SDimitry Andric }; 18180b57cec5SDimitry Andric 18190b57cec5SDimitry Andric } // end anonymous namespace 18200b57cec5SDimitry Andric 18218bcb0991SDimitry Andric void MappingTraits<ELFYAML::StackSizeEntry>::mapping( 18228bcb0991SDimitry Andric IO &IO, ELFYAML::StackSizeEntry &E) { 18238bcb0991SDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 18248bcb0991SDimitry Andric IO.mapOptional("Address", E.Address, Hex64(0)); 18258bcb0991SDimitry Andric IO.mapRequired("Size", E.Size); 18268bcb0991SDimitry Andric } 18278bcb0991SDimitry Andric 1828e8d8bef9SDimitry Andric void MappingTraits<ELFYAML::BBAddrMapEntry>::mapping( 1829e8d8bef9SDimitry Andric IO &IO, ELFYAML::BBAddrMapEntry &E) { 1830e8d8bef9SDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 183181ad6265SDimitry Andric IO.mapRequired("Version", E.Version); 183281ad6265SDimitry Andric IO.mapOptional("Feature", E.Feature, Hex8(0)); 1833*0fca6ea1SDimitry Andric IO.mapOptional("NumBBRanges", E.NumBBRanges); 1834*0fca6ea1SDimitry Andric IO.mapOptional("BBRanges", E.BBRanges); 1835*0fca6ea1SDimitry Andric } 1836*0fca6ea1SDimitry Andric 1837*0fca6ea1SDimitry Andric void MappingTraits<ELFYAML::BBAddrMapEntry::BBRangeEntry>::mapping( 1838*0fca6ea1SDimitry Andric IO &IO, ELFYAML::BBAddrMapEntry::BBRangeEntry &E) { 1839*0fca6ea1SDimitry Andric IO.mapOptional("BaseAddress", E.BaseAddress, Hex64(0)); 1840fe6060f1SDimitry Andric IO.mapOptional("NumBlocks", E.NumBlocks); 1841e8d8bef9SDimitry Andric IO.mapOptional("BBEntries", E.BBEntries); 1842e8d8bef9SDimitry Andric } 1843e8d8bef9SDimitry Andric 1844e8d8bef9SDimitry Andric void MappingTraits<ELFYAML::BBAddrMapEntry::BBEntry>::mapping( 1845e8d8bef9SDimitry Andric IO &IO, ELFYAML::BBAddrMapEntry::BBEntry &E) { 1846e8d8bef9SDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 1847bdd1243dSDimitry Andric IO.mapOptional("ID", E.ID); 1848e8d8bef9SDimitry Andric IO.mapRequired("AddressOffset", E.AddressOffset); 1849e8d8bef9SDimitry Andric IO.mapRequired("Size", E.Size); 1850e8d8bef9SDimitry Andric IO.mapRequired("Metadata", E.Metadata); 1851e8d8bef9SDimitry Andric } 1852e8d8bef9SDimitry Andric 18535f757f3fSDimitry Andric void MappingTraits<ELFYAML::PGOAnalysisMapEntry>::mapping( 18545f757f3fSDimitry Andric IO &IO, ELFYAML::PGOAnalysisMapEntry &E) { 18555f757f3fSDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 18565f757f3fSDimitry Andric IO.mapOptional("FuncEntryCount", E.FuncEntryCount); 18575f757f3fSDimitry Andric IO.mapOptional("PGOBBEntries", E.PGOBBEntries); 18585f757f3fSDimitry Andric } 18595f757f3fSDimitry Andric 18605f757f3fSDimitry Andric void MappingTraits<ELFYAML::PGOAnalysisMapEntry::PGOBBEntry>::mapping( 18615f757f3fSDimitry Andric IO &IO, ELFYAML::PGOAnalysisMapEntry::PGOBBEntry &E) { 18625f757f3fSDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 18635f757f3fSDimitry Andric IO.mapOptional("BBFreq", E.BBFreq); 18645f757f3fSDimitry Andric IO.mapOptional("Successors", E.Successors); 18655f757f3fSDimitry Andric } 18665f757f3fSDimitry Andric 18675f757f3fSDimitry Andric void MappingTraits<ELFYAML::PGOAnalysisMapEntry::PGOBBEntry::SuccessorEntry>:: 18685f757f3fSDimitry Andric mapping(IO &IO, 18695f757f3fSDimitry Andric ELFYAML::PGOAnalysisMapEntry::PGOBBEntry::SuccessorEntry &E) { 18705f757f3fSDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 18715f757f3fSDimitry Andric IO.mapRequired("ID", E.ID); 18725f757f3fSDimitry Andric IO.mapRequired("BrProb", E.BrProb); 18735f757f3fSDimitry Andric } 18745f757f3fSDimitry Andric 1875480093f4SDimitry Andric void MappingTraits<ELFYAML::GnuHashHeader>::mapping(IO &IO, 1876480093f4SDimitry Andric ELFYAML::GnuHashHeader &E) { 1877480093f4SDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 1878480093f4SDimitry Andric IO.mapOptional("NBuckets", E.NBuckets); 1879480093f4SDimitry Andric IO.mapRequired("SymNdx", E.SymNdx); 1880480093f4SDimitry Andric IO.mapOptional("MaskWords", E.MaskWords); 1881480093f4SDimitry Andric IO.mapRequired("Shift2", E.Shift2); 1882480093f4SDimitry Andric } 1883480093f4SDimitry Andric 18840b57cec5SDimitry Andric void MappingTraits<ELFYAML::DynamicEntry>::mapping(IO &IO, 18850b57cec5SDimitry Andric ELFYAML::DynamicEntry &Rel) { 18860b57cec5SDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 18870b57cec5SDimitry Andric 18880b57cec5SDimitry Andric IO.mapRequired("Tag", Rel.Tag); 18890b57cec5SDimitry Andric IO.mapRequired("Value", Rel.Val); 18900b57cec5SDimitry Andric } 18910b57cec5SDimitry Andric 1892480093f4SDimitry Andric void MappingTraits<ELFYAML::NoteEntry>::mapping(IO &IO, ELFYAML::NoteEntry &N) { 1893480093f4SDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 1894480093f4SDimitry Andric 1895480093f4SDimitry Andric IO.mapOptional("Name", N.Name); 1896480093f4SDimitry Andric IO.mapOptional("Desc", N.Desc); 1897480093f4SDimitry Andric IO.mapRequired("Type", N.Type); 1898480093f4SDimitry Andric } 1899480093f4SDimitry Andric 19000b57cec5SDimitry Andric void MappingTraits<ELFYAML::VerdefEntry>::mapping(IO &IO, 19010b57cec5SDimitry Andric ELFYAML::VerdefEntry &E) { 19020b57cec5SDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 19030b57cec5SDimitry Andric 1904e8d8bef9SDimitry Andric IO.mapOptional("Version", E.Version); 1905e8d8bef9SDimitry Andric IO.mapOptional("Flags", E.Flags); 1906e8d8bef9SDimitry Andric IO.mapOptional("VersionNdx", E.VersionNdx); 1907e8d8bef9SDimitry Andric IO.mapOptional("Hash", E.Hash); 19080b57cec5SDimitry Andric IO.mapRequired("Names", E.VerNames); 19090b57cec5SDimitry Andric } 19100b57cec5SDimitry Andric 19110b57cec5SDimitry Andric void MappingTraits<ELFYAML::VerneedEntry>::mapping(IO &IO, 19120b57cec5SDimitry Andric ELFYAML::VerneedEntry &E) { 19130b57cec5SDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 19140b57cec5SDimitry Andric 19150b57cec5SDimitry Andric IO.mapRequired("Version", E.Version); 19160b57cec5SDimitry Andric IO.mapRequired("File", E.File); 19170b57cec5SDimitry Andric IO.mapRequired("Entries", E.AuxV); 19180b57cec5SDimitry Andric } 19190b57cec5SDimitry Andric 19200b57cec5SDimitry Andric void MappingTraits<ELFYAML::VernauxEntry>::mapping(IO &IO, 19210b57cec5SDimitry Andric ELFYAML::VernauxEntry &E) { 19220b57cec5SDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 19230b57cec5SDimitry Andric 19240b57cec5SDimitry Andric IO.mapRequired("Name", E.Name); 19250b57cec5SDimitry Andric IO.mapRequired("Hash", E.Hash); 19260b57cec5SDimitry Andric IO.mapRequired("Flags", E.Flags); 19270b57cec5SDimitry Andric IO.mapRequired("Other", E.Other); 19280b57cec5SDimitry Andric } 19290b57cec5SDimitry Andric 19300b57cec5SDimitry Andric void MappingTraits<ELFYAML::Relocation>::mapping(IO &IO, 19310b57cec5SDimitry Andric ELFYAML::Relocation &Rel) { 19320b57cec5SDimitry Andric const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); 19330b57cec5SDimitry Andric assert(Object && "The IO context is not initialized"); 19340b57cec5SDimitry Andric 19355ffd83dbSDimitry Andric IO.mapOptional("Offset", Rel.Offset, (Hex64)0); 19360b57cec5SDimitry Andric IO.mapOptional("Symbol", Rel.Symbol); 19370b57cec5SDimitry Andric 1938e8d8bef9SDimitry Andric if (Object->getMachine() == ELFYAML::ELF_EM(ELF::EM_MIPS) && 19390b57cec5SDimitry Andric Object->Header.Class == ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64)) { 19400b57cec5SDimitry Andric MappingNormalization<NormalizedMips64RelType, ELFYAML::ELF_REL> Key( 19410b57cec5SDimitry Andric IO, Rel.Type); 19420b57cec5SDimitry Andric IO.mapRequired("Type", Key->Type); 19430b57cec5SDimitry Andric IO.mapOptional("Type2", Key->Type2, ELFYAML::ELF_REL(ELF::R_MIPS_NONE)); 19440b57cec5SDimitry Andric IO.mapOptional("Type3", Key->Type3, ELFYAML::ELF_REL(ELF::R_MIPS_NONE)); 19450b57cec5SDimitry Andric IO.mapOptional("SpecSym", Key->SpecSym, ELFYAML::ELF_RSS(ELF::RSS_UNDEF)); 19460b57cec5SDimitry Andric } else 19470b57cec5SDimitry Andric IO.mapRequired("Type", Rel.Type); 19480b57cec5SDimitry Andric 19495ffd83dbSDimitry Andric IO.mapOptional("Addend", Rel.Addend, (ELFYAML::YAMLIntUInt)0); 19500b57cec5SDimitry Andric } 19510b57cec5SDimitry Andric 1952e8d8bef9SDimitry Andric void MappingTraits<ELFYAML::ARMIndexTableEntry>::mapping( 1953e8d8bef9SDimitry Andric IO &IO, ELFYAML::ARMIndexTableEntry &E) { 1954e8d8bef9SDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 1955e8d8bef9SDimitry Andric IO.mapRequired("Offset", E.Offset); 1956e8d8bef9SDimitry Andric 1957e8d8bef9SDimitry Andric StringRef CantUnwind = "EXIDX_CANTUNWIND"; 1958e8d8bef9SDimitry Andric if (IO.outputting() && (uint32_t)E.Value == ARM::EHABI::EXIDX_CANTUNWIND) 1959e8d8bef9SDimitry Andric IO.mapRequired("Value", CantUnwind); 1960e8d8bef9SDimitry Andric else if (!IO.outputting() && getStringValue(IO, "Value") == CantUnwind) 1961e8d8bef9SDimitry Andric E.Value = ARM::EHABI::EXIDX_CANTUNWIND; 1962e8d8bef9SDimitry Andric else 1963e8d8bef9SDimitry Andric IO.mapRequired("Value", E.Value); 1964e8d8bef9SDimitry Andric } 1965e8d8bef9SDimitry Andric 19660b57cec5SDimitry Andric void MappingTraits<ELFYAML::Object>::mapping(IO &IO, ELFYAML::Object &Object) { 19670b57cec5SDimitry Andric assert(!IO.getContext() && "The IO context is initialized already"); 19680b57cec5SDimitry Andric IO.setContext(&Object); 19690b57cec5SDimitry Andric IO.mapTag("!ELF", true); 19700b57cec5SDimitry Andric IO.mapRequired("FileHeader", Object.Header); 19710b57cec5SDimitry Andric IO.mapOptional("ProgramHeaders", Object.ProgramHeaders); 1972480093f4SDimitry Andric IO.mapOptional("Sections", Object.Chunks); 19730b57cec5SDimitry Andric IO.mapOptional("Symbols", Object.Symbols); 19740b57cec5SDimitry Andric IO.mapOptional("DynamicSymbols", Object.DynamicSymbols); 19755ffd83dbSDimitry Andric IO.mapOptional("DWARF", Object.DWARF); 19765ffd83dbSDimitry Andric if (Object.DWARF) { 19775ffd83dbSDimitry Andric Object.DWARF->IsLittleEndian = 19785ffd83dbSDimitry Andric Object.Header.Data == ELFYAML::ELF_ELFDATA(ELF::ELFDATA2LSB); 19795ffd83dbSDimitry Andric Object.DWARF->Is64BitAddrSize = 19805ffd83dbSDimitry Andric Object.Header.Class == ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64); 19810b57cec5SDimitry Andric } 19825ffd83dbSDimitry Andric IO.setContext(nullptr); 19838bcb0991SDimitry Andric } 19848bcb0991SDimitry Andric 1985480093f4SDimitry Andric void MappingTraits<ELFYAML::LinkerOption>::mapping(IO &IO, 1986480093f4SDimitry Andric ELFYAML::LinkerOption &Opt) { 1987480093f4SDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 1988480093f4SDimitry Andric IO.mapRequired("Name", Opt.Key); 1989480093f4SDimitry Andric IO.mapRequired("Value", Opt.Value); 1990480093f4SDimitry Andric } 1991480093f4SDimitry Andric 1992fe6060f1SDimitry Andric void MappingTraits<ELFYAML::CallGraphEntryWeight>::mapping( 1993fe6060f1SDimitry Andric IO &IO, ELFYAML::CallGraphEntryWeight &E) { 19945ffd83dbSDimitry Andric assert(IO.getContext() && "The IO context is not initialized"); 19955ffd83dbSDimitry Andric IO.mapRequired("Weight", E.Weight); 19965ffd83dbSDimitry Andric } 19975ffd83dbSDimitry Andric 19980b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_AFL_REG) 19990b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_ABI_FP) 20000b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_EXT) 20010b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_ASE) 20020b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_FLAGS1) 20030b57cec5SDimitry Andric 20040b57cec5SDimitry Andric } // end namespace yaml 20050b57cec5SDimitry Andric 20060b57cec5SDimitry Andric } // end namespace llvm 2007