Author: Eric Astor Date: 2020-12-01T18:06:05-05:00 New Revision: c64037b784aeae63b1863ee1abd5601c2c6a8102
URL: https://github.com/llvm/llvm-project/commit/c64037b784aeae63b1863ee1abd5601c2c6a8102 DIFF: https://github.com/llvm/llvm-project/commit/c64037b784aeae63b1863ee1abd5601c2c6a8102.diff LOG: [ms] [llvm-ml] Support command-line defines Enable command-line defines as textmacros Reviewed By: thakis Differential Revision: https://reviews.llvm.org/D90059 Added: llvm/test/tools/llvm-ml/command_line_defines.asm Modified: llvm/include/llvm/MC/MCParser/MCAsmParser.h llvm/lib/MC/MCParser/MasmParser.cpp llvm/tools/llvm-ml/Opts.td llvm/tools/llvm-ml/llvm-ml.cpp Removed: ################################################################################ diff --git a/llvm/include/llvm/MC/MCParser/MCAsmParser.h b/llvm/include/llvm/MC/MCParser/MCAsmParser.h index 2040810eac14..391a6b0b575e 100644 --- a/llvm/include/llvm/MC/MCParser/MCAsmParser.h +++ b/llvm/include/llvm/MC/MCParser/MCAsmParser.h @@ -184,6 +184,8 @@ class MCAsmParser { virtual bool isParsingMasm() const { return false; } + virtual bool defineMacro(StringRef Name, StringRef Value) { return true; } + virtual bool lookUpField(StringRef Name, AsmFieldInfo &Info) const { return true; } diff --git a/llvm/lib/MC/MCParser/MasmParser.cpp b/llvm/lib/MC/MCParser/MasmParser.cpp index 709f1ea1173d..63aebbc5a7ba 100644 --- a/llvm/lib/MC/MCParser/MasmParser.cpp +++ b/llvm/lib/MC/MCParser/MasmParser.cpp @@ -501,6 +501,8 @@ class MasmParser : public MCAsmParser { bool isParsingMasm() const override { return true; } + bool defineMacro(StringRef Name, StringRef Value) override; + bool lookUpField(StringRef Name, AsmFieldInfo &Info) const override; bool lookUpField(StringRef Base, StringRef Member, AsmFieldInfo &Info) const override; @@ -6905,6 +6907,19 @@ static int rewritesSort(const AsmRewrite *AsmRewriteA, llvm_unreachable("Unstable rewrite sort."); } +bool MasmParser::defineMacro(StringRef Name, StringRef Value) { + Variable &Var = Variables[Name.lower()]; + if (Var.Name.empty()) { + Var.Name = Name; + } else if (!Var.Redefinable) { + return TokError("invalid variable redefinition"); + } + Var.Redefinable = true; + Var.IsText = true; + Var.TextValue = Value.str(); + return false; +} + bool MasmParser::lookUpField(StringRef Name, AsmFieldInfo &Info) const { const std::pair<StringRef, StringRef> BaseMember = Name.split('.'); const StringRef Base = BaseMember.first, Member = BaseMember.second; diff --git a/llvm/test/tools/llvm-ml/command_line_defines.asm b/llvm/test/tools/llvm-ml/command_line_defines.asm new file mode 100644 index 000000000000..51b02e6ebb4a --- /dev/null +++ b/llvm/test/tools/llvm-ml/command_line_defines.asm @@ -0,0 +1,38 @@ +; RUN: llvm-ml -filetype=s %s /Fo - /DT1=test1 /D T2=test2 | FileCheck %s + +.code + +t1: + ret +; CHECK-NOT: t1: +; CHECK-LABEL: test1: +; CHECK-NOT: t1: + +t2: + ret +; CHECK-NOT: t2: +; CHECK-LABEL: test2: +; CHECK-NOT: t2: + +t3: +ifdef t1 + xor eax, eax +endif + ret +; CHECK-LABEL: t3: +; CHECK: xor eax, eax +; CHECK: ret + +t4: +ifdef undefined + xor eax, eax +elseifdef t2 + xor ebx, ebx +endif + ret +; CHECK-LABEL: t4: +; CHECK-NOT: xor eax, eax +; CHECK: xor ebx, ebx +; CHECK: ret + +end diff --git a/llvm/tools/llvm-ml/Opts.td b/llvm/tools/llvm-ml/Opts.td index ed52bb4771ba..4c2757b05722 100644 --- a/llvm/tools/llvm-ml/Opts.td +++ b/llvm/tools/llvm-ml/Opts.td @@ -31,6 +31,9 @@ def help : MLFlag<"?">, HelpText<"Display available options">; def help_long : MLFlag<"help">, Alias<help>; def assemble_only : MLFlag<"c">, HelpText<"Assemble only; do not link">; +def define : MLJoinedOrSeparate<"D">, MetaVarName<"<macro>=<value>">, + HelpText<"Define <macro> to <value> (or blank if <value> " + "omitted)">; def output_file : MLJoinedOrSeparate<"Fo">, HelpText<"Names the output file">; def include_path : MLJoinedOrSeparate<"I">, HelpText<"Sets path for include files">; @@ -72,7 +75,6 @@ def coff_object_file : UnsupportedFlag<"coff">, HelpText<"">; def preserve_identifier_case : UnsupportedFlag<"Cp">, HelpText<"">; def uppercase_identifiers : UnsupportedFlag<"Cu">, HelpText<"">; def preserve_extern_case : UnsupportedFlag<"Cx">, HelpText<"">; -def define : UnsupportedJoinedOrSeparate<"D">, HelpText<"">; def output_preprocessed : UnsupportedFlag<"EP">, HelpText<"">; def errorreport : UnsupportedJoined<"ERRORREPORT">, HelpText<"">; def stacksize : UnsupportedSeparate<"F">, HelpText<"">; diff --git a/llvm/tools/llvm-ml/llvm-ml.cpp b/llvm/tools/llvm-ml/llvm-ml.cpp index ac03ef826c58..1733dcd47281 100644 --- a/llvm/tools/llvm-ml/llvm-ml.cpp +++ b/llvm/tools/llvm-ml/llvm-ml.cpp @@ -147,6 +147,17 @@ static int AssembleInput(StringRef ProgName, const Target *TheTarget, Parser->getLexer().setLexMasmHexFloats(true); Parser->getLexer().setLexMasmStrings(true); + auto Defines = InputArgs.getAllArgValues(OPT_define); + for (StringRef Define : Defines) { + const auto NameValue = Define.split('='); + StringRef Name = NameValue.first, Value = NameValue.second; + if (Parser->defineMacro(Name, Value)) { + WithColor::error(errs(), ProgName) + << "can't define macro '" << Name << "' = '" << Value << "'\n"; + return 1; + } + } + int Res = Parser->Run(/*NoInitialTextSection=*/true); return Res; _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits