From: Eli Friedman Date: Thu, 28 Feb 2019 20:33:22 +0000 (+0000) Subject: [AArch64] [Windows] Fix llvm-readobj -unwind output with many epilogs. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=413823232638da4e1cec3cdcefcfe97085efeb25;p=llvm [AArch64] [Windows] Fix llvm-readobj -unwind output with many epilogs. The number of epilog scopes may not fit into a uint8_t. Fixes https://bugs.llvm.org/show_bug.cgi?id=40855 Differential Revision: https://reviews.llvm.org/D58693 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355135 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/ARMWinEH.h b/include/llvm/Support/ARMWinEH.h index b1b821b78a4..857a0d3814a 100644 --- a/include/llvm/Support/ARMWinEH.h +++ b/include/llvm/Support/ARMWinEH.h @@ -382,7 +382,7 @@ struct ExceptionDataRecord { return ((Data[0] & 0x00400000) >> 22); } - uint8_t EpilogueCount() const { + uint16_t EpilogueCount() const { if (HeaderWords(*this) == 1) { if (isAArch64) return (Data[0] & 0x07C00000) >> 22; diff --git a/test/tools/llvm-readobj/arm64-many-epilogs.s b/test/tools/llvm-readobj/arm64-many-epilogs.s new file mode 100644 index 00000000000..054f1dd0cab --- /dev/null +++ b/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