Index: llvm/trunk/include/llvm/Support/ARMWinEH.h =================================================================== --- llvm/trunk/include/llvm/Support/ARMWinEH.h +++ llvm/trunk/include/llvm/Support/ARMWinEH.h @@ -382,7 +382,7 @@ return ((Data[0] & 0x00400000) >> 22); } - uint8_t EpilogueCount() const { + uint16_t EpilogueCount() const { if (HeaderWords(*this) == 1) { if (isAArch64) return (Data[0] & 0x07C00000) >> 22; Index: llvm/trunk/test/tools/llvm-readobj/arm64-many-epilogs.s =================================================================== --- llvm/trunk/test/tools/llvm-readobj/arm64-many-epilogs.s +++ llvm/trunk/test/tools/llvm-readobj/arm64-many-epilogs.s @@ -0,0 +1,26 @@ +// REQUIRES: aarch64-registered-target +// RUN: llvm-mc -filetype=obj -triple aarch64-windows %s -o - \ +// RUN: | not llvm-readobj -unwind - | FileCheck %s + +// Older versions of LLVM had a bug where we would accidentally +// truncate the number of epilogue scopes to a uint8_t; make +// sure this doesn't happen. +// +// We expect the llvm-readobj invocation to fail because the +// xdata section is truncated (to reduce the size of the testcase). + +// CHECK: EpilogueScopes: 256 + +.section .pdata,"dr" + .long "?func@@YAHXZ"@IMGREL + .long "$unwind$func@@YAHXZ"@IMGREL + + .text + .globl "?func@@YAHXZ" + .p2align 3 +"?func@@YAHXZ": + ret + +.section .xdata,"dr" +"$unwind$func@@YAHXZ": +.long 0x00000000, 0x02010100, 0x09000000, 0x0A000000