diff options
Diffstat (limited to 'llvm/lib/ObjectYAML/ELFYAML.cpp')
-rw-r--r-- | llvm/lib/ObjectYAML/ELFYAML.cpp | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp index d597148b98ab..cdd180cdc15d 100644 --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -29,6 +29,8 @@ namespace llvm { ELFYAML::Chunk::~Chunk() = default; namespace ELFYAML { +ELF_ELFOSABI Object::getOSAbi() const { return Header.OSABI; } + unsigned Object::getMachine() const { if (Header.Machine) return *Header.Machine; @@ -175,6 +177,10 @@ void ScalarEnumerationTraits<ELFYAML::ELF_NT>::enumeration( ECase(NT_AMD_PAL_METADATA); // AMDGPU specific notes. (Code Object V3) ECase(NT_AMDGPU_METADATA); + // Android specific notes. + ECase(NT_ANDROID_TYPE_IDENT); + ECase(NT_ANDROID_TYPE_KUSER); + ECase(NT_ANDROID_TYPE_MEMTAG); #undef ECase IO.enumFallback<Hex32>(Value); } @@ -344,6 +350,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration( ECase(EM_BPF); ECase(EM_VE); ECase(EM_CSKY); + ECase(EM_LOONGARCH); #undef ECase IO.enumFallback<Hex16>(Value); } @@ -560,6 +567,7 @@ void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO, BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX909, EF_AMDGPU_MACH); BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX90A, EF_AMDGPU_MACH); BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX90C, EF_AMDGPU_MACH); + BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX940, EF_AMDGPU_MACH); BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1010, EF_AMDGPU_MACH); BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1011, EF_AMDGPU_MACH); BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1012, EF_AMDGPU_MACH); @@ -570,6 +578,11 @@ void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO, BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1033, EF_AMDGPU_MACH); BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1034, EF_AMDGPU_MACH); BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1035, EF_AMDGPU_MACH); + BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1036, EF_AMDGPU_MACH); + BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1100, EF_AMDGPU_MACH); + BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1101, EF_AMDGPU_MACH); + BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1102, EF_AMDGPU_MACH); + BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX1103, EF_AMDGPU_MACH); switch (Object->Header.ABIVersion) { default: // ELFOSABI_AMDGPU_PAL, ELFOSABI_AMDGPU_MESA3D support *_V3 flags. @@ -641,6 +654,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration( ECase(SHT_LLVM_SYMPART); ECase(SHT_LLVM_PART_EHDR); ECase(SHT_LLVM_PART_PHDR); + ECase(SHT_LLVM_BB_ADDR_MAP_V0); ECase(SHT_LLVM_BB_ADDR_MAP); ECase(SHT_GNU_ATTRIBUTES); ECase(SHT_GNU_HASH); @@ -705,7 +719,14 @@ void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO, BCase(SHF_GROUP); BCase(SHF_TLS); BCase(SHF_COMPRESSED); - BCase(SHF_GNU_RETAIN); + switch (Object->getOSAbi()) { + case ELF::ELFOSABI_SOLARIS: + BCase(SHF_SUNW_NODISCARD); + break; + default: + BCase(SHF_GNU_RETAIN); + break; + } switch (Object->getMachine()) { case ELF::EM_ARM: BCase(SHF_ARM_PURECODE); @@ -735,6 +756,8 @@ void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO, void ScalarEnumerationTraits<ELFYAML::ELF_SHN>::enumeration( IO &IO, ELFYAML::ELF_SHN &Value) { + const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); + assert(Object && "The IO context is not initialized"); #define ECase(X) IO.enumCase(Value, #X, ELF::X) ECase(SHN_UNDEF); ECase(SHN_LORESERVE); @@ -747,6 +770,15 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHN>::enumeration( ECase(SHN_XINDEX); ECase(SHN_HIRESERVE); ECase(SHN_AMDGPU_LDS); + + if (!IO.outputting() || Object->getMachine() == ELF::EM_MIPS) { + ECase(SHN_MIPS_ACOMMON); + ECase(SHN_MIPS_TEXT); + ECase(SHN_MIPS_DATA); + ECase(SHN_MIPS_SCOMMON); + ECase(SHN_MIPS_SUNDEFINED); + } + ECase(SHN_HEXAGON_SCOMMON); ECase(SHN_HEXAGON_SCOMMON_1); ECase(SHN_HEXAGON_SCOMMON_2); @@ -839,12 +871,18 @@ void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration( case ELF::EM_CSKY: #include "llvm/BinaryFormat/ELFRelocs/CSKY.def" break; + case ELF::EM_PPC: +#include "llvm/BinaryFormat/ELFRelocs/PowerPC.def" + break; case ELF::EM_PPC64: #include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def" break; case ELF::EM_68K: #include "llvm/BinaryFormat/ELFRelocs/M68k.def" break; + case ELF::EM_LOONGARCH: +#include "llvm/BinaryFormat/ELFRelocs/LoongArch.def" + break; default: // Nothing to do. break; @@ -1298,7 +1336,7 @@ static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) { // We also support reading a content as array of bytes using the ContentArray // key. obj2yaml never prints this field. - assert(!IO.outputting() || !Section.ContentBuf.hasValue()); + assert(!IO.outputting() || !Section.ContentBuf); IO.mapOptional("ContentArray", Section.ContentBuf); if (Section.ContentBuf) { if (Section.Content) @@ -1327,8 +1365,7 @@ static void sectionMapping(IO &IO, ELFYAML::HashSection &Section) { // obj2yaml does not dump these fields. They can be used to override nchain // and nbucket values for creating broken sections. - assert(!IO.outputting() || - (!Section.NBucket.hasValue() && !Section.NChain.hasValue())); + assert(!IO.outputting() || (!Section.NBucket && !Section.NChain)); IO.mapOptional("NChain", Section.NChain); IO.mapOptional("NBucket", Section.NBucket); } @@ -1603,6 +1640,7 @@ void MappingTraits<std::unique_ptr<ELFYAML::Chunk>>::mapping( Section.reset(new ELFYAML::CallGraphProfileSection()); sectionMapping(IO, *cast<ELFYAML::CallGraphProfileSection>(Section.get())); break; + case ELF::SHT_LLVM_BB_ADDR_MAP_V0: case ELF::SHT_LLVM_BB_ADDR_MAP: if (!IO.outputting()) Section.reset(new ELFYAML::BBAddrMapSection()); @@ -1732,6 +1770,8 @@ void MappingTraits<ELFYAML::StackSizeEntry>::mapping( void MappingTraits<ELFYAML::BBAddrMapEntry>::mapping( IO &IO, ELFYAML::BBAddrMapEntry &E) { assert(IO.getContext() && "The IO context is not initialized"); + IO.mapRequired("Version", E.Version); + IO.mapOptional("Feature", E.Feature, Hex8(0)); IO.mapOptional("Address", E.Address, Hex64(0)); IO.mapOptional("NumBlocks", E.NumBlocks); IO.mapOptional("BBEntries", E.BBEntries); |