diff options
Diffstat (limited to 'lib/ObjectYAML/ELFYAML.cpp')
-rw-r--r-- | lib/ObjectYAML/ELFYAML.cpp | 105 |
1 files changed, 100 insertions, 5 deletions
diff --git a/lib/ObjectYAML/ELFYAML.cpp b/lib/ObjectYAML/ELFYAML.cpp index 39741dab327a..7e7f3d1fdded 100644 --- a/lib/ObjectYAML/ELFYAML.cpp +++ b/lib/ObjectYAML/ELFYAML.cpp @@ -39,6 +39,21 @@ void ScalarEnumerationTraits<ELFYAML::ELF_ET>::enumeration( IO.enumFallback<Hex16>(Value); } +void ScalarEnumerationTraits<ELFYAML::ELF_PT>::enumeration( + IO &IO, ELFYAML::ELF_PT &Value) { +#define ECase(X) IO.enumCase(Value, #X, ELF::X) + ECase(PT_NULL); + ECase(PT_LOAD); + ECase(PT_DYNAMIC); + ECase(PT_INTERP); + ECase(PT_NOTE); + ECase(PT_SHLIB); + ECase(PT_PHDR); + ECase(PT_TLS); +#undef ECase + IO.enumFallback<Hex32>(Value); +} + void ScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration( IO &IO, ELFYAML::ELF_EM &Value) { #define ECase(X) IO.enumCase(Value, #X, ELF::X) @@ -231,7 +246,6 @@ void ScalarEnumerationTraits<ELFYAML::ELF_ELFOSABI>::enumeration( ECase(ELFOSABI_HPUX); ECase(ELFOSABI_NETBSD); ECase(ELFOSABI_GNU); - ECase(ELFOSABI_GNU); ECase(ELFOSABI_HURD); ECase(ELFOSABI_SOLARIS); ECase(ELFOSABI_AIX); @@ -245,10 +259,12 @@ void ScalarEnumerationTraits<ELFYAML::ELF_ELFOSABI>::enumeration( ECase(ELFOSABI_AROS); ECase(ELFOSABI_FENIXOS); ECase(ELFOSABI_CLOUDABI); - ECase(ELFOSABI_C6000_ELFABI); ECase(ELFOSABI_AMDGPU_HSA); - ECase(ELFOSABI_C6000_LINUX); + ECase(ELFOSABI_AMDGPU_PAL); + ECase(ELFOSABI_AMDGPU_MESA3D); ECase(ELFOSABI_ARM); + ECase(ELFOSABI_C6000_ELFABI); + ECase(ELFOSABI_C6000_LINUX); ECase(ELFOSABI_STANDALONE); #undef ECase } @@ -344,7 +360,18 @@ void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO, BCase(EF_AVR_ARCH_XMEGA6); BCase(EF_AVR_ARCH_XMEGA7); break; + case ELF::EM_RISCV: + BCase(EF_RISCV_RVC); + BCaseMask(EF_RISCV_FLOAT_ABI_SOFT, EF_RISCV_FLOAT_ABI); + BCaseMask(EF_RISCV_FLOAT_ABI_SINGLE, EF_RISCV_FLOAT_ABI); + BCaseMask(EF_RISCV_FLOAT_ABI_DOUBLE, EF_RISCV_FLOAT_ABI); + BCaseMask(EF_RISCV_FLOAT_ABI_QUAD, EF_RISCV_FLOAT_ABI); + BCase(EF_RISCV_RVE); + break; case ELF::EM_AMDGPU: + BCaseMask(EF_AMDGPU_ARCH_R600, EF_AMDGPU_ARCH); + BCaseMask(EF_AMDGPU_ARCH_GCN, EF_AMDGPU_ARCH); + break; case ELF::EM_X86_64: break; default: @@ -361,7 +388,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration( #define ECase(X) IO.enumCase(Value, #X, ELF::X) ECase(SHT_NULL); ECase(SHT_PROGBITS); - // No SHT_SYMTAB. Use the top-level `Symbols` key instead. + ECase(SHT_SYMTAB); // FIXME: Issue a diagnostic with this information. ECase(SHT_STRTAB); ECase(SHT_RELA); @@ -378,6 +405,8 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration( ECase(SHT_GROUP); ECase(SHT_SYMTAB_SHNDX); ECase(SHT_LOOS); + ECase(SHT_ANDROID_REL); + ECase(SHT_ANDROID_RELA); ECase(SHT_LLVM_ODRTAB); ECase(SHT_GNU_ATTRIBUTES); ECase(SHT_GNU_HASH); @@ -412,6 +441,14 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration( #undef ECase } +void ScalarBitSetTraits<ELFYAML::ELF_PF>::bitset(IO &IO, + ELFYAML::ELF_PF &Value) { +#define BCase(X) IO.bitSetCase(Value, #X, ELF::X) + BCase(PF_X); + BCase(PF_W); + BCase(PF_R); +} + void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO, ELFYAML::ELF_SHF &Value) { const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); @@ -427,6 +464,7 @@ void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO, BCase(SHF_OS_NONCONFORMING); BCase(SHF_GROUP); BCase(SHF_TLS); + BCase(SHF_COMPRESSED); switch (Object->Header.Machine) { case ELF::EM_ARM: BCase(SHF_ARM_PURECODE); @@ -454,6 +492,28 @@ void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO, #undef BCase } +void ScalarEnumerationTraits<ELFYAML::ELF_SHN>::enumeration( + IO &IO, ELFYAML::ELF_SHN &Value) { +#define ECase(X) IO.enumCase(Value, #X, ELF::X) + ECase(SHN_UNDEF); + ECase(SHN_LORESERVE); + ECase(SHN_LOPROC); + ECase(SHN_HIPROC); + ECase(SHN_LOOS); + ECase(SHN_HIOS); + ECase(SHN_ABS); + ECase(SHN_COMMON); + ECase(SHN_XINDEX); + ECase(SHN_HIRESERVE); + ECase(SHN_HEXAGON_SCOMMON); + ECase(SHN_HEXAGON_SCOMMON_1); + ECase(SHN_HEXAGON_SCOMMON_2); + ECase(SHN_HEXAGON_SCOMMON_4); + ECase(SHN_HEXAGON_SCOMMON_8); +#undef ECase + IO.enumFallback<Hex32>(Value); +} + void ScalarEnumerationTraits<ELFYAML::ELF_STT>::enumeration( IO &IO, ELFYAML::ELF_STT &Value) { #define ECase(X) IO.enumCase(Value, #X, ELF::X) @@ -532,6 +592,9 @@ void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration( case ELF::EM_ARM: #include "llvm/BinaryFormat/ELFRelocs/ARM.def" break; + case ELF::EM_ARC: +#include "llvm/BinaryFormat/ELFRelocs/ARC.def" + break; case ELF::EM_RISCV: #include "llvm/BinaryFormat/ELFRelocs/RISCV.def" break; @@ -649,6 +712,16 @@ void MappingTraits<ELFYAML::FileHeader>::mapping(IO &IO, IO.mapOptional("Entry", FileHdr.Entry, Hex64(0)); } +void MappingTraits<ELFYAML::ProgramHeader>::mapping( + IO &IO, ELFYAML::ProgramHeader &Phdr) { + IO.mapRequired("Type", Phdr.Type); + IO.mapOptional("Flags", Phdr.Flags, ELFYAML::ELF_PF(0)); + IO.mapOptional("Sections", Phdr.Sections); + IO.mapOptional("VAddr", Phdr.VAddr, Hex64(0)); + IO.mapOptional("PAddr", Phdr.PAddr, Hex64(0)); + IO.mapOptional("Align", Phdr.Align); +} + namespace { struct NormalizedOther { @@ -669,6 +742,7 @@ void MappingTraits<ELFYAML::Symbol>::mapping(IO &IO, ELFYAML::Symbol &Symbol) { IO.mapOptional("Name", Symbol.Name, StringRef()); IO.mapOptional("Type", Symbol.Type, ELFYAML::ELF_STT(0)); IO.mapOptional("Section", Symbol.Section, StringRef()); + IO.mapOptional("Index", Symbol.Index); IO.mapOptional("Value", Symbol.Value, Hex64(0)); IO.mapOptional("Size", Symbol.Size, Hex64(0)); @@ -677,6 +751,20 @@ void MappingTraits<ELFYAML::Symbol>::mapping(IO &IO, ELFYAML::Symbol &Symbol) { IO.mapOptional("Other", Keys->Other, ELFYAML::ELF_STO(0)); } +StringRef MappingTraits<ELFYAML::Symbol>::validate(IO &IO, + ELFYAML::Symbol &Symbol) { + if (Symbol.Index && Symbol.Section.data()) { + return "Index and Section cannot both be specified for Symbol"; + } + if (Symbol.Index && *Symbol.Index == ELFYAML::ELF_SHN(ELF::SHN_XINDEX)) { + return "Large indexes are not supported"; + } + if (Symbol.Index && *Symbol.Index < ELFYAML::ELF_SHN(ELF::SHN_LORESERVE)) { + return "Use a section name to define which section a symbol is defined in"; + } + return StringRef(); +} + void MappingTraits<ELFYAML::LocalGlobalWeakSymbols>::mapping( IO &IO, ELFYAML::LocalGlobalWeakSymbols &Symbols) { IO.mapOptional("Local", Symbols.Local); @@ -720,6 +808,11 @@ void MappingTraits<ELFYAML::SectionOrType>::mapping( IO.mapRequired("SectionOrType", sectionOrType.sectionNameOrType); } +void MappingTraits<ELFYAML::SectionName>::mapping( + IO &IO, ELFYAML::SectionName §ionName) { + IO.mapRequired("Section", sectionName.Section); +} + static void sectionMapping(IO &IO, ELFYAML::MipsABIFlags &Section) { commonSectionMapping(IO, Section); IO.mapOptional("Version", Section.Version, Hex16(0)); @@ -816,7 +909,7 @@ void MappingTraits<ELFYAML::Relocation>::mapping(IO &IO, assert(Object && "The IO context is not initialized"); IO.mapRequired("Offset", Rel.Offset); - IO.mapRequired("Symbol", Rel.Symbol); + IO.mapOptional("Symbol", Rel.Symbol); if (Object->Header.Machine == ELFYAML::ELF_EM(ELF::EM_MIPS) && Object->Header.Class == ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64)) { @@ -837,8 +930,10 @@ void MappingTraits<ELFYAML::Object>::mapping(IO &IO, ELFYAML::Object &Object) { IO.setContext(&Object); IO.mapTag("!ELF", true); IO.mapRequired("FileHeader", Object.Header); + IO.mapOptional("ProgramHeaders", Object.ProgramHeaders); IO.mapOptional("Sections", Object.Sections); IO.mapOptional("Symbols", Object.Symbols); + IO.mapOptional("DynamicSymbols", Object.DynamicSymbols); IO.setContext(nullptr); } |