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

via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 12 06:36:03 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-mc

Author: None (Qwinci)

<details>
<summary>Changes</summary>

Add support for `PROC FRAME: ehandler` syntax used to specify the seh unwind/exception handler for a function in Masm.

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


2 Files Affected:

- (modified) llvm/lib/MC/MCParser/COFFMasmParser.cpp (+7) 
- (added) llvm/test/tools/llvm-ml/proc_frame_ehandler.asm (+30) 


``````````diff
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

``````````

</details>


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


More information about the llvm-commits mailing list