[ms] [llvm-ml] Allow use of locally-defined variables in expressions
authorEric Astor <epastor@google.com>
Mon, 7 Sep 2020 18:00:05 +0000 (14:00 -0400)
committerEric Astor <epastor@google.com>
Mon, 7 Sep 2020 18:00:14 +0000 (14:00 -0400)
MASM allows variables defined by equate statements to be used in expressions.

Reviewed By: thakis

Differential Revision: https://reviews.llvm.org/D86946

llvm/lib/MC/MCParser/MasmParser.cpp
llvm/test/tools/llvm-ml/variable.test [new file with mode: 0644]

index 333eef2..4d62174 100644 (file)
@@ -3076,6 +3076,11 @@ bool MasmParser::parseDirectiveEquate(StringRef IDVal, StringRef Name,
   SMLoc EndLoc, StartLoc = Lexer.getLoc();
   if (parseExpression(Expr, EndLoc))
     return addErrorSuffix(" in '" + Twine(IDVal) + "' directive");
+  MCSymbol *Sym = getContext().getOrCreateSymbol(Var.Name);
+  Sym->setRedefinable(Var.Redefinable);
+  Sym->setVariableValue(Expr);
+  Sym->setExternal(false);
+
   if (Expr->evaluateAsAbsolute(Var.NumericValue,
                                getStreamer().getAssemblerPtr()))
     return false;
diff --git a/llvm/test/tools/llvm-ml/variable.test b/llvm/test/tools/llvm-ml/variable.test
new file mode 100644 (file)
index 0000000..4e89d67
--- /dev/null
@@ -0,0 +1,13 @@
+# RUN: llvm-ml -filetype=asm %s | FileCheck %s
+
+.data
+t1_value equ 1 or 2
+
+t1 BYTE t1_value DUP (0)
+; CHECK: t1:
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .byte 0
+; CHECK-NOT: .byte 0
+
+END