## Evaluates the hex writer behavior with empty sections and segments. ## ## Show that the presence of an empty section placed at the same address of a ## filled section doesn't affect the hex output. Also, show that the presence of ## an empty section placed behind the filled section doesn't affect the hex ## output. And, show that this happens regardless of the section ordering in the ## section header table. (Two filled sections, and four empty sections, to ## realize this test.) ## ## Then, show the same kind of behaviors for segments. (One filled section, four ## empty sections, each in a single segment.) # RUN: yaml2obj %s -o %t # RUN: llvm-objcopy -O ihex %t - | FileCheck %s --implicit-check-not={{.}} ## .data0 address # CHECK: :02000004333394 ## .data0 offset, contents, checksum # CHECK-NEXT: :020000000123DA ## .data1 address # CHECK-NEXT: :02000004444472 ## .data1 offset, contents, checksum # CHECK-NEXT: :02000000456752 ## .data2 address # CHECK-NEXT: :0200000477770C ## .data2 offset, contents, checksum # CHECK-NEXT: :0200000089ABCA ## End of file # CHECK-NEXT: :00000001FF --- !ELF FileHeader: Class: ELFCLASS32 Data: ELFDATA2LSB Type: ET_EXEC Machine: EM_ARM Sections: ## An empty section that's placed at the same address as a populated section. ## This won't be in the output. It also won't affect how the subsequent section ## is written. - Name: .empty_at_data0 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x33330000 Size: 0 ## A section populated with data. This is in the output. - Name: .data0 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x33330000 Content: "0123" ## An empty section that's placed at the end of .data0. This won't be in the ## output. - Name: .empty_behind_data0 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x33330002 Size: 0 ## An empty section declared before .data1, but placed behind .data1. This ## won't be in the output. - Name: .empty_behind_data1 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x44440002 Size: 0 ## A section populated with data. This is in the output. - Name: .data1 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x44440000 Content: "4567" ## An empty section declared after .data1, but placed at the start of .data1. ## This won't be in the output. - Name: .empty_at_data1 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x44440000 Size: 0 ## An empty section that's isolated (by address) from all others. This won't be ## in the output. - Name: .empty_isolated Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x7FFFFFFF AddressAlign: 0x1 Size: 0 ## The sections below are placed into segments of varying configurations. ## Populated section in its own segment. This is in the output. - Name: .data2 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x77770000 Content: "89AB" ## Empty section in its own segment. That segment is declared before the .data2 ## segment in the program headers, and placed at an address just behind .data2. ## This won't be in the output. - Name: .empty0 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x88880000 Size: 0 ## Empty section in its own segment. That segment is declared before the .data2 ## segment in the program headers, and placed at the same address as .data2. ## This won't be in the output. - Name: .empty1 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x99990000 Size: 0 ## Empty section in its own segment. That segment is declared after the .data2 ## segment in the program headers, and placed at the same address as .data2. ## This won't be in the output. - Name: .empty2 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0xAAAA0000 Size: 0 ## Empty section in its own segment. That segment is declared after the .data2 ## segment in the program headers, and placed at an address just behind .data2. ## This won't be in the output. - Name: .empty3 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0xBBBB0000 Size: 0 ProgramHeaders: ## .data0 sections, with empty bookends. - Type: PT_LOAD Flags: [ PF_R ] PAddr: 0x33330000 VAddr: 0x33330000 FirstSec: .empty_at_data0 LastSec: .empty_behind_data0 ## .data1 sections, with empty bookends. - Type: PT_LOAD Flags: [ PF_R ] PAddr: 0x44440000 VAddr: 0x44440000 FirstSec: .empty_behind_data1 LastSec: .empty_at_data1 ## .empty_isolated section. - Type: PT_LOAD Flags: [ PF_R ] PAddr: 0x7FFFFFFF VAddr: 0x7FFFFFFF FirstSec: .empty_isolated LastSec: .empty_isolated ## Segments below include a single empty segment, and are positioned around ## .data2 in various ways. Declared before, placed behind .data2 segment. - Type: PT_LOAD Flags: [ PF_R ] PAddr: 0x77770002 VAddr: 0x77770002 FirstSec: .empty0 LastSec: .empty0 ## Declared before, placed at .data2 segment. - Type: PT_LOAD Flags: [ PF_R ] PAddr: 0x77770000 VAddr: 0x77770000 FirstSec: .empty1 LastSec: .empty1 ## Segment for .data2. - Type: PT_LOAD Flags: [ PF_R ] PAddr: 0x77770000 VAddr: 0x77770000 FirstSec: .data2 LastSec: .data2 ## Declared after, placed at .data2 segment. - Type: PT_LOAD Flags: [ PF_R ] PAddr: 0x77770000 VAddr: 0x77770000 FirstSec: .empty2 LastSec: .empty2 ## Declared after, placed behind .data2 segment. - Type: PT_LOAD Flags: [ PF_R ] PAddr: 0x77770002 VAddr: 0x77770002 FirstSec: .empty3 LastSec: .empty3