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 @@ -204,8 +204,9 @@ SectionKind::getBSS()); } - StringRef CurrentProcedure; - bool CurrentProcedureFramed; + /// Stack of active procedure definitions. + SmallVector CurrentProcedures; + SmallVector CurrentProceduresFramed; public: COFFMasmParser() = default; @@ -340,8 +341,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) { @@ -350,17 +351,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; }