This patch adds support for dumping the unwind info from ARM64 COFF object files. This is required so that we can add test cases to https://reviews.llvm.org/D50166 (MCLayer support for ARM64 exception handling). Only unpacked unwind data is supported, as that is what D50166 currently supports.
I tested this with objects produced by both cl.exe and clang that includes the Windows ARM64 exception handling patches. The output that is produced looks like:
Case 1: single epilogue
File: test.obj
Format: COFF-ARM64
Arch: aarch64
AddressSize: 64bit
UnwindInformation [
RuntimeFunction { Function: $LN6 (0x0) ExceptionRecord: $unwind$?func@@YAHH@Z (0x0) ExceptionData { FunctionLength: 340 Version: 0 ExceptionData: No EpiloguePacked: Yes EpilogueOffset: 15 ByteCodeLength: 28 Prologue [ 0xe002dac8 ; sub sp, #2993280 0xe3 ; nop 0xe3 ; nop 0xe3 ; nop 0xd885 ; stp d10, d11, [sp, #40] 0xd803 ; stp d8, d9, [sp, #24] 0xd2c2 ; str x30, [sp, #16] 0x28 ; stp x19, x20, [sp, #-64]! 0xe4 ; end ] Epilogue [ 0xe002dac8 ; add sp, #2993280 0xd885 ; ldp d10, d11, [sp, #40] 0xd803 ; ldp d8, d9, [sp, #24] 0xd2c2 ; ldr x30, [sp, #16] 0x28 ; ldp x19, x20, [sp], #64 0xe4 ; end ] } }
]
Case 2: multiple epilogues
File: test1.obj
Format: COFF-ARM64
Arch: aarch64
AddressSize: 64bit
UnwindInformation [
RuntimeFunction { Function: $LN6 (0x0) ExceptionRecord: $unwind$?func@@YAHH@Z (0x0) ExceptionData { FunctionLength: 72 Version: 0 ExceptionData: No EpiloguePacked: No EpilogueScopes: 2 ByteCodeLength: 8 Prologue [ 0x1f ; sub sp, #496 0xd600 ; stp x19, lr, [sp, #0] 0x01 ; sub sp, #16 0xe4 ; end ] EpilogueScopes [ EpilogueScope { StartOffset: 8 EpilogueStartIndex: 0 Opcodes [ 0x1f ; add sp, #496 0xd600 ; ldp x19, lr, [sp, #0] 0x01 ; add sp, #16 0xe4 ; end ] } EpilogueScope { StartOffset: 14 EpilogueStartIndex: 0 Opcodes [ 0x1f ; add sp, #496 0xd600 ; ldp x19, lr, [sp, #0] 0x01 ; add sp, #16 0xe4 ; end ] } ] } }
]
Testing uncovered an encoding issue for the large stack size unwind opcode in D50166. I will update that patch with the fix and test cases that rely on this patch.