From da26b595ac4f8bd01d9f0e22a89d4cf7ee0a9b36 Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Mon, 6 Nov 2017 07:20:58 +0000 Subject: [PATCH] [ObjectYAML] Map relocation types for COFF ARMNT and ARM64 Differential Revision: https://reviews.llvm.org/D39668 llvm-svn: 317459 --- include/llvm/ObjectYAML/COFFYAML.h | 10 ++ lib/ObjectYAML/COFFYAML.cpp | 48 +++++++++ test/Object/obj2yaml.test | 158 +++++++++++++++++++++++++++++ 3 files changed, 216 insertions(+) diff --git a/include/llvm/ObjectYAML/COFFYAML.h b/include/llvm/ObjectYAML/COFFYAML.h index bbceefac3d9..1fce46c125f 100644 --- a/include/llvm/ObjectYAML/COFFYAML.h +++ b/include/llvm/ObjectYAML/COFFYAML.h @@ -157,6 +157,16 @@ struct ScalarEnumerationTraits { static void enumeration(IO &IO, COFF::RelocationTypeAMD64 &Value); }; +template <> +struct ScalarEnumerationTraits { + static void enumeration(IO &IO, COFF::RelocationTypesARM &Value); +}; + +template <> +struct ScalarEnumerationTraits { + static void enumeration(IO &IO, COFF::RelocationTypesARM64 &Value); +}; + template <> struct ScalarEnumerationTraits { static void enumeration(IO &IO, COFF::WindowsSubsystem &Value); diff --git a/lib/ObjectYAML/COFFYAML.cpp b/lib/ObjectYAML/COFFYAML.cpp index 1103159fc98..056a1aa3ca1 100644 --- a/lib/ObjectYAML/COFFYAML.cpp +++ b/lib/ObjectYAML/COFFYAML.cpp @@ -178,6 +178,46 @@ void ScalarEnumerationTraits::enumeration( ECase(IMAGE_REL_AMD64_SSPAN32); } +void ScalarEnumerationTraits::enumeration( + IO &IO, COFF::RelocationTypesARM &Value) { + ECase(IMAGE_REL_ARM_ABSOLUTE); + ECase(IMAGE_REL_ARM_ADDR32); + ECase(IMAGE_REL_ARM_ADDR32NB); + ECase(IMAGE_REL_ARM_BRANCH24); + ECase(IMAGE_REL_ARM_BRANCH11); + ECase(IMAGE_REL_ARM_TOKEN); + ECase(IMAGE_REL_ARM_BLX24); + ECase(IMAGE_REL_ARM_BLX11); + ECase(IMAGE_REL_ARM_SECTION); + ECase(IMAGE_REL_ARM_SECREL); + ECase(IMAGE_REL_ARM_MOV32A); + ECase(IMAGE_REL_ARM_MOV32T); + ECase(IMAGE_REL_ARM_BRANCH20T); + ECase(IMAGE_REL_ARM_BRANCH24T); + ECase(IMAGE_REL_ARM_BLX23T); +} + +void ScalarEnumerationTraits::enumeration( + IO &IO, COFF::RelocationTypesARM64 &Value) { + ECase(IMAGE_REL_ARM64_ABSOLUTE); + ECase(IMAGE_REL_ARM64_ADDR32); + ECase(IMAGE_REL_ARM64_ADDR32NB); + ECase(IMAGE_REL_ARM64_BRANCH26); + ECase(IMAGE_REL_ARM64_PAGEBASE_REL21); + ECase(IMAGE_REL_ARM64_REL21); + ECase(IMAGE_REL_ARM64_PAGEOFFSET_12A); + ECase(IMAGE_REL_ARM64_PAGEOFFSET_12L); + ECase(IMAGE_REL_ARM64_SECREL); + ECase(IMAGE_REL_ARM64_SECREL_LOW12A); + ECase(IMAGE_REL_ARM64_SECREL_HIGH12A); + ECase(IMAGE_REL_ARM64_SECREL_LOW12L); + ECase(IMAGE_REL_ARM64_TOKEN); + ECase(IMAGE_REL_ARM64_SECTION); + ECase(IMAGE_REL_ARM64_ADDR64); + ECase(IMAGE_REL_ARM64_BRANCH19); + ECase(IMAGE_REL_ARM64_BRANCH14); +} + void ScalarEnumerationTraits::enumeration( IO &IO, COFF::WindowsSubsystem &Value) { ECase(IMAGE_SUBSYSTEM_UNKNOWN); @@ -378,6 +418,14 @@ void MappingTraits::mapping(IO &IO, MappingNormalization, uint16_t> NT( IO, Rel.Type); IO.mapRequired("Type", NT->Type); + } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_ARMNT) { + MappingNormalization, uint16_t> NT( + IO, Rel.Type); + IO.mapRequired("Type", NT->Type); + } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_ARM64) { + MappingNormalization, uint16_t> NT( + IO, Rel.Type); + IO.mapRequired("Type", NT->Type); } else { IO.mapRequired("Type", Rel.Type); } diff --git a/test/Object/obj2yaml.test b/test/Object/obj2yaml.test index 3d89f53bafc..7b274b31bb1 100644 --- a/test/Object/obj2yaml.test +++ b/test/Object/obj2yaml.test @@ -1,5 +1,7 @@ RUN: obj2yaml %p/Inputs/trivial-object-test.coff-i386 | FileCheck %s --check-prefix COFF-I386 RUN: obj2yaml %p/Inputs/trivial-object-test.coff-x86-64 | FileCheck %s --check-prefix COFF-X86-64 +RUN: obj2yaml %p/Inputs/trivial-object-test.coff-armnt | FileCheck %s --check-prefix COFF-ARMNT +RUN: obj2yaml %p/Inputs/trivial-object-test.coff-arm64 | FileCheck %s --check-prefix COFF-ARM64 RUN: obj2yaml %p/Inputs/trivial-object-test.elf-mipsel | FileCheck %s --check-prefix ELF-MIPSEL RUN: obj2yaml %p/Inputs/trivial-object-test.elf-mips64el | FileCheck %s --check-prefix ELF-MIPS64EL RUN: obj2yaml %p/Inputs/trivial-object-test.elf-x86-64 | FileCheck %s --check-prefix ELF-X86-64 @@ -189,6 +191,162 @@ COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_FUNCTION COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC +COFF-ARMNT: header: +COFF-ARMNT-NEXT: Machine: IMAGE_FILE_MACHINE_ARMNT + +COFF-ARMNT: sections: +COFF-ARMNT-NEXT: - Name: .text +COFF-ARMNT-NEXT: Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_PURGEABLE, IMAGE_SCN_MEM_16BIT, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] +COFF-ARMNT-NEXT: Alignment: 4 +COFF-ARMNT-NEXT: SectionData: 00F000F87047 + +COFF-ARMNT: Relocations: +COFF-ARMNT-NEXT: - VirtualAddress: 0 +COFF-ARMNT-NEXT: SymbolName: otherFunc +COFF-ARMNT-NEXT: Type: IMAGE_REL_ARM_BLX23T + +COFF-ARMNT: - Name: .data +COFF-ARMNT-NEXT: Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] +COFF-ARMNT-NEXT: Alignment: 4 +COFF-ARMNT-NEXT: SectionData: '' + +COFF-ARMNT: - Name: .bss +COFF-ARMNT-NEXT: Characteristics: [ IMAGE_SCN_CNT_UNINITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] +COFF-ARMNT-NEXT: Alignment: 4 +COFF-ARMNT-NEXT: SectionData: '' + +COFF-ARMNT: symbols: +COFF-ARMNT-NEXT: - Name: .text +COFF-ARMNT-NEXT: Value: 0 +COFF-ARMNT-NEXT: SectionNumber: 1 +COFF-ARMNT-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-ARMNT-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-ARMNT-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC +COFF-ARMNT-NEXT: SectionDefinition: +COFF-ARMNT-NEXT: Length: 6 +COFF-ARMNT-NEXT: NumberOfRelocations: 1 +COFF-ARMNT-NEXT: NumberOfLinenumbers: 0 +COFF-ARMNT-NEXT: CheckSum: 879026160 +COFF-ARMNT-NEXT: Number: 1 + +COFF-ARMNT: - Name: .data +COFF-ARMNT-NEXT: Value: 0 +COFF-ARMNT-NEXT: SectionNumber: 2 +COFF-ARMNT-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-ARMNT-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-ARMNT-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC +COFF-ARMNT-NEXT: SectionDefinition: +COFF-ARMNT-NEXT: Length: 0 +COFF-ARMNT-NEXT: NumberOfRelocations: 0 +COFF-ARMNT-NEXT: NumberOfLinenumbers: 0 +COFF-ARMNT-NEXT: CheckSum: 0 +COFF-ARMNT-NEXT: Number: 2 + +COFF-ARMNT: - Name: .bss +COFF-ARMNT-NEXT: Value: 0 +COFF-ARMNT-NEXT: SectionNumber: 3 +COFF-ARMNT-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-ARMNT-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-ARMNT-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC +COFF-ARMNT-NEXT: SectionDefinition: +COFF-ARMNT-NEXT: Length: 0 +COFF-ARMNT-NEXT: NumberOfRelocations: 0 +COFF-ARMNT-NEXT: NumberOfLinenumbers: 0 +COFF-ARMNT-NEXT: CheckSum: 0 +COFF-ARMNT-NEXT: Number: 3 + +COFF-ARMNT: - Name: main +COFF-ARMNT-NEXT: Value: 0 +COFF-ARMNT-NEXT: SectionNumber: 1 +COFF-ARMNT-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-ARMNT-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-ARMNT-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL + +COFF-ARMNT: - Name: otherFunc +COFF-ARMNT-NEXT: Value: 0 +COFF-ARMNT-NEXT: SectionNumber: 0 +COFF-ARMNT-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-ARMNT-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-ARMNT-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL + +COFF-ARM64: header: +COFF-ARM64-NEXT: Machine: IMAGE_FILE_MACHINE_ARM64 + +COFF-ARM64: sections: +COFF-ARM64-NEXT: - Name: .text +COFF-ARM64-NEXT: Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] +COFF-ARM64-NEXT: Alignment: 4 +COFF-ARM64-NEXT: SectionData: 00000094C0035FD6 + +COFF-ARM64: Relocations: +COFF-ARM64-NEXT: - VirtualAddress: 0 +COFF-ARM64-NEXT: SymbolName: otherFunc +COFF-ARM64-NEXT: Type: IMAGE_REL_ARM64_BRANCH26 + +COFF-ARM64: - Name: .data +COFF-ARM64-NEXT: Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] +COFF-ARM64-NEXT: Alignment: 4 +COFF-ARM64-NEXT: SectionData: '' + +COFF-ARM64: - Name: .bss +COFF-ARM64-NEXT: Characteristics: [ IMAGE_SCN_CNT_UNINITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] +COFF-ARM64-NEXT: Alignment: 4 +COFF-ARM64-NEXT: SectionData: '' + +COFF-ARM64: symbols: +COFF-ARM64-NEXT: - Name: .text +COFF-ARM64-NEXT: Value: 0 +COFF-ARM64-NEXT: SectionNumber: 1 +COFF-ARM64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-ARM64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-ARM64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC +COFF-ARM64-NEXT: SectionDefinition: +COFF-ARM64-NEXT: Length: 8 +COFF-ARM64-NEXT: NumberOfRelocations: 1 +COFF-ARM64-NEXT: NumberOfLinenumbers: 0 +COFF-ARM64-NEXT: CheckSum: 35579893 +COFF-ARM64-NEXT: Number: 1 + +COFF-ARM64: - Name: .data +COFF-ARM64-NEXT: Value: 0 +COFF-ARM64-NEXT: SectionNumber: 2 +COFF-ARM64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-ARM64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-ARM64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC +COFF-ARM64-NEXT: SectionDefinition: +COFF-ARM64-NEXT: Length: 0 +COFF-ARM64-NEXT: NumberOfRelocations: 0 +COFF-ARM64-NEXT: NumberOfLinenumbers: 0 +COFF-ARM64-NEXT: CheckSum: 0 +COFF-ARM64-NEXT: Number: 2 + +COFF-ARM64: - Name: .bss +COFF-ARM64-NEXT: Value: 0 +COFF-ARM64-NEXT: SectionNumber: 3 +COFF-ARM64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-ARM64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-ARM64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC +COFF-ARM64-NEXT: SectionDefinition: +COFF-ARM64-NEXT: Length: 0 +COFF-ARM64-NEXT: NumberOfRelocations: 0 +COFF-ARM64-NEXT: NumberOfLinenumbers: 0 +COFF-ARM64-NEXT: CheckSum: 0 +COFF-ARM64-NEXT: Number: 3 + +COFF-ARM64: - Name: main +COFF-ARM64-NEXT: Value: 0 +COFF-ARM64-NEXT: SectionNumber: 1 +COFF-ARM64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-ARM64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-ARM64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL + +COFF-ARM64: - Name: otherFunc +COFF-ARM64-NEXT: Value: 0 +COFF-ARM64-NEXT: SectionNumber: 0 +COFF-ARM64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-ARM64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-ARM64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL + ELF-MIPSEL: FileHeader: ELF-MIPSEL-NEXT: Class: ELFCLASS32 ELF-MIPSEL-NEXT: Data: ELFDATA2LSB