[llvm] [MC] Support specifying unwind handler in Masm proc directive (PR #181152)

via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 19 11:46:22 PST 2026


https://github.com/Qwinci updated https://github.com/llvm/llvm-project/pull/181152

>From c266bde9f5c8965282cf33db838a3dcaf516844e Mon Sep 17 00:00:00 2001
From: Qwinci <qwinci222 at gmail.com>
Date: Thu, 12 Feb 2026 16:17:45 +0200
Subject: [PATCH] [MC] Support specifying unwind handler in Masm proc directive

---
 llvm/lib/MC/MCParser/COFFMasmParser.cpp       |  7 +++++
 .../tools/llvm-ml/proc_frame_ehandler.asm     | 30 +++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 llvm/test/tools/llvm-ml/proc_frame_ehandler.asm

diff --git a/llvm/lib/MC/MCParser/COFFMasmParser.cpp b/llvm/lib/MC/MCParser/COFFMasmParser.cpp
index db796a3ad2ed8..bc8d783a78921 100644
--- a/llvm/lib/MC/MCParser/COFFMasmParser.cpp
+++ b/llvm/lib/MC/MCParser/COFFMasmParser.cpp
@@ -472,6 +472,13 @@ bool COFFMasmParser::parseDirectiveProc(StringRef Directive, SMLoc Loc) {
     Framed = true;
     getStreamer().emitWinCFIStartProc(Sym, Loc);
   }
+  if (Framed && getLexer().is(AsmToken::Colon)) {
+    Lex();
+    MCSymbol *HandlerSym;
+    if (getParser().parseSymbol(HandlerSym))
+      return Error(Loc, "expected identifier for unwind handler");
+    getStreamer().emitWinEHHandler(HandlerSym, true, true, Loc);
+  }
   getStreamer().emitLabel(Sym, Loc);
 
   CurrentProcedures.push_back(Sym->getName());
diff --git a/llvm/test/tools/llvm-ml/proc_frame_ehandler.asm b/llvm/test/tools/llvm-ml/proc_frame_ehandler.asm
new file mode 100644
index 0000000000000..1f45fb6a95e8c
--- /dev/null
+++ b/llvm/test/tools/llvm-ml/proc_frame_ehandler.asm
@@ -0,0 +1,30 @@
+; RUN: llvm-ml64 -filetype=s %s /Fo - | FileCheck %s
+
+.code
+
+t1 PROC FRAME: ehandler
+  push rbp
+  .pushreg rbp
+  mov rbp, rsp
+  .setframe rbp, 0
+  pushfq
+  .allocstack 8
+  .endprolog
+  ret
+t1 ENDP
+
+; CHECK: .seh_proc t1
+; CHECK: .seh_handler ehandler, @unwind, @except
+
+; CHECK: t1:
+; CHECK: push rbp
+; CHECK: .seh_pushreg rbp
+; CHECK: mov rbp, rsp
+; CHECK: .seh_setframe rbp, 0
+; CHECK: pushfq
+; CHECK: .seh_stackalloc 8
+; CHECK: .seh_endprologue
+; CHECK: ret
+; CHECK: .seh_endproc
+
+END



More information about the llvm-commits mailing list