[ms] [llvm-ml] Handle OPTION PROLOGUE/EPILOGUE:NONE

Since we don't yet implement PROC's PROLOGUE and EPILOGUE support, we can safely ignore the option that disables them.

Reviewed By: thakis

Differential Revision: https://reviews.llvm.org/D131524
This commit is contained in:
Eric Astor 2022-08-10 17:51:51 +00:00
parent ec08114133
commit bc9617899c
2 changed files with 56 additions and 1 deletions

View File

@ -47,6 +47,7 @@ class COFFMasmParser : public MCAsmParserExtension {
bool ParseDirectiveSegment(StringRef, SMLoc);
bool ParseDirectiveSegmentEnd(StringRef, SMLoc);
bool ParseDirectiveIncludelib(StringRef, SMLoc);
bool ParseDirectiveOption(StringRef, SMLoc);
bool ParseDirectiveAlias(StringRef, SMLoc);
@ -120,7 +121,7 @@ class COFFMasmParser : public MCAsmParserExtension {
// .fpo
addDirectiveHandler<&COFFMasmParser::ParseDirectiveIncludelib>(
"includelib");
// option
addDirectiveHandler<&COFFMasmParser::ParseDirectiveOption>("option");
// popcontext
// pushcontext
// .safeseh
@ -403,6 +404,43 @@ bool COFFMasmParser::ParseDirectiveIncludelib(StringRef Directive, SMLoc Loc) {
return false;
}
/// ParseDirectiveOption
/// ::= "option" option-list
bool COFFMasmParser::ParseDirectiveOption(StringRef Directive, SMLoc Loc) {
auto parseOption = [&]() -> bool {
StringRef Option;
if (getParser().parseIdentifier(Option))
return TokError("expected identifier for option name");
if (Option.equals_insensitive("prologue")) {
StringRef MacroId;
if (parseToken(AsmToken::Colon) || getParser().parseIdentifier(MacroId))
return TokError("expected :macroId after OPTION PROLOGUE");
if (MacroId.equals_insensitive("none")) {
// Since we currently don't implement prologues/epilogues, NONE is our
// default.
return false;
}
return TokError("OPTION PROLOGUE is currently unsupported");
}
if (Option.equals_insensitive("epilogue")) {
StringRef MacroId;
if (parseToken(AsmToken::Colon) || getParser().parseIdentifier(MacroId))
return TokError("expected :macroId after OPTION EPILOGUE");
if (MacroId.equals_insensitive("none")) {
// Since we currently don't implement prologues/epilogues, NONE is our
// default.
return false;
}
return TokError("OPTION EPILOGUE is currently unsupported");
}
return TokError("OPTION '" + Option + "' is currently unsupported");
};
if (parseMany(parseOption))
return addErrorSuffix(" in OPTION directive");
return false;
}
/// ParseDirectiveProc
/// TODO(epastor): Implement parameters and other attributes.
/// ::= label "proc" [[distance]]

View File

@ -0,0 +1,17 @@
; RUN: llvm-ml -filetype=s %s /Fo - | FileCheck %s
OPTION pRoLoGuE:nOnE, EPILogue:None
.code
t1 PROC
ret
t1 ENDP
; CHECK-LABEL: t1:
; CHECK-NOT: pop
; CHECK-NOT: push
; CHECK: {{^ *}}ret{{ *$}}
end