Skip to content

Commit bb6732c

Browse files
committed
[MC] Add parseEOL() overload and migrate some parseToken(AsmToken::EndOfStatement) to parseEOL()
For many directives, the following diagnostics * `error: unexpected token` * `error: unexpected token in '.abort' directive"` are replaced with `error: expected newline`. `unexpected token` may make the user think a different token is needed. `expected newline` is clearer about the expected token. For `in '...' directive`, the directive name is not useful because the next line replicates the error line which includes the directive.
1 parent e5eb3e3 commit bb6732c

File tree

9 files changed

+72
-91
lines changed

9 files changed

+72
-91
lines changed

llvm/include/llvm/MC/MCParser/MCAsmParser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ class MCAsmParser {
258258
/// success.
259259
bool parseOptionalToken(AsmToken::TokenKind T);
260260

261+
bool parseEOL();
261262
bool parseEOL(const Twine &ErrMsg);
262263

263264
bool parseMany(function_ref<bool()> parseOne, bool hasComma = true);

llvm/lib/MC/MCParser/AsmParser.cpp

Lines changed: 41 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -3216,8 +3216,7 @@ bool AsmParser::parseDirectiveZero() {
32163216
return true;
32173217
}
32183218

3219-
if (parseToken(AsmToken::EndOfStatement,
3220-
"unexpected token in '.zero' directive"))
3219+
if (parseEOL())
32213220
return true;
32223221
getStreamer().emitFill(*NumBytes, Val, NumBytesLoc);
32233222

@@ -3247,8 +3246,7 @@ bool AsmParser::parseDirectiveFill() {
32473246
return true;
32483247
}
32493248
}
3250-
if (parseToken(AsmToken::EndOfStatement,
3251-
"unexpected token in '.fill' directive"))
3249+
if (parseEOL())
32523250
return true;
32533251

32543252
if (FillSize < 0) {
@@ -3281,7 +3279,7 @@ bool AsmParser::parseDirectiveOrg() {
32813279
if (parseOptionalToken(AsmToken::Comma))
32823280
if (parseAbsoluteExpression(FillExpr))
32833281
return addErrorSuffix(" in '.org' directive");
3284-
if (parseToken(AsmToken::EndOfStatement))
3282+
if (parseEOL())
32853283
return addErrorSuffix(" in '.org' directive");
32863284

32873285
getStreamer().emitValueToOffset(Offset, FillExpr, OffsetLoc);
@@ -3315,15 +3313,15 @@ bool AsmParser::parseDirectiveAlign(bool IsPow2, unsigned ValueSize) {
33153313
parseAbsoluteExpression(MaxBytesToFill))
33163314
return true;
33173315
}
3318-
return parseToken(AsmToken::EndOfStatement);
3316+
return parseEOL();
33193317
};
33203318

33213319
if (checkForValidSection())
33223320
return addErrorSuffix(" in directive");
33233321
// Ignore empty '.p2align' directives for GNU-as compatibility
33243322
if (IsPow2 && (ValueSize == 1) && getTok().is(AsmToken::EndOfStatement)) {
33253323
Warning(AlignmentLoc, "p2align directive with no operand(s) is ignored");
3326-
return parseToken(AsmToken::EndOfStatement);
3324+
return parseEOL();
33273325
}
33283326
if (parseAlign())
33293327
return addErrorSuffix(" in directive");
@@ -4097,7 +4095,7 @@ bool AsmParser::parseDirectiveCFIStartProc() {
40974095
if (!parseOptionalToken(AsmToken::EndOfStatement)) {
40984096
if (check(parseIdentifier(Simple) || Simple != "simple",
40994097
"unexpected token") ||
4100-
parseToken(AsmToken::EndOfStatement))
4098+
parseEOL())
41014099
return addErrorSuffix(" in '.cfi_startproc' directive");
41024100
}
41034101

@@ -4113,7 +4111,7 @@ bool AsmParser::parseDirectiveCFIStartProc() {
41134111
/// parseDirectiveCFIEndProc
41144112
/// ::= .cfi_endproc
41154113
bool AsmParser::parseDirectiveCFIEndProc() {
4116-
if (parseToken(AsmToken::EndOfStatement))
4114+
if (parseEOL())
41174115
return addErrorSuffix(" in '.cfi_endproc' directive");
41184116
getStreamer().emitCFIEndProc();
41194117
return false;
@@ -4140,7 +4138,7 @@ bool AsmParser::parseDirectiveCFIDefCfa(SMLoc DirectiveLoc) {
41404138
int64_t Register = 0, Offset = 0;
41414139
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) ||
41424140
parseToken(AsmToken::Comma, "unexpected token in directive") ||
4143-
parseAbsoluteExpression(Offset) || parseToken(AsmToken::EndOfStatement))
4141+
parseAbsoluteExpression(Offset) || parseEOL())
41444142
return true;
41454143

41464144
getStreamer().emitCFIDefCfa(Register, Offset);
@@ -4151,7 +4149,7 @@ bool AsmParser::parseDirectiveCFIDefCfa(SMLoc DirectiveLoc) {
41514149
/// ::= .cfi_def_cfa_offset offset
41524150
bool AsmParser::parseDirectiveCFIDefCfaOffset() {
41534151
int64_t Offset = 0;
4154-
if (parseAbsoluteExpression(Offset) || parseToken(AsmToken::EndOfStatement))
4152+
if (parseAbsoluteExpression(Offset) || parseEOL())
41554153
return true;
41564154

41574155
getStreamer().emitCFIDefCfaOffset(Offset);
@@ -4164,8 +4162,7 @@ bool AsmParser::parseDirectiveCFIRegister(SMLoc DirectiveLoc) {
41644162
int64_t Register1 = 0, Register2 = 0;
41654163
if (parseRegisterOrRegisterNumber(Register1, DirectiveLoc) ||
41664164
parseToken(AsmToken::Comma, "unexpected token in directive") ||
4167-
parseRegisterOrRegisterNumber(Register2, DirectiveLoc) ||
4168-
parseToken(AsmToken::EndOfStatement))
4165+
parseRegisterOrRegisterNumber(Register2, DirectiveLoc) || parseEOL())
41694166
return true;
41704167

41714168
getStreamer().emitCFIRegister(Register1, Register2);
@@ -4175,7 +4172,7 @@ bool AsmParser::parseDirectiveCFIRegister(SMLoc DirectiveLoc) {
41754172
/// parseDirectiveCFIWindowSave
41764173
/// ::= .cfi_window_save
41774174
bool AsmParser::parseDirectiveCFIWindowSave() {
4178-
if (parseToken(AsmToken::EndOfStatement))
4175+
if (parseEOL())
41794176
return true;
41804177
getStreamer().emitCFIWindowSave();
41814178
return false;
@@ -4185,8 +4182,7 @@ bool AsmParser::parseDirectiveCFIWindowSave() {
41854182
/// ::= .cfi_adjust_cfa_offset adjustment
41864183
bool AsmParser::parseDirectiveCFIAdjustCfaOffset() {
41874184
int64_t Adjustment = 0;
4188-
if (parseAbsoluteExpression(Adjustment) ||
4189-
parseToken(AsmToken::EndOfStatement))
4185+
if (parseAbsoluteExpression(Adjustment) || parseEOL())
41904186
return true;
41914187

41924188
getStreamer().emitCFIAdjustCfaOffset(Adjustment);
@@ -4197,8 +4193,7 @@ bool AsmParser::parseDirectiveCFIAdjustCfaOffset() {
41974193
/// ::= .cfi_def_cfa_register register
41984194
bool AsmParser::parseDirectiveCFIDefCfaRegister(SMLoc DirectiveLoc) {
41994195
int64_t Register = 0;
4200-
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) ||
4201-
parseToken(AsmToken::EndOfStatement))
4196+
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) || parseEOL())
42024197
return true;
42034198

42044199
getStreamer().emitCFIDefCfaRegister(Register);
@@ -4213,7 +4208,7 @@ bool AsmParser::parseDirectiveCFIOffset(SMLoc DirectiveLoc) {
42134208

42144209
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) ||
42154210
parseToken(AsmToken::Comma, "unexpected token in directive") ||
4216-
parseAbsoluteExpression(Offset) || parseToken(AsmToken::EndOfStatement))
4211+
parseAbsoluteExpression(Offset) || parseEOL())
42174212
return true;
42184213

42194214
getStreamer().emitCFIOffset(Register, Offset);
@@ -4227,7 +4222,7 @@ bool AsmParser::parseDirectiveCFIRelOffset(SMLoc DirectiveLoc) {
42274222

42284223
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) ||
42294224
parseToken(AsmToken::Comma, "unexpected token in directive") ||
4230-
parseAbsoluteExpression(Offset) || parseToken(AsmToken::EndOfStatement))
4225+
parseAbsoluteExpression(Offset) || parseEOL())
42314226
return true;
42324227

42334228
getStreamer().emitCFIRelOffset(Register, Offset);
@@ -4271,7 +4266,7 @@ bool AsmParser::parseDirectiveCFIPersonalityOrLsda(bool IsPersonality) {
42714266
if (check(!isValidEncoding(Encoding), "unsupported encoding.") ||
42724267
parseToken(AsmToken::Comma, "unexpected token in directive") ||
42734268
check(parseIdentifier(Name), "expected identifier in directive") ||
4274-
parseToken(AsmToken::EndOfStatement))
4269+
parseEOL())
42754270
return true;
42764271

42774272
MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
@@ -4286,7 +4281,7 @@ bool AsmParser::parseDirectiveCFIPersonalityOrLsda(bool IsPersonality) {
42864281
/// parseDirectiveCFIRememberState
42874282
/// ::= .cfi_remember_state
42884283
bool AsmParser::parseDirectiveCFIRememberState() {
4289-
if (parseToken(AsmToken::EndOfStatement))
4284+
if (parseEOL())
42904285
return true;
42914286
getStreamer().emitCFIRememberState();
42924287
return false;
@@ -4295,7 +4290,7 @@ bool AsmParser::parseDirectiveCFIRememberState() {
42954290
/// parseDirectiveCFIRestoreState
42964291
/// ::= .cfi_remember_state
42974292
bool AsmParser::parseDirectiveCFIRestoreState() {
4298-
if (parseToken(AsmToken::EndOfStatement))
4293+
if (parseEOL())
42994294
return true;
43004295
getStreamer().emitCFIRestoreState();
43014296
return false;
@@ -4306,8 +4301,7 @@ bool AsmParser::parseDirectiveCFIRestoreState() {
43064301
bool AsmParser::parseDirectiveCFISameValue(SMLoc DirectiveLoc) {
43074302
int64_t Register = 0;
43084303

4309-
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) ||
4310-
parseToken(AsmToken::EndOfStatement))
4304+
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) || parseEOL())
43114305
return true;
43124306

43134307
getStreamer().emitCFISameValue(Register);
@@ -4318,8 +4312,7 @@ bool AsmParser::parseDirectiveCFISameValue(SMLoc DirectiveLoc) {
43184312
/// ::= .cfi_restore register
43194313
bool AsmParser::parseDirectiveCFIRestore(SMLoc DirectiveLoc) {
43204314
int64_t Register = 0;
4321-
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) ||
4322-
parseToken(AsmToken::EndOfStatement))
4315+
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) || parseEOL())
43234316
return true;
43244317

43254318
getStreamer().emitCFIRestore(Register);
@@ -4353,8 +4346,7 @@ bool AsmParser::parseDirectiveCFIEscape() {
43534346
/// ::= .cfi_return_column register
43544347
bool AsmParser::parseDirectiveCFIReturnColumn(SMLoc DirectiveLoc) {
43554348
int64_t Register = 0;
4356-
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) ||
4357-
parseToken(AsmToken::EndOfStatement))
4349+
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) || parseEOL())
43584350
return true;
43594351
getStreamer().emitCFIReturnColumn(Register);
43604352
return false;
@@ -4376,8 +4368,7 @@ bool AsmParser::parseDirectiveCFISignalFrame() {
43764368
bool AsmParser::parseDirectiveCFIUndefined(SMLoc DirectiveLoc) {
43774369
int64_t Register = 0;
43784370

4379-
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) ||
4380-
parseToken(AsmToken::EndOfStatement))
4371+
if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) || parseEOL())
43814372
return true;
43824373

43834374
getStreamer().emitCFIUndefined(Register);
@@ -4388,8 +4379,8 @@ bool AsmParser::parseDirectiveCFIUndefined(SMLoc DirectiveLoc) {
43884379
/// ::= .altmacro
43894380
/// ::= .noaltmacro
43904381
bool AsmParser::parseDirectiveAltmacro(StringRef Directive) {
4391-
if (getLexer().isNot(AsmToken::EndOfStatement))
4392-
return TokError("unexpected token in '" + Directive + "' directive");
4382+
if (parseEOL())
4383+
return true;
43934384
AltMacroMode = (Directive == ".altmacro");
43944385
return false;
43954386
}
@@ -4398,10 +4389,8 @@ bool AsmParser::parseDirectiveAltmacro(StringRef Directive) {
43984389
/// ::= .macros_on
43994390
/// ::= .macros_off
44004391
bool AsmParser::parseDirectiveMacrosOnOff(StringRef Directive) {
4401-
if (parseToken(AsmToken::EndOfStatement,
4402-
"unexpected token in '" + Directive + "' directive"))
4392+
if (parseEOL())
44034393
return true;
4404-
44054394
setMacrosEnabled(Directive == ".macros_on");
44064395
return false;
44074396
}
@@ -4640,8 +4629,7 @@ void AsmParser::checkForBadMacro(SMLoc DirectiveLoc, StringRef Name,
46404629
/// parseDirectiveExitMacro
46414630
/// ::= .exitm
46424631
bool AsmParser::parseDirectiveExitMacro(StringRef Directive) {
4643-
if (parseToken(AsmToken::EndOfStatement,
4644-
"unexpected token in '" + Directive + "' directive"))
4632+
if (parseEOL())
46454633
return true;
46464634

46474635
if (!isInsideMacroInstantiation())
@@ -4748,9 +4736,7 @@ bool AsmParser::parseDirectiveBundleLock() {
47484736
/// parseDirectiveBundleLock
47494737
/// ::= {.bundle_lock}
47504738
bool AsmParser::parseDirectiveBundleUnlock() {
4751-
if (checkForValidSection() ||
4752-
parseToken(AsmToken::EndOfStatement,
4753-
"unexpected token in '.bundle_unlock' directive"))
4739+
if (checkForValidSection() || parseEOL())
47544740
return true;
47554741

47564742
getStreamer().emitBundleUnlock();
@@ -4769,7 +4755,7 @@ bool AsmParser::parseDirectiveSpace(StringRef IDVal) {
47694755
if (parseOptionalToken(AsmToken::Comma))
47704756
if (parseAbsoluteExpression(FillExpr))
47714757
return addErrorSuffix("in '" + Twine(IDVal) + "' directive");
4772-
if (parseToken(AsmToken::EndOfStatement))
4758+
if (parseEOL())
47734759
return addErrorSuffix("in '" + Twine(IDVal) + "' directive");
47744760

47754761
// FIXME: Sometimes the fill expr is 'nop' if it isn't supplied, instead of 0.
@@ -4966,8 +4952,7 @@ bool AsmParser::parseDirectiveComm(bool IsLocal) {
49664952
}
49674953
}
49684954

4969-
if (parseToken(AsmToken::EndOfStatement,
4970-
"unexpected token in '.comm' or '.lcomm' directive"))
4955+
if (parseEOL())
49714956
return true;
49724957

49734958
// NOTE: a size of zero for a .comm should create a undefined symbol
@@ -5004,8 +4989,7 @@ bool AsmParser::parseDirectiveAbort() {
50044989
SMLoc Loc = getLexer().getLoc();
50054990

50064991
StringRef Str = parseStringToEndOfStatement();
5007-
if (parseToken(AsmToken::EndOfStatement,
5008-
"unexpected token in '.abort' directive"))
4992+
if (parseEOL())
50094993
return true;
50104994

50114995
if (Str.empty())
@@ -5066,8 +5050,7 @@ bool AsmParser::parseDirectiveIncbin() {
50665050
}
50675051
}
50685052

5069-
if (parseToken(AsmToken::EndOfStatement,
5070-
"unexpected token in '.incbin' directive"))
5053+
if (parseEOL())
50715054
return true;
50725055

50735056
if (check(Skip < 0, SkipLoc, "skip is negative"))
@@ -5088,9 +5071,7 @@ bool AsmParser::parseDirectiveIf(SMLoc DirectiveLoc, DirectiveKind DirKind) {
50885071
eatToEndOfStatement();
50895072
} else {
50905073
int64_t ExprValue;
5091-
if (parseAbsoluteExpression(ExprValue) ||
5092-
parseToken(AsmToken::EndOfStatement,
5093-
"unexpected token in '.if' directive"))
5074+
if (parseAbsoluteExpression(ExprValue) || parseEOL())
50945075
return true;
50955076

50965077
switch (DirKind) {
@@ -5134,8 +5115,7 @@ bool AsmParser::parseDirectiveIfb(SMLoc DirectiveLoc, bool ExpectBlank) {
51345115
} else {
51355116
StringRef Str = parseStringToEndOfStatement();
51365117

5137-
if (parseToken(AsmToken::EndOfStatement,
5138-
"unexpected token in '.ifb' directive"))
5118+
if (parseEOL())
51395119
return true;
51405120

51415121
TheCondState.CondMet = ExpectBlank == Str.empty();
@@ -5162,8 +5142,7 @@ bool AsmParser::parseDirectiveIfc(SMLoc DirectiveLoc, bool ExpectEqual) {
51625142

51635143
StringRef Str2 = parseStringToEndOfStatement();
51645144

5165-
if (parseToken(AsmToken::EndOfStatement,
5166-
"unexpected token in '.ifc' directive"))
5145+
if (parseEOL())
51675146
return true;
51685147

51695148
TheCondState.CondMet = ExpectEqual == (Str1.trim() == Str2.trim());
@@ -5222,7 +5201,7 @@ bool AsmParser::parseDirectiveIfdef(SMLoc DirectiveLoc, bool expect_defined) {
52225201
eatToEndOfStatement();
52235202
} else {
52245203
if (check(parseIdentifier(Name), "expected identifier after '.ifdef'") ||
5225-
parseToken(AsmToken::EndOfStatement, "unexpected token in '.ifdef'"))
5204+
parseEOL())
52265205
return true;
52275206

52285207
MCSymbol *Sym = getContext().lookupSymbol(Name);
@@ -5257,8 +5236,7 @@ bool AsmParser::parseDirectiveElseIf(SMLoc DirectiveLoc) {
52575236
if (parseAbsoluteExpression(ExprValue))
52585237
return true;
52595238

5260-
if (parseToken(AsmToken::EndOfStatement,
5261-
"unexpected token in '.elseif' directive"))
5239+
if (parseEOL())
52625240
return true;
52635241

52645242
TheCondState.CondMet = ExprValue;
@@ -5271,8 +5249,7 @@ bool AsmParser::parseDirectiveElseIf(SMLoc DirectiveLoc) {
52715249
/// parseDirectiveElse
52725250
/// ::= .else
52735251
bool AsmParser::parseDirectiveElse(SMLoc DirectiveLoc) {
5274-
if (parseToken(AsmToken::EndOfStatement,
5275-
"unexpected token in '.else' directive"))
5252+
if (parseEOL())
52765253
return true;
52775254

52785255
if (TheCondState.TheCond != AsmCond::IfCond &&
@@ -5359,8 +5336,7 @@ bool AsmParser::parseDirectiveWarning(SMLoc L) {
53595336
/// parseDirectiveEndIf
53605337
/// ::= .endif
53615338
bool AsmParser::parseDirectiveEndIf(SMLoc DirectiveLoc) {
5362-
if (parseToken(AsmToken::EndOfStatement,
5363-
"unexpected token in '.endif' directive"))
5339+
if (parseEOL())
53645340
return true;
53655341

53665342
if ((TheCondState.TheCond == AsmCond::NoCond) || TheCondStack.empty())
@@ -5782,16 +5758,15 @@ bool AsmParser::parseDirectivePrint(SMLoc DirectiveLoc) {
57825758
}
57835759

57845760
bool AsmParser::parseDirectiveAddrsig() {
5785-
if (parseToken(AsmToken::EndOfStatement))
5761+
if (parseEOL())
57865762
return true;
57875763
getStreamer().emitAddrsig();
57885764
return false;
57895765
}
57905766

57915767
bool AsmParser::parseDirectiveAddrsigSym() {
57925768
StringRef Name;
5793-
if (check(parseIdentifier(Name), "expected identifier") ||
5794-
parseToken(AsmToken::EndOfStatement))
5769+
if (check(parseIdentifier(Name), "expected identifier") || parseEOL())
57955770
return true;
57965771
MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
57975772
getStreamer().emitAddrsigSym(Sym);
@@ -6191,7 +6166,7 @@ bool parseAssignmentExpression(StringRef Name, bool allow_redef,
61916166
// a = b
61926167
// b = c
61936168

6194-
if (Parser.parseToken(AsmToken::EndOfStatement))
6169+
if (Parser.parseEOL())
61956170
return true;
61966171

61976172
// Validate that the LHS is allowed to be a variable (either it has not been

0 commit comments

Comments
 (0)