# RUN: yaml2obj --docnum=1 %s -o %t.1 # RUN: llvm-readobj --sframe=.sframe_eof_address --sframe=.sframe_eof_offset --sframe \ # RUN: %t.1 2>&1 | \ # RUN: FileCheck %s --strict-whitespace --match-full-lines \ # RUN: -DFILE=%t.1 --check-prefix=CASE1 # RUN: yaml2obj --docnum=2 %s -o %t.2 # RUN: llvm-readobj --sframe %t.2 2>&1 | \ # RUN: FileCheck %s --strict-whitespace --match-full-lines \ # RUN: -DFILE=%t.2 --check-prefix=CASE2 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Sections: - Name: .sframe_eof_address Type: SHT_GNU_SFRAME Flags: [ SHF_ALLOC ] ContentArray: [ 0xe2, 0xde, 0x02, 0x04, # Preamble (magic, version, flags) # Header: 0x03, 0x42, 0x47, 0x00, # ABI, Fixed FP offset, Fixed RA Offset, AUX header length 0x01, 0x00, 0x00, 0x00, # Number of FDEs 0x01, 0x00, 0x00, 0x00, # Number of FREs 0x00, 0x10, 0x00, 0x00, # FRE length 0x00, 0x00, 0x00, 0x00, # FDE offset 0x00, 0x00, 0x00, 0x00, # FRE offset # FDE[0]: 0x00, 0xde, 0xad, 0x00, # Start Address 0xbe, 0x01, 0x00, 0x00, # Size 0x00, 0x00, 0x00, 0x00, # Start FRE Offset 0x01, 0x00, 0x00, 0x00, # Number of FREs 0x00, 0xde, 0xad, 0x00, # Info, RepSize, Padding2 # FRE[0]: 0x00 # Start Address, (missing) Info ] # CASE1-LABEL:SFrame section '.sframe_eof_address' { # CASE1: FuncDescEntry [0] { # CASE1: Info { # CASE1-NEXT: FRE Type: Addr1 (0x0) # CASE1-NEXT: FDE Type: PCInc (0x0) # CASE1: FREs [ # CASE1-NEXT:{{.*}}: warning: '[[FILE]]': unexpected end of data at offset 0x31 while reading [0x30, 0x32) # CASE1-NEXT: ] - Name: .sframe_eof_offset Type: SHT_GNU_SFRAME Flags: [ SHF_ALLOC ] ContentArray: [ 0xe2, 0xde, 0x02, 0x04, # Preamble (magic, version, flags) # Header: 0x03, 0x42, 0x47, 0x00, # ABI, Fixed FP offset, Fixed RA Offset, AUX header length 0x01, 0x00, 0x00, 0x00, # Number of FDEs 0x01, 0x00, 0x00, 0x00, # Number of FREs 0x00, 0x10, 0x00, 0x00, # FRE length 0x00, 0x00, 0x00, 0x00, # FDE offset 0x00, 0x00, 0x00, 0x00, # FRE offset # FDE[0]: 0x00, 0xde, 0xad, 0x00, # Start Address 0xbe, 0x01, 0x00, 0x00, # Size 0x00, 0x00, 0x00, 0x00, # Start FRE Offset 0x01, 0x00, 0x00, 0x00, # Number of FREs 0x00, 0xde, 0xad, 0x00, # Info, RepSize, Padding2 # FRE[0]: 0x00, 0x02 # Start Address, Info, (missing) Offsets ] # CASE1-LABEL:SFrame section '.sframe_eof_offset' { # CASE1: FuncDescEntry [0] { # CASE1: Info { # CASE1-NEXT: FRE Type: Addr1 (0x0) # CASE1-NEXT: FDE Type: PCInc (0x0) # CASE1: FREs [ # CASE1-NEXT:{{.*}}: warning: '[[FILE]]': unexpected end of data at offset 0x32 while reading [0x32, 0x33) # CASE1-NEXT: ] - Name: .sframe Type: SHT_GNU_SFRAME Flags: [ SHF_ALLOC ] ContentArray: [ 0xe2, 0xde, 0x02, 0x04, # Preamble (magic, version, flags) # Header: 0x03, 0x42, 0x40, 0x00, # ABI, Fixed FP offset, Fixed RA Offset, AUX header length 0x03, 0x00, 0x00, 0x00, # Number of FDEs 0x01, 0x00, 0x00, 0x00, # Number of FREs 0x00, 0x10, 0x00, 0x00, # FRE length 0x00, 0x00, 0x00, 0x00, # FDE offset 0x00, 0x00, 0x00, 0x00, # FRE offset # FDE[0]: 0x00, 0x00, 0xde, 0x00, # Start Address 0xbe, 0x01, 0x00, 0x00, # Size 0x00, 0x00, 0x00, 0x00, # Start FRE Offset 0x02, 0x00, 0x00, 0x00, # Number of FREs 0x00, 0xde, 0xad, 0x00, # Info, RepSize, Padding2 # FDE[1]: 0x00, 0x00, 0xad, 0x00, # Start Address 0xbe, 0x01, 0x00, 0x00, # Size 0x08, 0x00, 0x00, 0x00, # Start FRE Offset 0x03, 0x00, 0x00, 0x00, # Number of FREs 0x11, 0xde, 0xad, 0x00, # Info, RepSize, Padding2 # FDE[2]: 0x00, 0x00, 0xbe, 0x00, # Start Address 0xbe, 0x01, 0x00, 0x00, # Size 0x08, 0x00, 0x00, 0x00, # Start FRE Offset 0x01, 0x00, 0x00, 0x00, # Number of FREs 0x03, 0xde, 0xad, 0x00, # Info, RepSize, Padding2 # FRE[0,0]: Zero offsets 0x00, 0x00, # Start Address, Info # FRE[0,1]: One four-byte offset, SP-based 0x01, 0x43, # Start Address, Info 0x74, 0x00, 0x00, 0x00, # Offset[0] # FRE[1,0]: Two two-byte offsets, FP-based 0x00, 0x00, 0x24, # Start Address, Info 0x10, 0x00, 0x20, 0x00, # Offset[0], Offset[1] # FRE[1,1]: Four one-byte offsets, FP-based 0x00, 0x01, 0x08, # Start Address, Info 0x10, 0x20, 0x30, 0x40, # Offset[0-3] ] ## Testing: ## - little-endian support ## - AMD64 ABI ## - one and two byte address sizes ## - PCInc and PCMask FDE types ## - all offset sizes ## - various offset counts ## - hitting EOF after printing some number of FREs ## - invalid FRE type # CASE1-LABEL:SFrame section '.sframe' { # CASE1: ABI: AMD64EndianLittle (0x3) # CASE1: CFA fixed RA offset: 64 # CASE1: FuncDescEntry [0] { # CASE1-NEXT: PC: 0xDE007F # CASE1: Info { # CASE1-NEXT: FRE Type: Addr1 (0x0) # CASE1-NEXT: FDE Type: PCInc (0x0) # CASE1: FREs [ # CASE1-NEXT: Frame Row Entry { # CASE1-NEXT: Start Address: 0xDE007F # CASE1-NEXT: Return Address Signed: No # CASE1-NEXT: Offset Size: B1 (0x0) # CASE1-NEXT: Base Register: FP (0x0) # CASE1-NEXT: RA Offset: 64 # CASE1-NEXT: } # CASE1-NEXT: Frame Row Entry { # CASE1-NEXT: Start Address: 0xDE0080 # CASE1-NEXT: Return Address Signed: No # CASE1-NEXT: Offset Size: B4 (0x2) # CASE1-NEXT: Base Register: SP (0x1) # CASE1-NEXT: CFA Offset: 116 # CASE1-NEXT: RA Offset: 64 # CASE1-NEXT: } # CASE1-NEXT: ] # CASE1: FuncDescEntry [1] { # CASE1-NEXT: PC: 0xAD0093 # CASE1: Info { # CASE1-NEXT: FRE Type: Addr2 (0x1) # CASE1-NEXT: FDE Type: PCMask (0x1) # CASE1: FREs [ # CASE1-NEXT: Frame Row Entry { # CASE1-NEXT: Start Address: 0x0 # CASE1-NEXT: Return Address Signed: No # CASE1-NEXT: Offset Size: B2 (0x1) # CASE1-NEXT: Base Register: FP (0x0) # CASE1-NEXT: CFA Offset: 16 # CASE1-NEXT: RA Offset: 64 # CASE1-NEXT: FP Offset: 32 # CASE1-NEXT: } # CASE1-NEXT: Frame Row Entry { # CASE1-NEXT: Start Address: 0x100 # CASE1-NEXT: Return Address Signed: No # CASE1-NEXT: Offset Size: B1 (0x0) # CASE1-NEXT: Base Register: FP (0x0) # CASE1-NEXT: CFA Offset: 16 # CASE1-NEXT: RA Offset: 64 # CASE1-NEXT: FP Offset: 32 # CASE1-NEXT: Extra Offsets: [48, 64] # CASE1-NEXT: } # CASE1-NEXT:{{.*}}: warning: '[[FILE]]': unexpected end of data at offset 0x6e while reading [0x6e, 0x71) # CASE1: FuncDescEntry [2] { # CASE1: Info { # CASE1-NEXT: FRE Type: 0x3 # CASE1: FREs [ # CASE1-NEXT:{{.*}}: warning: '[[FILE]]': unsupported FRE type 3 at offset 0x60 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2MSB Type: ET_EXEC Sections: - Name: .sframe Type: SHT_GNU_SFRAME Flags: [ SHF_ALLOC ] ContentArray: [ 0xde, 0xe2, 0x02, 0x05, # Preamble (magic, version, flags) # Header: 0x01, 0x42, 0x47, 0x00, # ABI, Fixed FP offset, Fixed RA Offset, AUX header length 0x00, 0x00, 0x00, 0x01, # Number of FDEs 0x00, 0x00, 0x00, 0x10, # Number of FREs 0x00, 0x00, 0x10, 0x00, # FRE length 0x00, 0x00, 0x00, 0x00, # FDE offset 0x00, 0x00, 0x01, 0x00, # FRE offset # FDE: 0x00, 0xde, 0x00, 0x00, # Start Address 0x00, 0x00, 0x01, 0xbe, # Size 0x00, 0x00, 0x00, 0x00, # Start FRE Offset 0x00, 0x00, 0x00, 0x06, # Number of FREs 0x02, 0xde, 0xad, 0x00, # Info, RepSize, Padding2 # FRE[0]: Zero offsets 0x00, 0x00, 0x00, 0x00, # Start Address 0x00, # Info # FRE[1]: One offset 0x00, 0x00, 0x00, 0x01, # Start Address 0x82, 0x10, # Info, Offset[0] # FRE[2]: Two offsets 0x00, 0x00, 0x00, 0x02, # Start Address 0x04, 0x10, 0x20, # Info, Offset[0-1] # FRE[3]: Three offsets 0x00, 0x00, 0x00, 0x03, # Start Address 0x86, 0x10, 0x20, 0x30, # Info, Offset[0-2] # FRE[4]: Four offsets 0x00, 0x00, 0x00, 0x04, # Start Address 0x08, # Info 0x10, 0x20, 0x30, 0x40, # Offset[0-3] # FRE[4]: Invalid offset size 0x00, 0x00, 0x00, 0x05, # Start Address 0x60, # Info ] ## Testing: ## - big-endian support ## - ARM64 ABI ## - four-byte address sizes ## - return address signing ## - various offset counts ## - invalid offset size # CASE2-LABEL:SFrame section '.sframe' { # CASE2: ABI: AArch64EndianBig (0x1) # CASE2: FuncDescEntry [0] { # CASE2-NEXT: PC: 0xDE001C # CASE2: Info { # CASE2-NEXT: FRE Type: Addr4 (0x2) # CASE2-NEXT: FDE Type: PCInc (0x0) # CASE2: FREs [ # CASE2-NEXT: Frame Row Entry { # CASE2-NEXT: Start Address: 0xDE001C # CASE2-NEXT: Return Address Signed: No # CASE2-NEXT: Offset Size: B1 (0x0) # CASE2-NEXT: Base Register: FP (0x0) # CASE2-NEXT: } # CASE2-NEXT: Frame Row Entry { # CASE2-NEXT: Start Address: 0xDE001D # CASE2-NEXT: Return Address Signed: Yes # CASE2-NEXT: Offset Size: B1 (0x0) # CASE2-NEXT: Base Register: FP (0x0) # CASE2-NEXT: CFA Offset: 16 # CASE2-NEXT: } # CASE2-NEXT: Frame Row Entry { # CASE2-NEXT: Start Address: 0xDE001E # CASE2-NEXT: Return Address Signed: No # CASE2-NEXT: Offset Size: B1 (0x0) # CASE2-NEXT: Base Register: FP (0x0) # CASE2-NEXT: CFA Offset: 16 # CASE2-NEXT: RA Offset: 32 # CASE2-NEXT: } # CASE2-NEXT: Frame Row Entry { # CASE2-NEXT: Start Address: 0xDE001F # CASE2-NEXT: Return Address Signed: Yes # CASE2-NEXT: Offset Size: B1 (0x0) # CASE2-NEXT: Base Register: FP (0x0) # CASE2-NEXT: CFA Offset: 16 # CASE2-NEXT: RA Offset: 32 # CASE2-NEXT: FP Offset: 48 # CASE2-NEXT: } # CASE2-NEXT: Frame Row Entry { # CASE2-NEXT: Start Address: 0xDE0020 # CASE2-NEXT: Return Address Signed: No # CASE2-NEXT: Offset Size: B1 (0x0) # CASE2-NEXT: Base Register: FP (0x0) # CASE2-NEXT: CFA Offset: 16 # CASE2-NEXT: RA Offset: 32 # CASE2-NEXT: FP Offset: 48 # CASE2-NEXT: Extra Offsets: [64] # CASE2-NEXT: } # CASE2-NEXT:{{.*}}: warning: '[[FILE]]': unsupported FRE offset size 3 at offset 0x58