# 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 ...