Skip to content

[WinEH] Take musttail calls into account when unlinking eh records #119702

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 13, 2024

Conversation

zmodem
Copy link
Collaborator

@zmodem zmodem commented Dec 12, 2024

Exception handling records are unlinked on function return. However, if there is a musttail call before the return, that's the de-facto point of termination and the unlinking instructions must be inserted before that.

Fixes #119255

Exception handling records are unlinked on function return. However, if
there is a musttail call before the return, that's the de-facto point of
termination and the unlinking instructions must be inserted *before*
that.

Fixes llvm#119255
@llvmbot
Copy link
Member

llvmbot commented Dec 12, 2024

@llvm/pr-subscribers-platform-windows

@llvm/pr-subscribers-backend-x86

Author: Hans (zmodem)

Changes

Exception handling records are unlinked on function return. However, if there is a musttail call before the return, that's the de-facto point of termination and the unlinking instructions must be inserted before that.

Fixes #119255


Full diff: https://github.com/llvm/llvm-project/pull/119702.diff

2 Files Affected:

  • (modified) llvm/lib/Target/X86/X86WinEHState.cpp (+10)
  • (added) llvm/test/CodeGen/WinEH/wineh-musttail-call.ll (+32)
diff --git a/llvm/lib/Target/X86/X86WinEHState.cpp b/llvm/lib/Target/X86/X86WinEHState.cpp
index b3e4c70eb57f30..fcbce15564ae37 100644
--- a/llvm/lib/Target/X86/X86WinEHState.cpp
+++ b/llvm/lib/Target/X86/X86WinEHState.cpp
@@ -363,6 +363,16 @@ void WinEHStatePass::emitExceptionRegistrationRecord(Function *F) {
     Instruction *T = BB.getTerminator();
     if (!isa<ReturnInst>(T))
       continue;
+
+    // Back up to any preceding musttail call, the de-facto terminator.
+    Instruction *Prev = T->getPrevNonDebugInstruction();
+    if (isa_and_present<BitCastInst>(Prev))
+      Prev = T->getPrevNonDebugInstruction();
+    if (CallInst *CI = dyn_cast_or_null<CallInst>(Prev)) {
+      if (CI->isMustTailCall())
+        T = CI;
+    }
+
     Builder.SetInsertPoint(T);
     unlinkExceptionRegistration(Builder);
   }
diff --git a/llvm/test/CodeGen/WinEH/wineh-musttail-call.ll b/llvm/test/CodeGen/WinEH/wineh-musttail-call.ll
new file mode 100644
index 00000000000000..7f508090a1bc78
--- /dev/null
+++ b/llvm/test/CodeGen/WinEH/wineh-musttail-call.ll
@@ -0,0 +1,32 @@
+; RUN: llc < %s | FileCheck %s
+
+target triple = "i386-pc-windows-msvc"
+
+; Check that codegen doesn't fail due to wineh inserting instructions between
+; the musttail call and return instruction.
+
+
+define void @test() personality ptr @__CxxFrameHandler3 {
+; CHECK-LABEL: test:
+
+entry:
+  invoke void @foo() to label %try.cont unwind label %catch.dispatch
+
+catch.dispatch:
+  %0 = catchswitch within none [label %catch] unwind to caller
+
+catch:
+  %1 = catchpad within %0 [ptr null, i32 64, ptr null]
+  catchret from %1 to label %try.cont
+
+try.cont:
+; CHECK: movl %{{[a-z0-9]+}}, %fs:0
+; CHECK: jmp _bar
+
+  musttail call void @bar()
+  ret void
+}
+
+declare i32 @__CxxFrameHandler3(...)
+declare void @foo()
+declare void @bar()

@zmodem zmodem merged commit 1d07098 into llvm:main Dec 13, 2024
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Bug Clang 17/19. Error build any coroutines library on Windows in Visual Studio 2022
4 participants