Index: llvm/test/CodeGen/AArch64/wineh6.mir =================================================================== --- llvm/test/CodeGen/AArch64/wineh6.mir +++ llvm/test/CodeGen/AArch64/wineh6.mir @@ -20,7 +20,7 @@ # CHECK-NEXT: StartOffset: 20 # CHECK-NEXT: EpilogueStartIndex: 4 # CHECK-NEXT: Opcodes [ -# CHECK-NEXT: 0xe1 ; mov fp, sp +# CHECK-NEXT: 0xe1 ; mov sp, fp # CHECK-NEXT: 0x81 ; ldp x29, x30, [sp], #16 # CHECK-NEXT: 0xe4 ; end # CHECK-NEXT: ] Index: llvm/test/CodeGen/AArch64/wineh7.mir =================================================================== --- llvm/test/CodeGen/AArch64/wineh7.mir +++ llvm/test/CodeGen/AArch64/wineh7.mir @@ -21,7 +21,7 @@ # CHECK-NEXT: StartOffset: 13 # CHECK-NEXT: EpilogueStartIndex: 8 # CHECK-NEXT: Opcodes [ -# CHECK-NEXT: 0xe204 ; add fp, sp, #32 +# CHECK-NEXT: 0xe204 ; sub sp, fp, #32 # CHECK-NEXT: 0x44 ; ldp x29, x30, [sp, #32] # CHECK-NEXT: 0xc802 ; ldp x19, x20, [sp, #16] # CHECK-NEXT: 0xcc85 ; ldp x21, x22, [sp], #48 Index: llvm/test/tools/llvm-readobj/COFF/arm64-unwind-opcodes.s =================================================================== --- llvm/test/tools/llvm-readobj/COFF/arm64-unwind-opcodes.s +++ llvm/test/tools/llvm-readobj/COFF/arm64-unwind-opcodes.s @@ -1,12 +1,25 @@ // REQUIRES: aarch64-registered-target // RUN: llvm-mc -filetype=obj -triple aarch64-windows %s -o - \ -// RUN: | llvm-readobj --unwind - | FileCheck %s +// RUN: | llvm-readobj --unwind - | FileCheck --strict-whitespace %s // CHECK: Prologue [ +// CHECK-NEXT: 0xe202 ; add fp, sp, #16 +// CHECK-NEXT: 0xe1 ; mov fp, sp // CHECK-NEXT: 0xdc01 ; str d8, [sp, #8] // CHECK-NEXT: 0xd400 ; str x19, [sp, #-8]! // CHECK-NEXT: 0xe4 ; end // CHECK-NEXT: ] +// CHECK-NEXT: EpilogueScopes [ +// CHECK-NEXT: EpilogueScope { +// CHECK-NEXT: StartOffset: +// CHECK-NEXT: EpilogueStartIndex: +// CHECK-NEXT: Opcodes [ +// CHECK-NEXT: 0xe202 ; sub sp, fp, #16 +// CHECK-NEXT: 0xe1 ; mov sp, fp +// CHECK-NEXT: 0xe4 ; end +// CHECK-NEXT: ] +// CHECK-NEXT: } +// CHECK-NEXT: ] .section .pdata,"dr" .long func@IMGREL @@ -16,9 +29,18 @@ .globl func func: str x19, [sp, #-8]! - str d8, [sp, #8] + str d8, [sp, #8] + mov x29, sp + add x29, sp, #16 + nop + sub sp, x29, #16 + mov sp, x29 ret .section .xdata,"dr" "$unwind$func": -.long 0x10000002, 0x00d401dc, 0xe3e3e3e4 +.byte 0x08, 0x00, 0x40, 0x18 +.byte 0x05, 0x00, 0x00, 0x02 +.byte 0xe2, 0x02, 0xe1, 0xdc +.byte 0x01, 0xd4, 0x00, 0xe4 +.byte 0xe2, 0x02, 0xe1, 0xe4 Index: llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp =================================================================== --- llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp +++ llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp @@ -746,7 +746,9 @@ bool Decoder::opcode_setfp(const uint8_t *OC, unsigned &Offset, unsigned Length, bool Prologue) { - SW.startLine() << format("0x%02x ; mov fp, sp\n", OC[Offset]); + SW.startLine() << format("0x%02x ; mov %s, %s\n", OC[Offset], + static_cast(Prologue ? "fp" : "sp"), + static_cast(Prologue ? "sp" : "fp")); ++Offset; return false; } @@ -754,8 +756,11 @@ bool Decoder::opcode_addfp(const uint8_t *OC, unsigned &Offset, unsigned Length, bool Prologue) { unsigned NumBytes = OC[Offset + 1] << 3; - SW.startLine() << format("0x%02x%02x ; add fp, sp, #%u\n", - OC[Offset], OC[Offset + 1], NumBytes); + SW.startLine() << format( + "0x%02x%02x ; %s %s, %s, #%u\n", OC[Offset], OC[Offset + 1], + static_cast(Prologue ? "add" : "sub"), + static_cast(Prologue ? "fp" : "sp"), + static_cast(Prologue ? "sp" : "fp"), NumBytes); Offset += 2; return false; }