forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Backport fixes for aarch64-pc-windows-msvc (llvm#46)
* [AArch64] Fix mismatch in prologue and epilogue for funclets on Windows The generated code for a funclet can have an add to sp in the epilogue for which there is no corresponding sub in the prologue. This patch removes the early return from emitPrologue that was preventing the sub to sp, and instead conditionalizes the appropriate parts of the rest of the function. Fixes https://bugs.llvm.org/show_bug.cgi?id=45345 Differential Revision: https://reviews.llvm.org/D77015 * [AArch64] Change AArch64 Windows EH UnwindHelp object to be a fixed object The UnwindHelp object is used during exception handling by runtime code. It must be findable from a fixed offset from FP. This change allocates the UnwindHelp object as a fixed object (as is done for x86_64) to ensure that both the generated code and runtime agree on the location of the object. Fixes https://bugs.llvm.org/show_bug.cgi?id=45346 Differential Revision: https://reviews.llvm.org/D77016
- Loading branch information
1 parent
e0bac6a
commit b485511
Showing
7 changed files
with
212 additions
and
67 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
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,62 @@ | ||
; RUN: llc -o - %s -mtriple=aarch64-windows | FileCheck %s | ||
; Check that the stack bump around a funclet is computed correctly in both the | ||
; prologue and epilogue in the case we have a MaxCallFrameSize > 0 and are doing alloca | ||
target datalayout = "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128" | ||
target triple = "aarch64-pc-windows-msvc19.25.28611" | ||
|
||
; // requires passing arguments on the stack | ||
; void test2(void*, int, int, int, int, int, int, int, int); | ||
; | ||
; // function with the funclet being checked | ||
; void test1(size_t bytes) | ||
; { | ||
; // alloca forces a separate callee save bump and stack bump | ||
; void *data = _alloca(bytes); | ||
; try { | ||
; test2(data, 0, 1, 2, 3, 4, 5, 6, 7); | ||
; } catch (...) { | ||
; // the funclet being checked | ||
; } | ||
; } | ||
|
||
; CHECK-LABEL: ?catch$2@?0??test1@@YAX_K@Z@4HA | ||
; CHECK: sub sp, sp, #16 | ||
; CHECK: add sp, sp, #16 | ||
; Function Attrs: uwtable | ||
define dso_local void @"?test1@@YAX_K@Z"(i64 %0) #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { | ||
%2 = alloca i64, align 8 | ||
%3 = alloca i8*, align 8 | ||
store i64 %0, i64* %2, align 8 | ||
%4 = load i64, i64* %2, align 8 | ||
%5 = alloca i8, i64 %4, align 16 | ||
store i8* %5, i8** %3, align 8 | ||
%6 = load i8*, i8** %3, align 8 | ||
invoke void @"?test2@@YAXPEAXHHHHHHHH@Z"(i8* %6, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7) | ||
to label %13 unwind label %7 | ||
|
||
7: ; preds = %1 | ||
%8 = catchswitch within none [label %9] unwind to caller | ||
|
||
9: ; preds = %7 | ||
%10 = catchpad within %8 [i8* null, i32 64, i8* null] | ||
catchret from %10 to label %11 | ||
|
||
11: ; preds = %9 | ||
br label %12 | ||
|
||
12: ; preds = %11, %13 | ||
ret void | ||
|
||
13: ; preds = %1 | ||
br label %12 | ||
} | ||
|
||
declare dso_local void @"?test2@@YAXPEAXHHHHHHHH@Z"(i8*, i32, i32, i32, i32, i32, i32, i32, i32) #1 | ||
|
||
declare dso_local i32 @__CxxFrameHandler3(...) | ||
|
||
attributes #0 = { uwtable } | ||
|
||
!llvm.module.flags = !{!0} | ||
|
||
!0 = !{i32 1, !"wchar_size", i32 2} |
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
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
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
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
Oops, something went wrong.