| # Test reading an ExceptionRecord which is referenced in different ways: |
| # - Relocation against base of .xdata record, immediate offset in .pdata |
| # (what LLVM produces) |
| # - Relocation against symbol in .xdata, no immediate offset in .pdata |
| # (what MSVC produces) |
| # - Combination of the two above (unlikely to occur in the wild, but for |
| # testing the consistency of the code) |
| |
| # RUN: yaml2obj %s -o %t.obj |
| # RUN: llvm-readobj --unwind %t.obj | FileCheck %s |
| |
| # CHECK: UnwindInformation [ |
| # CHECK-NEXT: RuntimeFunction { |
| # CHECK-NEXT: Function: func (0x0) |
| # CHECK-NEXT: ExceptionRecord: .xdata (0x0) |
| # CHECK-NEXT: ExceptionData { |
| # CHECK-NEXT: FunctionLength: 4 |
| # CHECK-NEXT: Version: 0 |
| # CHECK-NEXT: ExceptionData: No |
| # CHECK-NEXT: EpiloguePacked: No |
| # CHECK-NEXT: EpilogueScopes: 0 |
| # CHECK-NEXT: ByteCodeLength: 4 |
| # CHECK-NEXT: Prologue [ |
| # CHECK-NEXT: 0xd400 ; str x19, [sp, #-8]! |
| # CHECK-NEXT: 0xe4 ; end |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: EpilogueScopes [ |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: } |
| # CHECK-NEXT: } |
| # CHECK-NEXT: RuntimeFunction { |
| # CHECK-NEXT: Function: func2 (0x4) |
| # CHECK-NEXT: ExceptionRecord: .xdata +0x8 (0x8) |
| # CHECK-NEXT: ExceptionData { |
| # CHECK-NEXT: FunctionLength: 4 |
| # CHECK-NEXT: Version: 0 |
| # CHECK-NEXT: ExceptionData: No |
| # CHECK-NEXT: EpiloguePacked: No |
| # CHECK-NEXT: EpilogueScopes: 0 |
| # CHECK-NEXT: ByteCodeLength: 4 |
| # CHECK-NEXT: Prologue [ |
| # CHECK-NEXT: 0xdc01 ; str d8, [sp, #8] |
| # CHECK-NEXT: 0xe4 ; end |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: EpilogueScopes [ |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: } |
| # CHECK-NEXT: } |
| # CHECK-NEXT: RuntimeFunction { |
| # CHECK-NEXT: Function: func3 (0x8) |
| # CHECK-NEXT: ExceptionRecord: func3_xdata (0x10) |
| # CHECK-NEXT: ExceptionData { |
| # CHECK-NEXT: FunctionLength: 4 |
| # CHECK-NEXT: Version: 0 |
| # CHECK-NEXT: ExceptionData: No |
| # CHECK-NEXT: EpiloguePacked: No |
| # CHECK-NEXT: EpilogueScopes: 0 |
| # CHECK-NEXT: ByteCodeLength: 4 |
| # CHECK-NEXT: Prologue [ |
| # CHECK-NEXT: 0xe1 ; mov fp, sp |
| # CHECK-NEXT: 0xe4 ; end |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: EpilogueScopes [ |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: } |
| # CHECK-NEXT: } |
| # CHECK-NEXT: RuntimeFunction { |
| # CHECK-NEXT: Function: func4 (0xC) |
| # CHECK-NEXT: ExceptionRecord: func3_xdata +0x8 (0x18) |
| # CHECK-NEXT: ExceptionData { |
| # CHECK-NEXT: FunctionLength: 4 |
| # CHECK-NEXT: Version: 0 |
| # CHECK-NEXT: ExceptionData: No |
| # CHECK-NEXT: EpiloguePacked: No |
| # CHECK-NEXT: EpilogueScopes: 0 |
| # CHECK-NEXT: ByteCodeLength: 4 |
| # CHECK-NEXT: Prologue [ |
| # CHECK-NEXT: 0x81 ; stp x29, x30, [sp, #-16]! |
| # CHECK-NEXT: 0xe4 ; end |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: EpilogueScopes [ |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: } |
| # CHECK-NEXT: } |
| # CHECK-NEXT: ] |
| |
| --- !COFF |
| header: |
| Machine: IMAGE_FILE_MACHINE_ARM64 |
| Characteristics: [ ] |
| sections: |
| - Name: .text |
| Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] |
| Alignment: 4 |
| SectionData: F38F1FF8E80700FDFD030091FD7BBFA9 |
| - Name: .xdata |
| Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] |
| Alignment: 4 |
| SectionData: 01000008D400E4E301000008DC01E4E301000008E1E4E3E30100000881E4E3E3 |
| - Name: .pdata |
| Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] |
| Alignment: 4 |
| SectionData: '0000000000000000000000000800000000000000000000000000000008000000' |
| Relocations: |
| - VirtualAddress: 0 |
| SymbolName: func |
| Type: IMAGE_REL_ARM64_ADDR32NB |
| - VirtualAddress: 4 |
| SymbolName: .xdata |
| Type: IMAGE_REL_ARM64_ADDR32NB |
| - VirtualAddress: 8 |
| SymbolName: func2 |
| Type: IMAGE_REL_ARM64_ADDR32NB |
| - VirtualAddress: 12 |
| SymbolName: .xdata |
| Type: IMAGE_REL_ARM64_ADDR32NB |
| - VirtualAddress: 16 |
| SymbolName: func3 |
| Type: IMAGE_REL_ARM64_ADDR32NB |
| - VirtualAddress: 20 |
| SymbolName: func3_xdata |
| Type: IMAGE_REL_ARM64_ADDR32NB |
| - VirtualAddress: 24 |
| SymbolName: func4 |
| Type: IMAGE_REL_ARM64_ADDR32NB |
| - VirtualAddress: 28 |
| SymbolName: func3_xdata |
| Type: IMAGE_REL_ARM64_ADDR32NB |
| symbols: |
| - Name: .text |
| Value: 0 |
| SectionNumber: 1 |
| SimpleType: IMAGE_SYM_TYPE_NULL |
| ComplexType: IMAGE_SYM_DTYPE_NULL |
| StorageClass: IMAGE_SYM_CLASS_STATIC |
| SectionDefinition: |
| Length: 16 |
| NumberOfRelocations: 0 |
| NumberOfLinenumbers: 0 |
| CheckSum: 2581817939 |
| Number: 1 |
| - Name: .xdata |
| Value: 0 |
| SectionNumber: 2 |
| SimpleType: IMAGE_SYM_TYPE_NULL |
| ComplexType: IMAGE_SYM_DTYPE_NULL |
| StorageClass: IMAGE_SYM_CLASS_STATIC |
| SectionDefinition: |
| Length: 32 |
| NumberOfRelocations: 0 |
| NumberOfLinenumbers: 0 |
| CheckSum: 3086971960 |
| Number: 2 |
| - Name: .pdata |
| Value: 0 |
| SectionNumber: 3 |
| SimpleType: IMAGE_SYM_TYPE_NULL |
| ComplexType: IMAGE_SYM_DTYPE_NULL |
| StorageClass: IMAGE_SYM_CLASS_STATIC |
| SectionDefinition: |
| Length: 32 |
| NumberOfRelocations: 8 |
| NumberOfLinenumbers: 0 |
| CheckSum: 0 |
| Number: 3 |
| - Name: func |
| Value: 0 |
| SectionNumber: 1 |
| SimpleType: IMAGE_SYM_TYPE_NULL |
| ComplexType: IMAGE_SYM_DTYPE_NULL |
| StorageClass: IMAGE_SYM_CLASS_STATIC |
| - Name: func2 |
| Value: 4 |
| SectionNumber: 1 |
| SimpleType: IMAGE_SYM_TYPE_NULL |
| ComplexType: IMAGE_SYM_DTYPE_NULL |
| StorageClass: IMAGE_SYM_CLASS_STATIC |
| - Name: func3 |
| Value: 8 |
| SectionNumber: 1 |
| SimpleType: IMAGE_SYM_TYPE_NULL |
| ComplexType: IMAGE_SYM_DTYPE_NULL |
| StorageClass: IMAGE_SYM_CLASS_STATIC |
| - Name: func4 |
| Value: 12 |
| SectionNumber: 1 |
| SimpleType: IMAGE_SYM_TYPE_NULL |
| ComplexType: IMAGE_SYM_DTYPE_NULL |
| StorageClass: IMAGE_SYM_CLASS_STATIC |
| - Name: func3_xdata |
| Value: 16 |
| SectionNumber: 2 |
| SimpleType: IMAGE_SYM_TYPE_NULL |
| ComplexType: IMAGE_SYM_DTYPE_NULL |
| StorageClass: IMAGE_SYM_CLASS_STATIC |
| ... |