[llvm] 6313f55 - [llvm-readobj] [ARMWinEH] Fix printing of exception handlers with packed epilogues

Martin Storsjö via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 10 01:41:29 PDT 2020


Author: Martin Storsjö
Date: 2020-09-10T11:26:43+03:00
New Revision: 6313f5561945930e9a5ec63cb187605ce741bb61

URL: https://github.com/llvm/llvm-project/commit/6313f5561945930e9a5ec63cb187605ce741bb61
DIFF: https://github.com/llvm/llvm-project/commit/6313f5561945930e9a5ec63cb187605ce741bb61.diff

LOG: [llvm-readobj] [ARMWinEH] Fix printing of exception handlers with packed 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

Added: 
    llvm/test/tools/llvm-readobj/COFF/arm64-packed-epilog.s

Modified: 
    llvm/include/llvm/Support/ARMWinEH.h

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Support/ARMWinEH.h b/llvm/include/llvm/Support/ARMWinEH.h
index 857a0d3814a8..83ba044ed446 100644
--- a/llvm/include/llvm/Support/ARMWinEH.h
+++ b/llvm/include/llvm/Support/ARMWinEH.h
@@ -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];
   }
 };
 

diff  --git a/llvm/test/tools/llvm-readobj/COFF/arm64-packed-epilog.s b/llvm/test/tools/llvm-readobj/COFF/arm64-packed-epilog.s
new file mode 100644
index 000000000000..c3bfe5a9cf55
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/arm64-packed-epilog.s
@@ -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 at 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


        


More information about the llvm-commits mailing list