Skip to content

Commit

Permalink
[llvm-readobj] [ARMWinEH] Fix printing of exception handlers with pac…
Browse files Browse the repository at this point in the history
…ked epilogues

If there's a packed epilogue (indicated by the flag E), the EpilogueCount()
field actually should be interpreted as EpilogueOffset.

Differential Revision: https://reviews.llvm.org/D87365
  • Loading branch information
mstorsjo committed Sep 10, 2020
1 parent 8060283 commit 6313f55
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 2 deletions.
5 changes: 3 additions & 2 deletions llvm/include/llvm/Support/ARMWinEH.h
Original file line number Diff line number Diff line change
Expand Up @@ -416,12 +416,13 @@ struct ExceptionDataRecord {

uint32_t ExceptionHandlerRVA() const {
assert(X() && "Exception Handler RVA is only valid if the X bit is set");
return Data[HeaderWords(*this) + EpilogueCount() + CodeWords()];
return Data[HeaderWords(*this) + (E() ? 0 : EpilogueCount()) + CodeWords()];
}

uint32_t ExceptionHandlerParameter() const {
assert(X() && "Exception Handler RVA is only valid if the X bit is set");
return Data[HeaderWords(*this) + EpilogueCount() + CodeWords() + 1];
return Data[HeaderWords(*this) + (E() ? 0 : EpilogueCount()) + CodeWords() +
1];
}
};

Expand Down
34 changes: 34 additions & 0 deletions llvm/test/tools/llvm-readobj/COFF/arm64-packed-epilog.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// REQUIRES: aarch64-registered-target
// RUN: llvm-mc -filetype=obj -triple aarch64-windows %s -o %t.o
// RUN: llvm-readobj --unwind %t.o | FileCheck %s

// CHECK: ExceptionData {
// CHECK-NEXT: FunctionLength: 4
// CHECK-NEXT: Version: 0
// CHECK-NEXT: ExceptionData: Yes
// CHECK-NEXT: EpiloguePacked: Yes
// CHECK-NEXT: EpilogueOffset: 0
// CHECK-NEXT: ByteCodeLength: 4
// CHECK-NEXT: Prologue [
// CHECK-NEXT: 0xe4 ; end
// CHECK-NEXT: ]
// CHECK-NEXT: ExceptionHandler [
// CHECK-NEXT: Routine: 0x11223344
// CHECK-NEXT: Parameter: 0x55667788
// CHECK-NEXT: ]

.section .pdata,"dr"
.long func@IMGREL
.long "$unwind$func"@IMGREL

.text
.globl func
func:
ret

.section .xdata,"dr"
"$unwind$func":
.byte 0x01, 0x00, 0x30, 0x08
.byte 0xe4, 0xe3, 0xe3, 0xe3
.byte 0x44, 0x33, 0x22, 0x11
.byte 0x88, 0x77, 0x66, 0x55

0 comments on commit 6313f55

Please sign in to comment.