Skip to content

Commit 14951a5

Browse files
committed
[MCParser] Extract some VariantKind from getVariantKindForName
All VariantKinds except VK_None/VK_Invalid are target-specific (e.g. a target may not support "@plt" even if it is widely available). Move the parsers to lib/Target to ensure that VariantKind from unrelated targets will not be parsed.
1 parent 8c7c791 commit 14951a5

File tree

7 files changed

+125
-41
lines changed

7 files changed

+125
-41
lines changed

llvm/lib/MC/MCExpr.cpp

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ const MCSymbolRefExpr *MCSymbolRefExpr::create(StringRef Name, VariantKind Kind,
246246
return create(Ctx.getOrCreateSymbol(Name), Kind, Ctx);
247247
}
248248

249+
// TODO: Move target-specific Kinds to lib/Target/.
249250
StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
250251
switch (Kind) {
251252
// clang-format off
@@ -444,11 +445,9 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
444445
.Case("gotrel", VK_GOTREL)
445446
.Case("pcrel", VK_PCREL)
446447
.Case("gotpcrel", VK_GOTPCREL)
447-
.Case("gotpcrel_norelax", VK_GOTPCREL_NORELAX)
448448
.Case("gottpoff", VK_GOTTPOFF)
449449
.Case("indntpoff", VK_INDNTPOFF)
450450
.Case("ntpoff", VK_NTPOFF)
451-
.Case("gotntpoff", VK_GOTNTPOFF)
452451
.Case("plt", VK_PLT)
453452
.Case("tlscall", VK_TLSCALL)
454453
.Case("tlsdesc", VK_TLSDESC)
@@ -466,45 +465,6 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
466465
.Case("gotpageoff", VK_GOTPAGEOFF)
467466
.Case("imgrel", VK_COFF_IMGREL32)
468467
.Case("secrel32", VK_SECREL)
469-
.Case("size", VK_SIZE)
470-
.Case("abs8", VK_X86_ABS8)
471-
.Case("pltoff", VK_X86_PLTOFF)
472-
.Case("gdgot", VK_Hexagon_GD_GOT)
473-
.Case("gdplt", VK_Hexagon_GD_PLT)
474-
.Case("iegot", VK_Hexagon_IE_GOT)
475-
.Case("ie", VK_Hexagon_IE)
476-
.Case("ldgot", VK_Hexagon_LD_GOT)
477-
.Case("ldplt", VK_Hexagon_LD_PLT)
478-
.Case("lo8", VK_AVR_LO8)
479-
.Case("hi8", VK_AVR_HI8)
480-
.Case("hlo8", VK_AVR_HLO8)
481-
.Case("typeindex", VK_WASM_TYPEINDEX)
482-
.Case("tbrel", VK_WASM_TBREL)
483-
.Case("mbrel", VK_WASM_MBREL)
484-
.Case("tlsrel", VK_WASM_TLSREL)
485-
.Case("got@tls", VK_WASM_GOT_TLS)
486-
.Case("funcindex", VK_WASM_FUNCINDEX)
487-
.Case("gotpcrel32@lo", VK_AMDGPU_GOTPCREL32_LO)
488-
.Case("gotpcrel32@hi", VK_AMDGPU_GOTPCREL32_HI)
489-
.Case("rel32@lo", VK_AMDGPU_REL32_LO)
490-
.Case("rel32@hi", VK_AMDGPU_REL32_HI)
491-
.Case("rel64", VK_AMDGPU_REL64)
492-
.Case("abs32@lo", VK_AMDGPU_ABS32_LO)
493-
.Case("abs32@hi", VK_AMDGPU_ABS32_HI)
494-
.Case("hi", VK_VE_HI32)
495-
.Case("lo", VK_VE_LO32)
496-
.Case("pc_hi", VK_VE_PC_HI32)
497-
.Case("pc_lo", VK_VE_PC_LO32)
498-
.Case("got_hi", VK_VE_GOT_HI32)
499-
.Case("got_lo", VK_VE_GOT_LO32)
500-
.Case("gotoff_hi", VK_VE_GOTOFF_HI32)
501-
.Case("gotoff_lo", VK_VE_GOTOFF_LO32)
502-
.Case("plt_hi", VK_VE_PLT_HI32)
503-
.Case("plt_lo", VK_VE_PLT_LO32)
504-
.Case("tls_gd_hi", VK_VE_TLS_GD_HI32)
505-
.Case("tls_gd_lo", VK_VE_TLS_GD_LO32)
506-
.Case("tpoff_hi", VK_VE_TPOFF_HI32)
507-
.Case("tpoff_lo", VK_VE_TPOFF_LO32)
508468
.Default(VK_Invalid);
509469
}
510470

llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,6 +1612,8 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
16121612
OperandVector &Operands, MCStreamer &Out,
16131613
uint64_t &ErrorInfo,
16141614
bool MatchingInlineAsm) override;
1615+
MCSymbolRefExpr::VariantKind
1616+
getVariantKindForName(StringRef Name) const override;
16151617
bool ParseDirective(AsmToken DirectiveID) override;
16161618
ParseStatus parseOperand(OperandVector &Operands, StringRef Mnemonic,
16171619
OperandMode Mode = OperandMode_Default);
@@ -5450,6 +5452,20 @@ bool AMDGPUAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
54505452
llvm_unreachable("Implement any new match types added!");
54515453
}
54525454

5455+
MCSymbolRefExpr::VariantKind
5456+
AMDGPUAsmParser::getVariantKindForName(StringRef Name) const {
5457+
return StringSwitch<MCSymbolRefExpr::VariantKind>(Name.lower())
5458+
.Case("gotpcrel", MCSymbolRefExpr::VK_GOTPCREL)
5459+
.Case("gotpcrel32@lo", MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_LO)
5460+
.Case("gotpcrel32@hi", MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_HI)
5461+
.Case("rel32@lo", MCSymbolRefExpr::VK_AMDGPU_REL32_LO)
5462+
.Case("rel32@hi", MCSymbolRefExpr::VK_AMDGPU_REL32_HI)
5463+
.Case("rel64", MCSymbolRefExpr::VK_AMDGPU_REL64)
5464+
.Case("abs32@lo", MCSymbolRefExpr::VK_AMDGPU_ABS32_LO)
5465+
.Case("abs32@hi", MCSymbolRefExpr::VK_AMDGPU_ABS32_HI)
5466+
.Default(MCSymbolRefExpr::VK_Invalid);
5467+
}
5468+
54535469
bool AMDGPUAsmParser::ParseAsAbsoluteExpression(uint32_t &Ret) {
54545470
int64_t Tmp = -1;
54555471
if (!isToken(AsmToken::Integer) && !isToken(AsmToken::Identifier)) {

llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ class AVRAsmParser : public MCTargetAsmParser {
7777
unsigned validateTargetOperandClass(MCParsedAsmOperand &Op,
7878
unsigned Kind) override;
7979

80+
MCSymbolRefExpr::VariantKind
81+
getVariantKindForName(StringRef Name) const override;
82+
8083
MCRegister toDREG(MCRegister Reg, unsigned From = AVR::sub_lo) {
8184
MCRegisterClass const *Class = &AVRMCRegisterClasses[AVR::DREGSRegClassID];
8285
return MRI->getMatchingSuperReg(Reg, From, Class);
@@ -783,3 +786,12 @@ unsigned AVRAsmParser::validateTargetOperandClass(MCParsedAsmOperand &AsmOp,
783786
}
784787
return Match_InvalidOperand;
785788
}
789+
790+
MCSymbolRefExpr::VariantKind
791+
AVRAsmParser::getVariantKindForName(StringRef Name) const {
792+
return StringSwitch<MCSymbolRefExpr::VariantKind>(Name.lower())
793+
.Case("lo8", MCSymbolRefExpr::VK_AVR_LO8)
794+
.Case("hi8", MCSymbolRefExpr::VK_AVR_HI8)
795+
.Case("hlo8", MCSymbolRefExpr::VK_AVR_HLO8)
796+
.Default(MCSymbolRefExpr::VK_Invalid);
797+
}

llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ class HexagonAsmParser : public MCTargetAsmParser {
140140

141141
unsigned validateTargetOperandClass(MCParsedAsmOperand &Op,
142142
unsigned Kind) override;
143+
MCSymbolRefExpr::VariantKind
144+
getVariantKindForName(StringRef Name) const override;
143145
bool OutOfRange(SMLoc IDLoc, long long Val, long long Max);
144146
int processInstruction(MCInst &Inst, OperandVector const &Operands,
145147
SMLoc IDLoc);
@@ -1330,6 +1332,24 @@ unsigned HexagonAsmParser::validateTargetOperandClass(MCParsedAsmOperand &AsmOp,
13301332
return Match_InvalidOperand;
13311333
}
13321334

1335+
MCSymbolRefExpr::VariantKind
1336+
HexagonAsmParser::getVariantKindForName(StringRef Name) const {
1337+
return StringSwitch<MCSymbolRefExpr::VariantKind>(Name.lower())
1338+
.Case("dtprel", MCSymbolRefExpr::VK_DTPREL)
1339+
.Case("gdgot", MCSymbolRefExpr::VK_Hexagon_GD_GOT)
1340+
.Case("gdplt", MCSymbolRefExpr::VK_Hexagon_GD_PLT)
1341+
.Case("got", MCSymbolRefExpr::VK_GOT)
1342+
.Case("gotrel", MCSymbolRefExpr::VK_GOTREL)
1343+
.Case("ie", MCSymbolRefExpr::VK_Hexagon_IE)
1344+
.Case("iegot", MCSymbolRefExpr::VK_Hexagon_IE_GOT)
1345+
.Case("ldgot", MCSymbolRefExpr::VK_Hexagon_LD_GOT)
1346+
.Case("ldplt", MCSymbolRefExpr::VK_Hexagon_LD_PLT)
1347+
.Case("pcrel", MCSymbolRefExpr::VK_PCREL)
1348+
.Case("plt", MCSymbolRefExpr::VK_PLT)
1349+
.Case("tprel", MCSymbolRefExpr::VK_TPREL)
1350+
.Default(MCSymbolRefExpr::VK_Invalid);
1351+
}
1352+
13331353
// FIXME: Calls to OutOfRange should propagate failure up to parseStatement.
13341354
bool HexagonAsmParser::OutOfRange(SMLoc IDLoc, long long Val, long long Max) {
13351355
std::string errStr;

llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ class VEAsmParser : public MCTargetAsmParser {
6363
unsigned validateTargetOperandClass(MCParsedAsmOperand &Op,
6464
unsigned Kind) override;
6565

66+
MCSymbolRefExpr::VariantKind
67+
getVariantKindForName(StringRef Name) const override;
68+
6669
// Custom parse functions for VE specific operands.
6770
ParseStatus parseMEMOperand(OperandVector &Operands);
6871
ParseStatus parseMEMAsOperand(OperandVector &Operands);
@@ -1583,3 +1586,23 @@ unsigned VEAsmParser::validateTargetOperandClass(MCParsedAsmOperand &GOp,
15831586
}
15841587
return Match_InvalidOperand;
15851588
}
1589+
1590+
MCSymbolRefExpr::VariantKind
1591+
VEAsmParser::getVariantKindForName(StringRef Name) const {
1592+
return StringSwitch<MCSymbolRefExpr::VariantKind>(Name.lower())
1593+
.Case("hi", MCSymbolRefExpr::VK_VE_HI32)
1594+
.Case("lo", MCSymbolRefExpr::VK_VE_LO32)
1595+
.Case("pc_hi", MCSymbolRefExpr::VK_VE_PC_HI32)
1596+
.Case("pc_lo", MCSymbolRefExpr::VK_VE_PC_LO32)
1597+
.Case("got_hi", MCSymbolRefExpr::VK_VE_GOT_HI32)
1598+
.Case("got_lo", MCSymbolRefExpr::VK_VE_GOT_LO32)
1599+
.Case("gotoff_hi", MCSymbolRefExpr::VK_VE_GOTOFF_HI32)
1600+
.Case("gotoff_lo", MCSymbolRefExpr::VK_VE_GOTOFF_LO32)
1601+
.Case("plt_hi", MCSymbolRefExpr::VK_VE_PLT_HI32)
1602+
.Case("plt_lo", MCSymbolRefExpr::VK_VE_PLT_LO32)
1603+
.Case("tls_gd_hi", MCSymbolRefExpr::VK_VE_TLS_GD_HI32)
1604+
.Case("tls_gd_lo", MCSymbolRefExpr::VK_VE_TLS_GD_LO32)
1605+
.Case("tpoff_hi", MCSymbolRefExpr::VK_VE_TPOFF_HI32)
1606+
.Case("tpoff_lo", MCSymbolRefExpr::VK_VE_TPOFF_LO32)
1607+
.Default(MCSymbolRefExpr::VK_Invalid);
1608+
}

llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,6 +1210,9 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser {
12101210
llvm_unreachable("Implement any new match types added!");
12111211
}
12121212

1213+
MCSymbolRefExpr::VariantKind
1214+
getVariantKindForName(StringRef Name) const override;
1215+
12131216
void doBeforeLabelEmit(MCSymbol *Symbol, SMLoc IDLoc) override {
12141217
// Code below only applies to labels in text sections.
12151218
auto *CWS = cast<MCSectionWasm>(getStreamer().getCurrentSectionOnly());
@@ -1280,6 +1283,19 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser {
12801283
};
12811284
} // end anonymous namespace
12821285

1286+
MCSymbolRefExpr::VariantKind
1287+
WebAssemblyAsmParser::getVariantKindForName(StringRef Name) const {
1288+
return StringSwitch<MCSymbolRefExpr::VariantKind>(Name.lower())
1289+
.Case("typeindex", MCSymbolRefExpr::VK_WASM_TYPEINDEX)
1290+
.Case("tbrel", MCSymbolRefExpr::VK_WASM_TBREL)
1291+
.Case("mbrel", MCSymbolRefExpr::VK_WASM_MBREL)
1292+
.Case("tlsrel", MCSymbolRefExpr::VK_WASM_TLSREL)
1293+
.Case("got", MCSymbolRefExpr::VK_GOT)
1294+
.Case("got@tls", MCSymbolRefExpr::VK_WASM_GOT_TLS)
1295+
.Case("funcindex", MCSymbolRefExpr::VK_WASM_FUNCINDEX)
1296+
.Default(MCSymbolRefExpr::VK_Invalid);
1297+
}
1298+
12831299
// Force static initialization.
12841300
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeWebAssemblyAsmParser() {
12851301
RegisterMCAsmParser<WebAssemblyAsmParser> X(getTheWebAssemblyTarget32());

llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,6 +1182,9 @@ class X86AsmParser : public MCTargetAsmParser {
11821182

11831183
unsigned checkTargetMatchPredicate(MCInst &Inst) override;
11841184

1185+
MCSymbolRefExpr::VariantKind
1186+
getVariantKindForName(StringRef Name) const override;
1187+
11851188
bool validateInstruction(MCInst &Inst, const OperandVector &Ops);
11861189
bool processInstruction(MCInst &Inst, const OperandVector &Ops);
11871190

@@ -4247,6 +4250,40 @@ unsigned X86AsmParser::checkTargetMatchPredicate(MCInst &Inst) {
42474250
return Match_Success;
42484251
}
42494252

4253+
MCSymbolRefExpr::VariantKind
4254+
X86AsmParser::getVariantKindForName(StringRef Name) const {
4255+
return StringSwitch<MCSymbolRefExpr::VariantKind>(Name.lower())
4256+
.Case("abs8", MCSymbolRefExpr::VK_X86_ABS8)
4257+
.Case("dtpoff", MCSymbolRefExpr::VK_DTPOFF)
4258+
.Case("dtprel", MCSymbolRefExpr::VK_DTPREL)
4259+
.Case("got", MCSymbolRefExpr::VK_GOT)
4260+
.Case("gotent", MCSymbolRefExpr::VK_GOTENT)
4261+
.Case("gotntpoff", MCSymbolRefExpr::VK_GOTNTPOFF)
4262+
.Case("gotoff", MCSymbolRefExpr::VK_GOTOFF)
4263+
.Case("gotpcrel", MCSymbolRefExpr::VK_GOTPCREL)
4264+
.Case("gotpcrel_norelax", MCSymbolRefExpr::VK_GOTPCREL_NORELAX)
4265+
.Case("gotrel", MCSymbolRefExpr::VK_GOTREL)
4266+
.Case("gottpoff", MCSymbolRefExpr::VK_GOTTPOFF)
4267+
.Case("indntpoff", MCSymbolRefExpr::VK_INDNTPOFF)
4268+
.Case("imgrel", MCSymbolRefExpr::VK_COFF_IMGREL32)
4269+
.Case("ntpoff", MCSymbolRefExpr::VK_NTPOFF)
4270+
.Case("pcrel", MCSymbolRefExpr::VK_PCREL)
4271+
.Case("plt", MCSymbolRefExpr::VK_PLT)
4272+
.Case("pltoff", MCSymbolRefExpr::VK_X86_PLTOFF)
4273+
.Case("secrel32", MCSymbolRefExpr::VK_SECREL)
4274+
.Case("size", MCSymbolRefExpr::VK_SIZE)
4275+
.Case("tlscall", MCSymbolRefExpr::VK_TLSCALL)
4276+
.Case("tlsdesc", MCSymbolRefExpr::VK_TLSDESC)
4277+
.Case("tlsgd", MCSymbolRefExpr::VK_TLSGD)
4278+
.Case("tlsld", MCSymbolRefExpr::VK_TLSLD)
4279+
.Case("tlsldm", MCSymbolRefExpr::VK_TLSLDM)
4280+
.Case("tlvp", MCSymbolRefExpr::VK_TLVP)
4281+
.Case("tlvppage", MCSymbolRefExpr::VK_TLVPPAGE)
4282+
.Case("tlvppageoff", MCSymbolRefExpr::VK_TLVPPAGEOFF)
4283+
.Case("tpoff", MCSymbolRefExpr::VK_TPOFF)
4284+
.Default(MCSymbolRefExpr::VK_Invalid);
4285+
}
4286+
42504287
bool X86AsmParser::matchAndEmitATTInstruction(
42514288
SMLoc IDLoc, unsigned &Opcode, MCInst &Inst, OperandVector &Operands,
42524289
MCStreamer &Out, uint64_t &ErrorInfo, bool MatchingInlineAsm) {

0 commit comments

Comments
 (0)