xref: /llvm-project/llvm/test/tools/llvm-objcopy/ELF/srec-writer.test (revision 7ddc32052546abd41656d2e670f3902b1bf805a7)
1*7ddc3205Squic-areg## Check for basic functionality using an input file with
2*7ddc3205Squic-areg## various section types, adresses, data, and no segments.
3*7ddc3205Squic-areg# RUN: yaml2obj %s --docnum=1 -o %t
4*7ddc3205Squic-areg# RUN: llvm-objcopy -O srec %t - | \
5*7ddc3205Squic-areg# RUN:   FileCheck --match-full-lines --strict-whitespace %s --check-prefix=SREC
6*7ddc3205Squic-areg
7*7ddc3205Squic-areg## The record type for the header should be S0 with a 2 byte address
8*7ddc3205Squic-areg## of 0. For an output file named "-" the header data field should contain "2D".
9*7ddc3205Squic-areg## The byte count field should therefore have a value of 4: 2 bytes for address,
10*7ddc3205Squic-areg## 1 byte for output file and 1 byte for checksum.
11*7ddc3205Squic-areg     # SREC:S00400002DCE
12*7ddc3205Squic-areg# SREC-NEXT:S31500001000000102030405060708090A0B0C0D0E0F62
13*7ddc3205Squic-areg# SREC-NEXT:S30A0000101010111213147B
14*7ddc3205Squic-areg# SREC-NEXT:S30F00EFFFFF1111111111111111111159
15*7ddc3205Squic-areg# SREC-NEXT:S31000FFFFF83031323334353637383940AC
16*7ddc3205Squic-areg# SREC-NEXT:S30A8000100000010203045B
17*7ddc3205Squic-areg# SREC-NEXT:S70500000000FA
18*7ddc3205Squic-areg
19*7ddc3205Squic-areg## Terminator should contain the entry point.
20*7ddc3205Squic-areg# RUN: llvm-objcopy -O srec --set-start=0xF0000000 %t --only-section=.dummy - 2>&1 | \
21*7ddc3205Squic-areg# RUN:   FileCheck --match-full-lines --strict-whitespace %s --check-prefix=ENTRY
22*7ddc3205Squic-areg## Sign-extended entry point is OK.
23*7ddc3205Squic-areg# RUN: llvm-objcopy -O srec --set-start=0xFFFFFFFFF0000000 %t --only-section=.dummy - 2>&1 | \
24*7ddc3205Squic-areg# RUN:   FileCheck --match-full-lines --strict-whitespace %s --check-prefix=ENTRY
25*7ddc3205Squic-areg
26*7ddc3205Squic-areg     # ENTRY:S00400002DCE
27*7ddc3205Squic-areg# ENTRY-NEXT:S705F00000000A
28*7ddc3205Squic-areg
29*7ddc3205Squic-areg## Start address which exceeds 32 bit range triggers an error.
30*7ddc3205Squic-areg# RUN: not llvm-objcopy -O srec --set-start=0xF00000000 %t - 2>&1 | \
31*7ddc3205Squic-areg# RUN:   FileCheck %s --check-prefix=BAD_START
32*7ddc3205Squic-areg
33*7ddc3205Squic-areg# BAD_START: entry point address 0xf00000000 overflows 32 bits
34*7ddc3205Squic-areg
35*7ddc3205Squic-areg## Sign-extended start address which exceeds 32 bit range triggers an error.
36*7ddc3205Squic-areg# RUN: not llvm-objcopy -O srec --set-start=0xFFFFFFFF0F000000 %t - 2>&1 | \
37*7ddc3205Squic-areg# RUN:   FileCheck %s --check-prefix=BAD_EXTENDED_START
38*7ddc3205Squic-areg
39*7ddc3205Squic-areg# BAD_EXTENDED_START: entry point address 0xffffffff0f000000 overflows 32 bits
40*7ddc3205Squic-areg
41*7ddc3205Squic-areg--- !ELF
42*7ddc3205Squic-aregFileHeader:
43*7ddc3205Squic-areg  Class:           ELFCLASS64
44*7ddc3205Squic-areg  Data:            ELFDATA2LSB
45*7ddc3205Squic-areg  Type:            ET_EXEC
46*7ddc3205Squic-areg  Machine:         EM_X86_64
47*7ddc3205Squic-aregSections:
48*7ddc3205Squic-areg  - Name:            .data1
49*7ddc3205Squic-areg## Records for this section should come last.
50*7ddc3205Squic-areg    Type:            SHT_PROGBITS
51*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
52*7ddc3205Squic-areg    Content:         "11111111111111111111"
53*7ddc3205Squic-areg    Address:         0xEFFFFF
54*7ddc3205Squic-areg  - Name:            .data2
55*7ddc3205Squic-areg## This section overlaps 24-bit address boundary, so we expect
56*7ddc3205Squic-areg## its record type to be S3.
57*7ddc3205Squic-areg    Type:            SHT_PROGBITS
58*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
59*7ddc3205Squic-areg    Content:         "3031323334353637383940"
60*7ddc3205Squic-areg    Address:         0xFFFFF8
61*7ddc3205Squic-areg## Sign-extended addresses are OK.
62*7ddc3205Squic-areg  - Name:            .data3
63*7ddc3205Squic-areg    Type:            SHT_PROGBITS
64*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
65*7ddc3205Squic-areg    Address:         0xFFFFFFFF80001000
66*7ddc3205Squic-areg    Content:         "0001020304"
67*7ddc3205Squic-areg  - Name:            .text
68*7ddc3205Squic-areg## This section's contents exceed default line length of 16 bytes
69*7ddc3205Squic-areg## so we expect two lines created for it. Records for this section
70*7ddc3205Squic-areg## should appear before records for the previous section.
71*7ddc3205Squic-areg    Type:            SHT_PROGBITS
72*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
73*7ddc3205Squic-areg    Address:         0x1000
74*7ddc3205Squic-areg    Content:         "000102030405060708090A0B0C0D0E0F1011121314"
75*7ddc3205Squic-areg  - Name:            .bss
76*7ddc3205Squic-areg## NOBITS sections are not written.
77*7ddc3205Squic-areg    Type:            SHT_NOBITS
78*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
79*7ddc3205Squic-areg    Address:         0x10100
80*7ddc3205Squic-areg    Size:            0x1000
81*7ddc3205Squic-areg  - Name:            .dummy
82*7ddc3205Squic-areg## Non-allocatable sections are not written.
83*7ddc3205Squic-areg    Type:            SHT_PROGBITS
84*7ddc3205Squic-areg    Flags:           [ ]
85*7ddc3205Squic-areg    Address:         0x20FFF8
86*7ddc3205Squic-areg    Size:            65536
87*7ddc3205Squic-areg
88*7ddc3205Squic-areg## Check for various error cases.
89*7ddc3205Squic-areg
90*7ddc3205Squic-areg## Check that section address range overlapping 32 bit range
91*7ddc3205Squic-areg## triggers an error.
92*7ddc3205Squic-areg# RUN: yaml2obj %s --docnum=2 -o %t.err
93*7ddc3205Squic-areg# RUN: not llvm-objcopy -O srec --only-section=.text1 %t.err - 2>&1 | \
94*7ddc3205Squic-areg# RUN:   FileCheck %s --check-prefix=BAD-ADDR
95*7ddc3205Squic-areg# RUN: not llvm-objcopy -O srec --only-section=.text2 %t.err - 2>&1 | \
96*7ddc3205Squic-areg# RUN:   FileCheck %s --check-prefix=BAD-ADDR2
97*7ddc3205Squic-areg
98*7ddc3205Squic-areg# BAD-ADDR: section '.text1' address range [0xfffffff8, 0x100000000] is not 32 bit
99*7ddc3205Squic-areg# BAD-ADDR2: section '.text2' address range [0xffffffff0, 0xffffffff4] is not 32 bit
100*7ddc3205Squic-areg
101*7ddc3205Squic-areg## Check that zero length section is not written.
102*7ddc3205Squic-areg# RUN: llvm-objcopy -O srec --only-section=.text %t.err - | \
103*7ddc3205Squic-areg# RUN:   FileCheck --match-full-lines --strict-whitespace --implicit-check-not={{.}} %s --check-prefix=ZERO_SIZE_SEC
104*7ddc3205Squic-areg
105*7ddc3205Squic-areg## There should be no records besides header and terminator.
106*7ddc3205Squic-areg# ZERO_SIZE_SEC:S00400002DCE
107*7ddc3205Squic-areg# ZERO_SIZE_SEC-NEXT:S9030000FC
108*7ddc3205Squic-areg
109*7ddc3205Squic-areg--- !ELF
110*7ddc3205Squic-aregFileHeader:
111*7ddc3205Squic-areg  Class:           ELFCLASS64
112*7ddc3205Squic-areg  Data:            ELFDATA2LSB
113*7ddc3205Squic-areg  Type:            ET_EXEC
114*7ddc3205Squic-areg  Machine:         EM_X86_64
115*7ddc3205Squic-aregSections:
116*7ddc3205Squic-areg  - Name:            .text1
117*7ddc3205Squic-areg## Part of section data is in 32-bit address range and part isn't.
118*7ddc3205Squic-areg    Type:            SHT_PROGBITS
119*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC]
120*7ddc3205Squic-areg    Address:         0xFFFFFFF8
121*7ddc3205Squic-areg    Content:         "000102030405060708"
122*7ddc3205Squic-areg  - Name:            .text2
123*7ddc3205Squic-areg  ## Entire secion is outside of 32-bit range.
124*7ddc3205Squic-areg    Type:            SHT_PROGBITS
125*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
126*7ddc3205Squic-areg    Address:         0xFFFFFFFF0
127*7ddc3205Squic-areg    Content:         "0001020304"
128*7ddc3205Squic-areg
129*7ddc3205Squic-areg## This tests an input file with segments and expects
130*7ddc3205Squic-areg## physical addresses instead of virtual addresses.
131*7ddc3205Squic-areg# RUN: yaml2obj %s --docnum=3 -o %t.seg
132*7ddc3205Squic-areg# RUN: llvm-objcopy -O srec %t.seg - | \
133*7ddc3205Squic-areg# RUN:   FileCheck --match-full-lines --strict-whitespace %s --check-prefix=PADDR
134*7ddc3205Squic-areg
135*7ddc3205Squic-areg     # PADDR:S00400002DCE
136*7ddc3205Squic-areg# PADDR-NEXT:S214100000000102030405060708090A0B0C0D0E0F63
137*7ddc3205Squic-areg# PADDR-NEXT:S20910001010111213147C
138*7ddc3205Squic-areg# PADDR-NEXT:S20F10001530313233343536373839407E
139*7ddc3205Squic-areg# PADDR-NEXT:S20810002040414243C1
140*7ddc3205Squic-areg# PADDR-NEXT:S20F10002450515253545556575859600F
141*7ddc3205Squic-areg# PADDR-NEXT:S20720FFF8000000E1
142*7ddc3205Squic-areg# PADDR-NEXT:S804100000EB
143*7ddc3205Squic-areg
144*7ddc3205Squic-areg--- !ELF
145*7ddc3205Squic-areg## This file has a non-contiguous section layout with large gaps.
146*7ddc3205Squic-areg## These sections are all tightly packed into one PT_LOAD segment
147*7ddc3205Squic-areg## starting at physical address 0x100000. Records should use physical addresses.
148*7ddc3205Squic-aregFileHeader:
149*7ddc3205Squic-areg  Class:           ELFCLASS64
150*7ddc3205Squic-areg  Data:            ELFDATA2LSB
151*7ddc3205Squic-areg  Type:            ET_EXEC
152*7ddc3205Squic-areg  Machine:         EM_X86_64
153*7ddc3205Squic-areg  Entry:           0x100000
154*7ddc3205Squic-aregSections:
155*7ddc3205Squic-areg  - Name:            .text
156*7ddc3205Squic-areg    Type:            SHT_PROGBITS
157*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
158*7ddc3205Squic-areg    Address:         0x0
159*7ddc3205Squic-areg    Content:         "000102030405060708090A0B0C0D0E0F1011121314"
160*7ddc3205Squic-areg  - Name:            .data1
161*7ddc3205Squic-areg    Type:            SHT_PROGBITS
162*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
163*7ddc3205Squic-areg    Content:         "3031323334353637383940"
164*7ddc3205Squic-areg    Address:         0xFFF8
165*7ddc3205Squic-areg  - Name:            .data2
166*7ddc3205Squic-areg    Type:            SHT_PROGBITS
167*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
168*7ddc3205Squic-areg    Content:         "40414243"
169*7ddc3205Squic-areg    Address:         0x10100
170*7ddc3205Squic-areg  - Name:            .data3
171*7ddc3205Squic-areg    Type:            SHT_PROGBITS
172*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
173*7ddc3205Squic-areg    Content:         "5051525354555657585960"
174*7ddc3205Squic-areg    Address:         0x10FFF8
175*7ddc3205Squic-areg  - Name:            .bss
176*7ddc3205Squic-areg    Type:            SHT_NOBITS
177*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
178*7ddc3205Squic-areg    Address:         0x10100
179*7ddc3205Squic-areg    Size:            0x1000
180*7ddc3205Squic-areg  - Name:            .dummy
181*7ddc3205Squic-areg    Type:            SHT_PROGBITS
182*7ddc3205Squic-areg    Flags:           [ SHF_ALLOC ]
183*7ddc3205Squic-areg    Address:         0x20FFF8
184*7ddc3205Squic-areg    Size:            3
185*7ddc3205Squic-areg  - Name:            .nonalloc
186*7ddc3205Squic-areg    Type:            SHT_PROGBITS
187*7ddc3205Squic-areg    Flags:           [ ]
188*7ddc3205Squic-areg    Address:         0x300000
189*7ddc3205Squic-areg    Size:            1
190*7ddc3205Squic-aregProgramHeaders:
191*7ddc3205Squic-areg  - Type:     PT_LOAD
192*7ddc3205Squic-areg    Flags:    [ PF_X, PF_R ]
193*7ddc3205Squic-areg    VAddr:    0xF00000000
194*7ddc3205Squic-areg    PAddr:    0x100000
195*7ddc3205Squic-areg    FirstSec: .text
196*7ddc3205Squic-areg    LastSec:  .bss
197