summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-objcopy
diff options
context:
space:
mode:
authorEugene Leviant <eleviant@accesssoftek.com>2019-05-29 11:37:16 +0000
committerEugene Leviant <eleviant@accesssoftek.com>2019-05-29 11:37:16 +0000
commita6fb183c98943e90a9e35db78dae25bc79b8c66a (patch)
tree4fbba23cd19ff3d62c07239842230cf5f0244fbb /llvm/test/tools/llvm-objcopy
parent377c1cfe9495810f8416c626103708340e2a0038 (diff)
downloadbcm5719-llvm-a6fb183c98943e90a9e35db78dae25bc79b8c66a.tar.gz
bcm5719-llvm-a6fb183c98943e90a9e35db78dae25bc79b8c66a.zip
[llvm-objcopy] Implement IHEX writer
Differential revision: https://reviews.llvm.org/D60270 llvm-svn: 361949
Diffstat (limited to 'llvm/test/tools/llvm-objcopy')
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-pt-null.yaml20
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-sections.yaml60
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-sections2.yaml39
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-segments.yaml60
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/ihex-writer.test81
5 files changed, 260 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-pt-null.yaml b/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-pt-null.yaml
new file mode 100644
index 00000000000..3f142aeb284
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-pt-null.yaml
@@ -0,0 +1,20 @@
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x0
+ AddressAlign: 0x8
+ Content: "0001020304"
+ProgramHeaders:
+ - Type: PT_NULL
+ Flags: [ PF_X, PF_R ]
+ VAddr: 0xF00000000
+ PAddr: 0x100000
+ Sections:
+ - Section: .text
diff --git a/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-sections.yaml b/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-sections.yaml
new file mode 100644
index 00000000000..9a71b3175ef
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-sections.yaml
@@ -0,0 +1,60 @@
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+# This section contents exceeds default IHex line length of 16 bytes
+# so we expect two lines created for it.
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x0
+ AddressAlign: 0x8
+ Content: "000102030405060708090A0B0C0D0E0F1011121314"
+ - Name: .data
+# This section overlap 16-bit segment boundary, so we expect
+# additional 'SegmentAddr' record of type '02'
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Content: "3031323334353637383940"
+ Address: 0xFFF8
+ AddressAlign: 0x8
+ - Name: .data2
+# Previous section '.data' should have forced creation of
+# 'SegmentAddr'(02) record with segment address of 0x10000,
+# so this section should have address of 0x100.
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Content: "40414243"
+ Address: 0x10100
+ AddressAlign: 0x8
+ - Name: .data3
+# The last section not only overlaps segment boundary, but
+# also has linear address which doesn't fit 20 bits. The
+# following records should be craeted:
+# 'SegmentAddr'(02) record with address 0x0
+# 'ExtendedAddr'(04) record with address 0x100000
+# 'Data'(00) record with 8 bytes of section data
+# 'SegmentAddr'(02) record with address 0x10000
+# 'Data'(00) record with remaining 3 bytes of data.
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Content: "5051525354555657585960"
+ Address: 0x10FFF8
+ AddressAlign: 0x8
+ - Name: .bss
+# NOBITS sections are not written to IHex
+ Type: SHT_NOBITS
+ Flags: [ SHF_ALLOC ]
+ Address: 0x10100
+ Size: 0x1000
+ AddressAlign: 0x8
+ - Name: .dummy
+# Non-allocatable sections are not written to IHex
+ Type: SHT_PROGBITS
+ Flags: [ ]
+ Address: 0x20FFF8
+ Size: 65536
+ AddressAlign: 0x8
diff --git a/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-sections2.yaml b/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-sections2.yaml
new file mode 100644
index 00000000000..224340cbcc9
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-sections2.yaml
@@ -0,0 +1,39 @@
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+# Zero length sections are not exported to IHex
+# 'SegmentAddr' and 'ExtendedAddr' records aren't
+# created either.
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x7FFFFFFF
+ AddressAlign: 0x8
+ Size: 0
+ - Name: .text1
+# Section address is sign-extended 32-bit address
+# Data fits 32-bit range
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0xFFFFFFFF80001000
+ AddressAlign: 0x8
+ Content: "0001020304"
+ - Name: .text2
+# Part of section data is in 32-bit address range
+# and part isn't.
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0xFFFFFFF8
+ AddressAlign: 0x8
+ Content: "000102030405060708"
+ - Name: .text3
+ # Entire secion is outside of 32-bit range
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0xFFFFFFFF0
+ AddressAlign: 0x8
+ Content: "0001020304"
diff --git a/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-segments.yaml b/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-segments.yaml
new file mode 100644
index 00000000000..c7d8a7affb8
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/Inputs/ihex-elf-segments.yaml
@@ -0,0 +1,60 @@
+# Here we use yaml from ihex-elf-sections.yaml, but add single load
+# segment containing all exported sections. In such case we should
+# use physical address of a section intead of virtual address. Physical
+# addresses start from 0x100000, so we create two additional 'ExtenededAddr'
+# (03) record in the beginning of IHex file with that physical address
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+ Entry: 0x100000
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x0
+ AddressAlign: 0x8
+ Content: "000102030405060708090A0B0C0D0E0F1011121314"
+ - Name: .data1
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Content: "3031323334353637383940"
+ Address: 0xFFF8
+ AddressAlign: 0x8
+ - Name: .data2
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Content: "40414243"
+ Address: 0x10100
+ AddressAlign: 0x8
+ - Name: .data3
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Content: "5051525354555657585960"
+ Address: 0x10FFF8
+ AddressAlign: 0x8
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_ALLOC ]
+ Address: 0x10100
+ Size: 0x1000
+ AddressAlign: 0x8
+ - Name: .dummy
+ Type: SHT_PROGBITS
+ Flags: [ ]
+ Address: 0x20FFF8
+ Size: 65536
+ AddressAlign: 0x8
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_X, PF_R ]
+ VAddr: 0xF00000000
+ PAddr: 0x100000
+ Sections:
+ - Section: .text
+ - Section: .data1
+ - Section: .data2
+ - Section: .data3
+ - Section: .bss
diff --git a/llvm/test/tools/llvm-objcopy/ELF/ihex-writer.test b/llvm/test/tools/llvm-objcopy/ELF/ihex-writer.test
new file mode 100644
index 00000000000..2b74743385b
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/ihex-writer.test
@@ -0,0 +1,81 @@
+# RUN: yaml2obj %p/Inputs/ihex-elf-sections.yaml -o %t
+# RUN: llvm-objcopy -O ihex %t - | FileCheck %s
+
+# Check ihex output, when we have segments in ELF file
+# In such case only sections in PT_LOAD segments will
+# be exported and their physical addresses will be used
+# RUN: yaml2obj %p/Inputs/ihex-elf-segments.yaml -o %t-segs
+# RUN: llvm-objcopy -O ihex %t-segs - | FileCheck %s --check-prefix=SEGMENTS
+
+# Check that non-load segments are ignored:
+# RUN: yaml2obj %p/Inputs/ihex-elf-pt-null.yaml -o %t2-segs
+# RUN: llvm-objcopy -O ihex %t2-segs - | FileCheck %s --check-prefix=PT_NULL
+
+# Check that sign-extended 32-bit section addresses are processed
+# correctly
+# RUN: yaml2obj %p/Inputs/ihex-elf-sections2.yaml -o %t-sec2
+# RUN: llvm-objcopy -O ihex --only-section=.text1 %t-sec2 - | FileCheck %s --check-prefix=SIGN_EXTENDED
+
+# Check that section address range overlapping 32 bit range
+# triggers an error
+# RUN: not llvm-objcopy -O ihex --only-section=.text2 %t-sec2 %t-sec2-2.hex 2>&1 | FileCheck %s --check-prefix=BAD-ADDR
+# RUN: not llvm-objcopy -O ihex --only-section=.text3 %t-sec2 %t-sec2-3.hex 2>&1 | FileCheck %s --check-prefix=BAD-ADDR2
+
+# Check that zero length section is not written
+# RUN: llvm-objcopy -O ihex --only-section=.text %t-sec2 - | FileCheck %s --check-prefix=ZERO_SIZE_SEC
+
+# Check 80x86 start address record. It is created for start
+# addresses less than 0x100000
+# RUN: llvm-objcopy -O ihex --set-start=0xFFFF %t - | FileCheck %s --check-prefix=START1
+
+# Check i386 start address record (05). It is created for
+# start addresses which doesn't fit 20 bits
+# RUN: llvm-objcopy -O ihex --set-start=0x100000 %t - | FileCheck %s --check-prefix=START2
+
+# We allow sign extended 32 bit start addresses as well.
+# RUN: llvm-objcopy -O ihex --set-start=0xFFFFFFFF80001000 %t - | FileCheck %s --check-prefix=START3
+
+# Start address which exceeds 32 bit range triggers an error
+# RUN: not llvm-objcopy -O ihex --set-start=0xF00000000 %t %t6.hex 2>&1 | FileCheck %s --check-prefix=BAD-START
+
+# CHECK: :10000000000102030405060708090A0B0C0D0E0F78
+# CHECK-NEXT: :05001000101112131491
+# CHECK-NEXT: :08FFF800303132333435363765
+# CHECK-NEXT: :020000021000EC
+# CHECK-NEXT: :030000003839404C
+# CHECK-NEXT: :0401000040414243F5
+# CHECK-NEXT: :020000020000FC
+# CHECK-NEXT: :020000040010EA
+# CHECK-NEXT: :08FFF800505152535455565765
+# CHECK-NEXT: :020000040011E9
+# CHECK-NEXT: :03000000585960EC
+# CHECK-NEXT: :00000001FF
+
+# SEGMENTS: :020000040010EA
+# SEGMENTS-NEXT: :10000000000102030405060708090A0B0C0D0E0F78
+# SEGMENTS-NEXT: :05001000101112131491
+# SEGMENTS-NEXT: :0B001800303132333435363738394090
+# SEGMENTS-NEXT: :0400280040414243CE
+# SEGMENTS-NEXT: :0B003000505152535455565758596018
+# SEGMENTS-NEXT: :0400000500100000E7
+# SEGMENTS-NEXT: :00000001FF
+
+# 'ExtendedAddr' (04) record shouldn't be created
+# PT_NULL-NOT: :02000004
+
+# SIGN_EXTENDED: :0200000480007A
+# SIGN_EXTENDED-NEXT: :051000000001020304E1
+# SIGN_EXTENDED-NEXT: :00000001FF
+
+# BAD-ADDR: error: {{.*}}: Section '.text2' address range [0xfffffff8, 0x100000000] is not 32 bit
+# BAD-ADDR2: error: {{.*}}: Section '.text3' address range [0xffffffff0, 0xffffffff4] is not 32 bit
+
+# There shouldn't be 'ExtendedAddr' nor 'Data' records
+# ZERO_SIZE_SEC-NOT: :02000004
+# ZERO_SIZE_SEC-NOT: :00FFFF00
+# ZERO_SIZE_SEC: :00000001FF
+
+# START1: :040000030000FFFFFB
+# START2: :0400000500100000E7
+# START3: :040000058000100067
+# BAD-START: error: {{.*}}: Entry point address 0xf00000000 overflows 32 bits
OpenPOWER on IntegriCloud