aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2025-03-02 16:20:59 -0800
committerFangrui Song <i@maskray.me>2025-03-02 16:20:59 -0800
commit8c7c791284877e36f73c41ffa56b52c13e613993 (patch)
treef703b46d9e702540caec47e6c0d0792759d11387 /llvm/lib
parent3c80d9b8dda38162016f72defe24baf79d4cf0ef (diff)
downloadllvm-8c7c791284877e36f73c41ffa56b52c13e613993.zip
llvm-8c7c791284877e36f73c41ffa56b52c13e613993.tar.gz
llvm-8c7c791284877e36f73c41ffa56b52c13e613993.tar.bz2
[MCParser] Use getVariantKindForName and move PPC specific VariantKind to PowerPC/
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/MC/MCExpr.cpp64
-rw-r--r--llvm/lib/MC/MCParser/AsmParser.cpp8
-rw-r--r--llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp77
3 files changed, 83 insertions, 66 deletions
diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp
index ede7655..f2243ba 100644
--- a/llvm/lib/MC/MCExpr.cpp
+++ b/llvm/lib/MC/MCExpr.cpp
@@ -431,6 +431,8 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
llvm_unreachable("Invalid variant kind");
}
+// FIXME: All variant kinds are target-specific. Move them to
+// *AsmParser::getVariantKindForName and remove this function.
MCSymbolRefExpr::VariantKind
MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
return StringSwitch<VariantKind>(Name.lower())
@@ -467,68 +469,6 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
.Case("size", VK_SIZE)
.Case("abs8", VK_X86_ABS8)
.Case("pltoff", VK_X86_PLTOFF)
- .Case("l", VK_PPC_LO)
- .Case("h", VK_PPC_HI)
- .Case("ha", VK_PPC_HA)
- .Case("high", VK_PPC_HIGH)
- .Case("higha", VK_PPC_HIGHA)
- .Case("higher", VK_PPC_HIGHER)
- .Case("highera", VK_PPC_HIGHERA)
- .Case("highest", VK_PPC_HIGHEST)
- .Case("highesta", VK_PPC_HIGHESTA)
- .Case("got@l", VK_PPC_GOT_LO)
- .Case("got@h", VK_PPC_GOT_HI)
- .Case("got@ha", VK_PPC_GOT_HA)
- .Case("local", VK_PPC_LOCAL)
- .Case("tocbase", VK_PPC_TOCBASE)
- .Case("toc", VK_PPC_TOC)
- .Case("toc@l", VK_PPC_TOC_LO)
- .Case("toc@h", VK_PPC_TOC_HI)
- .Case("toc@ha", VK_PPC_TOC_HA)
- .Case("u", VK_PPC_U)
- .Case("l", VK_PPC_L)
- .Case("tls", VK_PPC_TLS)
- .Case("dtpmod", VK_PPC_DTPMOD)
- .Case("tprel@l", VK_PPC_TPREL_LO)
- .Case("tprel@h", VK_PPC_TPREL_HI)
- .Case("tprel@ha", VK_PPC_TPREL_HA)
- .Case("tprel@high", VK_PPC_TPREL_HIGH)
- .Case("tprel@higha", VK_PPC_TPREL_HIGHA)
- .Case("tprel@higher", VK_PPC_TPREL_HIGHER)
- .Case("tprel@highera", VK_PPC_TPREL_HIGHERA)
- .Case("tprel@highest", VK_PPC_TPREL_HIGHEST)
- .Case("tprel@highesta", VK_PPC_TPREL_HIGHESTA)
- .Case("dtprel@l", VK_PPC_DTPREL_LO)
- .Case("dtprel@h", VK_PPC_DTPREL_HI)
- .Case("dtprel@ha", VK_PPC_DTPREL_HA)
- .Case("dtprel@high", VK_PPC_DTPREL_HIGH)
- .Case("dtprel@higha", VK_PPC_DTPREL_HIGHA)
- .Case("dtprel@higher", VK_PPC_DTPREL_HIGHER)
- .Case("dtprel@highera", VK_PPC_DTPREL_HIGHERA)
- .Case("dtprel@highest", VK_PPC_DTPREL_HIGHEST)
- .Case("dtprel@highesta", VK_PPC_DTPREL_HIGHESTA)
- .Case("got@tprel", VK_PPC_GOT_TPREL)
- .Case("got@tprel@l", VK_PPC_GOT_TPREL_LO)
- .Case("got@tprel@h", VK_PPC_GOT_TPREL_HI)
- .Case("got@tprel@ha", VK_PPC_GOT_TPREL_HA)
- .Case("got@dtprel", VK_PPC_GOT_DTPREL)
- .Case("got@dtprel@l", VK_PPC_GOT_DTPREL_LO)
- .Case("got@dtprel@h", VK_PPC_GOT_DTPREL_HI)
- .Case("got@dtprel@ha", VK_PPC_GOT_DTPREL_HA)
- .Case("got@tlsgd", VK_PPC_GOT_TLSGD)
- .Case("got@tlsgd@l", VK_PPC_GOT_TLSGD_LO)
- .Case("got@tlsgd@h", VK_PPC_GOT_TLSGD_HI)
- .Case("got@tlsgd@ha", VK_PPC_GOT_TLSGD_HA)
- .Case("got@tlsld", VK_PPC_GOT_TLSLD)
- .Case("got@tlsld@l", VK_PPC_GOT_TLSLD_LO)
- .Case("got@tlsld@h", VK_PPC_GOT_TLSLD_HI)
- .Case("got@tlsld@ha", VK_PPC_GOT_TLSLD_HA)
- .Case("got@pcrel", VK_PPC_GOT_PCREL)
- .Case("got@tlsgd@pcrel", VK_PPC_GOT_TLSGD_PCREL)
- .Case("got@tlsld@pcrel", VK_PPC_GOT_TLSLD_PCREL)
- .Case("got@tprel@pcrel", VK_PPC_GOT_TPREL_PCREL)
- .Case("tls@pcrel", VK_PPC_TLS_PCREL)
- .Case("notoc", VK_PPC_NOTOC)
.Case("gdgot", VK_Hexagon_GD_GOT)
.Case("gdplt", VK_Hexagon_GD_PLT)
.Case("iegot", VK_Hexagon_IE_GOT)
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp
index be90ac3..fca6b378 100644
--- a/llvm/lib/MC/MCParser/AsmParser.cpp
+++ b/llvm/lib/MC/MCParser/AsmParser.cpp
@@ -1279,7 +1279,7 @@ bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc,
std::pair<StringRef, StringRef> Split = IDVal.split('@');
MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
if (Split.first.size() != IDVal.size()) {
- Variant = MCSymbolRefExpr::getVariantKindForName(Split.second);
+ Variant = getTargetParser().getVariantKindForName(Split.second);
if (Variant == MCSymbolRefExpr::VK_Invalid)
return TokError("invalid variant '" + Split.second + "'");
IDVal = Split.first;
@@ -1458,8 +1458,8 @@ static std::string angleBracketString(StringRef AltMacroStr) {
bool AsmParser::parseExpression(const MCExpr *&Res, SMLoc &EndLoc) {
// Parse the expression.
Res = nullptr;
- if (getTargetParser().parsePrimaryExpr(Res, EndLoc) ||
- parseBinOpRHS(1, Res, EndLoc))
+ auto &TS = getTargetParser();
+ if (TS.parsePrimaryExpr(Res, EndLoc) || parseBinOpRHS(1, Res, EndLoc))
return true;
// As a special case, we support 'a op b @ modifier' by rewriting the
@@ -1470,7 +1470,7 @@ bool AsmParser::parseExpression(const MCExpr *&Res, SMLoc &EndLoc) {
return TokError("unexpected symbol modifier following '@'");
MCSymbolRefExpr::VariantKind Variant =
- MCSymbolRefExpr::getVariantKindForName(getTok().getIdentifier());
+ TS.getVariantKindForName(getTok().getIdentifier());
if (Variant == MCSymbolRefExpr::VK_Invalid)
return TokError("invalid variant '" + getTok().getIdentifier() + "'");
diff --git a/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp b/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
index a364653..8f30fd5 100644
--- a/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
+++ b/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
@@ -156,6 +156,8 @@ public:
unsigned validateTargetOperandClass(MCParsedAsmOperand &Op,
unsigned Kind) override;
+ MCSymbolRefExpr::VariantKind
+ getVariantKindForName(StringRef Name) const override;
const MCExpr *applyModifierToExpr(const MCExpr *E,
MCSymbolRefExpr::VariantKind,
MCContext &Ctx) override;
@@ -1901,6 +1903,81 @@ unsigned PPCAsmParser::validateTargetOperandClass(MCParsedAsmOperand &AsmOp,
return Match_InvalidOperand;
}
+MCSymbolRefExpr::VariantKind
+PPCAsmParser::getVariantKindForName(StringRef Name) const {
+ return StringSwitch<MCSymbolRefExpr::VariantKind>(Name.lower())
+ .Case("dtprel", MCSymbolRefExpr::VK_DTPREL)
+ .Case("got", MCSymbolRefExpr::VK_GOT)
+ .Case("pcrel", MCSymbolRefExpr::VK_PCREL)
+ .Case("plt", MCSymbolRefExpr::VK_PLT)
+ .Case("tlsgd", MCSymbolRefExpr::VK_TLSGD)
+ .Case("tlsld", MCSymbolRefExpr::VK_TLSLD)
+ .Case("tprel", MCSymbolRefExpr::VK_TPREL)
+ .Case("l", MCSymbolRefExpr::VK_PPC_LO)
+ .Case("h", MCSymbolRefExpr::VK_PPC_HI)
+ .Case("ha", MCSymbolRefExpr::VK_PPC_HA)
+ .Case("high", MCSymbolRefExpr::VK_PPC_HIGH)
+ .Case("higha", MCSymbolRefExpr::VK_PPC_HIGHA)
+ .Case("higher", MCSymbolRefExpr::VK_PPC_HIGHER)
+ .Case("highera", MCSymbolRefExpr::VK_PPC_HIGHERA)
+ .Case("highest", MCSymbolRefExpr::VK_PPC_HIGHEST)
+ .Case("highesta", MCSymbolRefExpr::VK_PPC_HIGHESTA)
+ .Case("got@l", MCSymbolRefExpr::VK_PPC_GOT_LO)
+ .Case("got@h", MCSymbolRefExpr::VK_PPC_GOT_HI)
+ .Case("got@ha", MCSymbolRefExpr::VK_PPC_GOT_HA)
+ .Case("local", MCSymbolRefExpr::VK_PPC_LOCAL)
+ .Case("tocbase", MCSymbolRefExpr::VK_PPC_TOCBASE)
+ .Case("toc", MCSymbolRefExpr::VK_PPC_TOC)
+ .Case("toc@l", MCSymbolRefExpr::VK_PPC_TOC_LO)
+ .Case("toc@h", MCSymbolRefExpr::VK_PPC_TOC_HI)
+ .Case("toc@ha", MCSymbolRefExpr::VK_PPC_TOC_HA)
+ .Case("u", MCSymbolRefExpr::VK_PPC_U)
+ // .Case("l", MCSymbolRefExpr::VK_PPC_L) VK_PPC_LO?
+ .Case("tls", MCSymbolRefExpr::VK_PPC_TLS)
+ .Case("dtpmod", MCSymbolRefExpr::VK_PPC_DTPMOD)
+ .Case("tprel@l", MCSymbolRefExpr::VK_PPC_TPREL_LO)
+ .Case("tprel@h", MCSymbolRefExpr::VK_PPC_TPREL_HI)
+ .Case("tprel@ha", MCSymbolRefExpr::VK_PPC_TPREL_HA)
+ .Case("tprel@high", MCSymbolRefExpr::VK_PPC_TPREL_HIGH)
+ .Case("tprel@higha", MCSymbolRefExpr::VK_PPC_TPREL_HIGHA)
+ .Case("tprel@higher", MCSymbolRefExpr::VK_PPC_TPREL_HIGHER)
+ .Case("tprel@highera", MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA)
+ .Case("tprel@highest", MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST)
+ .Case("tprel@highesta", MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA)
+ .Case("dtprel@l", MCSymbolRefExpr::VK_PPC_DTPREL_LO)
+ .Case("dtprel@h", MCSymbolRefExpr::VK_PPC_DTPREL_HI)
+ .Case("dtprel@ha", MCSymbolRefExpr::VK_PPC_DTPREL_HA)
+ .Case("dtprel@high", MCSymbolRefExpr::VK_PPC_DTPREL_HIGH)
+ .Case("dtprel@higha", MCSymbolRefExpr::VK_PPC_DTPREL_HIGHA)
+ .Case("dtprel@higher", MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER)
+ .Case("dtprel@highera", MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA)
+ .Case("dtprel@highest", MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST)
+ .Case("dtprel@highesta", MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA)
+ .Case("got@tprel", MCSymbolRefExpr::VK_PPC_GOT_TPREL)
+ .Case("got@tprel@l", MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO)
+ .Case("got@tprel@h", MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI)
+ .Case("got@tprel@ha", MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA)
+ .Case("got@dtprel", MCSymbolRefExpr::VK_PPC_GOT_DTPREL)
+ .Case("got@dtprel@l", MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO)
+ .Case("got@dtprel@h", MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI)
+ .Case("got@dtprel@ha", MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA)
+ .Case("got@tlsgd", MCSymbolRefExpr::VK_PPC_GOT_TLSGD)
+ .Case("got@tlsgd@l", MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO)
+ .Case("got@tlsgd@h", MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI)
+ .Case("got@tlsgd@ha", MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA)
+ .Case("got@tlsld", MCSymbolRefExpr::VK_PPC_GOT_TLSLD)
+ .Case("got@tlsld@l", MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO)
+ .Case("got@tlsld@h", MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI)
+ .Case("got@tlsld@ha", MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA)
+ .Case("got@pcrel", MCSymbolRefExpr::VK_PPC_GOT_PCREL)
+ .Case("got@tlsgd@pcrel", MCSymbolRefExpr::VK_PPC_GOT_TLSGD_PCREL)
+ .Case("got@tlsld@pcrel", MCSymbolRefExpr::VK_PPC_GOT_TLSLD_PCREL)
+ .Case("got@tprel@pcrel", MCSymbolRefExpr::VK_PPC_GOT_TPREL_PCREL)
+ .Case("tls@pcrel", MCSymbolRefExpr::VK_PPC_TLS_PCREL)
+ .Case("notoc", MCSymbolRefExpr::VK_PPC_NOTOC)
+ .Default(MCSymbolRefExpr::VK_Invalid);
+}
+
const MCExpr *
PPCAsmParser::applyModifierToExpr(const MCExpr *E,
MCSymbolRefExpr::VariantKind Variant,