[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