Skip to content

Commit 9a0030e

Browse files
authored
[ARM] Don't use -1 as invalid register number in assembly parser. (llvm#106666)
Use MCRegister instead.
1 parent 9764cf8 commit 9a0030e

File tree

1 file changed

+81
-81
lines changed

1 file changed

+81
-81
lines changed

llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Lines changed: 81 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ class ARMAsmParser : public MCTargetAsmParser {
441441
bool validatetSTMRegList(const MCInst &Inst, const OperandVector &Operands,
442442
unsigned MnemonicOpsEndInd, unsigned ListIndex);
443443

444-
int tryParseRegister(bool AllowOutofBoundReg = false);
444+
MCRegister tryParseRegister(bool AllowOutofBoundReg = false);
445445
bool tryParseRegisterWithWriteBack(OperandVector &);
446446
int tryParseShiftRegister(OperandVector &);
447447
std::optional<ARM_AM::ShiftOpc> tryParseShiftToken();
@@ -4205,7 +4205,7 @@ bool ARMAsmParser::parseRegister(MCRegister &Reg, SMLoc &StartLoc,
42054205
EndLoc = Tok.getEndLoc();
42064206
Reg = tryParseRegister();
42074207

4208-
return Reg == (unsigned)-1;
4208+
return !Reg;
42094209
}
42104210

42114211
ParseStatus ARMAsmParser::tryParseRegister(MCRegister &Reg, SMLoc &StartLoc,
@@ -4216,59 +4216,59 @@ ParseStatus ARMAsmParser::tryParseRegister(MCRegister &Reg, SMLoc &StartLoc,
42164216
}
42174217

42184218
/// Try to parse a register name. The token must be an Identifier when called,
4219-
/// and if it is a register name the token is eaten and the register number is
4220-
/// returned. Otherwise return -1.
4221-
int ARMAsmParser::tryParseRegister(bool AllowOutOfBoundReg) {
4219+
/// and if it is a register name the token is eaten and the register is
4220+
/// returned. Otherwise return an invalid MCRegister.
4221+
MCRegister ARMAsmParser::tryParseRegister(bool AllowOutOfBoundReg) {
42224222
MCAsmParser &Parser = getParser();
42234223
const AsmToken &Tok = Parser.getTok();
4224-
if (Tok.isNot(AsmToken::Identifier)) return -1;
4224+
if (Tok.isNot(AsmToken::Identifier))
4225+
return MCRegister();
42254226

42264227
std::string lowerCase = Tok.getString().lower();
4227-
unsigned RegNum = MatchRegisterName(lowerCase);
4228-
if (!RegNum) {
4229-
RegNum = StringSwitch<unsigned>(lowerCase)
4230-
.Case("r13", ARM::SP)
4231-
.Case("r14", ARM::LR)
4232-
.Case("r15", ARM::PC)
4233-
.Case("ip", ARM::R12)
4234-
// Additional register name aliases for 'gas' compatibility.
4235-
.Case("a1", ARM::R0)
4236-
.Case("a2", ARM::R1)
4237-
.Case("a3", ARM::R2)
4238-
.Case("a4", ARM::R3)
4239-
.Case("v1", ARM::R4)
4240-
.Case("v2", ARM::R5)
4241-
.Case("v3", ARM::R6)
4242-
.Case("v4", ARM::R7)
4243-
.Case("v5", ARM::R8)
4244-
.Case("v6", ARM::R9)
4245-
.Case("v7", ARM::R10)
4246-
.Case("v8", ARM::R11)
4247-
.Case("sb", ARM::R9)
4248-
.Case("sl", ARM::R10)
4249-
.Case("fp", ARM::R11)
4250-
.Default(0);
4251-
}
4252-
if (!RegNum) {
4228+
MCRegister Reg = MatchRegisterName(lowerCase);
4229+
if (!Reg) {
4230+
Reg = StringSwitch<MCRegister>(lowerCase)
4231+
.Case("r13", ARM::SP)
4232+
.Case("r14", ARM::LR)
4233+
.Case("r15", ARM::PC)
4234+
.Case("ip", ARM::R12)
4235+
// Additional register name aliases for 'gas' compatibility.
4236+
.Case("a1", ARM::R0)
4237+
.Case("a2", ARM::R1)
4238+
.Case("a3", ARM::R2)
4239+
.Case("a4", ARM::R3)
4240+
.Case("v1", ARM::R4)
4241+
.Case("v2", ARM::R5)
4242+
.Case("v3", ARM::R6)
4243+
.Case("v4", ARM::R7)
4244+
.Case("v5", ARM::R8)
4245+
.Case("v6", ARM::R9)
4246+
.Case("v7", ARM::R10)
4247+
.Case("v8", ARM::R11)
4248+
.Case("sb", ARM::R9)
4249+
.Case("sl", ARM::R10)
4250+
.Case("fp", ARM::R11)
4251+
.Default(MCRegister());
4252+
}
4253+
if (!Reg) {
42534254
// Check for aliases registered via .req. Canonicalize to lower case.
42544255
// That's more consistent since register names are case insensitive, and
42554256
// it's how the original entry was passed in from MC/MCParser/AsmParser.
42564257
auto Entry = RegisterReqs.find(lowerCase);
42574258
// If no match, return failure.
42584259
if (Entry == RegisterReqs.end())
4259-
return -1;
4260+
return MCRegister();
42604261
Parser.Lex(); // Eat identifier token.
42614262
return Entry->getValue();
42624263
}
42634264

42644265
// Some FPUs only have 16 D registers, so D16-D31 are invalid
4265-
if (!AllowOutOfBoundReg && !hasD32() && RegNum >= ARM::D16 &&
4266-
RegNum <= ARM::D31)
4267-
return -1;
4266+
if (!AllowOutOfBoundReg && !hasD32() && Reg >= ARM::D16 && Reg <= ARM::D31)
4267+
return MCRegister();
42684268

42694269
Parser.Lex(); // Eat identifier token.
42704270

4271-
return RegNum;
4271+
return Reg;
42724272
}
42734273

42744274
std::optional<ARM_AM::ShiftOpc> ARMAsmParser::tryParseShiftToken() {
@@ -4356,7 +4356,7 @@ int ARMAsmParser::tryParseShiftRegister(OperandVector &Operands) {
43564356
SMLoc L = Parser.getTok().getLoc();
43574357
EndLoc = Parser.getTok().getEndLoc();
43584358
ShiftReg = tryParseRegister();
4359-
if (ShiftReg == -1) {
4359+
if (!ShiftReg) {
43604360
Error(L, "expected immediate or register in shift operand");
43614361
return -1;
43624362
}
@@ -4387,12 +4387,11 @@ bool ARMAsmParser::tryParseRegisterWithWriteBack(OperandVector &Operands) {
43874387
MCAsmParser &Parser = getParser();
43884388
SMLoc RegStartLoc = Parser.getTok().getLoc();
43894389
SMLoc RegEndLoc = Parser.getTok().getEndLoc();
4390-
int RegNo = tryParseRegister();
4391-
if (RegNo == -1)
4390+
MCRegister Reg = tryParseRegister();
4391+
if (!Reg)
43924392
return true;
43934393

4394-
Operands.push_back(
4395-
ARMOperand::CreateReg(RegNo, RegStartLoc, RegEndLoc, *this));
4394+
Operands.push_back(ARMOperand::CreateReg(Reg, RegStartLoc, RegEndLoc, *this));
43964395

43974396
const AsmToken &ExclaimTok = Parser.getTok();
43984397
if (ExclaimTok.is(AsmToken::Exclaim)) {
@@ -4619,8 +4618,8 @@ bool ARMAsmParser::parseRegisterList(OperandVector &Operands, bool EnforceOrder,
46194618

46204619
// Check the first register in the list to see what register class
46214620
// this is a list of.
4622-
int Reg = tryParseRegister();
4623-
if (Reg == -1)
4621+
MCRegister Reg = tryParseRegister();
4622+
if (!Reg)
46244623
return Error(RegLoc, "register expected");
46254624
if (!AllowRAAC && Reg == ARM::RA_AUTH_CODE)
46264625
return Error(RegLoc, "pseudo-register not allowed");
@@ -4634,7 +4633,7 @@ bool ARMAsmParser::parseRegisterList(OperandVector &Operands, bool EnforceOrder,
46344633
Reg = getDRegFromQReg(Reg);
46354634
EReg = MRI->getEncodingValue(Reg);
46364635
Registers.emplace_back(EReg, Reg);
4637-
++Reg;
4636+
Reg = Reg + 1;
46384637
}
46394638
const MCRegisterClass *RC;
46404639
if (Reg == ARM::RA_AUTH_CODE ||
@@ -4663,8 +4662,8 @@ bool ARMAsmParser::parseRegisterList(OperandVector &Operands, bool EnforceOrder,
46634662
return Error(RegLoc, "pseudo-register not allowed");
46644663
Parser.Lex(); // Eat the minus.
46654664
SMLoc AfterMinusLoc = Parser.getTok().getLoc();
4666-
int EndReg = tryParseRegister(AllowOutOfBoundReg);
4667-
if (EndReg == -1)
4665+
MCRegister EndReg = tryParseRegister(AllowOutOfBoundReg);
4666+
if (!EndReg)
46684667
return Error(AfterMinusLoc, "register expected");
46694668
if (EndReg == ARM::RA_AUTH_CODE)
46704669
return Error(AfterMinusLoc, "pseudo-register not allowed");
@@ -4696,10 +4695,10 @@ bool ARMAsmParser::parseRegisterList(OperandVector &Operands, bool EnforceOrder,
46964695
}
46974696
Parser.Lex(); // Eat the comma.
46984697
RegLoc = Parser.getTok().getLoc();
4699-
int OldReg = Reg;
4698+
MCRegister OldReg = Reg;
47004699
const AsmToken RegTok = Parser.getTok();
47014700
Reg = tryParseRegister(AllowOutOfBoundReg);
4702-
if (Reg == -1)
4701+
if (!Reg)
47034702
return Error(RegLoc, "register expected");
47044703
if (!AllowRAAC && Reg == ARM::RA_AUTH_CODE)
47054704
return Error(RegLoc, "pseudo-register not allowed");
@@ -4755,7 +4754,8 @@ bool ARMAsmParser::parseRegisterList(OperandVector &Operands, bool EnforceOrder,
47554754
") in register list");
47564755
}
47574756
if (isQReg) {
4758-
EReg = MRI->getEncodingValue(++Reg);
4757+
Reg = Reg + 1;
4758+
EReg = MRI->getEncodingValue(Reg);
47594759
Registers.emplace_back(EReg, Reg);
47604760
}
47614761
}
@@ -4835,8 +4835,8 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
48354835
// use the custom matcher to convert to list if necessary
48364836
if (!hasMVE() && Parser.getTok().is(AsmToken::Identifier)) {
48374837
SMLoc E = Parser.getTok().getEndLoc();
4838-
int Reg = tryParseRegister();
4839-
if (Reg == -1)
4838+
MCRegister Reg = tryParseRegister();
4839+
if (!Reg)
48404840
return ParseStatus::NoMatch;
48414841
if (ARMMCRegisterClasses[ARM::DPRRegClassID].contains(Reg)) {
48424842
ParseStatus Res = parseVectorLane(LaneKind, LaneIndex, E);
@@ -4889,12 +4889,12 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
48894889
Parser.Lex(); // Eat '{' token.
48904890
SMLoc RegLoc = Parser.getTok().getLoc();
48914891

4892-
int Reg = tryParseRegister();
4893-
if (Reg == -1)
4892+
MCRegister Reg = tryParseRegister();
4893+
if (!Reg)
48944894
return Error(RegLoc, "register expected");
48954895
unsigned Count = 1;
48964896
int Spacing = 0;
4897-
unsigned FirstReg = Reg;
4897+
MCRegister FirstReg = Reg;
48984898

48994899
if (hasMVE() && !ARMMCRegisterClasses[ARM::MQPRRegClassID].contains(Reg))
49004900
return Error(Parser.getTok().getLoc(),
@@ -4905,7 +4905,7 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
49054905
FirstReg = Reg = getDRegFromQReg(Reg);
49064906
Spacing = 1; // double-spacing requires explicit D registers, otherwise
49074907
// it's ambiguous with four-register single spaced.
4908-
++Reg;
4908+
Reg = Reg + 1;
49094909
++Count;
49104910
}
49114911

@@ -4923,8 +4923,8 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
49234923
"sequential registers in double spaced list");
49244924
Parser.Lex(); // Eat the minus.
49254925
SMLoc AfterMinusLoc = Parser.getTok().getLoc();
4926-
int EndReg = tryParseRegister();
4927-
if (EndReg == -1)
4926+
MCRegister EndReg = tryParseRegister();
4927+
if (!EndReg)
49284928
return Error(AfterMinusLoc, "register expected");
49294929
// Allow Q regs and just interpret them as the two D sub-registers.
49304930
if (!hasMVE() && ARMMCRegisterClasses[ARM::QPRRegClassID].contains(EndReg))
@@ -4957,9 +4957,9 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
49574957
}
49584958
Parser.Lex(); // Eat the comma.
49594959
RegLoc = Parser.getTok().getLoc();
4960-
int OldReg = Reg;
4960+
MCRegister OldReg = Reg;
49614961
Reg = tryParseRegister();
4962-
if (Reg == -1)
4962+
if (!Reg)
49634963
return Error(RegLoc, "register expected");
49644964

49654965
if (hasMVE()) {
@@ -4983,7 +4983,7 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
49834983
Reg = getDRegFromQReg(Reg);
49844984
if (Reg != OldReg + 1)
49854985
return Error(RegLoc, "non-contiguous register range");
4986-
++Reg;
4986+
Reg = Reg + 1;
49874987
Count += 2;
49884988
// Parse the lane specifier if present.
49894989
VectorLaneTy NextLaneKind;
@@ -5674,8 +5674,8 @@ ParseStatus ARMAsmParser::parsePostIdxReg(OperandVector &Operands) {
56745674
}
56755675

56765676
SMLoc E = Parser.getTok().getEndLoc();
5677-
int Reg = tryParseRegister();
5678-
if (Reg == -1) {
5677+
MCRegister Reg = tryParseRegister();
5678+
if (!Reg) {
56795679
if (!haveEaten)
56805680
return ParseStatus::NoMatch;
56815681
return Error(Parser.getTok().getLoc(), "register expected");
@@ -5752,8 +5752,8 @@ ParseStatus ARMAsmParser::parseAM3Offset(OperandVector &Operands) {
57525752
}
57535753

57545754
Tok = Parser.getTok();
5755-
int Reg = tryParseRegister();
5756-
if (Reg == -1) {
5755+
MCRegister Reg = tryParseRegister();
5756+
if (!Reg) {
57575757
if (!haveEaten)
57585758
return ParseStatus::NoMatch;
57595759
return Error(Tok.getLoc(), "register expected");
@@ -5935,8 +5935,8 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
59355935
Parser.Lex(); // Eat left bracket token.
59365936

59375937
const AsmToken &BaseRegTok = Parser.getTok();
5938-
int BaseRegNum = tryParseRegister();
5939-
if (BaseRegNum == -1)
5938+
MCRegister BaseReg = tryParseRegister();
5939+
if (!BaseReg)
59405940
return Error(BaseRegTok.getLoc(), "register expected");
59415941

59425942
// The next token must either be a comma, a colon or a closing bracket.
@@ -5950,7 +5950,7 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
59505950
Parser.Lex(); // Eat right bracket token.
59515951

59525952
Operands.push_back(ARMOperand::CreateMem(
5953-
BaseRegNum, nullptr, 0, ARM_AM::no_shift, 0, 0, false, S, E, *this));
5953+
BaseReg, nullptr, 0, ARM_AM::no_shift, 0, 0, false, S, E, *this));
59545954

59555955
// If there's a pre-indexing writeback marker, '!', just add it as a token
59565956
// operand. It's rather odd, but syntactically valid.
@@ -6006,7 +6006,7 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
60066006

60076007
// Don't worry about range checking the value here. That's handled by
60086008
// the is*() predicates.
6009-
Operands.push_back(ARMOperand::CreateMem(BaseRegNum, nullptr, 0,
6009+
Operands.push_back(ARMOperand::CreateMem(BaseReg, nullptr, 0,
60106010
ARM_AM::no_shift, 0, Align, false,
60116011
S, E, *this, AlignmentLoc));
60126012

@@ -6050,7 +6050,7 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
60506050
AdjustedOffset = CE;
60516051
} else
60526052
AdjustedOffset = Offset;
6053-
Operands.push_back(ARMOperand::CreateMem(BaseRegNum, AdjustedOffset, 0,
6053+
Operands.push_back(ARMOperand::CreateMem(BaseReg, AdjustedOffset, 0,
60546054
ARM_AM::no_shift, 0, 0, false, S,
60556055
E, *this));
60566056

@@ -6082,8 +6082,8 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
60826082
}
60836083

60846084
E = Parser.getTok().getLoc();
6085-
int OffsetRegNum = tryParseRegister();
6086-
if (OffsetRegNum == -1)
6085+
MCRegister OffsetReg = tryParseRegister();
6086+
if (!OffsetReg)
60876087
return Error(E, "register expected");
60886088

60896089
// If there's a shift operator, handle it.
@@ -6101,7 +6101,7 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
61016101
E = Parser.getTok().getEndLoc();
61026102
Parser.Lex(); // Eat right bracket token.
61036103

6104-
Operands.push_back(ARMOperand::CreateMem(BaseRegNum, nullptr, OffsetRegNum,
6104+
Operands.push_back(ARMOperand::CreateMem(BaseReg, nullptr, OffsetReg,
61056105
ShiftType, ShiftImm, 0, isNegative,
61066106
S, E, *this));
61076107

@@ -12077,16 +12077,16 @@ bool ARMAsmParser::parseDirectiveSetFP(SMLoc L) {
1207712077

1207812078
// Parse fpreg
1207912079
SMLoc FPRegLoc = Parser.getTok().getLoc();
12080-
int FPReg = tryParseRegister();
12080+
MCRegister FPReg = tryParseRegister();
1208112081

12082-
if (check(FPReg == -1, FPRegLoc, "frame pointer register expected") ||
12082+
if (check(!FPReg, FPRegLoc, "frame pointer register expected") ||
1208312083
Parser.parseComma())
1208412084
return true;
1208512085

1208612086
// Parse spreg
1208712087
SMLoc SPRegLoc = Parser.getTok().getLoc();
12088-
int SPReg = tryParseRegister();
12089-
if (check(SPReg == -1, SPRegLoc, "stack pointer register expected") ||
12088+
MCRegister SPReg = tryParseRegister();
12089+
if (check(!SPReg, SPRegLoc, "stack pointer register expected") ||
1209012090
check(SPReg != ARM::SP && SPReg != UC.getFPReg(), SPRegLoc,
1209112091
"register should be either $sp or the latest fp register"))
1209212092
return true;
@@ -12404,8 +12404,8 @@ bool ARMAsmParser::parseDirectiveMovSP(SMLoc L) {
1240412404
return Error(L, "unexpected .movsp directive");
1240512405

1240612406
SMLoc SPRegLoc = Parser.getTok().getLoc();
12407-
int SPReg = tryParseRegister();
12408-
if (SPReg == -1)
12407+
MCRegister SPReg = tryParseRegister();
12408+
if (!SPReg)
1240912409
return Error(SPRegLoc, "register expected");
1241012410
if (SPReg == ARM::SP || SPReg == ARM::PC)
1241112411
return Error(SPRegLoc, "sp and pc are not permitted in .movsp directive");
@@ -12542,8 +12542,8 @@ bool ARMAsmParser::parseDirectiveSEHSaveRegs(SMLoc L, bool Wide) {
1254212542
/// parseDirectiveSEHSaveSP
1254312543
/// ::= .seh_save_sp
1254412544
bool ARMAsmParser::parseDirectiveSEHSaveSP(SMLoc L) {
12545-
int Reg = tryParseRegister();
12546-
if (Reg == -1 || !MRI->getRegClass(ARM::GPRRegClassID).contains(Reg))
12545+
MCRegister Reg = tryParseRegister();
12546+
if (!Reg || !MRI->getRegClass(ARM::GPRRegClassID).contains(Reg))
1254712547
return Error(L, "expected GPR");
1254812548
unsigned Index = MRI->getEncodingValue(Reg);
1254912549
if (Index > 14 || Index == 13)

0 commit comments

Comments
 (0)