[PATCH] D145286: [WinEH] Fix issue of dynamic alloca in try block

LuoYuanke via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 3 16:31:39 PST 2023


LuoYuanke created this revision.
Herald added subscribers: pengfei, hiraditya.
Herald added a project: All.
LuoYuanke requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D145286

Files:
  llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
  llvm/test/CodeGen/X86/wineh-dyn-alloca.ll


Index: llvm/test/CodeGen/X86/wineh-dyn-alloca.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/wineh-dyn-alloca.ll
@@ -0,0 +1,42 @@
+; RUN: llc -mtriple=x86_64-pc-windows-msvc19 -verify-machineinstrs < %s | FileCheck %s
+
+%struct.widget = type { ptr, ptr, [8 x i8] }
+
+ at global = external global %struct.widget
+
+define dso_local void @hoist() local_unnamed_addr #0 personality ptr @__CxxFrameHandler3 {
+bb:
+  br i1 poison, label %bb1, label %bb7
+
+; CHECK:.Ltmp0:
+; CHECK:	subq	$32, %rsp
+; CHECK:	callq	snork
+; CHECK:	addq	$32, %rsp
+bb1:                                              ; preds = %bb
+  %tmp = alloca i32, align 4
+  invoke void @snork()
+          to label %bb6 unwind label %bb2
+
+bb2:                                              ; preds = %bb1
+  %tmp3 = catchswitch within none [label %bb4] unwind label %bb8
+
+bb4:                                              ; preds = %bb2
+  %tmp5 = catchpad within %tmp3 [ptr @global, i32 0, ptr %tmp]
+  unreachable
+
+bb6:                                              ; preds = %bb1
+  unreachable
+
+bb7:                                              ; preds = %bb
+  ret void
+
+bb8:                                              ; preds = %bb2
+  %tmp9 = cleanuppad within none []
+  unreachable
+}
+
+declare dso_local i32 @__CxxFrameHandler3(...) #0
+
+declare dso_local void @snork() local_unnamed_addr #0
+
+attributes #0 = { nofree }
Index: llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
+++ llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
@@ -111,7 +111,8 @@
     // Map all BB references in the WinEH data to MBBs.
     for (WinEHTryBlockMapEntry &TBME : EHInfo.TryBlockMap) {
       for (WinEHHandlerType &H : TBME.HandlerArray) {
-        if (const AllocaInst *AI = H.CatchObj.Alloca)
+        const AllocaInst *AI = H.CatchObj.Alloca;
+        if (AI && AI->isStaticAlloca())
           CatchObjects.insert({AI, {}}).first->second.push_back(
               &H.CatchObj.FrameIndex);
         else


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D145286.502310.patch
Type: text/x-patch
Size: 2181 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230304/d6d6e80d/attachment.bin>


More information about the llvm-commits mailing list