[ms] [llvm-ml] Add support for nested PROC/ENDP pairs

This is believed to match behavior by ML.EXE and ML64.EXE.

Reviewed By: thakis

Differential Revision: https://reviews.llvm.org/D131522
This commit is contained in:
Eric Astor 2022-08-11 14:18:32 +00:00
parent 4e68834add
commit 94fae7a581
3 changed files with 54 additions and 10 deletions

View File

@ -207,8 +207,9 @@ class COFFMasmParser : public MCAsmParserExtension {
SectionKind::getBSS());
}
StringRef CurrentProcedure;
bool CurrentProcedureFramed;
/// Stack of active procedure definitions.
SmallVector<StringRef, 1> CurrentProcedures;
SmallVector<bool, 1> CurrentProceduresFramed;
public:
COFFMasmParser() = default;
@ -478,8 +479,8 @@ bool COFFMasmParser::ParseDirectiveProc(StringRef Directive, SMLoc Loc) {
}
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 @@ bool COFFMasmParser::ParseDirectiveEndProc(StringRef Directive, SMLoc Loc) {
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().equals_insensitive(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;
}

View File

@ -0,0 +1,30 @@
; 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
t2 PROC
xor eax, eax
t2_nested PROC
ret
T2_nEsTeD ENDP
t2 ENDP
; CHECK-LABEL: t2:
; CHECK: xor eax, eax
; CHECK: t2_nested:
; CHECK: ret
END

View File

@ -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