Skip to content

Commit 18e09da

Browse files
committed
[Mips] Rework relocation expression parsing
A relocation expression might be used in an immediate operand or a memory offset. https://reviews.llvm.org/D23110 , which intended to generalize chained relocation operators (%hi(%neg(%gp_rel(x)))), inappropriated introduced intrusive changes to the generic code. This patch drops the intrusive changes and significantly simplifies the code. The new style is similar to pre-D23110 but much cleaner. Some weird expressions allowed by gas are not supported for simplicity, e.g. "%lo foo", "(%lo(foo))", "%lo(foo)+1". "(%lo(foo))", while previously parsed, is not used in practice. "%lo(foo)+1" and "%lo(2*4)+foo" were previously parsed but would lead to an error anyway as the expression is not relocatable (`evaluateSymbolicAdd` does not fold the Add when RefKind are different).
1 parent 6d847b1 commit 18e09da

File tree

11 files changed

+86
-250
lines changed

11 files changed

+86
-250
lines changed

llvm/include/llvm/MC/MCAsmInfo.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -432,10 +432,6 @@ class MCAsmInfo {
432432
/// expressions as logical rather than arithmetic.
433433
bool UseLogicalShr = true;
434434

435-
// If true, then the lexer and expression parser will support %neg(),
436-
// %hi(), and similar unary operators.
437-
bool HasMipsExpressions = false;
438-
439435
// If true, use Motorola-style integers in Assembly (ex. $0ac).
440436
bool UseMotorolaIntegers = false;
441437

@@ -723,7 +719,6 @@ class MCAsmInfo {
723719

724720
bool shouldUseLogicalShr() const { return UseLogicalShr; }
725721

726-
bool hasMipsExpressions() const { return HasMipsExpressions; }
727722
bool shouldUseMotorolaIntegers() const { return UseMotorolaIntegers; }
728723
};
729724

llvm/include/llvm/MC/MCAsmMacro.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,6 @@ class AsmToken {
5252
Amp, AmpAmp, Exclaim, ExclaimEqual, Percent, Hash,
5353
Less, LessEqual, LessLess, LessGreater,
5454
Greater, GreaterEqual, GreaterGreater, At, MinusGreater,
55-
56-
// MIPS unary expression operators such as %neg.
57-
PercentCall16, PercentCall_Hi, PercentCall_Lo, PercentDtprel_Hi,
58-
PercentDtprel_Lo, PercentGot, PercentGot_Disp, PercentGot_Hi, PercentGot_Lo,
59-
PercentGot_Ofst, PercentGot_Page, PercentGottprel, PercentGp_Rel, PercentHi,
60-
PercentHigher, PercentHighest, PercentLo, PercentNeg, PercentPcrel_Hi,
61-
PercentPcrel_Lo, PercentTlsgd, PercentTlsldm, PercentTprel_Hi,
62-
PercentTprel_Lo
6355
};
6456

6557
private:

llvm/include/llvm/MC/MCParser/MCTargetAsmParser.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -524,12 +524,6 @@ class MCTargetAsmParser : public MCAsmParserExtension {
524524
/// output streamer, if the target does not emit them immediately.
525525
virtual void flushPendingInstructions(MCStreamer &Out) {}
526526

527-
virtual const MCExpr *createTargetUnaryExpr(const MCExpr *E,
528-
AsmToken::TokenKind OperatorToken,
529-
MCContext &Ctx) {
530-
return nullptr;
531-
}
532-
533527
// For any initialization at the beginning of parsing.
534528
virtual void onBeginOfFile() {}
535529

llvm/lib/MC/MCParser/AsmLexer.cpp

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -879,45 +879,6 @@ AsmToken AsmLexer::LexToken() {
879879
if (LexMotorolaIntegers && (*CurPtr == '0' || *CurPtr == '1')) {
880880
return LexDigit();
881881
}
882-
883-
if (MAI.hasMipsExpressions()) {
884-
AsmToken::TokenKind Operator;
885-
unsigned OperatorLength;
886-
887-
std::tie(Operator, OperatorLength) =
888-
StringSwitch<std::pair<AsmToken::TokenKind, unsigned>>(
889-
StringRef(CurPtr))
890-
.StartsWith("call16", {AsmToken::PercentCall16, 7})
891-
.StartsWith("call_hi", {AsmToken::PercentCall_Hi, 8})
892-
.StartsWith("call_lo", {AsmToken::PercentCall_Lo, 8})
893-
.StartsWith("dtprel_hi", {AsmToken::PercentDtprel_Hi, 10})
894-
.StartsWith("dtprel_lo", {AsmToken::PercentDtprel_Lo, 10})
895-
.StartsWith("got_disp", {AsmToken::PercentGot_Disp, 9})
896-
.StartsWith("got_hi", {AsmToken::PercentGot_Hi, 7})
897-
.StartsWith("got_lo", {AsmToken::PercentGot_Lo, 7})
898-
.StartsWith("got_ofst", {AsmToken::PercentGot_Ofst, 9})
899-
.StartsWith("got_page", {AsmToken::PercentGot_Page, 9})
900-
.StartsWith("gottprel", {AsmToken::PercentGottprel, 9})
901-
.StartsWith("got", {AsmToken::PercentGot, 4})
902-
.StartsWith("gp_rel", {AsmToken::PercentGp_Rel, 7})
903-
.StartsWith("higher", {AsmToken::PercentHigher, 7})
904-
.StartsWith("highest", {AsmToken::PercentHighest, 8})
905-
.StartsWith("hi", {AsmToken::PercentHi, 3})
906-
.StartsWith("lo", {AsmToken::PercentLo, 3})
907-
.StartsWith("neg", {AsmToken::PercentNeg, 4})
908-
.StartsWith("pcrel_hi", {AsmToken::PercentPcrel_Hi, 9})
909-
.StartsWith("pcrel_lo", {AsmToken::PercentPcrel_Lo, 9})
910-
.StartsWith("tlsgd", {AsmToken::PercentTlsgd, 6})
911-
.StartsWith("tlsldm", {AsmToken::PercentTlsldm, 7})
912-
.StartsWith("tprel_hi", {AsmToken::PercentTprel_Hi, 9})
913-
.StartsWith("tprel_lo", {AsmToken::PercentTprel_Lo, 9})
914-
.Default({AsmToken::Percent, 1});
915-
916-
if (Operator != AsmToken::Percent) {
917-
CurPtr += OperatorLength - 1;
918-
return AsmToken(Operator, StringRef(TokStart, OperatorLength));
919-
}
920-
}
921882
return AsmToken(AsmToken::Percent, StringRef(TokStart, 1));
922883
case '/':
923884
IsAtStartOfStatement = OldIsAtStartOfStatement;

llvm/lib/MC/MCParser/AsmParser.cpp

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,42 +1344,6 @@ bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc,
13441344
return true;
13451345
Res = MCUnaryExpr::createNot(Res, getContext(), FirstTokenLoc);
13461346
return false;
1347-
// MIPS unary expression operators. The lexer won't generate these tokens if
1348-
// MCAsmInfo::HasMipsExpressions is false for the target.
1349-
case AsmToken::PercentCall16:
1350-
case AsmToken::PercentCall_Hi:
1351-
case AsmToken::PercentCall_Lo:
1352-
case AsmToken::PercentDtprel_Hi:
1353-
case AsmToken::PercentDtprel_Lo:
1354-
case AsmToken::PercentGot:
1355-
case AsmToken::PercentGot_Disp:
1356-
case AsmToken::PercentGot_Hi:
1357-
case AsmToken::PercentGot_Lo:
1358-
case AsmToken::PercentGot_Ofst:
1359-
case AsmToken::PercentGot_Page:
1360-
case AsmToken::PercentGottprel:
1361-
case AsmToken::PercentGp_Rel:
1362-
case AsmToken::PercentHi:
1363-
case AsmToken::PercentHigher:
1364-
case AsmToken::PercentHighest:
1365-
case AsmToken::PercentLo:
1366-
case AsmToken::PercentNeg:
1367-
case AsmToken::PercentPcrel_Hi:
1368-
case AsmToken::PercentPcrel_Lo:
1369-
case AsmToken::PercentTlsgd:
1370-
case AsmToken::PercentTlsldm:
1371-
case AsmToken::PercentTprel_Hi:
1372-
case AsmToken::PercentTprel_Lo:
1373-
Lex(); // Eat the operator.
1374-
if (Lexer.isNot(AsmToken::LParen))
1375-
return TokError("expected '(' after operator");
1376-
Lex(); // Eat the operator.
1377-
if (parseExpression(Res, EndLoc))
1378-
return true;
1379-
if (parseRParen())
1380-
return true;
1381-
Res = getTargetParser().createTargetUnaryExpr(Res, FirstTokenKind, Ctx);
1382-
return !Res;
13831347
}
13841348
}
13851349

llvm/lib/MC/MCParser/MCAsmLexer.cpp

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -96,30 +96,6 @@ void AsmToken::dump(raw_ostream &OS) const {
9696
case AsmToken::Space: OS << "Space"; break;
9797
case AsmToken::Star: OS << "Star"; break;
9898
case AsmToken::Tilde: OS << "Tilde"; break;
99-
case AsmToken::PercentCall16: OS << "PercentCall16"; break;
100-
case AsmToken::PercentCall_Hi: OS << "PercentCall_Hi"; break;
101-
case AsmToken::PercentCall_Lo: OS << "PercentCall_Lo"; break;
102-
case AsmToken::PercentDtprel_Hi: OS << "PercentDtprel_Hi"; break;
103-
case AsmToken::PercentDtprel_Lo: OS << "PercentDtprel_Lo"; break;
104-
case AsmToken::PercentGot: OS << "PercentGot"; break;
105-
case AsmToken::PercentGot_Disp: OS << "PercentGot_Disp"; break;
106-
case AsmToken::PercentGot_Hi: OS << "PercentGot_Hi"; break;
107-
case AsmToken::PercentGot_Lo: OS << "PercentGot_Lo"; break;
108-
case AsmToken::PercentGot_Ofst: OS << "PercentGot_Ofst"; break;
109-
case AsmToken::PercentGot_Page: OS << "PercentGot_Page"; break;
110-
case AsmToken::PercentGottprel: OS << "PercentGottprel"; break;
111-
case AsmToken::PercentGp_Rel: OS << "PercentGp_Rel"; break;
112-
case AsmToken::PercentHi: OS << "PercentHi"; break;
113-
case AsmToken::PercentHigher: OS << "PercentHigher"; break;
114-
case AsmToken::PercentHighest: OS << "PercentHighest"; break;
115-
case AsmToken::PercentLo: OS << "PercentLo"; break;
116-
case AsmToken::PercentNeg: OS << "PercentNeg"; break;
117-
case AsmToken::PercentPcrel_Hi: OS << "PercentPcrel_Hi"; break;
118-
case AsmToken::PercentPcrel_Lo: OS << "PercentPcrel_Lo"; break;
119-
case AsmToken::PercentTlsgd: OS << "PercentTlsgd"; break;
120-
case AsmToken::PercentTlsldm: OS << "PercentTlsldm"; break;
121-
case AsmToken::PercentTprel_Hi: OS << "PercentTprel_Hi"; break;
122-
case AsmToken::PercentTprel_Lo: OS << "PercentTprel_Lo"; break;
12399
}
124100

125101
// Print the token string.

llvm/lib/MC/MCParser/MasmParser.cpp

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1610,42 +1610,6 @@ bool MasmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc,
16101610
return true;
16111611
Res = MCUnaryExpr::createNot(Res, getContext(), FirstTokenLoc);
16121612
return false;
1613-
// MIPS unary expression operators. The lexer won't generate these tokens if
1614-
// MCAsmInfo::HasMipsExpressions is false for the target.
1615-
case AsmToken::PercentCall16:
1616-
case AsmToken::PercentCall_Hi:
1617-
case AsmToken::PercentCall_Lo:
1618-
case AsmToken::PercentDtprel_Hi:
1619-
case AsmToken::PercentDtprel_Lo:
1620-
case AsmToken::PercentGot:
1621-
case AsmToken::PercentGot_Disp:
1622-
case AsmToken::PercentGot_Hi:
1623-
case AsmToken::PercentGot_Lo:
1624-
case AsmToken::PercentGot_Ofst:
1625-
case AsmToken::PercentGot_Page:
1626-
case AsmToken::PercentGottprel:
1627-
case AsmToken::PercentGp_Rel:
1628-
case AsmToken::PercentHi:
1629-
case AsmToken::PercentHigher:
1630-
case AsmToken::PercentHighest:
1631-
case AsmToken::PercentLo:
1632-
case AsmToken::PercentNeg:
1633-
case AsmToken::PercentPcrel_Hi:
1634-
case AsmToken::PercentPcrel_Lo:
1635-
case AsmToken::PercentTlsgd:
1636-
case AsmToken::PercentTlsldm:
1637-
case AsmToken::PercentTprel_Hi:
1638-
case AsmToken::PercentTprel_Lo:
1639-
Lex(); // Eat the operator.
1640-
if (Lexer.isNot(AsmToken::LParen))
1641-
return TokError("expected '(' after operator");
1642-
Lex(); // Eat the operator.
1643-
if (parseExpression(Res, EndLoc))
1644-
return true;
1645-
if (parseRParen())
1646-
return true;
1647-
Res = getTargetParser().createTargetUnaryExpr(Res, FirstTokenKind, Ctx);
1648-
return !Res;
16491613
}
16501614
}
16511615

0 commit comments

Comments
 (0)