1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00

[AsmParser][SystemZ][z/OS] Reject character and string literals for HLASM

- As per the HLASM support we are providing, i.e. support only for the first parameter of the inline asm block, only pertaining to Z machine instructions defined in LLVM, character literals and string literals are not supported (see Figure 4 - https://www-01.ibm.com/servers/resourcelink/svc00100.nsf/pages/zOSV2R3sc264940/$file/asmr1023.pdf for more information)
- This patch explicitly rejects the usage of char literals and string literals (for example "abc 'a'") when the relevant field is set
- This is achieved by introducing a field called `LexHLASMStrings` in MCAsmLexer similar to `LexMasmStrings`

Reviewed By: abhina.sreeskantharajan, Kai

Differential Revision: https://reviews.llvm.org/D101660
This commit is contained in:
Anirudh Prasad 2021-05-05 10:21:27 -04:00
parent 437fc84e41
commit 97a8b374a1
3 changed files with 44 additions and 0 deletions

View File

@ -57,6 +57,7 @@ protected: // Can only create subclasses.
bool UseMasmDefaultRadix = false;
unsigned DefaultRadix = 10;
bool LexHLASMIntegers = false;
bool LexHLASMStrings = false;
AsmCommentConsumer *CommentConsumer = nullptr;
MCAsmLexer();
@ -180,6 +181,11 @@ public:
/// Set whether to lex HLASM-flavour integers. For now this is only [0-9]*
void setLexHLASMIntegers(bool V) { LexHLASMIntegers = V; }
/// Set whether to "lex" HLASM-flavour character and string literals. For now,
/// setting this option to true, will disable lexing for character and string
/// literals.
void setLexHLASMStrings(bool V) { LexHLASMStrings = V; }
};
} // end namespace llvm

View File

@ -567,6 +567,9 @@ AsmToken AsmLexer::LexDigit() {
AsmToken AsmLexer::LexSingleQuote() {
int CurChar = getNextChar();
if (LexHLASMStrings)
return ReturnError(TokStart, "invalid usage of character literals");
if (LexMasmStrings) {
while (CurChar != EOF) {
if (CurChar != '\'') {
@ -621,6 +624,9 @@ AsmToken AsmLexer::LexSingleQuote() {
/// LexQuote: String: "..."
AsmToken AsmLexer::LexQuote() {
int CurChar = getNextChar();
if (LexHLASMStrings)
return ReturnError(TokStart, "invalid usage of string literals");
if (LexMasmStrings) {
while (CurChar != EOF) {
if (CurChar != '"') {

View File

@ -700,4 +700,36 @@ TEST_F(SystemZAsmLexerTest, CheckRejectStarAsCurrentPC) {
EXPECT_EQ(ParsePrimaryExpr, true);
EXPECT_EQ(Parser->hasPendingError(), true);
}
TEST_F(SystemZAsmLexerTest, CheckRejectCharLiterals) {
StringRef AsmStr = "abc 'd'";
// Setup.
setupCallToAsmParser(AsmStr);
Parser->getLexer().setLexHLASMStrings(true);
// Lex initially to get the string.
Parser->getLexer().Lex();
SmallVector<AsmToken::TokenKind> ExpectedTokens(
{AsmToken::Identifier, AsmToken::Error, AsmToken::Error,
AsmToken::EndOfStatement, AsmToken::Eof});
lexAndCheckTokens(AsmStr, ExpectedTokens);
}
TEST_F(SystemZAsmLexerTest, CheckRejectStringLiterals) {
StringRef AsmStr = "abc \"ef\"";
// Setup.
setupCallToAsmParser(AsmStr);
Parser->getLexer().setLexHLASMStrings(true);
// Lex initially to get the string.
Parser->getLexer().Lex();
SmallVector<AsmToken::TokenKind> ExpectedTokens(
{AsmToken::Identifier, AsmToken::Error, AsmToken::Identifier,
AsmToken::Error, AsmToken::EndOfStatement, AsmToken::Eof});
lexAndCheckTokens(AsmStr, ExpectedTokens);
}
} // end anonymous namespace