| ## Check section headers when converting from hex to ELF. |
| # RUN: yaml2obj %p/Inputs/ihex-elf-sections.yaml -o %t |
| # RUN: llvm-objcopy -O ihex %t %t.hex |
| # RUN: llvm-objcopy -I ihex -O elf32-i386 %t.hex %t2 |
| # RUN: llvm-readobj --section-headers %t2 | FileCheck %s |
| |
| # CHECK: Name: .sec1 |
| # CHECK-NEXT: Type: SHT_PROGBITS (0x1) |
| # CHECK-NEXT: Flags [ (0x3) |
| # CHECK-NEXT: SHF_ALLOC (0x2) |
| # CHECK-NEXT: SHF_WRITE (0x1) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Address: 0x0 |
| # CHECK-NEXT: Offset: |
| # CHECK-NEXT: Size: 21 |
| # CHECK-NEXT: Link: 0 |
| # CHECK-NEXT: Info: 0 |
| # CHECK-NEXT: AddressAlignment: 1 |
| # CHECK-NEXT: EntrySize: 0 |
| |
| # CHECK: Name: .sec2 |
| # CHECK-NEXT: Type: SHT_PROGBITS (0x1) |
| # CHECK-NEXT: Flags [ (0x3) |
| # CHECK-NEXT: SHF_ALLOC (0x2) |
| # CHECK-NEXT: SHF_WRITE (0x1) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Address: 0xFFF8 |
| # CHECK-NEXT: Offset: |
| # CHECK-NEXT: Size: 11 |
| # CHECK-NEXT: Link: 0 |
| # CHECK-NEXT: Info: 0 |
| # CHECK-NEXT: AddressAlignment: 1 |
| # CHECK-NEXT: EntrySize: 0 |
| |
| # CHECK: Name: .sec3 |
| # CHECK-NEXT: Type: SHT_PROGBITS (0x1) |
| # CHECK-NEXT: Flags [ (0x3) |
| # CHECK-NEXT: SHF_ALLOC (0x2) |
| # CHECK-NEXT: SHF_WRITE (0x1) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Address: 0x10100 |
| # CHECK-NEXT: Offset: |
| # CHECK-NEXT: Size: 4 |
| # CHECK-NEXT: Link: 0 |
| # CHECK-NEXT: Info: 0 |
| # CHECK-NEXT: AddressAlignment: 1 |
| # CHECK-NEXT: EntrySize: 0 |
| |
| # CHECK: Name: .sec4 |
| # CHECK-NEXT: Type: SHT_PROGBITS (0x1) |
| # CHECK-NEXT: Flags [ (0x3) |
| # CHECK-NEXT: SHF_ALLOC (0x2) |
| # CHECK-NEXT: SHF_WRITE (0x1) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Address: 0x10FFF8 |
| # CHECK-NEXT: Offset: |
| # CHECK-NEXT: Size: 11 |
| # CHECK-NEXT: Link: 0 |
| # CHECK-NEXT: Info: 0 |
| # CHECK-NEXT: AddressAlignment: 1 |
| # CHECK-NEXT: EntrySize: 0 |
| |
| ## Check section contents. |
| # RUN: llvm-objcopy -O binary --only-section=.text %t %t.text |
| # RUN: llvm-objcopy -O binary --only-section=.sec1 %t2 %t2.sec1 |
| # RUN: cmp %t.text %t2.sec1 |
| # RUN: llvm-objcopy -O binary --only-section=.data %t %t.data |
| # RUN: llvm-objcopy -O binary --only-section=.sec2 %t2 %t2.sec2 |
| # RUN: cmp %t.data %t2.sec2 |
| # RUN: llvm-objcopy -O binary --only-section=.data2 %t %t.data2 |
| # RUN: llvm-objcopy -O binary --only-section=.sec3 %t2 %t2.sec3 |
| # RUN: cmp %t.data2 %t2.sec3 |
| # RUN: llvm-objcopy -O binary --only-section=.data3 %t %t.data3 |
| # RUN: llvm-objcopy -O binary --only-section=.sec4 %t2 %t2.sec4 |
| # RUN: cmp %t.data3 %t2.sec4 |
| |
| ## Check loading from raw hex file. |
| # RUN: llvm-objcopy -I ihex -O elf32-i386 %p/Inputs/sections.hex %t-raw |
| # RUN: llvm-readobj --section-headers %t-raw | FileCheck %s --check-prefix=RAW |
| |
| # RAW: Name: .sec1 |
| # RAW-NEXT: Type: SHT_PROGBITS (0x1) |
| # RAW-NEXT: Flags [ (0x3) |
| # RAW-NEXT: SHF_ALLOC (0x2) |
| # RAW-NEXT: SHF_WRITE (0x1) |
| # RAW-NEXT: ] |
| # RAW-NEXT: Address: 0x1FFF8 |
| # RAW-NEXT: Offset: |
| # RAW-NEXT: Size: 11 |
| |
| # RAW: Name: .sec2 |
| # RAW-NEXT: Type: SHT_PROGBITS (0x1) |
| # RAW-NEXT: Flags [ (0x3) |
| # RAW-NEXT: SHF_ALLOC (0x2) |
| # RAW-NEXT: SHF_WRITE (0x1) |
| # RAW-NEXT: ] |
| # RAW-NEXT: Address: 0xFFFF8 |
| # RAW-NEXT: Offset: |
| # RAW-NEXT: Size: 11 |
| |
| # RAW: Name: .sec3 |
| # RAW-NEXT: Type: SHT_PROGBITS (0x1) |
| # RAW-NEXT: Flags [ (0x3) |
| # RAW-NEXT: SHF_ALLOC (0x2) |
| # RAW-NEXT: SHF_WRITE (0x1) |
| # RAW-NEXT: ] |
| # RAW-NEXT: Address: 0x1FFFF8 |
| # RAW-NEXT: Offset: |
| # RAW-NEXT: Size: 11 |
| |
| ## Check section contents. |
| # RUN: llvm-objcopy -O ihex --only-section=.sec1 %t-raw - | FileCheck %s --check-prefix=RAW-SEC1 |
| |
| # RAW-SEC1: :020000021000EC |
| # RAW-SEC1-NEXT: :08FFF8000001020304050607E5 |
| # RAW-SEC1-NEXT: :020000022000DC |
| # RAW-SEC1-NEXT: :0300000008090AE2 |
| |
| # RUN: llvm-objcopy -O ihex --only-section=.sec2 %t-raw - | FileCheck %s --check-prefix=RAW-SEC2 |
| |
| # RAW-SEC2: :02000002F0000C |
| # RAW-SEC2-NEXT: :08FFF800303132333435363765 |
| # RAW-SEC2-NEXT: :020000020000FC |
| # RAW-SEC2-NEXT: :020000040010EA |
| # RAW-SEC2-NEXT: :030000003839404C |
| |
| # RUN: llvm-objcopy -O ihex --only-section=.sec3 %t-raw - | FileCheck %s --check-prefix=RAW-SEC3 |
| |
| # RAW-SEC3: :02000004001FDB |
| # RAW-SEC3-NEXT: :08FFF8004041424344454647E5 |
| # RAW-SEC3-NEXT: :020000040020DA |
| # RAW-SEC3-NEXT: :030000004849501C |
| |
| ## Check that line is trimmed from whitespace. |
| # RUN: echo " :0100000001FE " | llvm-objcopy -I ihex -O elf64-x86-64 - - \ |
| # RUN: | llvm-objcopy -O ihex - - | FileCheck %s --check-prefix=SPACES |
| |
| # SPACES: :0100000001FE |
| # SPACES-NEXT: :00000001FF |
| |
| ## Check for various parsing errors. |
| ## 1. String too short. |
| # RUN: echo "01000000FF" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_LENGTH |
| |
| # BAD_LENGTH: error: '{{.*}}': line 1: line is too short: 10 chars |
| |
| ## 2. Missing ':'. |
| # RUN: echo "0100000000FF" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=MISSING_COLON |
| |
| # MISSING_COLON: error: '{{.*}}': line 1: missing ':' in the beginning of line |
| |
| ## 3. Invalid charatcer. |
| # RUN: echo ":01000000xF" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_CHAR |
| |
| # BAD_CHAR: error: '{{.*}}': line 1: invalid character at position 10 |
| |
| ## 4. Incorrect string length. |
| # RUN: echo ":010000000000000F" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_LENGTH2 |
| |
| # BAD_LENGTH2: error: '{{.*}}': line 1: invalid line length 17 (should be 13) |
| |
| ## 5. Invalid type (06). |
| # RUN: echo ":00000006FA" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_TYPE |
| |
| # BAD_TYPE: error: '{{.*}}': line 1: unknown record type: 6 |
| |
| ## 6. Invalid checksum. |
| # RUN: echo ":00000001FA" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_CKSUM |
| |
| # BAD_CKSUM: error: '{{.*}}': line 1: incorrect checksum |
| |
| ## 7. Zero data length. |
| # RUN: echo ":00010000FF" | not llvm-objcopy -I ihex - - 2>&1 | FileCheck %s --check-prefix=ZERO_DATA_LEN |
| |
| # ZERO_DATA_LEN: error: '{{.*}}': line 1: zero data length is not allowed for data records |
| |
| ## 8. Bad data length for '02' (SegmentAddr) record. |
| # RUN: echo ":03000002000000FB" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_SEGADDR_LEN |
| |
| # BAD_SEGADDR_LEN: error: '{{.*}}': line 1: segment address data should be 2 bytes in size |
| |
| ## 9. Bad data length for '03' (StartAddr80x86) record. |
| # RUN: echo ":03000003000000FA" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_STARTADDR_LEN |
| |
| ## 10. Bad data length for '05' (StartAddr) record. |
| # RUN: echo ":03000005000000F8" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_STARTADDR_LEN |
| |
| # BAD_STARTADDR_LEN: error: '{{.*}}': line 1: start address data should be 4 bytes in size |
| |
| ## 11. Address value for 'StartAddr80x86' is greater then 0xFFFFFU. |
| # RUN: echo ":04000003FFFFFFFFFD" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_STARTADDR |
| |
| # BAD_STARTADDR: error: '{{.*}}': line 1: start address exceeds 20 bit for 80x86 |
| |
| ## 12. Invalid extended address data size. |
| # RUN: echo ":04000004FFFFFFFFFC" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=BAD_EXTADDR_LEN |
| |
| # BAD_EXTADDR_LEN: error: '{{.*}}': line 1: extended address data should be 2 bytes in size |
| |
| ## 13. No sections in the hex file. |
| ## a) try empty file: |
| # RUN: echo "" | not llvm-objcopy -I ihex -O elf32-i386 - - 2>&1 | FileCheck %s --check-prefix=NO_SECTIONS |
| ## b) EOF record should cancel processing further records. Not having any section data |
| ## before EOF should trigger an error. |
| # RUN: echo ":00000001FF" > %t-bad14.hex |
| # RUN: echo ":0100000001FE" >> %t-bad14.hex |
| # RUN: not llvm-objcopy -I ihex %t-bad14.hex %t-none 2>&1 | FileCheck %s --check-prefix=NO_SECTIONS |
| |
| # NO_SECTIONS: error: '{{.*}}': no sections |