Path: blob/main/contrib/llvm-project/llvm/lib/ObjectYAML/ELFYAML.cpp
35234 views
//===- ELFYAML.cpp - ELF YAMLIO implementation ----------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file defines classes for handling the YAML representation of ELF.9//10//===----------------------------------------------------------------------===//1112#include "llvm/ObjectYAML/ELFYAML.h"13#include "llvm/ADT/APInt.h"14#include "llvm/ADT/MapVector.h"15#include "llvm/ADT/StringRef.h"16#include "llvm/BinaryFormat/ELF.h"17#include "llvm/Support/ARMEHABI.h"18#include "llvm/Support/Casting.h"19#include "llvm/Support/ErrorHandling.h"20#include "llvm/Support/MipsABIFlags.h"21#include "llvm/Support/YAMLTraits.h"22#include "llvm/Support/WithColor.h"23#include <cassert>24#include <cstdint>25#include <optional>2627namespace llvm {2829ELFYAML::Chunk::~Chunk() = default;3031namespace ELFYAML {32ELF_ELFOSABI Object::getOSAbi() const { return Header.OSABI; }3334unsigned Object::getMachine() const {35if (Header.Machine)36return *Header.Machine;37return llvm::ELF::EM_NONE;38}3940constexpr StringRef SectionHeaderTable::TypeStr;41} // namespace ELFYAML4243namespace yaml {4445void ScalarEnumerationTraits<ELFYAML::ELF_ET>::enumeration(46IO &IO, ELFYAML::ELF_ET &Value) {47#define ECase(X) IO.enumCase(Value, #X, ELF::X)48ECase(ET_NONE);49ECase(ET_REL);50ECase(ET_EXEC);51ECase(ET_DYN);52ECase(ET_CORE);53#undef ECase54IO.enumFallback<Hex16>(Value);55}5657void ScalarEnumerationTraits<ELFYAML::ELF_PT>::enumeration(58IO &IO, ELFYAML::ELF_PT &Value) {59#define ECase(X) IO.enumCase(Value, #X, ELF::X)60ECase(PT_NULL);61ECase(PT_LOAD);62ECase(PT_DYNAMIC);63ECase(PT_INTERP);64ECase(PT_NOTE);65ECase(PT_SHLIB);66ECase(PT_PHDR);67ECase(PT_TLS);68ECase(PT_GNU_EH_FRAME);69ECase(PT_GNU_STACK);70ECase(PT_GNU_RELRO);71ECase(PT_GNU_PROPERTY);72#undef ECase73IO.enumFallback<Hex32>(Value);74}7576void ScalarEnumerationTraits<ELFYAML::ELF_NT>::enumeration(77IO &IO, ELFYAML::ELF_NT &Value) {78#define ECase(X) IO.enumCase(Value, #X, ELF::X)79// Generic note types.80ECase(NT_VERSION);81ECase(NT_ARCH);82ECase(NT_GNU_BUILD_ATTRIBUTE_OPEN);83ECase(NT_GNU_BUILD_ATTRIBUTE_FUNC);84// Core note types.85ECase(NT_PRSTATUS);86ECase(NT_FPREGSET);87ECase(NT_PRPSINFO);88ECase(NT_TASKSTRUCT);89ECase(NT_AUXV);90ECase(NT_PSTATUS);91ECase(NT_FPREGS);92ECase(NT_PSINFO);93ECase(NT_LWPSTATUS);94ECase(NT_LWPSINFO);95ECase(NT_WIN32PSTATUS);96ECase(NT_PPC_VMX);97ECase(NT_PPC_VSX);98ECase(NT_PPC_TAR);99ECase(NT_PPC_PPR);100ECase(NT_PPC_DSCR);101ECase(NT_PPC_EBB);102ECase(NT_PPC_PMU);103ECase(NT_PPC_TM_CGPR);104ECase(NT_PPC_TM_CFPR);105ECase(NT_PPC_TM_CVMX);106ECase(NT_PPC_TM_CVSX);107ECase(NT_PPC_TM_SPR);108ECase(NT_PPC_TM_CTAR);109ECase(NT_PPC_TM_CPPR);110ECase(NT_PPC_TM_CDSCR);111ECase(NT_386_TLS);112ECase(NT_386_IOPERM);113ECase(NT_X86_XSTATE);114ECase(NT_S390_HIGH_GPRS);115ECase(NT_S390_TIMER);116ECase(NT_S390_TODCMP);117ECase(NT_S390_TODPREG);118ECase(NT_S390_CTRS);119ECase(NT_S390_PREFIX);120ECase(NT_S390_LAST_BREAK);121ECase(NT_S390_SYSTEM_CALL);122ECase(NT_S390_TDB);123ECase(NT_S390_VXRS_LOW);124ECase(NT_S390_VXRS_HIGH);125ECase(NT_S390_GS_CB);126ECase(NT_S390_GS_BC);127ECase(NT_ARM_VFP);128ECase(NT_ARM_TLS);129ECase(NT_ARM_HW_BREAK);130ECase(NT_ARM_HW_WATCH);131ECase(NT_ARM_SVE);132ECase(NT_ARM_PAC_MASK);133ECase(NT_ARM_TAGGED_ADDR_CTRL);134ECase(NT_ARM_SSVE);135ECase(NT_ARM_ZA);136ECase(NT_ARM_ZT);137ECase(NT_FILE);138ECase(NT_PRXFPREG);139ECase(NT_SIGINFO);140// LLVM-specific notes.141ECase(NT_LLVM_HWASAN_GLOBALS);142// GNU note types143ECase(NT_GNU_ABI_TAG);144ECase(NT_GNU_HWCAP);145ECase(NT_GNU_BUILD_ID);146ECase(NT_GNU_GOLD_VERSION);147ECase(NT_GNU_PROPERTY_TYPE_0);148// FreeBSD note types.149ECase(NT_FREEBSD_ABI_TAG);150ECase(NT_FREEBSD_NOINIT_TAG);151ECase(NT_FREEBSD_ARCH_TAG);152ECase(NT_FREEBSD_FEATURE_CTL);153// FreeBSD core note types.154ECase(NT_FREEBSD_THRMISC);155ECase(NT_FREEBSD_PROCSTAT_PROC);156ECase(NT_FREEBSD_PROCSTAT_FILES);157ECase(NT_FREEBSD_PROCSTAT_VMMAP);158ECase(NT_FREEBSD_PROCSTAT_GROUPS);159ECase(NT_FREEBSD_PROCSTAT_UMASK);160ECase(NT_FREEBSD_PROCSTAT_RLIMIT);161ECase(NT_FREEBSD_PROCSTAT_OSREL);162ECase(NT_FREEBSD_PROCSTAT_PSSTRINGS);163ECase(NT_FREEBSD_PROCSTAT_AUXV);164// NetBSD core note types.165ECase(NT_NETBSDCORE_PROCINFO);166ECase(NT_NETBSDCORE_AUXV);167ECase(NT_NETBSDCORE_LWPSTATUS);168// OpenBSD core note types.169ECase(NT_OPENBSD_PROCINFO);170ECase(NT_OPENBSD_AUXV);171ECase(NT_OPENBSD_REGS);172ECase(NT_OPENBSD_FPREGS);173ECase(NT_OPENBSD_XFPREGS);174ECase(NT_OPENBSD_WCOOKIE);175// AMD specific notes. (Code Object V2)176ECase(NT_AMD_HSA_CODE_OBJECT_VERSION);177ECase(NT_AMD_HSA_HSAIL);178ECase(NT_AMD_HSA_ISA_VERSION);179ECase(NT_AMD_HSA_METADATA);180ECase(NT_AMD_HSA_ISA_NAME);181ECase(NT_AMD_PAL_METADATA);182// AMDGPU specific notes. (Code Object V3)183ECase(NT_AMDGPU_METADATA);184// Android specific notes.185ECase(NT_ANDROID_TYPE_IDENT);186ECase(NT_ANDROID_TYPE_KUSER);187ECase(NT_ANDROID_TYPE_MEMTAG);188#undef ECase189IO.enumFallback<Hex32>(Value);190}191192void ScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration(193IO &IO, ELFYAML::ELF_EM &Value) {194#define ECase(X) IO.enumCase(Value, #X, ELF::X)195ECase(EM_NONE);196ECase(EM_M32);197ECase(EM_SPARC);198ECase(EM_386);199ECase(EM_68K);200ECase(EM_88K);201ECase(EM_IAMCU);202ECase(EM_860);203ECase(EM_MIPS);204ECase(EM_S370);205ECase(EM_MIPS_RS3_LE);206ECase(EM_PARISC);207ECase(EM_VPP500);208ECase(EM_SPARC32PLUS);209ECase(EM_960);210ECase(EM_PPC);211ECase(EM_PPC64);212ECase(EM_S390);213ECase(EM_SPU);214ECase(EM_V800);215ECase(EM_FR20);216ECase(EM_RH32);217ECase(EM_RCE);218ECase(EM_ARM);219ECase(EM_ALPHA);220ECase(EM_SH);221ECase(EM_SPARCV9);222ECase(EM_TRICORE);223ECase(EM_ARC);224ECase(EM_H8_300);225ECase(EM_H8_300H);226ECase(EM_H8S);227ECase(EM_H8_500);228ECase(EM_IA_64);229ECase(EM_MIPS_X);230ECase(EM_COLDFIRE);231ECase(EM_68HC12);232ECase(EM_MMA);233ECase(EM_PCP);234ECase(EM_NCPU);235ECase(EM_NDR1);236ECase(EM_STARCORE);237ECase(EM_ME16);238ECase(EM_ST100);239ECase(EM_TINYJ);240ECase(EM_X86_64);241ECase(EM_PDSP);242ECase(EM_PDP10);243ECase(EM_PDP11);244ECase(EM_FX66);245ECase(EM_ST9PLUS);246ECase(EM_ST7);247ECase(EM_68HC16);248ECase(EM_68HC11);249ECase(EM_68HC08);250ECase(EM_68HC05);251ECase(EM_SVX);252ECase(EM_ST19);253ECase(EM_VAX);254ECase(EM_CRIS);255ECase(EM_JAVELIN);256ECase(EM_FIREPATH);257ECase(EM_ZSP);258ECase(EM_MMIX);259ECase(EM_HUANY);260ECase(EM_PRISM);261ECase(EM_AVR);262ECase(EM_FR30);263ECase(EM_D10V);264ECase(EM_D30V);265ECase(EM_V850);266ECase(EM_M32R);267ECase(EM_MN10300);268ECase(EM_MN10200);269ECase(EM_PJ);270ECase(EM_OPENRISC);271ECase(EM_ARC_COMPACT);272ECase(EM_XTENSA);273ECase(EM_VIDEOCORE);274ECase(EM_TMM_GPP);275ECase(EM_NS32K);276ECase(EM_TPC);277ECase(EM_SNP1K);278ECase(EM_ST200);279ECase(EM_IP2K);280ECase(EM_MAX);281ECase(EM_CR);282ECase(EM_F2MC16);283ECase(EM_MSP430);284ECase(EM_BLACKFIN);285ECase(EM_SE_C33);286ECase(EM_SEP);287ECase(EM_ARCA);288ECase(EM_UNICORE);289ECase(EM_EXCESS);290ECase(EM_DXP);291ECase(EM_ALTERA_NIOS2);292ECase(EM_CRX);293ECase(EM_XGATE);294ECase(EM_C166);295ECase(EM_M16C);296ECase(EM_DSPIC30F);297ECase(EM_CE);298ECase(EM_M32C);299ECase(EM_TSK3000);300ECase(EM_RS08);301ECase(EM_SHARC);302ECase(EM_ECOG2);303ECase(EM_SCORE7);304ECase(EM_DSP24);305ECase(EM_VIDEOCORE3);306ECase(EM_LATTICEMICO32);307ECase(EM_SE_C17);308ECase(EM_TI_C6000);309ECase(EM_TI_C2000);310ECase(EM_TI_C5500);311ECase(EM_MMDSP_PLUS);312ECase(EM_CYPRESS_M8C);313ECase(EM_R32C);314ECase(EM_TRIMEDIA);315ECase(EM_HEXAGON);316ECase(EM_8051);317ECase(EM_STXP7X);318ECase(EM_NDS32);319ECase(EM_ECOG1);320ECase(EM_ECOG1X);321ECase(EM_MAXQ30);322ECase(EM_XIMO16);323ECase(EM_MANIK);324ECase(EM_CRAYNV2);325ECase(EM_RX);326ECase(EM_METAG);327ECase(EM_MCST_ELBRUS);328ECase(EM_ECOG16);329ECase(EM_CR16);330ECase(EM_ETPU);331ECase(EM_SLE9X);332ECase(EM_L10M);333ECase(EM_K10M);334ECase(EM_AARCH64);335ECase(EM_AVR32);336ECase(EM_STM8);337ECase(EM_TILE64);338ECase(EM_TILEPRO);339ECase(EM_MICROBLAZE);340ECase(EM_CUDA);341ECase(EM_TILEGX);342ECase(EM_CLOUDSHIELD);343ECase(EM_COREA_1ST);344ECase(EM_COREA_2ND);345ECase(EM_ARC_COMPACT2);346ECase(EM_OPEN8);347ECase(EM_RL78);348ECase(EM_VIDEOCORE5);349ECase(EM_78KOR);350ECase(EM_56800EX);351ECase(EM_AMDGPU);352ECase(EM_RISCV);353ECase(EM_LANAI);354ECase(EM_BPF);355ECase(EM_VE);356ECase(EM_CSKY);357ECase(EM_LOONGARCH);358#undef ECase359IO.enumFallback<Hex16>(Value);360}361362void ScalarEnumerationTraits<ELFYAML::ELF_ELFCLASS>::enumeration(363IO &IO, ELFYAML::ELF_ELFCLASS &Value) {364#define ECase(X) IO.enumCase(Value, #X, ELF::X)365// Since the semantics of ELFCLASSNONE is "invalid", just don't accept it366// here.367ECase(ELFCLASS32);368ECase(ELFCLASS64);369#undef ECase370}371372void ScalarEnumerationTraits<ELFYAML::ELF_ELFDATA>::enumeration(373IO &IO, ELFYAML::ELF_ELFDATA &Value) {374#define ECase(X) IO.enumCase(Value, #X, ELF::X)375// ELFDATANONE is an invalid data encoding, but we accept it because376// we want to be able to produce invalid binaries for the tests.377ECase(ELFDATANONE);378ECase(ELFDATA2LSB);379ECase(ELFDATA2MSB);380#undef ECase381}382383void ScalarEnumerationTraits<ELFYAML::ELF_ELFOSABI>::enumeration(384IO &IO, ELFYAML::ELF_ELFOSABI &Value) {385#define ECase(X) IO.enumCase(Value, #X, ELF::X)386ECase(ELFOSABI_NONE);387ECase(ELFOSABI_HPUX);388ECase(ELFOSABI_NETBSD);389ECase(ELFOSABI_GNU);390ECase(ELFOSABI_LINUX);391ECase(ELFOSABI_HURD);392ECase(ELFOSABI_SOLARIS);393ECase(ELFOSABI_AIX);394ECase(ELFOSABI_IRIX);395ECase(ELFOSABI_FREEBSD);396ECase(ELFOSABI_TRU64);397ECase(ELFOSABI_MODESTO);398ECase(ELFOSABI_OPENBSD);399ECase(ELFOSABI_OPENVMS);400ECase(ELFOSABI_NSK);401ECase(ELFOSABI_AROS);402ECase(ELFOSABI_FENIXOS);403ECase(ELFOSABI_CLOUDABI);404ECase(ELFOSABI_AMDGPU_HSA);405ECase(ELFOSABI_AMDGPU_PAL);406ECase(ELFOSABI_AMDGPU_MESA3D);407ECase(ELFOSABI_ARM);408ECase(ELFOSABI_ARM_FDPIC);409ECase(ELFOSABI_C6000_ELFABI);410ECase(ELFOSABI_C6000_LINUX);411ECase(ELFOSABI_STANDALONE);412#undef ECase413IO.enumFallback<Hex8>(Value);414}415416void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO,417ELFYAML::ELF_EF &Value) {418const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());419assert(Object && "The IO context is not initialized");420#define BCase(X) IO.bitSetCase(Value, #X, ELF::X)421#define BCaseMask(X, M) IO.maskedBitSetCase(Value, #X, ELF::X, ELF::M)422switch (Object->getMachine()) {423case ELF::EM_ARM:424BCase(EF_ARM_SOFT_FLOAT);425BCase(EF_ARM_VFP_FLOAT);426BCaseMask(EF_ARM_EABI_UNKNOWN, EF_ARM_EABIMASK);427BCaseMask(EF_ARM_EABI_VER1, EF_ARM_EABIMASK);428BCaseMask(EF_ARM_EABI_VER2, EF_ARM_EABIMASK);429BCaseMask(EF_ARM_EABI_VER3, EF_ARM_EABIMASK);430BCaseMask(EF_ARM_EABI_VER4, EF_ARM_EABIMASK);431BCaseMask(EF_ARM_EABI_VER5, EF_ARM_EABIMASK);432BCaseMask(EF_ARM_BE8, EF_ARM_BE8);433break;434case ELF::EM_MIPS:435BCase(EF_MIPS_NOREORDER);436BCase(EF_MIPS_PIC);437BCase(EF_MIPS_CPIC);438BCase(EF_MIPS_ABI2);439BCase(EF_MIPS_32BITMODE);440BCase(EF_MIPS_FP64);441BCase(EF_MIPS_NAN2008);442BCase(EF_MIPS_MICROMIPS);443BCase(EF_MIPS_ARCH_ASE_M16);444BCase(EF_MIPS_ARCH_ASE_MDMX);445BCaseMask(EF_MIPS_ABI_O32, EF_MIPS_ABI);446BCaseMask(EF_MIPS_ABI_O64, EF_MIPS_ABI);447BCaseMask(EF_MIPS_ABI_EABI32, EF_MIPS_ABI);448BCaseMask(EF_MIPS_ABI_EABI64, EF_MIPS_ABI);449BCaseMask(EF_MIPS_MACH_3900, EF_MIPS_MACH);450BCaseMask(EF_MIPS_MACH_4010, EF_MIPS_MACH);451BCaseMask(EF_MIPS_MACH_4100, EF_MIPS_MACH);452BCaseMask(EF_MIPS_MACH_4650, EF_MIPS_MACH);453BCaseMask(EF_MIPS_MACH_4120, EF_MIPS_MACH);454BCaseMask(EF_MIPS_MACH_4111, EF_MIPS_MACH);455BCaseMask(EF_MIPS_MACH_SB1, EF_MIPS_MACH);456BCaseMask(EF_MIPS_MACH_OCTEON, EF_MIPS_MACH);457BCaseMask(EF_MIPS_MACH_XLR, EF_MIPS_MACH);458BCaseMask(EF_MIPS_MACH_OCTEON2, EF_MIPS_MACH);459BCaseMask(EF_MIPS_MACH_OCTEON3, EF_MIPS_MACH);460BCaseMask(EF_MIPS_MACH_5400, EF_MIPS_MACH);461BCaseMask(EF_MIPS_MACH_5900, EF_MIPS_MACH);462BCaseMask(EF_MIPS_MACH_5500, EF_MIPS_MACH);463BCaseMask(EF_MIPS_MACH_9000, EF_MIPS_MACH);464BCaseMask(EF_MIPS_MACH_LS2E, EF_MIPS_MACH);465BCaseMask(EF_MIPS_MACH_LS2F, EF_MIPS_MACH);466BCaseMask(EF_MIPS_MACH_LS3A, EF_MIPS_MACH);467BCaseMask(EF_MIPS_ARCH_1, EF_MIPS_ARCH);468BCaseMask(EF_MIPS_ARCH_2, EF_MIPS_ARCH);469BCaseMask(EF_MIPS_ARCH_3, EF_MIPS_ARCH);470BCaseMask(EF_MIPS_ARCH_4, EF_MIPS_ARCH);471BCaseMask(EF_MIPS_ARCH_5, EF_MIPS_ARCH);472BCaseMask(EF_MIPS_ARCH_32, EF_MIPS_ARCH);473BCaseMask(EF_MIPS_ARCH_64, EF_MIPS_ARCH);474BCaseMask(EF_MIPS_ARCH_32R2, EF_MIPS_ARCH);475BCaseMask(EF_MIPS_ARCH_64R2, EF_MIPS_ARCH);476BCaseMask(EF_MIPS_ARCH_32R6, EF_MIPS_ARCH);477BCaseMask(EF_MIPS_ARCH_64R6, EF_MIPS_ARCH);478break;479case ELF::EM_HEXAGON:480BCaseMask(EF_HEXAGON_MACH_V2, EF_HEXAGON_MACH);481BCaseMask(EF_HEXAGON_MACH_V3, EF_HEXAGON_MACH);482BCaseMask(EF_HEXAGON_MACH_V4, EF_HEXAGON_MACH);483BCaseMask(EF_HEXAGON_MACH_V5, EF_HEXAGON_MACH);484BCaseMask(EF_HEXAGON_MACH_V55, EF_HEXAGON_MACH);485BCaseMask(EF_HEXAGON_MACH_V60, EF_HEXAGON_MACH);486BCaseMask(EF_HEXAGON_MACH_V62, EF_HEXAGON_MACH);487BCaseMask(EF_HEXAGON_MACH_V65, EF_HEXAGON_MACH);488BCaseMask(EF_HEXAGON_MACH_V66, EF_HEXAGON_MACH);489BCaseMask(EF_HEXAGON_MACH_V67, EF_HEXAGON_MACH);490BCaseMask(EF_HEXAGON_MACH_V67T, EF_HEXAGON_MACH);491BCaseMask(EF_HEXAGON_MACH_V68, EF_HEXAGON_MACH);492BCaseMask(EF_HEXAGON_MACH_V69, EF_HEXAGON_MACH);493BCaseMask(EF_HEXAGON_MACH_V71, EF_HEXAGON_MACH);494BCaseMask(EF_HEXAGON_MACH_V71T, EF_HEXAGON_MACH);495BCaseMask(EF_HEXAGON_MACH_V73, EF_HEXAGON_MACH);496BCaseMask(EF_HEXAGON_ISA_V2, EF_HEXAGON_ISA);497BCaseMask(EF_HEXAGON_ISA_V3, EF_HEXAGON_ISA);498BCaseMask(EF_HEXAGON_ISA_V4, EF_HEXAGON_ISA);499BCaseMask(EF_HEXAGON_ISA_V5, EF_HEXAGON_ISA);500BCaseMask(EF_HEXAGON_ISA_V55, EF_HEXAGON_ISA);501BCaseMask(EF_HEXAGON_ISA_V60, EF_HEXAGON_ISA);502BCaseMask(EF_HEXAGON_ISA_V62, EF_HEXAGON_ISA);503BCaseMask(EF_HEXAGON_ISA_V65, EF_HEXAGON_ISA);504BCaseMask(EF_HEXAGON_ISA_V66, EF_HEXAGON_ISA);505BCaseMask(EF_HEXAGON_ISA_V67, EF_HEXAGON_ISA);506BCaseMask(EF_HEXAGON_ISA_V68, EF_HEXAGON_ISA);507BCaseMask(EF_HEXAGON_ISA_V69, EF_HEXAGON_ISA);508BCaseMask(EF_HEXAGON_ISA_V71, EF_HEXAGON_ISA);509BCaseMask(EF_HEXAGON_ISA_V73, EF_HEXAGON_ISA);510break;511case ELF::EM_AVR:512BCaseMask(EF_AVR_ARCH_AVR1, EF_AVR_ARCH_MASK);513BCaseMask(EF_AVR_ARCH_AVR2, EF_AVR_ARCH_MASK);514BCaseMask(EF_AVR_ARCH_AVR25, EF_AVR_ARCH_MASK);515BCaseMask(EF_AVR_ARCH_AVR3, EF_AVR_ARCH_MASK);516BCaseMask(EF_AVR_ARCH_AVR31, EF_AVR_ARCH_MASK);517BCaseMask(EF_AVR_ARCH_AVR35, EF_AVR_ARCH_MASK);518BCaseMask(EF_AVR_ARCH_AVR4, EF_AVR_ARCH_MASK);519BCaseMask(EF_AVR_ARCH_AVR5, EF_AVR_ARCH_MASK);520BCaseMask(EF_AVR_ARCH_AVR51, EF_AVR_ARCH_MASK);521BCaseMask(EF_AVR_ARCH_AVR6, EF_AVR_ARCH_MASK);522BCaseMask(EF_AVR_ARCH_AVRTINY, EF_AVR_ARCH_MASK);523BCaseMask(EF_AVR_ARCH_XMEGA1, EF_AVR_ARCH_MASK);524BCaseMask(EF_AVR_ARCH_XMEGA2, EF_AVR_ARCH_MASK);525BCaseMask(EF_AVR_ARCH_XMEGA3, EF_AVR_ARCH_MASK);526BCaseMask(EF_AVR_ARCH_XMEGA4, EF_AVR_ARCH_MASK);527BCaseMask(EF_AVR_ARCH_XMEGA5, EF_AVR_ARCH_MASK);528BCaseMask(EF_AVR_ARCH_XMEGA6, EF_AVR_ARCH_MASK);529BCaseMask(EF_AVR_ARCH_XMEGA7, EF_AVR_ARCH_MASK);530BCase(EF_AVR_LINKRELAX_PREPARED);531break;532case ELF::EM_LOONGARCH:533BCaseMask(EF_LOONGARCH_ABI_SOFT_FLOAT, EF_LOONGARCH_ABI_MODIFIER_MASK);534BCaseMask(EF_LOONGARCH_ABI_SINGLE_FLOAT, EF_LOONGARCH_ABI_MODIFIER_MASK);535BCaseMask(EF_LOONGARCH_ABI_DOUBLE_FLOAT, EF_LOONGARCH_ABI_MODIFIER_MASK);536BCaseMask(EF_LOONGARCH_OBJABI_V0, EF_LOONGARCH_OBJABI_MASK);537BCaseMask(EF_LOONGARCH_OBJABI_V1, EF_LOONGARCH_OBJABI_MASK);538break;539case ELF::EM_RISCV:540BCase(EF_RISCV_RVC);541BCaseMask(EF_RISCV_FLOAT_ABI_SOFT, EF_RISCV_FLOAT_ABI);542BCaseMask(EF_RISCV_FLOAT_ABI_SINGLE, EF_RISCV_FLOAT_ABI);543BCaseMask(EF_RISCV_FLOAT_ABI_DOUBLE, EF_RISCV_FLOAT_ABI);544BCaseMask(EF_RISCV_FLOAT_ABI_QUAD, EF_RISCV_FLOAT_ABI);545BCase(EF_RISCV_RVE);546BCase(EF_RISCV_TSO);547break;548case ELF::EM_XTENSA:549BCase(EF_XTENSA_XT_INSN);550BCaseMask(EF_XTENSA_MACH_NONE, EF_XTENSA_MACH);551BCase(EF_XTENSA_XT_LIT);552break;553case ELF::EM_AMDGPU:554BCaseMask(EF_AMDGPU_MACH_NONE, EF_AMDGPU_MACH);555BCaseMask(EF_AMDGPU_MACH_R600_R600, EF_AMDGPU_MACH);556BCaseMask(EF_AMDGPU_MACH_R600_R630, EF_AMDGPU_MACH);557BCaseMask(EF_AMDGPU_MACH_R600_RS880, EF_AMDGPU_MACH);558BCaseMask(EF_AMDGPU_MACH_R600_RV670, EF_AMDGPU_MACH);559BCaseMask(EF_AMDGPU_MACH_R600_RV710, EF_AMDGPU_MACH);560BCaseMask(EF_AMDGPU_MACH_R600_RV730, EF_AMDGPU_MACH);561BCaseMask(EF_AMDGPU_MACH_R600_RV770, EF_AMDGPU_MACH);562BCaseMask(EF_AMDGPU_MACH_R600_CEDAR, EF_AMDGPU_MACH);563BCaseMask(EF_AMDGPU_MACH_R600_CYPRESS, EF_AMDGPU_MACH);564BCaseMask(EF_AMDGPU_MACH_R600_JUNIPER, EF_AMDGPU_MACH);565BCaseMask(EF_AMDGPU_MACH_R600_REDWOOD, EF_AMDGPU_MACH);566BCaseMask(EF_AMDGPU_MACH_R600_SUMO, EF_AMDGPU_MACH);567BCaseMask(EF_AMDGPU_MACH_R600_BARTS, EF_AMDGPU_MACH);568BCaseMask(EF_AMDGPU_MACH_R600_CAICOS, EF_AMDGPU_MACH);569BCaseMask(EF_AMDGPU_MACH_R600_CAYMAN, EF_AMDGPU_MACH);570BCaseMask(EF_AMDGPU_MACH_R600_TURKS, EF_AMDGPU_MACH);571BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX600, EF_AMDGPU_MACH);572BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX601, EF_AMDGPU_MACH);573BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX602, EF_AMDGPU_MACH);574BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX700, EF_AMDGPU_MACH);575BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX701, EF_AMDGPU_MACH);576BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX702, EF_AMDGPU_MACH);577BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX703, EF_AMDGPU_MACH);578BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX704, EF_AMDGPU_MACH);579BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX705, EF_AMDGPU_MACH);580BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX801, EF_AMDGPU_MACH);581BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX802, EF_AMDGPU_MACH);582BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX803, EF_AMDGPU_MACH);583BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX805, EF_AMDGPU_MACH);584BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX810, EF_AMDGPU_MACH);585BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX900, EF_AMDGPU_MACH);586BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX902, EF_AMDGPU_MACH);587BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX904, EF_AMDGPU_MACH);588BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX906, EF_AMDGPU_MACH);589BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX908, EF_AMDGPU_MACH);590BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX909, EF_AMDGPU_MACH);591BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX90A, EF_AMDGPU_MACH);592BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX90C, EF_AMDGPU_MACH);593BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX940, EF_AMDGPU_MACH);594BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX941, EF_AMDGPU_MACH);595BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX942, EF_AMDGPU_MACH);596BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1010, EF_AMDGPU_MACH);597BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1011, EF_AMDGPU_MACH);598BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1012, EF_AMDGPU_MACH);599BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1013, EF_AMDGPU_MACH);600BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1030, EF_AMDGPU_MACH);601BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1031, EF_AMDGPU_MACH);602BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1032, EF_AMDGPU_MACH);603BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1033, EF_AMDGPU_MACH);604BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1034, EF_AMDGPU_MACH);605BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1035, EF_AMDGPU_MACH);606BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1036, EF_AMDGPU_MACH);607BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1100, EF_AMDGPU_MACH);608BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1101, EF_AMDGPU_MACH);609BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1102, EF_AMDGPU_MACH);610BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1103, EF_AMDGPU_MACH);611BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1150, EF_AMDGPU_MACH);612BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1151, EF_AMDGPU_MACH);613BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1152, EF_AMDGPU_MACH);614BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1200, EF_AMDGPU_MACH);615BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1201, EF_AMDGPU_MACH);616BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX9_GENERIC, EF_AMDGPU_MACH);617BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC, EF_AMDGPU_MACH);618BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX10_3_GENERIC, EF_AMDGPU_MACH);619BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC, EF_AMDGPU_MACH);620BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX12_GENERIC, EF_AMDGPU_MACH);621switch (Object->Header.ABIVersion) {622default:623// ELFOSABI_AMDGPU_PAL, ELFOSABI_AMDGPU_MESA3D support *_V3 flags.624[[fallthrough]];625case ELF::ELFABIVERSION_AMDGPU_HSA_V3:626BCase(EF_AMDGPU_FEATURE_XNACK_V3);627BCase(EF_AMDGPU_FEATURE_SRAMECC_V3);628break;629case ELF::ELFABIVERSION_AMDGPU_HSA_V6:630for (unsigned K = ELF::EF_AMDGPU_GENERIC_VERSION_MIN;631K <= ELF::EF_AMDGPU_GENERIC_VERSION_MAX; ++K) {632std::string Key = "EF_AMDGPU_GENERIC_VERSION_V" + std::to_string(K);633IO.maskedBitSetCase(Value, Key.c_str(),634K << ELF::EF_AMDGPU_GENERIC_VERSION_OFFSET,635ELF::EF_AMDGPU_GENERIC_VERSION);636}637[[fallthrough]];638case ELF::ELFABIVERSION_AMDGPU_HSA_V4:639case ELF::ELFABIVERSION_AMDGPU_HSA_V5:640BCaseMask(EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4,641EF_AMDGPU_FEATURE_XNACK_V4);642BCaseMask(EF_AMDGPU_FEATURE_XNACK_ANY_V4,643EF_AMDGPU_FEATURE_XNACK_V4);644BCaseMask(EF_AMDGPU_FEATURE_XNACK_OFF_V4,645EF_AMDGPU_FEATURE_XNACK_V4);646BCaseMask(EF_AMDGPU_FEATURE_XNACK_ON_V4,647EF_AMDGPU_FEATURE_XNACK_V4);648BCaseMask(EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4,649EF_AMDGPU_FEATURE_SRAMECC_V4);650BCaseMask(EF_AMDGPU_FEATURE_SRAMECC_ANY_V4,651EF_AMDGPU_FEATURE_SRAMECC_V4);652BCaseMask(EF_AMDGPU_FEATURE_SRAMECC_OFF_V4,653EF_AMDGPU_FEATURE_SRAMECC_V4);654BCaseMask(EF_AMDGPU_FEATURE_SRAMECC_ON_V4,655EF_AMDGPU_FEATURE_SRAMECC_V4);656break;657}658break;659default:660break;661}662#undef BCase663#undef BCaseMask664}665666void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration(667IO &IO, ELFYAML::ELF_SHT &Value) {668const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());669assert(Object && "The IO context is not initialized");670#define ECase(X) IO.enumCase(Value, #X, ELF::X)671ECase(SHT_NULL);672ECase(SHT_PROGBITS);673ECase(SHT_SYMTAB);674// FIXME: Issue a diagnostic with this information.675ECase(SHT_STRTAB);676ECase(SHT_RELA);677ECase(SHT_HASH);678ECase(SHT_DYNAMIC);679ECase(SHT_NOTE);680ECase(SHT_NOBITS);681ECase(SHT_REL);682ECase(SHT_SHLIB);683ECase(SHT_DYNSYM);684ECase(SHT_INIT_ARRAY);685ECase(SHT_FINI_ARRAY);686ECase(SHT_PREINIT_ARRAY);687ECase(SHT_GROUP);688ECase(SHT_SYMTAB_SHNDX);689ECase(SHT_RELR);690ECase(SHT_CREL);691ECase(SHT_ANDROID_REL);692ECase(SHT_ANDROID_RELA);693ECase(SHT_ANDROID_RELR);694ECase(SHT_LLVM_ODRTAB);695ECase(SHT_LLVM_LINKER_OPTIONS);696ECase(SHT_LLVM_CALL_GRAPH_PROFILE);697ECase(SHT_LLVM_ADDRSIG);698ECase(SHT_LLVM_DEPENDENT_LIBRARIES);699ECase(SHT_LLVM_SYMPART);700ECase(SHT_LLVM_PART_EHDR);701ECase(SHT_LLVM_PART_PHDR);702ECase(SHT_LLVM_BB_ADDR_MAP_V0);703ECase(SHT_LLVM_BB_ADDR_MAP);704ECase(SHT_LLVM_OFFLOADING);705ECase(SHT_LLVM_LTO);706ECase(SHT_GNU_ATTRIBUTES);707ECase(SHT_GNU_HASH);708ECase(SHT_GNU_verdef);709ECase(SHT_GNU_verneed);710ECase(SHT_GNU_versym);711switch (Object->getMachine()) {712case ELF::EM_ARM:713ECase(SHT_ARM_EXIDX);714ECase(SHT_ARM_PREEMPTMAP);715ECase(SHT_ARM_ATTRIBUTES);716ECase(SHT_ARM_DEBUGOVERLAY);717ECase(SHT_ARM_OVERLAYSECTION);718break;719case ELF::EM_HEXAGON:720ECase(SHT_HEX_ORDERED);721ECase(SHT_HEXAGON_ATTRIBUTES);722break;723case ELF::EM_X86_64:724ECase(SHT_X86_64_UNWIND);725break;726case ELF::EM_MIPS:727ECase(SHT_MIPS_REGINFO);728ECase(SHT_MIPS_OPTIONS);729ECase(SHT_MIPS_DWARF);730ECase(SHT_MIPS_ABIFLAGS);731break;732case ELF::EM_RISCV:733ECase(SHT_RISCV_ATTRIBUTES);734break;735case ELF::EM_MSP430:736ECase(SHT_MSP430_ATTRIBUTES);737break;738case ELF::EM_AARCH64:739ECase(SHT_AARCH64_AUTH_RELR);740ECase(SHT_AARCH64_MEMTAG_GLOBALS_STATIC);741ECase(SHT_AARCH64_MEMTAG_GLOBALS_DYNAMIC);742break;743default:744// Nothing to do.745break;746}747#undef ECase748IO.enumFallback<Hex32>(Value);749}750751void ScalarBitSetTraits<ELFYAML::ELF_PF>::bitset(IO &IO,752ELFYAML::ELF_PF &Value) {753#define BCase(X) IO.bitSetCase(Value, #X, ELF::X)754BCase(PF_X);755BCase(PF_W);756BCase(PF_R);757}758759void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO,760ELFYAML::ELF_SHF &Value) {761const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());762#define BCase(X) IO.bitSetCase(Value, #X, ELF::X)763BCase(SHF_WRITE);764BCase(SHF_ALLOC);765BCase(SHF_EXCLUDE);766BCase(SHF_EXECINSTR);767BCase(SHF_MERGE);768BCase(SHF_STRINGS);769BCase(SHF_INFO_LINK);770BCase(SHF_LINK_ORDER);771BCase(SHF_OS_NONCONFORMING);772BCase(SHF_GROUP);773BCase(SHF_TLS);774BCase(SHF_COMPRESSED);775switch (Object->getOSAbi()) {776case ELF::ELFOSABI_SOLARIS:777BCase(SHF_SUNW_NODISCARD);778break;779default:780BCase(SHF_GNU_RETAIN);781break;782}783switch (Object->getMachine()) {784case ELF::EM_ARM:785BCase(SHF_ARM_PURECODE);786break;787case ELF::EM_HEXAGON:788BCase(SHF_HEX_GPREL);789break;790case ELF::EM_MIPS:791BCase(SHF_MIPS_NODUPES);792BCase(SHF_MIPS_NAMES);793BCase(SHF_MIPS_LOCAL);794BCase(SHF_MIPS_NOSTRIP);795BCase(SHF_MIPS_GPREL);796BCase(SHF_MIPS_MERGE);797BCase(SHF_MIPS_ADDR);798BCase(SHF_MIPS_STRING);799break;800case ELF::EM_X86_64:801BCase(SHF_X86_64_LARGE);802break;803default:804// Nothing to do.805break;806}807#undef BCase808}809810void ScalarEnumerationTraits<ELFYAML::ELF_SHN>::enumeration(811IO &IO, ELFYAML::ELF_SHN &Value) {812const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());813assert(Object && "The IO context is not initialized");814#define ECase(X) IO.enumCase(Value, #X, ELF::X)815ECase(SHN_UNDEF);816ECase(SHN_LORESERVE);817ECase(SHN_LOPROC);818ECase(SHN_HIPROC);819ECase(SHN_LOOS);820ECase(SHN_HIOS);821ECase(SHN_ABS);822ECase(SHN_COMMON);823ECase(SHN_XINDEX);824ECase(SHN_HIRESERVE);825ECase(SHN_AMDGPU_LDS);826827if (!IO.outputting() || Object->getMachine() == ELF::EM_MIPS) {828ECase(SHN_MIPS_ACOMMON);829ECase(SHN_MIPS_TEXT);830ECase(SHN_MIPS_DATA);831ECase(SHN_MIPS_SCOMMON);832ECase(SHN_MIPS_SUNDEFINED);833}834835ECase(SHN_HEXAGON_SCOMMON);836ECase(SHN_HEXAGON_SCOMMON_1);837ECase(SHN_HEXAGON_SCOMMON_2);838ECase(SHN_HEXAGON_SCOMMON_4);839ECase(SHN_HEXAGON_SCOMMON_8);840#undef ECase841IO.enumFallback<Hex16>(Value);842}843844void ScalarEnumerationTraits<ELFYAML::ELF_STB>::enumeration(845IO &IO, ELFYAML::ELF_STB &Value) {846#define ECase(X) IO.enumCase(Value, #X, ELF::X)847ECase(STB_LOCAL);848ECase(STB_GLOBAL);849ECase(STB_WEAK);850ECase(STB_GNU_UNIQUE);851#undef ECase852IO.enumFallback<Hex8>(Value);853}854855void ScalarEnumerationTraits<ELFYAML::ELF_STT>::enumeration(856IO &IO, ELFYAML::ELF_STT &Value) {857#define ECase(X) IO.enumCase(Value, #X, ELF::X)858ECase(STT_NOTYPE);859ECase(STT_OBJECT);860ECase(STT_FUNC);861ECase(STT_SECTION);862ECase(STT_FILE);863ECase(STT_COMMON);864ECase(STT_TLS);865ECase(STT_GNU_IFUNC);866#undef ECase867IO.enumFallback<Hex8>(Value);868}869870871void ScalarEnumerationTraits<ELFYAML::ELF_RSS>::enumeration(872IO &IO, ELFYAML::ELF_RSS &Value) {873#define ECase(X) IO.enumCase(Value, #X, ELF::X)874ECase(RSS_UNDEF);875ECase(RSS_GP);876ECase(RSS_GP0);877ECase(RSS_LOC);878#undef ECase879}880881void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration(882IO &IO, ELFYAML::ELF_REL &Value) {883const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());884assert(Object && "The IO context is not initialized");885#define ELF_RELOC(X, Y) IO.enumCase(Value, #X, ELF::X);886switch (Object->getMachine()) {887case ELF::EM_X86_64:888#include "llvm/BinaryFormat/ELFRelocs/x86_64.def"889break;890case ELF::EM_MIPS:891#include "llvm/BinaryFormat/ELFRelocs/Mips.def"892break;893case ELF::EM_HEXAGON:894#include "llvm/BinaryFormat/ELFRelocs/Hexagon.def"895break;896case ELF::EM_386:897case ELF::EM_IAMCU:898#include "llvm/BinaryFormat/ELFRelocs/i386.def"899break;900case ELF::EM_AARCH64:901#include "llvm/BinaryFormat/ELFRelocs/AArch64.def"902break;903case ELF::EM_ARM:904#include "llvm/BinaryFormat/ELFRelocs/ARM.def"905break;906case ELF::EM_ARC:907#include "llvm/BinaryFormat/ELFRelocs/ARC.def"908break;909case ELF::EM_RISCV:910#include "llvm/BinaryFormat/ELFRelocs/RISCV.def"911break;912case ELF::EM_LANAI:913#include "llvm/BinaryFormat/ELFRelocs/Lanai.def"914break;915case ELF::EM_AMDGPU:916#include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def"917break;918case ELF::EM_BPF:919#include "llvm/BinaryFormat/ELFRelocs/BPF.def"920break;921case ELF::EM_VE:922#include "llvm/BinaryFormat/ELFRelocs/VE.def"923break;924case ELF::EM_CSKY:925#include "llvm/BinaryFormat/ELFRelocs/CSKY.def"926break;927case ELF::EM_PPC:928#include "llvm/BinaryFormat/ELFRelocs/PowerPC.def"929break;930case ELF::EM_PPC64:931#include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def"932break;933case ELF::EM_68K:934#include "llvm/BinaryFormat/ELFRelocs/M68k.def"935break;936case ELF::EM_LOONGARCH:937#include "llvm/BinaryFormat/ELFRelocs/LoongArch.def"938break;939case ELF::EM_XTENSA:940#include "llvm/BinaryFormat/ELFRelocs/Xtensa.def"941break;942default:943// Nothing to do.944break;945}946#undef ELF_RELOC947IO.enumFallback<Hex32>(Value);948}949950void ScalarEnumerationTraits<ELFYAML::ELF_DYNTAG>::enumeration(951IO &IO, ELFYAML::ELF_DYNTAG &Value) {952const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());953assert(Object && "The IO context is not initialized");954955// Disable architecture specific tags by default. We might enable them below.956#define AARCH64_DYNAMIC_TAG(name, value)957#define MIPS_DYNAMIC_TAG(name, value)958#define HEXAGON_DYNAMIC_TAG(name, value)959#define PPC_DYNAMIC_TAG(name, value)960#define PPC64_DYNAMIC_TAG(name, value)961// Ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc.962#define DYNAMIC_TAG_MARKER(name, value)963964#define STRINGIFY(X) (#X)965#define DYNAMIC_TAG(X, Y) IO.enumCase(Value, STRINGIFY(DT_##X), ELF::DT_##X);966switch (Object->getMachine()) {967case ELF::EM_AARCH64:968#undef AARCH64_DYNAMIC_TAG969#define AARCH64_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)970#include "llvm/BinaryFormat/DynamicTags.def"971#undef AARCH64_DYNAMIC_TAG972#define AARCH64_DYNAMIC_TAG(name, value)973break;974case ELF::EM_MIPS:975#undef MIPS_DYNAMIC_TAG976#define MIPS_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)977#include "llvm/BinaryFormat/DynamicTags.def"978#undef MIPS_DYNAMIC_TAG979#define MIPS_DYNAMIC_TAG(name, value)980break;981case ELF::EM_HEXAGON:982#undef HEXAGON_DYNAMIC_TAG983#define HEXAGON_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)984#include "llvm/BinaryFormat/DynamicTags.def"985#undef HEXAGON_DYNAMIC_TAG986#define HEXAGON_DYNAMIC_TAG(name, value)987break;988case ELF::EM_PPC:989#undef PPC_DYNAMIC_TAG990#define PPC_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)991#include "llvm/BinaryFormat/DynamicTags.def"992#undef PPC_DYNAMIC_TAG993#define PPC_DYNAMIC_TAG(name, value)994break;995case ELF::EM_PPC64:996#undef PPC64_DYNAMIC_TAG997#define PPC64_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)998#include "llvm/BinaryFormat/DynamicTags.def"999#undef PPC64_DYNAMIC_TAG1000#define PPC64_DYNAMIC_TAG(name, value)1001break;1002case ELF::EM_RISCV:1003#undef RISCV_DYNAMIC_TAG1004#define RISCV_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)1005#include "llvm/BinaryFormat/DynamicTags.def"1006#undef RISCV_DYNAMIC_TAG1007#define RISCV_DYNAMIC_TAG(name, value)1008break;1009default:1010#include "llvm/BinaryFormat/DynamicTags.def"1011break;1012}1013#undef AARCH64_DYNAMIC_TAG1014#undef MIPS_DYNAMIC_TAG1015#undef HEXAGON_DYNAMIC_TAG1016#undef PPC_DYNAMIC_TAG1017#undef PPC64_DYNAMIC_TAG1018#undef DYNAMIC_TAG_MARKER1019#undef STRINGIFY1020#undef DYNAMIC_TAG10211022IO.enumFallback<Hex64>(Value);1023}10241025void ScalarEnumerationTraits<ELFYAML::MIPS_AFL_REG>::enumeration(1026IO &IO, ELFYAML::MIPS_AFL_REG &Value) {1027#define ECase(X) IO.enumCase(Value, #X, Mips::AFL_##X)1028ECase(REG_NONE);1029ECase(REG_32);1030ECase(REG_64);1031ECase(REG_128);1032#undef ECase1033}10341035void ScalarEnumerationTraits<ELFYAML::MIPS_ABI_FP>::enumeration(1036IO &IO, ELFYAML::MIPS_ABI_FP &Value) {1037#define ECase(X) IO.enumCase(Value, #X, Mips::Val_GNU_MIPS_ABI_##X)1038ECase(FP_ANY);1039ECase(FP_DOUBLE);1040ECase(FP_SINGLE);1041ECase(FP_SOFT);1042ECase(FP_OLD_64);1043ECase(FP_XX);1044ECase(FP_64);1045ECase(FP_64A);1046#undef ECase1047}10481049void ScalarEnumerationTraits<ELFYAML::MIPS_AFL_EXT>::enumeration(1050IO &IO, ELFYAML::MIPS_AFL_EXT &Value) {1051#define ECase(X) IO.enumCase(Value, #X, Mips::AFL_##X)1052ECase(EXT_NONE);1053ECase(EXT_XLR);1054ECase(EXT_OCTEON2);1055ECase(EXT_OCTEONP);1056ECase(EXT_LOONGSON_3A);1057ECase(EXT_OCTEON);1058ECase(EXT_5900);1059ECase(EXT_4650);1060ECase(EXT_4010);1061ECase(EXT_4100);1062ECase(EXT_3900);1063ECase(EXT_10000);1064ECase(EXT_SB1);1065ECase(EXT_4111);1066ECase(EXT_4120);1067ECase(EXT_5400);1068ECase(EXT_5500);1069ECase(EXT_LOONGSON_2E);1070ECase(EXT_LOONGSON_2F);1071ECase(EXT_OCTEON3);1072#undef ECase1073}10741075void ScalarEnumerationTraits<ELFYAML::MIPS_ISA>::enumeration(1076IO &IO, ELFYAML::MIPS_ISA &Value) {1077IO.enumCase(Value, "MIPS1", 1);1078IO.enumCase(Value, "MIPS2", 2);1079IO.enumCase(Value, "MIPS3", 3);1080IO.enumCase(Value, "MIPS4", 4);1081IO.enumCase(Value, "MIPS5", 5);1082IO.enumCase(Value, "MIPS32", 32);1083IO.enumCase(Value, "MIPS64", 64);1084IO.enumFallback<Hex32>(Value);1085}10861087void ScalarBitSetTraits<ELFYAML::MIPS_AFL_ASE>::bitset(1088IO &IO, ELFYAML::MIPS_AFL_ASE &Value) {1089#define BCase(X) IO.bitSetCase(Value, #X, Mips::AFL_ASE_##X)1090BCase(DSP);1091BCase(DSPR2);1092BCase(EVA);1093BCase(MCU);1094BCase(MDMX);1095BCase(MIPS3D);1096BCase(MT);1097BCase(SMARTMIPS);1098BCase(VIRT);1099BCase(MSA);1100BCase(MIPS16);1101BCase(MICROMIPS);1102BCase(XPA);1103BCase(CRC);1104BCase(GINV);1105#undef BCase1106}11071108void ScalarBitSetTraits<ELFYAML::MIPS_AFL_FLAGS1>::bitset(1109IO &IO, ELFYAML::MIPS_AFL_FLAGS1 &Value) {1110#define BCase(X) IO.bitSetCase(Value, #X, Mips::AFL_FLAGS1_##X)1111BCase(ODDSPREG);1112#undef BCase1113}11141115void MappingTraits<ELFYAML::SectionHeader>::mapping(1116IO &IO, ELFYAML::SectionHeader &SHdr) {1117IO.mapRequired("Name", SHdr.Name);1118}11191120void MappingTraits<ELFYAML::FileHeader>::mapping(IO &IO,1121ELFYAML::FileHeader &FileHdr) {1122IO.mapRequired("Class", FileHdr.Class);1123IO.mapRequired("Data", FileHdr.Data);1124IO.mapOptional("OSABI", FileHdr.OSABI, ELFYAML::ELF_ELFOSABI(0));1125IO.mapOptional("ABIVersion", FileHdr.ABIVersion, Hex8(0));1126IO.mapRequired("Type", FileHdr.Type);1127IO.mapOptional("Machine", FileHdr.Machine);1128IO.mapOptional("Flags", FileHdr.Flags, ELFYAML::ELF_EF(0));1129IO.mapOptional("Entry", FileHdr.Entry, Hex64(0));1130IO.mapOptional("SectionHeaderStringTable", FileHdr.SectionHeaderStringTable);11311132// obj2yaml does not dump these fields.1133assert(!IO.outputting() ||1134(!FileHdr.EPhOff && !FileHdr.EPhEntSize && !FileHdr.EPhNum));1135IO.mapOptional("EPhOff", FileHdr.EPhOff);1136IO.mapOptional("EPhEntSize", FileHdr.EPhEntSize);1137IO.mapOptional("EPhNum", FileHdr.EPhNum);1138IO.mapOptional("EShEntSize", FileHdr.EShEntSize);1139IO.mapOptional("EShOff", FileHdr.EShOff);1140IO.mapOptional("EShNum", FileHdr.EShNum);1141IO.mapOptional("EShStrNdx", FileHdr.EShStrNdx);1142}11431144void MappingTraits<ELFYAML::ProgramHeader>::mapping(1145IO &IO, ELFYAML::ProgramHeader &Phdr) {1146IO.mapRequired("Type", Phdr.Type);1147IO.mapOptional("Flags", Phdr.Flags, ELFYAML::ELF_PF(0));1148IO.mapOptional("FirstSec", Phdr.FirstSec);1149IO.mapOptional("LastSec", Phdr.LastSec);1150IO.mapOptional("VAddr", Phdr.VAddr, Hex64(0));1151IO.mapOptional("PAddr", Phdr.PAddr, Phdr.VAddr);1152IO.mapOptional("Align", Phdr.Align);1153IO.mapOptional("FileSize", Phdr.FileSize);1154IO.mapOptional("MemSize", Phdr.MemSize);1155IO.mapOptional("Offset", Phdr.Offset);1156}11571158std::string MappingTraits<ELFYAML::ProgramHeader>::validate(1159IO &IO, ELFYAML::ProgramHeader &FileHdr) {1160if (!FileHdr.FirstSec && FileHdr.LastSec)1161return "the \"LastSec\" key can't be used without the \"FirstSec\" key";1162if (FileHdr.FirstSec && !FileHdr.LastSec)1163return "the \"FirstSec\" key can't be used without the \"LastSec\" key";1164return "";1165}11661167LLVM_YAML_STRONG_TYPEDEF(StringRef, StOtherPiece)11681169template <> struct ScalarTraits<StOtherPiece> {1170static void output(const StOtherPiece &Val, void *, raw_ostream &Out) {1171Out << Val;1172}1173static StringRef input(StringRef Scalar, void *, StOtherPiece &Val) {1174Val = Scalar;1175return {};1176}1177static QuotingType mustQuote(StringRef) { return QuotingType::None; }1178};1179template <> struct SequenceElementTraits<StOtherPiece> {1180static const bool flow = true;1181};11821183template <> struct ScalarTraits<ELFYAML::YAMLFlowString> {1184static void output(const ELFYAML::YAMLFlowString &Val, void *,1185raw_ostream &Out) {1186Out << Val;1187}1188static StringRef input(StringRef Scalar, void *,1189ELFYAML::YAMLFlowString &Val) {1190Val = Scalar;1191return {};1192}1193static QuotingType mustQuote(StringRef S) {1194return ScalarTraits<StringRef>::mustQuote(S);1195}1196};1197template <> struct SequenceElementTraits<ELFYAML::YAMLFlowString> {1198static const bool flow = true;1199};12001201namespace {12021203struct NormalizedOther {1204NormalizedOther(IO &IO) : YamlIO(IO) {}1205NormalizedOther(IO &IO, std::optional<uint8_t> Original) : YamlIO(IO) {1206assert(Original && "This constructor is only used for outputting YAML and "1207"assumes a non-empty Original");1208std::vector<StOtherPiece> Ret;1209const auto *Object = static_cast<ELFYAML::Object *>(YamlIO.getContext());1210for (std::pair<StringRef, uint8_t> &P :1211getFlags(Object->getMachine()).takeVector()) {1212uint8_t FlagValue = P.second;1213if ((*Original & FlagValue) != FlagValue)1214continue;1215*Original &= ~FlagValue;1216Ret.push_back({P.first});1217}12181219if (*Original != 0) {1220UnknownFlagsHolder = std::to_string(*Original);1221Ret.push_back({UnknownFlagsHolder});1222}12231224if (!Ret.empty())1225Other = std::move(Ret);1226}12271228uint8_t toValue(StringRef Name) {1229const auto *Object = static_cast<ELFYAML::Object *>(YamlIO.getContext());1230MapVector<StringRef, uint8_t> Flags = getFlags(Object->getMachine());12311232auto It = Flags.find(Name);1233if (It != Flags.end())1234return It->second;12351236uint8_t Val;1237if (to_integer(Name, Val))1238return Val;12391240YamlIO.setError("an unknown value is used for symbol's 'Other' field: " +1241Name);1242return 0;1243}12441245std::optional<uint8_t> denormalize(IO &) {1246if (!Other)1247return std::nullopt;1248uint8_t Ret = 0;1249for (StOtherPiece &Val : *Other)1250Ret |= toValue(Val);1251return Ret;1252}12531254// st_other field is used to encode symbol visibility and platform-dependent1255// flags and values. This method returns a name to value map that is used for1256// parsing and encoding this field.1257MapVector<StringRef, uint8_t> getFlags(unsigned EMachine) {1258MapVector<StringRef, uint8_t> Map;1259// STV_* values are just enumeration values. We add them in a reversed order1260// because when we convert the st_other to named constants when printing1261// YAML we want to use a maximum number of bits on each step:1262// when we have st_other == 3, we want to print it as STV_PROTECTED (3), but1263// not as STV_HIDDEN (2) + STV_INTERNAL (1).1264Map["STV_PROTECTED"] = ELF::STV_PROTECTED;1265Map["STV_HIDDEN"] = ELF::STV_HIDDEN;1266Map["STV_INTERNAL"] = ELF::STV_INTERNAL;1267// STV_DEFAULT is used to represent the default visibility and has a value1268// 0. We want to be able to read it from YAML documents, but there is no1269// reason to print it.1270if (!YamlIO.outputting())1271Map["STV_DEFAULT"] = ELF::STV_DEFAULT;12721273// MIPS is not consistent. All of the STO_MIPS_* values are bit flags,1274// except STO_MIPS_MIPS16 which overlaps them. It should be checked and1275// consumed first when we print the output, because we do not want to print1276// any other flags that have the same bits instead.1277if (EMachine == ELF::EM_MIPS) {1278Map["STO_MIPS_MIPS16"] = ELF::STO_MIPS_MIPS16;1279Map["STO_MIPS_MICROMIPS"] = ELF::STO_MIPS_MICROMIPS;1280Map["STO_MIPS_PIC"] = ELF::STO_MIPS_PIC;1281Map["STO_MIPS_PLT"] = ELF::STO_MIPS_PLT;1282Map["STO_MIPS_OPTIONAL"] = ELF::STO_MIPS_OPTIONAL;1283}12841285if (EMachine == ELF::EM_AARCH64)1286Map["STO_AARCH64_VARIANT_PCS"] = ELF::STO_AARCH64_VARIANT_PCS;1287if (EMachine == ELF::EM_RISCV)1288Map["STO_RISCV_VARIANT_CC"] = ELF::STO_RISCV_VARIANT_CC;1289return Map;1290}12911292IO &YamlIO;1293std::optional<std::vector<StOtherPiece>> Other;1294std::string UnknownFlagsHolder;1295};12961297} // end anonymous namespace12981299void ScalarTraits<ELFYAML::YAMLIntUInt>::output(const ELFYAML::YAMLIntUInt &Val,1300void *Ctx, raw_ostream &Out) {1301Out << Val;1302}13031304StringRef ScalarTraits<ELFYAML::YAMLIntUInt>::input(StringRef Scalar, void *Ctx,1305ELFYAML::YAMLIntUInt &Val) {1306const bool Is64 = static_cast<ELFYAML::Object *>(Ctx)->Header.Class ==1307ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64);1308StringRef ErrMsg = "invalid number";1309// We do not accept negative hex numbers because their meaning is ambiguous.1310// For example, would -0xfffffffff mean 1 or INT32_MIN?1311if (Scalar.empty() || Scalar.starts_with("-0x"))1312return ErrMsg;13131314if (Scalar.starts_with("-")) {1315const int64_t MinVal = Is64 ? INT64_MIN : INT32_MIN;1316long long Int;1317if (getAsSignedInteger(Scalar, /*Radix=*/0, Int) || (Int < MinVal))1318return ErrMsg;1319Val = Int;1320return "";1321}13221323const uint64_t MaxVal = Is64 ? UINT64_MAX : UINT32_MAX;1324unsigned long long UInt;1325if (getAsUnsignedInteger(Scalar, /*Radix=*/0, UInt) || (UInt > MaxVal))1326return ErrMsg;1327Val = UInt;1328return "";1329}13301331void MappingTraits<ELFYAML::Symbol>::mapping(IO &IO, ELFYAML::Symbol &Symbol) {1332IO.mapOptional("Name", Symbol.Name, StringRef());1333IO.mapOptional("StName", Symbol.StName);1334IO.mapOptional("Type", Symbol.Type, ELFYAML::ELF_STT(0));1335IO.mapOptional("Section", Symbol.Section);1336IO.mapOptional("Index", Symbol.Index);1337IO.mapOptional("Binding", Symbol.Binding, ELFYAML::ELF_STB(0));1338IO.mapOptional("Value", Symbol.Value);1339IO.mapOptional("Size", Symbol.Size);13401341// Symbol's Other field is a bit special. It is usually a field that1342// represents st_other and holds the symbol visibility. However, on some1343// platforms, it can contain bit fields and regular values, or even sometimes1344// a crazy mix of them (see comments for NormalizedOther). Because of this, we1345// need special handling.1346MappingNormalization<NormalizedOther, std::optional<uint8_t>> Keys(1347IO, Symbol.Other);1348IO.mapOptional("Other", Keys->Other);1349}13501351std::string MappingTraits<ELFYAML::Symbol>::validate(IO &IO,1352ELFYAML::Symbol &Symbol) {1353if (Symbol.Index && Symbol.Section)1354return "Index and Section cannot both be specified for Symbol";1355return "";1356}13571358static void commonSectionMapping(IO &IO, ELFYAML::Section &Section) {1359IO.mapOptional("Name", Section.Name, StringRef());1360IO.mapRequired("Type", Section.Type);1361IO.mapOptional("Flags", Section.Flags);1362IO.mapOptional("Address", Section.Address);1363IO.mapOptional("Link", Section.Link);1364IO.mapOptional("AddressAlign", Section.AddressAlign, Hex64(0));1365IO.mapOptional("EntSize", Section.EntSize);1366IO.mapOptional("Offset", Section.Offset);13671368IO.mapOptional("Content", Section.Content);1369IO.mapOptional("Size", Section.Size);13701371// obj2yaml does not dump these fields. They are expected to be empty when we1372// are producing YAML, because yaml2obj sets appropriate values for them1373// automatically when they are not explicitly defined.1374assert(!IO.outputting() ||1375(!Section.ShOffset && !Section.ShSize && !Section.ShName &&1376!Section.ShFlags && !Section.ShType && !Section.ShAddrAlign));1377IO.mapOptional("ShAddrAlign", Section.ShAddrAlign);1378IO.mapOptional("ShName", Section.ShName);1379IO.mapOptional("ShOffset", Section.ShOffset);1380IO.mapOptional("ShSize", Section.ShSize);1381IO.mapOptional("ShFlags", Section.ShFlags);1382IO.mapOptional("ShType", Section.ShType);1383}13841385static void sectionMapping(IO &IO, ELFYAML::DynamicSection &Section) {1386commonSectionMapping(IO, Section);1387IO.mapOptional("Entries", Section.Entries);1388}13891390static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) {1391commonSectionMapping(IO, Section);13921393// We also support reading a content as array of bytes using the ContentArray1394// key. obj2yaml never prints this field.1395assert(!IO.outputting() || !Section.ContentBuf);1396IO.mapOptional("ContentArray", Section.ContentBuf);1397if (Section.ContentBuf) {1398if (Section.Content)1399IO.setError("Content and ContentArray can't be used together");1400Section.Content = yaml::BinaryRef(*Section.ContentBuf);1401}14021403IO.mapOptional("Info", Section.Info);1404}14051406static void sectionMapping(IO &IO, ELFYAML::BBAddrMapSection &Section) {1407commonSectionMapping(IO, Section);1408IO.mapOptional("Content", Section.Content);1409IO.mapOptional("Entries", Section.Entries);1410IO.mapOptional("PGOAnalyses", Section.PGOAnalyses);1411}14121413static void sectionMapping(IO &IO, ELFYAML::StackSizesSection &Section) {1414commonSectionMapping(IO, Section);1415IO.mapOptional("Entries", Section.Entries);1416}14171418static void sectionMapping(IO &IO, ELFYAML::HashSection &Section) {1419commonSectionMapping(IO, Section);1420IO.mapOptional("Bucket", Section.Bucket);1421IO.mapOptional("Chain", Section.Chain);14221423// obj2yaml does not dump these fields. They can be used to override nchain1424// and nbucket values for creating broken sections.1425assert(!IO.outputting() || (!Section.NBucket && !Section.NChain));1426IO.mapOptional("NChain", Section.NChain);1427IO.mapOptional("NBucket", Section.NBucket);1428}14291430static void sectionMapping(IO &IO, ELFYAML::NoteSection &Section) {1431commonSectionMapping(IO, Section);1432IO.mapOptional("Notes", Section.Notes);1433}143414351436static void sectionMapping(IO &IO, ELFYAML::GnuHashSection &Section) {1437commonSectionMapping(IO, Section);1438IO.mapOptional("Header", Section.Header);1439IO.mapOptional("BloomFilter", Section.BloomFilter);1440IO.mapOptional("HashBuckets", Section.HashBuckets);1441IO.mapOptional("HashValues", Section.HashValues);1442}1443static void sectionMapping(IO &IO, ELFYAML::NoBitsSection &Section) {1444commonSectionMapping(IO, Section);1445}14461447static void sectionMapping(IO &IO, ELFYAML::VerdefSection &Section) {1448commonSectionMapping(IO, Section);1449IO.mapOptional("Info", Section.Info);1450IO.mapOptional("Entries", Section.Entries);1451}14521453static void sectionMapping(IO &IO, ELFYAML::SymverSection &Section) {1454commonSectionMapping(IO, Section);1455IO.mapOptional("Entries", Section.Entries);1456}14571458static void sectionMapping(IO &IO, ELFYAML::VerneedSection &Section) {1459commonSectionMapping(IO, Section);1460IO.mapOptional("Info", Section.Info);1461IO.mapOptional("Dependencies", Section.VerneedV);1462}14631464static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) {1465commonSectionMapping(IO, Section);1466IO.mapOptional("Info", Section.RelocatableSec, StringRef());1467IO.mapOptional("Relocations", Section.Relocations);1468}14691470static void sectionMapping(IO &IO, ELFYAML::RelrSection &Section) {1471commonSectionMapping(IO, Section);1472IO.mapOptional("Entries", Section.Entries);1473}14741475static void groupSectionMapping(IO &IO, ELFYAML::GroupSection &Group) {1476commonSectionMapping(IO, Group);1477IO.mapOptional("Info", Group.Signature);1478IO.mapOptional("Members", Group.Members);1479}14801481static void sectionMapping(IO &IO, ELFYAML::SymtabShndxSection &Section) {1482commonSectionMapping(IO, Section);1483IO.mapOptional("Entries", Section.Entries);1484}14851486static void sectionMapping(IO &IO, ELFYAML::AddrsigSection &Section) {1487commonSectionMapping(IO, Section);1488IO.mapOptional("Symbols", Section.Symbols);1489}14901491static void fillMapping(IO &IO, ELFYAML::Fill &Fill) {1492IO.mapOptional("Name", Fill.Name, StringRef());1493IO.mapOptional("Pattern", Fill.Pattern);1494IO.mapOptional("Offset", Fill.Offset);1495IO.mapRequired("Size", Fill.Size);1496}14971498static void sectionHeaderTableMapping(IO &IO,1499ELFYAML::SectionHeaderTable &SHT) {1500IO.mapOptional("Offset", SHT.Offset);1501IO.mapOptional("Sections", SHT.Sections);1502IO.mapOptional("Excluded", SHT.Excluded);1503IO.mapOptional("NoHeaders", SHT.NoHeaders);1504}15051506static void sectionMapping(IO &IO, ELFYAML::LinkerOptionsSection &Section) {1507commonSectionMapping(IO, Section);1508IO.mapOptional("Options", Section.Options);1509}15101511static void sectionMapping(IO &IO,1512ELFYAML::DependentLibrariesSection &Section) {1513commonSectionMapping(IO, Section);1514IO.mapOptional("Libraries", Section.Libs);1515}15161517static void sectionMapping(IO &IO, ELFYAML::CallGraphProfileSection &Section) {1518commonSectionMapping(IO, Section);1519IO.mapOptional("Entries", Section.Entries);1520}15211522void MappingTraits<ELFYAML::SectionOrType>::mapping(1523IO &IO, ELFYAML::SectionOrType §ionOrType) {1524IO.mapRequired("SectionOrType", sectionOrType.sectionNameOrType);1525}15261527static void sectionMapping(IO &IO, ELFYAML::ARMIndexTableSection &Section) {1528commonSectionMapping(IO, Section);1529IO.mapOptional("Entries", Section.Entries);1530}15311532static void sectionMapping(IO &IO, ELFYAML::MipsABIFlags &Section) {1533commonSectionMapping(IO, Section);1534IO.mapOptional("Version", Section.Version, Hex16(0));1535IO.mapRequired("ISA", Section.ISALevel);1536IO.mapOptional("ISARevision", Section.ISARevision, Hex8(0));1537IO.mapOptional("ISAExtension", Section.ISAExtension,1538ELFYAML::MIPS_AFL_EXT(Mips::AFL_EXT_NONE));1539IO.mapOptional("ASEs", Section.ASEs, ELFYAML::MIPS_AFL_ASE(0));1540IO.mapOptional("FpABI", Section.FpABI,1541ELFYAML::MIPS_ABI_FP(Mips::Val_GNU_MIPS_ABI_FP_ANY));1542IO.mapOptional("GPRSize", Section.GPRSize,1543ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE));1544IO.mapOptional("CPR1Size", Section.CPR1Size,1545ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE));1546IO.mapOptional("CPR2Size", Section.CPR2Size,1547ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE));1548IO.mapOptional("Flags1", Section.Flags1, ELFYAML::MIPS_AFL_FLAGS1(0));1549IO.mapOptional("Flags2", Section.Flags2, Hex32(0));1550}15511552static StringRef getStringValue(IO &IO, const char *Key) {1553StringRef Val;1554IO.mapRequired(Key, Val);1555return Val;1556}15571558static void setStringValue(IO &IO, const char *Key, StringRef Val) {1559IO.mapRequired(Key, Val);1560}15611562static bool isInteger(StringRef Val) {1563APInt Tmp;1564return !Val.getAsInteger(0, Tmp);1565}15661567void MappingTraits<std::unique_ptr<ELFYAML::Chunk>>::mapping(1568IO &IO, std::unique_ptr<ELFYAML::Chunk> &Section) {1569ELFYAML::ELF_SHT Type;1570StringRef TypeStr;1571if (IO.outputting()) {1572if (auto *S = dyn_cast<ELFYAML::Section>(Section.get()))1573Type = S->Type;1574else if (auto *SHT = dyn_cast<ELFYAML::SectionHeaderTable>(Section.get()))1575TypeStr = SHT->TypeStr;1576} else {1577// When the Type string does not have a "SHT_" prefix, we know it is not a1578// description of a regular ELF output section.1579TypeStr = getStringValue(IO, "Type");1580if (TypeStr.starts_with("SHT_") || isInteger(TypeStr))1581IO.mapRequired("Type", Type);1582}15831584if (TypeStr == "Fill") {1585assert(!IO.outputting()); // We don't dump fills currently.1586Section.reset(new ELFYAML::Fill());1587fillMapping(IO, *cast<ELFYAML::Fill>(Section.get()));1588return;1589}15901591if (TypeStr == ELFYAML::SectionHeaderTable::TypeStr) {1592if (IO.outputting())1593setStringValue(IO, "Type", TypeStr);1594else1595Section.reset(new ELFYAML::SectionHeaderTable(/*IsImplicit=*/false));15961597sectionHeaderTableMapping(1598IO, *cast<ELFYAML::SectionHeaderTable>(Section.get()));1599return;1600}16011602const auto &Obj = *static_cast<ELFYAML::Object *>(IO.getContext());1603if (Obj.getMachine() == ELF::EM_MIPS && Type == ELF::SHT_MIPS_ABIFLAGS) {1604if (!IO.outputting())1605Section.reset(new ELFYAML::MipsABIFlags());1606sectionMapping(IO, *cast<ELFYAML::MipsABIFlags>(Section.get()));1607return;1608}16091610if (Obj.getMachine() == ELF::EM_ARM && Type == ELF::SHT_ARM_EXIDX) {1611if (!IO.outputting())1612Section.reset(new ELFYAML::ARMIndexTableSection());1613sectionMapping(IO, *cast<ELFYAML::ARMIndexTableSection>(Section.get()));1614return;1615}16161617switch (Type) {1618case ELF::SHT_DYNAMIC:1619if (!IO.outputting())1620Section.reset(new ELFYAML::DynamicSection());1621sectionMapping(IO, *cast<ELFYAML::DynamicSection>(Section.get()));1622break;1623case ELF::SHT_REL:1624case ELF::SHT_RELA:1625case ELF::SHT_CREL:1626if (!IO.outputting())1627Section.reset(new ELFYAML::RelocationSection());1628sectionMapping(IO, *cast<ELFYAML::RelocationSection>(Section.get()));1629break;1630case ELF::SHT_RELR:1631if (!IO.outputting())1632Section.reset(new ELFYAML::RelrSection());1633sectionMapping(IO, *cast<ELFYAML::RelrSection>(Section.get()));1634break;1635case ELF::SHT_GROUP:1636if (!IO.outputting())1637Section.reset(new ELFYAML::GroupSection());1638groupSectionMapping(IO, *cast<ELFYAML::GroupSection>(Section.get()));1639break;1640case ELF::SHT_NOBITS:1641if (!IO.outputting())1642Section.reset(new ELFYAML::NoBitsSection());1643sectionMapping(IO, *cast<ELFYAML::NoBitsSection>(Section.get()));1644break;1645case ELF::SHT_HASH:1646if (!IO.outputting())1647Section.reset(new ELFYAML::HashSection());1648sectionMapping(IO, *cast<ELFYAML::HashSection>(Section.get()));1649break;1650case ELF::SHT_NOTE:1651if (!IO.outputting())1652Section.reset(new ELFYAML::NoteSection());1653sectionMapping(IO, *cast<ELFYAML::NoteSection>(Section.get()));1654break;1655case ELF::SHT_GNU_HASH:1656if (!IO.outputting())1657Section.reset(new ELFYAML::GnuHashSection());1658sectionMapping(IO, *cast<ELFYAML::GnuHashSection>(Section.get()));1659break;1660case ELF::SHT_GNU_verdef:1661if (!IO.outputting())1662Section.reset(new ELFYAML::VerdefSection());1663sectionMapping(IO, *cast<ELFYAML::VerdefSection>(Section.get()));1664break;1665case ELF::SHT_GNU_versym:1666if (!IO.outputting())1667Section.reset(new ELFYAML::SymverSection());1668sectionMapping(IO, *cast<ELFYAML::SymverSection>(Section.get()));1669break;1670case ELF::SHT_GNU_verneed:1671if (!IO.outputting())1672Section.reset(new ELFYAML::VerneedSection());1673sectionMapping(IO, *cast<ELFYAML::VerneedSection>(Section.get()));1674break;1675case ELF::SHT_SYMTAB_SHNDX:1676if (!IO.outputting())1677Section.reset(new ELFYAML::SymtabShndxSection());1678sectionMapping(IO, *cast<ELFYAML::SymtabShndxSection>(Section.get()));1679break;1680case ELF::SHT_LLVM_ADDRSIG:1681if (!IO.outputting())1682Section.reset(new ELFYAML::AddrsigSection());1683sectionMapping(IO, *cast<ELFYAML::AddrsigSection>(Section.get()));1684break;1685case ELF::SHT_LLVM_LINKER_OPTIONS:1686if (!IO.outputting())1687Section.reset(new ELFYAML::LinkerOptionsSection());1688sectionMapping(IO, *cast<ELFYAML::LinkerOptionsSection>(Section.get()));1689break;1690case ELF::SHT_LLVM_DEPENDENT_LIBRARIES:1691if (!IO.outputting())1692Section.reset(new ELFYAML::DependentLibrariesSection());1693sectionMapping(IO,1694*cast<ELFYAML::DependentLibrariesSection>(Section.get()));1695break;1696case ELF::SHT_LLVM_CALL_GRAPH_PROFILE:1697if (!IO.outputting())1698Section.reset(new ELFYAML::CallGraphProfileSection());1699sectionMapping(IO, *cast<ELFYAML::CallGraphProfileSection>(Section.get()));1700break;1701case ELF::SHT_LLVM_BB_ADDR_MAP:1702if (!IO.outputting())1703Section.reset(new ELFYAML::BBAddrMapSection());1704sectionMapping(IO, *cast<ELFYAML::BBAddrMapSection>(Section.get()));1705break;1706default:1707if (!IO.outputting()) {1708StringRef Name;1709IO.mapOptional("Name", Name, StringRef());1710Name = ELFYAML::dropUniqueSuffix(Name);17111712if (ELFYAML::StackSizesSection::nameMatches(Name))1713Section = std::make_unique<ELFYAML::StackSizesSection>();1714else1715Section = std::make_unique<ELFYAML::RawContentSection>();1716}17171718if (auto S = dyn_cast<ELFYAML::RawContentSection>(Section.get()))1719sectionMapping(IO, *S);1720else1721sectionMapping(IO, *cast<ELFYAML::StackSizesSection>(Section.get()));1722}1723}17241725std::string MappingTraits<std::unique_ptr<ELFYAML::Chunk>>::validate(1726IO &io, std::unique_ptr<ELFYAML::Chunk> &C) {1727if (const auto *F = dyn_cast<ELFYAML::Fill>(C.get())) {1728if (F->Pattern && F->Pattern->binary_size() != 0 && !F->Size)1729return "\"Size\" can't be 0 when \"Pattern\" is not empty";1730return "";1731}17321733if (const auto *SHT = dyn_cast<ELFYAML::SectionHeaderTable>(C.get())) {1734if (SHT->NoHeaders && (SHT->Sections || SHT->Excluded || SHT->Offset))1735return "NoHeaders can't be used together with Offset/Sections/Excluded";1736return "";1737}17381739const ELFYAML::Section &Sec = *cast<ELFYAML::Section>(C.get());1740if (Sec.Size && Sec.Content &&1741(uint64_t)(*Sec.Size) < Sec.Content->binary_size())1742return "Section size must be greater than or equal to the content size";17431744auto BuildErrPrefix = [](ArrayRef<std::pair<StringRef, bool>> EntV) {1745std::string Msg;1746for (size_t I = 0, E = EntV.size(); I != E; ++I) {1747StringRef Name = EntV[I].first;1748if (I == 0) {1749Msg = "\"" + Name.str() + "\"";1750continue;1751}1752if (I != EntV.size() - 1)1753Msg += ", \"" + Name.str() + "\"";1754else1755Msg += " and \"" + Name.str() + "\"";1756}1757return Msg;1758};17591760std::vector<std::pair<StringRef, bool>> Entries = Sec.getEntries();1761const size_t NumUsedEntries = llvm::count_if(1762Entries, [](const std::pair<StringRef, bool> &P) { return P.second; });17631764if ((Sec.Size || Sec.Content) && NumUsedEntries > 0)1765return BuildErrPrefix(Entries) +1766" cannot be used with \"Content\" or \"Size\"";17671768if (NumUsedEntries > 0 && Entries.size() != NumUsedEntries)1769return BuildErrPrefix(Entries) + " must be used together";17701771if (const auto *RawSection = dyn_cast<ELFYAML::RawContentSection>(C.get())) {1772if (RawSection->Flags && RawSection->ShFlags)1773return "ShFlags and Flags cannot be used together";1774return "";1775}17761777if (const auto *NB = dyn_cast<ELFYAML::NoBitsSection>(C.get())) {1778if (NB->Content)1779return "SHT_NOBITS section cannot have \"Content\"";1780return "";1781}17821783if (const auto *MF = dyn_cast<ELFYAML::MipsABIFlags>(C.get())) {1784if (MF->Content)1785return "\"Content\" key is not implemented for SHT_MIPS_ABIFLAGS "1786"sections";1787if (MF->Size)1788return "\"Size\" key is not implemented for SHT_MIPS_ABIFLAGS sections";1789return "";1790}17911792return "";1793}17941795namespace {17961797struct NormalizedMips64RelType {1798NormalizedMips64RelType(IO &)1799: Type(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)),1800Type2(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)),1801Type3(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)),1802SpecSym(ELFYAML::ELF_REL(ELF::RSS_UNDEF)) {}1803NormalizedMips64RelType(IO &, ELFYAML::ELF_REL Original)1804: Type(Original & 0xFF), Type2(Original >> 8 & 0xFF),1805Type3(Original >> 16 & 0xFF), SpecSym(Original >> 24 & 0xFF) {}18061807ELFYAML::ELF_REL denormalize(IO &) {1808ELFYAML::ELF_REL Res = Type | Type2 << 8 | Type3 << 16 | SpecSym << 24;1809return Res;1810}18111812ELFYAML::ELF_REL Type;1813ELFYAML::ELF_REL Type2;1814ELFYAML::ELF_REL Type3;1815ELFYAML::ELF_RSS SpecSym;1816};18171818} // end anonymous namespace18191820void MappingTraits<ELFYAML::StackSizeEntry>::mapping(1821IO &IO, ELFYAML::StackSizeEntry &E) {1822assert(IO.getContext() && "The IO context is not initialized");1823IO.mapOptional("Address", E.Address, Hex64(0));1824IO.mapRequired("Size", E.Size);1825}18261827void MappingTraits<ELFYAML::BBAddrMapEntry>::mapping(1828IO &IO, ELFYAML::BBAddrMapEntry &E) {1829assert(IO.getContext() && "The IO context is not initialized");1830IO.mapRequired("Version", E.Version);1831IO.mapOptional("Feature", E.Feature, Hex8(0));1832IO.mapOptional("NumBBRanges", E.NumBBRanges);1833IO.mapOptional("BBRanges", E.BBRanges);1834}18351836void MappingTraits<ELFYAML::BBAddrMapEntry::BBRangeEntry>::mapping(1837IO &IO, ELFYAML::BBAddrMapEntry::BBRangeEntry &E) {1838IO.mapOptional("BaseAddress", E.BaseAddress, Hex64(0));1839IO.mapOptional("NumBlocks", E.NumBlocks);1840IO.mapOptional("BBEntries", E.BBEntries);1841}18421843void MappingTraits<ELFYAML::BBAddrMapEntry::BBEntry>::mapping(1844IO &IO, ELFYAML::BBAddrMapEntry::BBEntry &E) {1845assert(IO.getContext() && "The IO context is not initialized");1846IO.mapOptional("ID", E.ID);1847IO.mapRequired("AddressOffset", E.AddressOffset);1848IO.mapRequired("Size", E.Size);1849IO.mapRequired("Metadata", E.Metadata);1850}18511852void MappingTraits<ELFYAML::PGOAnalysisMapEntry>::mapping(1853IO &IO, ELFYAML::PGOAnalysisMapEntry &E) {1854assert(IO.getContext() && "The IO context is not initialized");1855IO.mapOptional("FuncEntryCount", E.FuncEntryCount);1856IO.mapOptional("PGOBBEntries", E.PGOBBEntries);1857}18581859void MappingTraits<ELFYAML::PGOAnalysisMapEntry::PGOBBEntry>::mapping(1860IO &IO, ELFYAML::PGOAnalysisMapEntry::PGOBBEntry &E) {1861assert(IO.getContext() && "The IO context is not initialized");1862IO.mapOptional("BBFreq", E.BBFreq);1863IO.mapOptional("Successors", E.Successors);1864}18651866void MappingTraits<ELFYAML::PGOAnalysisMapEntry::PGOBBEntry::SuccessorEntry>::1867mapping(IO &IO,1868ELFYAML::PGOAnalysisMapEntry::PGOBBEntry::SuccessorEntry &E) {1869assert(IO.getContext() && "The IO context is not initialized");1870IO.mapRequired("ID", E.ID);1871IO.mapRequired("BrProb", E.BrProb);1872}18731874void MappingTraits<ELFYAML::GnuHashHeader>::mapping(IO &IO,1875ELFYAML::GnuHashHeader &E) {1876assert(IO.getContext() && "The IO context is not initialized");1877IO.mapOptional("NBuckets", E.NBuckets);1878IO.mapRequired("SymNdx", E.SymNdx);1879IO.mapOptional("MaskWords", E.MaskWords);1880IO.mapRequired("Shift2", E.Shift2);1881}18821883void MappingTraits<ELFYAML::DynamicEntry>::mapping(IO &IO,1884ELFYAML::DynamicEntry &Rel) {1885assert(IO.getContext() && "The IO context is not initialized");18861887IO.mapRequired("Tag", Rel.Tag);1888IO.mapRequired("Value", Rel.Val);1889}18901891void MappingTraits<ELFYAML::NoteEntry>::mapping(IO &IO, ELFYAML::NoteEntry &N) {1892assert(IO.getContext() && "The IO context is not initialized");18931894IO.mapOptional("Name", N.Name);1895IO.mapOptional("Desc", N.Desc);1896IO.mapRequired("Type", N.Type);1897}18981899void MappingTraits<ELFYAML::VerdefEntry>::mapping(IO &IO,1900ELFYAML::VerdefEntry &E) {1901assert(IO.getContext() && "The IO context is not initialized");19021903IO.mapOptional("Version", E.Version);1904IO.mapOptional("Flags", E.Flags);1905IO.mapOptional("VersionNdx", E.VersionNdx);1906IO.mapOptional("Hash", E.Hash);1907IO.mapRequired("Names", E.VerNames);1908}19091910void MappingTraits<ELFYAML::VerneedEntry>::mapping(IO &IO,1911ELFYAML::VerneedEntry &E) {1912assert(IO.getContext() && "The IO context is not initialized");19131914IO.mapRequired("Version", E.Version);1915IO.mapRequired("File", E.File);1916IO.mapRequired("Entries", E.AuxV);1917}19181919void MappingTraits<ELFYAML::VernauxEntry>::mapping(IO &IO,1920ELFYAML::VernauxEntry &E) {1921assert(IO.getContext() && "The IO context is not initialized");19221923IO.mapRequired("Name", E.Name);1924IO.mapRequired("Hash", E.Hash);1925IO.mapRequired("Flags", E.Flags);1926IO.mapRequired("Other", E.Other);1927}19281929void MappingTraits<ELFYAML::Relocation>::mapping(IO &IO,1930ELFYAML::Relocation &Rel) {1931const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());1932assert(Object && "The IO context is not initialized");19331934IO.mapOptional("Offset", Rel.Offset, (Hex64)0);1935IO.mapOptional("Symbol", Rel.Symbol);19361937if (Object->getMachine() == ELFYAML::ELF_EM(ELF::EM_MIPS) &&1938Object->Header.Class == ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64)) {1939MappingNormalization<NormalizedMips64RelType, ELFYAML::ELF_REL> Key(1940IO, Rel.Type);1941IO.mapRequired("Type", Key->Type);1942IO.mapOptional("Type2", Key->Type2, ELFYAML::ELF_REL(ELF::R_MIPS_NONE));1943IO.mapOptional("Type3", Key->Type3, ELFYAML::ELF_REL(ELF::R_MIPS_NONE));1944IO.mapOptional("SpecSym", Key->SpecSym, ELFYAML::ELF_RSS(ELF::RSS_UNDEF));1945} else1946IO.mapRequired("Type", Rel.Type);19471948IO.mapOptional("Addend", Rel.Addend, (ELFYAML::YAMLIntUInt)0);1949}19501951void MappingTraits<ELFYAML::ARMIndexTableEntry>::mapping(1952IO &IO, ELFYAML::ARMIndexTableEntry &E) {1953assert(IO.getContext() && "The IO context is not initialized");1954IO.mapRequired("Offset", E.Offset);19551956StringRef CantUnwind = "EXIDX_CANTUNWIND";1957if (IO.outputting() && (uint32_t)E.Value == ARM::EHABI::EXIDX_CANTUNWIND)1958IO.mapRequired("Value", CantUnwind);1959else if (!IO.outputting() && getStringValue(IO, "Value") == CantUnwind)1960E.Value = ARM::EHABI::EXIDX_CANTUNWIND;1961else1962IO.mapRequired("Value", E.Value);1963}19641965void MappingTraits<ELFYAML::Object>::mapping(IO &IO, ELFYAML::Object &Object) {1966assert(!IO.getContext() && "The IO context is initialized already");1967IO.setContext(&Object);1968IO.mapTag("!ELF", true);1969IO.mapRequired("FileHeader", Object.Header);1970IO.mapOptional("ProgramHeaders", Object.ProgramHeaders);1971IO.mapOptional("Sections", Object.Chunks);1972IO.mapOptional("Symbols", Object.Symbols);1973IO.mapOptional("DynamicSymbols", Object.DynamicSymbols);1974IO.mapOptional("DWARF", Object.DWARF);1975if (Object.DWARF) {1976Object.DWARF->IsLittleEndian =1977Object.Header.Data == ELFYAML::ELF_ELFDATA(ELF::ELFDATA2LSB);1978Object.DWARF->Is64BitAddrSize =1979Object.Header.Class == ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64);1980}1981IO.setContext(nullptr);1982}19831984void MappingTraits<ELFYAML::LinkerOption>::mapping(IO &IO,1985ELFYAML::LinkerOption &Opt) {1986assert(IO.getContext() && "The IO context is not initialized");1987IO.mapRequired("Name", Opt.Key);1988IO.mapRequired("Value", Opt.Value);1989}19901991void MappingTraits<ELFYAML::CallGraphEntryWeight>::mapping(1992IO &IO, ELFYAML::CallGraphEntryWeight &E) {1993assert(IO.getContext() && "The IO context is not initialized");1994IO.mapRequired("Weight", E.Weight);1995}19961997LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_AFL_REG)1998LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_ABI_FP)1999LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_EXT)2000LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_ASE)2001LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_FLAGS1)20022003} // end namespace yaml20042005} // end namespace llvm200620072008