diff --git a/llvm/lib/MC/MCParser/COFFMasmParser.cpp b/llvm/lib/MC/MCParser/COFFMasmParser.cpp --- a/llvm/lib/MC/MCParser/COFFMasmParser.cpp +++ b/llvm/lib/MC/MCParser/COFFMasmParser.cpp @@ -207,8 +207,9 @@ SectionKind::getBSS()); } - StringRef CurrentProcedure; - bool CurrentProcedureFramed; + /// Stack of active procedure definitions. + SmallVector CurrentProcedures; + SmallVector CurrentProceduresFramed; public: COFFMasmParser() = default; @@ -478,8 +479,8 @@ } getStreamer().emitLabel(Sym, Loc); - CurrentProcedure = Label; - CurrentProcedureFramed = Framed; + CurrentProcedures.push_back(Label); + CurrentProceduresFramed.push_back(Framed); return false; } bool COFFMasmParser::ParseDirectiveEndProc(StringRef Directive, SMLoc Loc) { @@ -488,17 +489,17 @@ if (getParser().parseIdentifier(Label)) return Error(LabelLoc, "expected identifier for procedure end"); - if (CurrentProcedure.empty()) + if (CurrentProcedures.empty()) return Error(Loc, "endp outside of procedure block"); - else if (CurrentProcedure != Label) + else if (CurrentProcedures.back() != Label) return Error(LabelLoc, "endp does not match current procedure '" + - CurrentProcedure + "'"); + CurrentProcedures.back() + "'"); - if (CurrentProcedureFramed) { + if (CurrentProceduresFramed.back()) { getStreamer().emitWinCFIEndProc(Loc); } - CurrentProcedure = ""; - CurrentProcedureFramed = false; + CurrentProcedures.pop_back(); + CurrentProceduresFramed.pop_back(); return false; } diff --git a/llvm/test/tools/llvm-ml/nested_proc.asm b/llvm/test/tools/llvm-ml/nested_proc.asm new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-ml/nested_proc.asm @@ -0,0 +1,18 @@ +; RUN: llvm-ml -m32 -filetype=s %s /Fo - | FileCheck %s +; RUN: llvm-ml -m64 -filetype=s %s /Fo - | FileCheck %s + +.code + +t1 PROC + xor eax, eax +t1_nested PROC + ret +t1_nested ENDP +t1 ENDP + +; CHECK-LABEL: t1: +; CHECK: xor eax, eax +; CHECK: t1_nested: +; CHECK: ret + +END diff --git a/llvm/test/tools/llvm-ml/nested_proc_errors.asm b/llvm/test/tools/llvm-ml/nested_proc_errors.asm new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-ml/nested_proc_errors.asm @@ -0,0 +1,13 @@ +; RUN: not llvm-ml -filetype=s %s /Fo - 2>&1 | FileCheck %s --implicit-check-not=error: + +.code + +t1 PROC + xor eax, eax +t1_nested PROC + ret +t1 ENDP +t1_nested ENDP +; CHECK: :[[# @LINE - 2]]:1: error: endp does not match current procedure 't1_nested' + +END