| # 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 |
| 0x02, 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 |
| |
| # 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 |
| # 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 0x5a while reading [0x5a, 0x5d) |
| |
| --- !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, 0x05, # 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] |
| ] |
| ## Testing: |
| ## - big-endian support |
| ## - ARM64 ABI |
| ## - four-byte address sizes |
| ## - return address signing |
| ## - various offset counts |
| # 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: } |