X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FObject%2FELFYAML.cpp;h=6340841e5ee67f8f4bae7148522a10e7a663338a;hb=487ecab8d41e70700ca27895127b99f955e31fd0;hp=4f0da24e404b93f63ac217160a02ceec89de2d57;hpb=7259f14839ab7a61f2af6e897005585b1ea4a3d4;p=oota-llvm.git diff --git a/lib/Object/ELFYAML.cpp b/lib/Object/ELFYAML.cpp index 4f0da24e404..6340841e5ee 100644 --- a/lib/Object/ELFYAML.cpp +++ b/lib/Object/ELFYAML.cpp @@ -243,48 +243,63 @@ void ScalarEnumerationTraits::enumeration( void ScalarBitSetTraits::bitset(IO &IO, ELFYAML::ELF_EF &Value) { + const auto *Object = static_cast(IO.getContext()); + assert(Object && "The IO context is not initialized"); #define BCase(X) IO.bitSetCase(Value, #X, ELF::X); - BCase(EF_ARM_SOFT_FLOAT) - BCase(EF_ARM_VFP_FLOAT) - BCase(EF_ARM_EABI_UNKNOWN) - BCase(EF_ARM_EABI_VER1) - BCase(EF_ARM_EABI_VER2) - BCase(EF_ARM_EABI_VER3) - BCase(EF_ARM_EABI_VER4) - BCase(EF_ARM_EABI_VER5) - BCase(EF_ARM_EABIMASK) - BCase(EF_MIPS_NOREORDER) - BCase(EF_MIPS_PIC) - BCase(EF_MIPS_CPIC) - BCase(EF_MIPS_ABI2) - BCase(EF_MIPS_32BITMODE) - BCase(EF_MIPS_ABI_O32) - BCase(EF_MIPS_MICROMIPS) - BCase(EF_MIPS_ARCH_ASE_M16) - BCase(EF_MIPS_ARCH_1) - BCase(EF_MIPS_ARCH_2) - BCase(EF_MIPS_ARCH_3) - BCase(EF_MIPS_ARCH_4) - BCase(EF_MIPS_ARCH_5) - BCase(EF_MIPS_ARCH_32) - BCase(EF_MIPS_ARCH_64) - BCase(EF_MIPS_ARCH_32R2) - BCase(EF_MIPS_ARCH_64R2) - BCase(EF_MIPS_ARCH) - BCase(EF_HEXAGON_MACH_V2) - BCase(EF_HEXAGON_MACH_V3) - BCase(EF_HEXAGON_MACH_V4) - BCase(EF_HEXAGON_MACH_V5) - BCase(EF_HEXAGON_ISA_MACH) - BCase(EF_HEXAGON_ISA_V2) - BCase(EF_HEXAGON_ISA_V3) - BCase(EF_HEXAGON_ISA_V4) - BCase(EF_HEXAGON_ISA_V5) +#define BCaseMask(X, M) IO.maskedBitSetCase(Value, #X, ELF::X, ELF::M); + switch (Object->Header.Machine) { + case ELF::EM_ARM: + BCase(EF_ARM_SOFT_FLOAT) + BCase(EF_ARM_VFP_FLOAT) + BCaseMask(EF_ARM_EABI_UNKNOWN, EF_ARM_EABIMASK) + BCaseMask(EF_ARM_EABI_VER1, EF_ARM_EABIMASK) + BCaseMask(EF_ARM_EABI_VER2, EF_ARM_EABIMASK) + BCaseMask(EF_ARM_EABI_VER3, EF_ARM_EABIMASK) + BCaseMask(EF_ARM_EABI_VER4, EF_ARM_EABIMASK) + BCaseMask(EF_ARM_EABI_VER5, EF_ARM_EABIMASK) + break; + case ELF::EM_MIPS: + BCase(EF_MIPS_NOREORDER) + BCase(EF_MIPS_PIC) + BCase(EF_MIPS_CPIC) + BCase(EF_MIPS_ABI2) + BCase(EF_MIPS_32BITMODE) + BCase(EF_MIPS_ABI_O32) + BCase(EF_MIPS_MICROMIPS) + BCase(EF_MIPS_ARCH_ASE_M16) + BCaseMask(EF_MIPS_ARCH_1, EF_MIPS_ARCH) + BCaseMask(EF_MIPS_ARCH_2, EF_MIPS_ARCH) + BCaseMask(EF_MIPS_ARCH_3, EF_MIPS_ARCH) + BCaseMask(EF_MIPS_ARCH_4, EF_MIPS_ARCH) + BCaseMask(EF_MIPS_ARCH_5, EF_MIPS_ARCH) + BCaseMask(EF_MIPS_ARCH_32, EF_MIPS_ARCH) + BCaseMask(EF_MIPS_ARCH_64, EF_MIPS_ARCH) + BCaseMask(EF_MIPS_ARCH_32R2, EF_MIPS_ARCH) + BCaseMask(EF_MIPS_ARCH_64R2, EF_MIPS_ARCH) + BCaseMask(EF_MIPS_ARCH_32R6, EF_MIPS_ARCH) + BCaseMask(EF_MIPS_ARCH_64R6, EF_MIPS_ARCH) + break; + case ELF::EM_HEXAGON: + BCase(EF_HEXAGON_MACH_V2) + BCase(EF_HEXAGON_MACH_V3) + BCase(EF_HEXAGON_MACH_V4) + BCase(EF_HEXAGON_MACH_V5) + BCase(EF_HEXAGON_ISA_V2) + BCase(EF_HEXAGON_ISA_V3) + BCase(EF_HEXAGON_ISA_V4) + BCase(EF_HEXAGON_ISA_V5) + break; + default: + llvm_unreachable("Unsupported architecture"); + } #undef BCase +#undef BCaseMask } void ScalarEnumerationTraits::enumeration( IO &IO, ELFYAML::ELF_SHT &Value) { + const auto *Object = static_cast(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) @@ -304,6 +319,37 @@ void ScalarEnumerationTraits::enumeration( ECase(SHT_PREINIT_ARRAY) ECase(SHT_GROUP) ECase(SHT_SYMTAB_SHNDX) + ECase(SHT_LOOS) + ECase(SHT_GNU_ATTRIBUTES) + ECase(SHT_GNU_HASH) + ECase(SHT_GNU_verdef) + ECase(SHT_GNU_verneed) + ECase(SHT_GNU_versym) + ECase(SHT_HIOS) + ECase(SHT_LOPROC) + 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 } @@ -338,6 +384,16 @@ void ScalarEnumerationTraits::enumeration( #undef ECase } +void ScalarEnumerationTraits::enumeration( + IO &IO, ELFYAML::ELF_STV &Value) { +#define ECase(X) IO.enumCase(Value, #X, ELF::X); + ECase(STV_DEFAULT) + ECase(STV_INTERNAL) + ECase(STV_HIDDEN) + ECase(STV_PROTECTED) +#undef ECase +} + void ScalarEnumerationTraits::enumeration( IO &IO, ELFYAML::ELF_REL &Value) { const auto *Object = static_cast(IO.getContext()); @@ -436,6 +492,15 @@ void ScalarEnumerationTraits::enumeration( ECase(R_MIPS_TLS_TPREL_HI16) ECase(R_MIPS_TLS_TPREL_LO16) ECase(R_MIPS_GLOB_DAT) + ECase(R_MIPS_PC21_S2) + ECase(R_MIPS_PC26_S2) + ECase(R_MIPS_PC18_S3) + ECase(R_MIPS_PC19_S2) + ECase(R_MIPS_PCHI16) + ECase(R_MIPS_PCLO16) + ECase(R_MIPS16_GOT16) + ECase(R_MIPS16_HI16) + ECase(R_MIPS16_LO16) ECase(R_MIPS_COPY) ECase(R_MIPS_JUMP_SLOT) ECase(R_MICROMIPS_26_S1) @@ -544,6 +609,49 @@ void ScalarEnumerationTraits::enumeration( ECase(R_HEX_TPREL_16_X) ECase(R_HEX_TPREL_11_X) break; + case ELF::EM_386: + ECase(R_386_NONE) + ECase(R_386_32) + ECase(R_386_PC32) + ECase(R_386_GOT32) + ECase(R_386_PLT32) + ECase(R_386_COPY) + ECase(R_386_GLOB_DAT) + ECase(R_386_JUMP_SLOT) + ECase(R_386_RELATIVE) + ECase(R_386_GOTOFF) + ECase(R_386_GOTPC) + ECase(R_386_32PLT) + ECase(R_386_TLS_TPOFF) + ECase(R_386_TLS_IE) + ECase(R_386_TLS_GOTIE) + ECase(R_386_TLS_LE) + ECase(R_386_TLS_GD) + ECase(R_386_TLS_LDM) + ECase(R_386_16) + ECase(R_386_PC16) + ECase(R_386_8) + ECase(R_386_PC8) + ECase(R_386_TLS_GD_32) + ECase(R_386_TLS_GD_PUSH) + ECase(R_386_TLS_GD_CALL) + ECase(R_386_TLS_GD_POP) + ECase(R_386_TLS_LDM_32) + ECase(R_386_TLS_LDM_PUSH) + ECase(R_386_TLS_LDM_CALL) + ECase(R_386_TLS_LDM_POP) + ECase(R_386_TLS_LDO_32) + ECase(R_386_TLS_IE_32) + ECase(R_386_TLS_LE_32) + ECase(R_386_TLS_DTPMOD32) + ECase(R_386_TLS_DTPOFF32) + ECase(R_386_TLS_TPOFF32) + ECase(R_386_TLS_GOTDESC) + ECase(R_386_TLS_DESC_CALL) + ECase(R_386_TLS_DESC) + ECase(R_386_IRELATIVE) + ECase(R_386_NUM) + break; default: llvm_unreachable("Unsupported architecture"); } @@ -567,6 +675,7 @@ void MappingTraits::mapping(IO &IO, ELFYAML::Symbol &Symbol) { 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)); } void MappingTraits::mapping( @@ -581,18 +690,19 @@ static void commonSectionMapping(IO &IO, ELFYAML::Section &Section) { IO.mapRequired("Type", Section.Type); IO.mapOptional("Flags", Section.Flags, ELFYAML::ELF_SHF(0)); IO.mapOptional("Address", Section.Address, Hex64(0)); - IO.mapOptional("Link", Section.Link); - IO.mapOptional("Info", Section.Info); + IO.mapOptional("Link", Section.Link, StringRef()); IO.mapOptional("AddressAlign", Section.AddressAlign, Hex64(0)); } static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) { commonSectionMapping(IO, Section); IO.mapOptional("Content", Section.Content); + IO.mapOptional("Size", Section.Size, Hex64(Section.Content.binary_size())); } static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) { commonSectionMapping(IO, Section); + IO.mapOptional("Info", Section.Info, StringRef()); IO.mapOptional("Relocations", Section.Relocations); } @@ -601,7 +711,8 @@ void MappingTraits>::mapping( ELFYAML::ELF_SHT sectionType; if (IO.outputting()) sectionType = Section->Type; - IO.mapRequired("Type", sectionType); + else + IO.mapRequired("Type", sectionType); switch (sectionType) { case ELF::SHT_REL: @@ -617,6 +728,14 @@ void MappingTraits>::mapping( } } +StringRef MappingTraits>::validate( + IO &io, std::unique_ptr &Section) { + const auto *RawSection = dyn_cast(Section.get()); + if (!RawSection || RawSection->Size >= RawSection->Content.binary_size()) + return StringRef(); + return "Section size must be greater or equal to the content size"; +} + void MappingTraits::mapping(IO &IO, ELFYAML::Relocation &Rel) { IO.mapRequired("Offset", Rel.Offset);