diff options
Diffstat (limited to 'lib/Object/ELFYAML.cpp')
-rw-r--r-- | lib/Object/ELFYAML.cpp | 159 |
1 files changed, 149 insertions, 10 deletions
diff --git a/lib/Object/ELFYAML.cpp b/lib/Object/ELFYAML.cpp index dc3d467825..f513c11e1f 100644 --- a/lib/Object/ELFYAML.cpp +++ b/lib/Object/ELFYAML.cpp @@ -264,6 +264,7 @@ void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO, BCase(EF_MIPS_CPIC) BCase(EF_MIPS_ABI2) BCase(EF_MIPS_32BITMODE) + BCase(EF_MIPS_NAN2008) BCase(EF_MIPS_ABI_O32) BCase(EF_MIPS_MICROMIPS) BCase(EF_MIPS_ARCH_ASE_M16) @@ -298,6 +299,8 @@ void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO, void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration( IO &IO, ELFYAML::ELF_SHT &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(SHT_NULL) ECase(SHT_PROGBITS) @@ -325,15 +328,29 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration( ECase(SHT_GNU_versym) ECase(SHT_HIOS) ECase(SHT_LOPROC) - ECase(SHT_ARM_EXIDX) - ECase(SHT_ARM_PREEMPTMAP) - ECase(SHT_ARM_ATTRIBUTES) - ECase(SHT_ARM_DEBUGOVERLAY) - ECase(SHT_ARM_OVERLAYSECTION) - ECase(SHT_HEX_ORDERED) - ECase(SHT_X86_64_UNWIND) - ECase(SHT_MIPS_REGINFO) - ECase(SHT_MIPS_OPTIONS) + switch (Object->Header.Machine) { + case ELF::EM_ARM: + ECase(SHT_ARM_EXIDX) + ECase(SHT_ARM_PREEMPTMAP) + ECase(SHT_ARM_ATTRIBUTES) + ECase(SHT_ARM_DEBUGOVERLAY) + ECase(SHT_ARM_OVERLAYSECTION) + break; + case ELF::EM_HEXAGON: + ECase(SHT_HEX_ORDERED) + break; + case ELF::EM_X86_64: + ECase(SHT_X86_64_UNWIND) + break; + case ELF::EM_MIPS: + ECase(SHT_MIPS_REGINFO) + ECase(SHT_MIPS_OPTIONS) + ECase(SHT_MIPS_ABIFLAGS) + break; + default: + // Nothing to do. + break; + } #undef ECase } @@ -378,6 +395,25 @@ void ScalarEnumerationTraits<ELFYAML::ELF_STV>::enumeration( #undef ECase } +void ScalarBitSetTraits<ELFYAML::ELF_STO>::bitset(IO &IO, + ELFYAML::ELF_STO &Value) { + const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); + assert(Object && "The IO context is not initialized"); +#define BCase(X) IO.bitSetCase(Value, #X, ELF::X); + switch (Object->Header.Machine) { + case ELF::EM_MIPS: + BCase(STO_MIPS_OPTIONAL) + BCase(STO_MIPS_PLT) + BCase(STO_MIPS_PIC) + BCase(STO_MIPS_MICROMIPS) + break; + default: + break; // Nothing to do + } +#undef BCase +#undef BCaseMask +} + void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration( IO &IO, ELFYAML::ELF_REL &Value) { const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); @@ -636,6 +672,92 @@ void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration( ECase(R_386_IRELATIVE) ECase(R_386_NUM) break; + case ELF::EM_AARCH64: + ECase(R_AARCH64_NONE) + ECase(R_AARCH64_ABS64) + ECase(R_AARCH64_ABS32) + ECase(R_AARCH64_ABS16) + ECase(R_AARCH64_PREL64) + ECase(R_AARCH64_PREL32) + ECase(R_AARCH64_PREL16) + ECase(R_AARCH64_MOVW_UABS_G0) + ECase(R_AARCH64_MOVW_UABS_G0_NC) + ECase(R_AARCH64_MOVW_UABS_G1) + ECase(R_AARCH64_MOVW_UABS_G1_NC) + ECase(R_AARCH64_MOVW_UABS_G2) + ECase(R_AARCH64_MOVW_UABS_G2_NC) + ECase(R_AARCH64_MOVW_UABS_G3) + ECase(R_AARCH64_MOVW_SABS_G0) + ECase(R_AARCH64_MOVW_SABS_G1) + ECase(R_AARCH64_MOVW_SABS_G2) + ECase(R_AARCH64_LD_PREL_LO19) + ECase(R_AARCH64_ADR_PREL_LO21) + ECase(R_AARCH64_ADR_PREL_PG_HI21) + ECase(R_AARCH64_ADD_ABS_LO12_NC) + ECase(R_AARCH64_LDST8_ABS_LO12_NC) + ECase(R_AARCH64_TSTBR14) + ECase(R_AARCH64_CONDBR19) + ECase(R_AARCH64_JUMP26) + ECase(R_AARCH64_CALL26) + ECase(R_AARCH64_LDST16_ABS_LO12_NC) + ECase(R_AARCH64_LDST32_ABS_LO12_NC) + ECase(R_AARCH64_LDST64_ABS_LO12_NC) + ECase(R_AARCH64_LDST128_ABS_LO12_NC) + ECase(R_AARCH64_GOTREL64) + ECase(R_AARCH64_GOTREL32) + ECase(R_AARCH64_ADR_GOT_PAGE) + ECase(R_AARCH64_LD64_GOT_LO12_NC) + ECase(R_AARCH64_TLSLD_MOVW_DTPREL_G2) + ECase(R_AARCH64_TLSLD_MOVW_DTPREL_G1) + ECase(R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC) + ECase(R_AARCH64_TLSLD_MOVW_DTPREL_G0) + ECase(R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC) + ECase(R_AARCH64_TLSLD_ADD_DTPREL_HI12) + ECase(R_AARCH64_TLSLD_ADD_DTPREL_LO12) + ECase(R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC) + ECase(R_AARCH64_TLSLD_LDST8_DTPREL_LO12) + ECase(R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC) + ECase(R_AARCH64_TLSLD_LDST16_DTPREL_LO12) + ECase(R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC) + ECase(R_AARCH64_TLSLD_LDST32_DTPREL_LO12) + ECase(R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC) + ECase(R_AARCH64_TLSLD_LDST64_DTPREL_LO12) + ECase(R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC) + ECase(R_AARCH64_TLSIE_MOVW_GOTTPREL_G1) + ECase(R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC) + ECase(R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) + ECase(R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) + ECase(R_AARCH64_TLSIE_LD_GOTTPREL_PREL19) + ECase(R_AARCH64_TLSLE_MOVW_TPREL_G2) + ECase(R_AARCH64_TLSLE_MOVW_TPREL_G1) + ECase(R_AARCH64_TLSLE_MOVW_TPREL_G1_NC) + ECase(R_AARCH64_TLSLE_MOVW_TPREL_G0) + ECase(R_AARCH64_TLSLE_MOVW_TPREL_G0_NC) + ECase(R_AARCH64_TLSLE_ADD_TPREL_HI12) + ECase(R_AARCH64_TLSLE_ADD_TPREL_LO12) + ECase(R_AARCH64_TLSLE_ADD_TPREL_LO12_NC) + ECase(R_AARCH64_TLSLE_LDST8_TPREL_LO12) + ECase(R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC) + ECase(R_AARCH64_TLSLE_LDST16_TPREL_LO12) + ECase(R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC) + ECase(R_AARCH64_TLSLE_LDST32_TPREL_LO12) + ECase(R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC) + ECase(R_AARCH64_TLSLE_LDST64_TPREL_LO12) + ECase(R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC) + ECase(R_AARCH64_TLSDESC_ADR_PAGE) + ECase(R_AARCH64_TLSDESC_LD64_LO12_NC) + ECase(R_AARCH64_TLSDESC_ADD_LO12_NC) + ECase(R_AARCH64_TLSDESC_CALL) + ECase(R_AARCH64_COPY) + ECase(R_AARCH64_GLOB_DAT) + ECase(R_AARCH64_JUMP_SLOT) + ECase(R_AARCH64_RELATIVE) + ECase(R_AARCH64_TLS_DTPREL64) + ECase(R_AARCH64_TLS_DTPMOD64) + ECase(R_AARCH64_TLS_TPREL64) + ECase(R_AARCH64_TLSDESC) + ECase(R_AARCH64_IRELATIVE) + break; default: llvm_unreachable("Unsupported architecture"); } @@ -653,13 +775,30 @@ void MappingTraits<ELFYAML::FileHeader>::mapping(IO &IO, IO.mapOptional("Entry", FileHdr.Entry, Hex64(0)); } +namespace { +struct NormalizedOther { + NormalizedOther(IO &) + : Visibility(ELFYAML::ELF_STV(0)), Other(ELFYAML::ELF_STO(0)) {} + NormalizedOther(IO &, uint8_t Original) + : Visibility(Original & 0x3), Other(Original & ~0x3) {} + + uint8_t denormalize(IO &) { return Visibility | Other; } + + ELFYAML::ELF_STV Visibility; + ELFYAML::ELF_STO Other; +}; +} + 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("Value", Symbol.Value, Hex64(0)); IO.mapOptional("Size", Symbol.Size, Hex64(0)); - IO.mapOptional("Visibility", Symbol.Visibility, ELFYAML::ELF_STV(0)); + + MappingNormalization<NormalizedOther, uint8_t> Keys(IO, Symbol.Other); + IO.mapOptional("Visibility", Keys->Visibility, ELFYAML::ELF_STV(0)); + IO.mapOptional("Other", Keys->Other, ELFYAML::ELF_STO(0)); } void MappingTraits<ELFYAML::LocalGlobalWeakSymbols>::mapping( |