[llvm] r349549 - [AArch64] Avoid crashing on .seh directives in assembly
Martin Storsjo via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 18 14:10:17 PST 2018
Author: mstorsjo
Date: Tue Dec 18 14:10:17 2018
New Revision: 349549
URL: http://llvm.org/viewvc/llvm-project?rev=349549&view=rev
Log:
[AArch64] Avoid crashing on .seh directives in assembly
Differential Revision: https://reviews.llvm.org/D55670
Added:
llvm/trunk/test/MC/AArch64/seh.s
Modified:
llvm/trunk/lib/MC/MCWin64EH.cpp
Modified: llvm/trunk/lib/MC/MCWin64EH.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCWin64EH.cpp?rev=349549&r1=349548&r2=349549&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCWin64EH.cpp (original)
+++ llvm/trunk/lib/MC/MCWin64EH.cpp Tue Dec 18 14:10:17 2018
@@ -468,10 +468,10 @@ static void ARM64EmitUnwindInfo(MCStream
info->Symbol = Label;
uint32_t FuncLength = 0x0;
- FuncLength = (uint32_t)GetAbsDifference(streamer, info->FuncletOrFuncEnd,
- info->Begin);
- if (FuncLength)
- FuncLength /= 4;
+ if (info->FuncletOrFuncEnd)
+ FuncLength = (uint32_t)GetAbsDifference(streamer, info->FuncletOrFuncEnd,
+ info->Begin);
+ FuncLength /= 4;
uint32_t PrologCodeBytes = ARM64CountOfUnwindCodes(info->Instructions);
uint32_t TotalCodeBytes = PrologCodeBytes;
Added: llvm/trunk/test/MC/AArch64/seh.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/seh.s?rev=349549&view=auto
==============================================================================
--- llvm/trunk/test/MC/AArch64/seh.s (added)
+++ llvm/trunk/test/MC/AArch64/seh.s Tue Dec 18 14:10:17 2018
@@ -0,0 +1,84 @@
+// This test checks that the SEH directives emit the correct unwind data.
+
+// RUN: llvm-mc -triple aarch64-pc-win32 -filetype=obj %s | llvm-readobj -s -r | FileCheck %s
+
+// CHECK: Sections [
+// CHECK: Section {
+// CHECK: Name: .text
+// CHECK: RelocationCount: 0
+// CHECK: Characteristics [
+// CHECK-NEXT: ALIGN_4BYTES
+// CHECK-NEXT: CNT_CODE
+// CHECK-NEXT: MEM_EXECUTE
+// CHECK-NEXT: MEM_READ
+// CHECK-NEXT: ]
+// CHECK-NEXT: }
+// CHECK: Section {
+// CHECK: Name: .xdata
+// CHECK: RawDataSize: 24
+// CHECK: RelocationCount: 1
+// CHECK: Characteristics [
+// CHECK-NEXT: ALIGN_4BYTES
+// CHECK-NEXT: CNT_INITIALIZED_DATA
+// CHECK-NEXT: MEM_READ
+// CHECK-NEXT: ]
+// CHECK-NEXT: }
+// CHECK: Section {
+// CHECK: Name: .pdata
+// CHECK: RelocationCount: 6
+// CHECK: Characteristics [
+// CHECK-NEXT: ALIGN_4BYTES
+// CHECK-NEXT: CNT_INITIALIZED_DATA
+// CHECK-NEXT: MEM_READ
+// CHECK-NEXT: ]
+// CHECK-NEXT: }
+// CHECK-NEXT: ]
+
+// CHECK-NEXT: Relocations [
+// CHECK-NEXT: Section (4) .xdata {
+// CHECK-NEXT: 0x8 IMAGE_REL_ARM64_ADDR32NB __C_specific_handler
+// CHECK-NEXT: }
+// CHECK-NEXT: Section (5) .pdata {
+// CHECK-NEXT: 0x0 IMAGE_REL_ARM64_ADDR32NB func
+// CHECK-NEXT: 0x4 IMAGE_REL_ARM64_ADDR32NB .xdata
+// CHECK-NEXT: 0x8 IMAGE_REL_ARM64_ADDR32NB func
+// CHECK-NEXT: 0xC IMAGE_REL_ARM64_ADDR32NB .xdata
+// CHECK-NEXT: 0x10 IMAGE_REL_ARM64_ADDR32NB smallFunc
+// CHECK-NEXT: 0x14 IMAGE_REL_ARM64_ADDR32NB .xdata
+// CHECK-NEXT: }
+// CHECK-NEXT: ]
+
+
+ .text
+ .globl func
+ .def func
+ .scl 2
+ .type 32
+ .endef
+ .seh_proc func
+func:
+ sub sp, sp, #24
+ .seh_stackalloc 24
+ mov x29, sp
+ .seh_endprologue
+ .seh_handler __C_specific_handler, @except
+ .seh_handlerdata
+ .long 0
+ .text
+ .seh_startchained
+ .seh_endprologue
+ .seh_endchained
+ add sp, sp, #24
+ ret
+ .seh_endproc
+
+// Test emission of small functions.
+ .globl smallFunc
+ .def smallFunc
+ .scl 2
+ .type 32
+ .endef
+ .seh_proc smallFunc
+smallFunc:
+ ret
+ .seh_endproc
More information about the llvm-commits
mailing list