-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Apply workaround for Failed to evaluate function length in SEH unwind…
… info in aarch64
- Loading branch information
1 parent
a6610a1
commit 1d30b39
Showing
2 changed files
with
82 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
From cef120a2e5abba06c1d7a699a4fd4a17e488d6af Mon Sep 17 00:00:00 2001 | ||
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin@martin.st> | ||
Date: Sun, 1 Oct 2023 00:08:23 +0300 | ||
Subject: [PATCH] [AArch64] Disable loop alignment for Windows targets | ||
|
||
This should fix #66912. When emitting SEH unwind info, we need to | ||
be able to calculate the exact length of functions before alignments | ||
are fixed. Until that limitation is overcome, just disable all | ||
loop alignment on Windows targets. | ||
--- | ||
llvm/lib/MC/MCWin64EH.cpp | 3 +++ | ||
.../Target/AArch64/AArch64ISelLowering.cpp | 7 ++++++- | ||
llvm/test/CodeGen/AArch64/sched-loop-align.ll | 21 +++++++++++++++++++ | ||
3 files changed, 30 insertions(+), 1 deletion(-) | ||
create mode 100644 llvm/test/CodeGen/AArch64/sched-loop-align.ll | ||
|
||
diff --git a/lib/MC/MCWin64EH.cpp b/lib/MC/MCWin64EH.cpp | ||
index a2d61da722af870..bb3492bec8aad8a 100644 | ||
--- a/lib/MC/MCWin64EH.cpp | ||
+++ b/lib/MC/MCWin64EH.cpp | ||
@@ -1402,6 +1402,9 @@ static void ARM64EmitUnwindInfo(MCStreamer &streamer, WinEH::FrameInfo *info, | ||
// here, but we'd have to emit the pdata, the xdata header, and the | ||
// epilogue scopes later, since they depend on whether the we need to | ||
// split the unwind data. | ||
+ // | ||
+ // If this is fixed, remove code in AArch64ISelLowering.cpp that | ||
+ // disables loop alignment on Windows. | ||
RawFuncLength = GetAbsDifference(streamer, info->FuncletOrFuncEnd, | ||
info->Begin); | ||
} | ||
diff --git a/lib/Target/AArch64/AArch64ISelLowering.cpp b/lib/Target/AArch64/AArch64ISelLowering.cpp | ||
index 932b36587f0694e..46064bc7e46783f 100644 | ||
--- a/lib/Target/AArch64/AArch64ISelLowering.cpp | ||
+++ b/lib/Target/AArch64/AArch64ISelLowering.cpp | ||
@@ -1051,7 +1051,12 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM, | ||
// Set required alignment. | ||
setMinFunctionAlignment(Align(4)); | ||
// Set preferred alignments. | ||
- setPrefLoopAlignment(STI.getPrefLoopAlignment()); | ||
+ | ||
+ // Don't align loops on Windows. The SEH unwind info generation needs to | ||
+ // know the exact length of functions before the alignments have been | ||
+ // expanded. | ||
+ if (!Subtarget->isTargetWindows()) | ||
+ setPrefLoopAlignment(STI.getPrefLoopAlignment()); | ||
setMaxBytesForAlignment(STI.getMaxBytesForLoopAlignment()); | ||
setPrefFunctionAlignment(STI.getPrefFunctionAlignment()); | ||
|
||
diff --git a/test/CodeGen/AArch64/sched-loop-align.ll b/test/CodeGen/AArch64/sched-loop-align.ll | ||
new file mode 100644 | ||
index 000000000000000..5b8e42c2790a439 | ||
--- /dev/null | ||
+++ b/test/CodeGen/AArch64/sched-loop-align.ll | ||
@@ -0,0 +1,21 @@ | ||
+; RUN: llc < %s -mtriple=aarch64-windows | FileCheck %s --check-prefix=WINDOWS | ||
+; RUN: llc < %s -mtriple=aarch64-linux | FileCheck %s --check-prefix=LINUX | ||
+ | ||
+define dso_local void @b() #0 { | ||
+entry: | ||
+ br label %for.cond | ||
+ | ||
+for.cond: | ||
+ tail call void @a() | ||
+ br label %for.cond | ||
+} | ||
+ | ||
+declare dso_local void @a(...) | ||
+ | ||
+attributes #0 = { noreturn nounwind uwtable "tune-cpu"="cortex-a53" } | ||
+ | ||
+; LINUX-LABEL: b: | ||
+; LINUX: .p2align 4 | ||
+ | ||
+; WINDOWS-LABEL: b: | ||
+; WINDOWS-NOT: .p2align |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters