[llvm] 94fae7a - [ms] [llvm-ml] Add support for nested PROC/ENDP pairs
Eric Astor via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 11 07:19:21 PDT 2022
Author: Eric Astor
Date: 2022-08-11T14:19:02Z
New Revision: 94fae7a581d6772e9f4ec0270485a4308eb8d2dc
URL: https://github.com/llvm/llvm-project/commit/94fae7a581d6772e9f4ec0270485a4308eb8d2dc
DIFF: https://github.com/llvm/llvm-project/commit/94fae7a581d6772e9f4ec0270485a4308eb8d2dc.diff
LOG: [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
Added:
llvm/test/tools/llvm-ml/nested_proc.asm
llvm/test/tools/llvm-ml/nested_proc_errors.asm
Modified:
llvm/lib/MC/MCParser/COFFMasmParser.cpp
Removed:
################################################################################
diff --git a/llvm/lib/MC/MCParser/COFFMasmParser.cpp b/llvm/lib/MC/MCParser/COFFMasmParser.cpp
index f2165b4864497..34aa5bf2ae39c 100644
--- a/llvm/lib/MC/MCParser/COFFMasmParser.cpp
+++ b/llvm/lib/MC/MCParser/COFFMasmParser.cpp
@@ -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;
}
diff --git a/llvm/test/tools/llvm-ml/nested_proc.asm b/llvm/test/tools/llvm-ml/nested_proc.asm
new file mode 100644
index 0000000000000..540541f597fc3
--- /dev/null
+++ b/llvm/test/tools/llvm-ml/nested_proc.asm
@@ -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
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
index 0000000000000..32356e9cf5531
--- /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
More information about the llvm-commits
mailing list