Skip to content

Commit 98a640a

Browse files
committed
[MC] Move VariantKind info to MCAsmInfo
Follow-up to 14951a5 * Unify getVariantKindName and getVariantKindForName * Allow each target to specify the preferred case (albeit ignored in MCParser) Note: targets that use variant kinds should call MCExpr::print with a non-null MAI to print variant kinds. operator<< passes a nullptr to `MCExpr::print`, which should be avoided (e.g. Hexagon; fixed in commit cf00ac8).
1 parent e6aae2a commit 98a640a

File tree

23 files changed

+296
-397
lines changed

23 files changed

+296
-397
lines changed

llvm/include/llvm/MC/MCAsmInfo.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#ifndef LLVM_MC_MCASMINFO_H
1616
#define LLVM_MC_MCASMINFO_H
1717

18+
#include "llvm/ADT/DenseMap.h"
19+
#include "llvm/ADT/StringMap.h"
1820
#include "llvm/ADT/StringRef.h"
1921
#include "llvm/MC/MCDirectives.h"
2022
#include "llvm/MC/MCTargetOptions.h"
@@ -63,6 +65,11 @@ class MCAsmInfo {
6365
/// quote, e.g., `'A`.
6466
};
6567

68+
struct VariantKindDesc {
69+
uint32_t Kind;
70+
StringRef Name;
71+
};
72+
6673
protected:
6774
//===------------------------------------------------------------------===//
6875
// Properties to be set by the target writer, used to configure asm printer.
@@ -417,6 +424,10 @@ class MCAsmInfo {
417424
// If true, use Motorola-style integers in Assembly (ex. $0ac).
418425
bool UseMotorolaIntegers = false;
419426

427+
llvm::DenseMap<uint32_t, StringRef> VariantKindToName;
428+
llvm::StringMap<uint32_t> NameToVariantKind;
429+
void initializeVariantKinds(ArrayRef<VariantKindDesc> Descs);
430+
420431
public:
421432
explicit MCAsmInfo();
422433
virtual ~MCAsmInfo();
@@ -696,6 +707,9 @@ class MCAsmInfo {
696707
bool shouldUseLogicalShr() const { return UseLogicalShr; }
697708

698709
bool shouldUseMotorolaIntegers() const { return UseMotorolaIntegers; }
710+
711+
StringRef getVariantKindName(uint32_t Kind) const;
712+
uint32_t getVariantKindForName(StringRef Name) const;
699713
};
700714

701715
} // end namespace llvm

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -505,10 +505,6 @@ class MCTargetAsmParser : public MCAsmParserExtension {
505505
// Return whether this parser accept star as start of statement
506506
virtual bool starIsStartOfStatement() { return false; };
507507

508-
virtual MCSymbolRefExpr::VariantKind
509-
getVariantKindForName(StringRef Name) const {
510-
return MCSymbolRefExpr::getVariantKindForName(Name);
511-
}
512508
virtual const MCExpr *applyModifierToExpr(const MCExpr *E,
513509
MCSymbolRefExpr::VariantKind,
514510
MCContext &Ctx) {

llvm/lib/MC/MCAsmInfo.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,33 @@ bool MCAsmInfo::shouldOmitSectionDirective(StringRef SectionName) const {
124124
return SectionName == ".text" || SectionName == ".data" ||
125125
(SectionName == ".bss" && !usesELFSectionDirectiveForBSS());
126126
}
127+
128+
void MCAsmInfo::initializeVariantKinds(ArrayRef<VariantKindDesc> Descs) {
129+
assert(VariantKindToName.empty() && "cannot initialize twice");
130+
for (auto Desc : Descs) {
131+
[[maybe_unused]] auto It =
132+
VariantKindToName.try_emplace(Desc.Kind, Desc.Name);
133+
assert(It.second && "duplicate Kind");
134+
[[maybe_unused]] auto It2 =
135+
NameToVariantKind.try_emplace(Desc.Name.lower(), Desc.Kind);
136+
// Workaround for VK_PPC_L/VK_PPC_LO ("l"), VK_PPC_TLSGD, and VK_PPC_TLSLD.
137+
assert(It2.second ||
138+
(Desc.Name == "l" || Desc.Name == "tlsgd" || Desc.Name == "tlsld"));
139+
}
140+
}
141+
142+
StringRef MCAsmInfo::getVariantKindName(uint32_t Kind) const {
143+
if (!VariantKindToName.empty())
144+
return VariantKindToName.find(Kind)->second;
145+
return MCSymbolRefExpr::getVariantKindName(
146+
MCSymbolRefExpr::VariantKind(Kind));
147+
}
148+
149+
uint32_t MCAsmInfo::getVariantKindForName(StringRef Name) const {
150+
if (NameToVariantKind.empty())
151+
return MCSymbolRefExpr::getVariantKindForName(Name);
152+
auto It = NameToVariantKind.find(Name.lower());
153+
if (It != NameToVariantKind.end())
154+
return It->second;
155+
return MCSymbolRefExpr::VK_Invalid;
156+
}

llvm/lib/MC/MCExpr.cpp

Lines changed: 5 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ void MCExpr::print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens) const {
8787
const MCSymbolRefExpr::VariantKind Kind = SRE.getKind();
8888
if (Kind != MCSymbolRefExpr::VK_None) {
8989
if (MAI && MAI->useParensForSymbolVariant()) // ARM
90-
OS << '(' << MCSymbolRefExpr::getVariantKindName(Kind) << ')';
90+
OS << '(' << MAI->getVariantKindName(Kind) << ')';
91+
else if (MAI)
92+
OS << '@' << MAI->getVariantKindName(Kind);
9193
else
9294
OS << '@' << MCSymbolRefExpr::getVariantKindName(Kind);
9395
}
@@ -246,11 +248,11 @@ const MCSymbolRefExpr *MCSymbolRefExpr::create(StringRef Name, VariantKind Kind,
246248
return create(Ctx.getOrCreateSymbol(Name), Kind, Ctx);
247249
}
248250

249-
// TODO: Move target-specific Kinds to lib/Target/.
251+
// TODO: Move target-specific Kinds to lib/Target/*/MCTargetDesc/*AsmInfo.cpp.
250252
StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
251253
switch (Kind) {
252254
// clang-format off
253-
case VK_Invalid: return "<<invalid>>";
255+
case VK_Invalid: default: return "<<invalid>>";
254256
case VK_None: return "<<none>>";
255257

256258
case VK_DTPOFF: return "DTPOFF";
@@ -261,18 +263,14 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
261263
case VK_GOTREL: return "GOTREL";
262264
case VK_PCREL: return "PCREL";
263265
case VK_GOTPCREL: return "GOTPCREL";
264-
case VK_GOTPCREL_NORELAX: return "GOTPCREL_NORELAX";
265266
case VK_GOTTPOFF: return "GOTTPOFF";
266-
case VK_GOTTPOFF_FDPIC: return "gottpoff_fdpic";
267267
case VK_INDNTPOFF: return "INDNTPOFF";
268268
case VK_NTPOFF: return "NTPOFF";
269269
case VK_GOTNTPOFF: return "GOTNTPOFF";
270270
case VK_PLT: return "PLT";
271271
case VK_TLSGD: return "TLSGD";
272-
case VK_TLSGD_FDPIC: return "tlsgd_fdpic";
273272
case VK_TLSLD: return "TLSLD";
274273
case VK_TLSLDM: return "TLSLDM";
275-
case VK_TLSLDM_FDPIC: return "tlsldm_fdpic";
276274
case VK_TPOFF: return "TPOFF";
277275
case VK_TPREL: return "TPREL";
278276
case VK_TLSCALL: return "tlscall";
@@ -285,148 +283,8 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
285283
case VK_GOTPAGE: return "GOTPAGE";
286284
case VK_GOTPAGEOFF: return "GOTPAGEOFF";
287285
case VK_SECREL: return "SECREL32";
288-
case VK_SIZE: return "SIZE";
289286
case VK_WEAKREF: return "WEAKREF";
290-
case VK_FUNCDESC: return "FUNCDESC";
291-
case VK_GOTFUNCDESC: return "GOTFUNCDESC";
292-
case VK_GOTOFFFUNCDESC: return "GOTOFFFUNCDESC";
293-
case VK_X86_ABS8: return "ABS8";
294-
case VK_X86_PLTOFF: return "PLTOFF";
295-
case VK_ARM_NONE: return "none";
296-
case VK_ARM_GOT_PREL: return "GOT_PREL";
297-
case VK_ARM_TARGET1: return "target1";
298-
case VK_ARM_TARGET2: return "target2";
299-
case VK_ARM_PREL31: return "prel31";
300-
case VK_ARM_SBREL: return "sbrel";
301-
case VK_ARM_TLSLDO: return "tlsldo";
302-
case VK_ARM_TLSDESCSEQ: return "tlsdescseq";
303-
case VK_AVR_NONE: return "none";
304-
case VK_AVR_LO8: return "lo8";
305-
case VK_AVR_HI8: return "hi8";
306-
case VK_AVR_HLO8: return "hlo8";
307-
case VK_AVR_DIFF8: return "diff8";
308-
case VK_AVR_DIFF16: return "diff16";
309-
case VK_AVR_DIFF32: return "diff32";
310-
case VK_AVR_PM: return "pm";
311-
case VK_PPC_LO: return "l";
312-
case VK_PPC_HI: return "h";
313-
case VK_PPC_HA: return "ha";
314-
case VK_PPC_HIGH: return "high";
315-
case VK_PPC_HIGHA: return "higha";
316-
case VK_PPC_HIGHER: return "higher";
317-
case VK_PPC_HIGHERA: return "highera";
318-
case VK_PPC_HIGHEST: return "highest";
319-
case VK_PPC_HIGHESTA: return "highesta";
320-
case VK_PPC_GOT_LO: return "got@l";
321-
case VK_PPC_GOT_HI: return "got@h";
322-
case VK_PPC_GOT_HA: return "got@ha";
323-
case VK_PPC_TOCBASE: return "tocbase";
324-
case VK_PPC_TOC: return "toc";
325-
case VK_PPC_TOC_LO: return "toc@l";
326-
case VK_PPC_TOC_HI: return "toc@h";
327-
case VK_PPC_TOC_HA: return "toc@ha";
328-
case VK_PPC_U: return "u";
329-
case VK_PPC_L: return "l";
330-
case VK_PPC_DTPMOD: return "dtpmod";
331-
case VK_PPC_TPREL_LO: return "tprel@l";
332-
case VK_PPC_TPREL_HI: return "tprel@h";
333-
case VK_PPC_TPREL_HA: return "tprel@ha";
334-
case VK_PPC_TPREL_HIGH: return "tprel@high";
335-
case VK_PPC_TPREL_HIGHA: return "tprel@higha";
336-
case VK_PPC_TPREL_HIGHER: return "tprel@higher";
337-
case VK_PPC_TPREL_HIGHERA: return "tprel@highera";
338-
case VK_PPC_TPREL_HIGHEST: return "tprel@highest";
339-
case VK_PPC_TPREL_HIGHESTA: return "tprel@highesta";
340-
case VK_PPC_DTPREL_LO: return "dtprel@l";
341-
case VK_PPC_DTPREL_HI: return "dtprel@h";
342-
case VK_PPC_DTPREL_HA: return "dtprel@ha";
343-
case VK_PPC_DTPREL_HIGH: return "dtprel@high";
344-
case VK_PPC_DTPREL_HIGHA: return "dtprel@higha";
345-
case VK_PPC_DTPREL_HIGHER: return "dtprel@higher";
346-
case VK_PPC_DTPREL_HIGHERA: return "dtprel@highera";
347-
case VK_PPC_DTPREL_HIGHEST: return "dtprel@highest";
348-
case VK_PPC_DTPREL_HIGHESTA: return "dtprel@highesta";
349-
case VK_PPC_GOT_TPREL: return "got@tprel";
350-
case VK_PPC_GOT_TPREL_LO: return "got@tprel@l";
351-
case VK_PPC_GOT_TPREL_HI: return "got@tprel@h";
352-
case VK_PPC_GOT_TPREL_HA: return "got@tprel@ha";
353-
case VK_PPC_GOT_DTPREL: return "got@dtprel";
354-
case VK_PPC_GOT_DTPREL_LO: return "got@dtprel@l";
355-
case VK_PPC_GOT_DTPREL_HI: return "got@dtprel@h";
356-
case VK_PPC_GOT_DTPREL_HA: return "got@dtprel@ha";
357-
case VK_PPC_TLS: return "tls";
358-
case VK_PPC_GOT_TLSGD: return "got@tlsgd";
359-
case VK_PPC_GOT_TLSGD_LO: return "got@tlsgd@l";
360-
case VK_PPC_GOT_TLSGD_HI: return "got@tlsgd@h";
361-
case VK_PPC_GOT_TLSGD_HA: return "got@tlsgd@ha";
362-
case VK_PPC_TLSGD: return "tlsgd";
363-
case VK_PPC_AIX_TLSGD:
364-
return "gd";
365-
case VK_PPC_AIX_TLSGDM:
366-
return "m";
367-
case VK_PPC_AIX_TLSIE:
368-
return "ie";
369-
case VK_PPC_AIX_TLSLE:
370-
return "le";
371-
case VK_PPC_AIX_TLSLD:
372-
return "ld";
373-
case VK_PPC_AIX_TLSML:
374-
return "ml";
375-
case VK_PPC_GOT_TLSLD: return "got@tlsld";
376-
case VK_PPC_GOT_TLSLD_LO: return "got@tlsld@l";
377-
case VK_PPC_GOT_TLSLD_HI: return "got@tlsld@h";
378-
case VK_PPC_GOT_TLSLD_HA: return "got@tlsld@ha";
379-
case VK_PPC_GOT_PCREL:
380-
return "got@pcrel";
381-
case VK_PPC_GOT_TLSGD_PCREL:
382-
return "got@tlsgd@pcrel";
383-
case VK_PPC_GOT_TLSLD_PCREL:
384-
return "got@tlsld@pcrel";
385-
case VK_PPC_GOT_TPREL_PCREL:
386-
return "got@tprel@pcrel";
387-
case VK_PPC_TLS_PCREL:
388-
return "tls@pcrel";
389-
case VK_PPC_TLSLD: return "tlsld";
390-
case VK_PPC_LOCAL: return "local";
391-
case VK_PPC_NOTOC: return "notoc";
392-
case VK_PPC_PCREL_OPT: return "<<invalid>>";
393287
case VK_COFF_IMGREL32: return "IMGREL";
394-
case VK_Hexagon_LO16: return "LO16";
395-
case VK_Hexagon_HI16: return "HI16";
396-
case VK_Hexagon_GPREL: return "GPREL";
397-
case VK_Hexagon_GD_GOT: return "GDGOT";
398-
case VK_Hexagon_LD_GOT: return "LDGOT";
399-
case VK_Hexagon_GD_PLT: return "GDPLT";
400-
case VK_Hexagon_LD_PLT: return "LDPLT";
401-
case VK_Hexagon_IE: return "IE";
402-
case VK_Hexagon_IE_GOT: return "IEGOT";
403-
case VK_WASM_TYPEINDEX: return "TYPEINDEX";
404-
case VK_WASM_MBREL: return "MBREL";
405-
case VK_WASM_TLSREL: return "TLSREL";
406-
case VK_WASM_TBREL: return "TBREL";
407-
case VK_WASM_GOT_TLS: return "GOT@TLS";
408-
case VK_WASM_FUNCINDEX: return "FUNCINDEX";
409-
case VK_AMDGPU_GOTPCREL32_LO: return "gotpcrel32@lo";
410-
case VK_AMDGPU_GOTPCREL32_HI: return "gotpcrel32@hi";
411-
case VK_AMDGPU_REL32_LO: return "rel32@lo";
412-
case VK_AMDGPU_REL32_HI: return "rel32@hi";
413-
case VK_AMDGPU_REL64: return "rel64";
414-
case VK_AMDGPU_ABS32_LO: return "abs32@lo";
415-
case VK_AMDGPU_ABS32_HI: return "abs32@hi";
416-
case VK_VE_HI32: return "hi";
417-
case VK_VE_LO32: return "lo";
418-
case VK_VE_PC_HI32: return "pc_hi";
419-
case VK_VE_PC_LO32: return "pc_lo";
420-
case VK_VE_GOT_HI32: return "got_hi";
421-
case VK_VE_GOT_LO32: return "got_lo";
422-
case VK_VE_GOTOFF_HI32: return "gotoff_hi";
423-
case VK_VE_GOTOFF_LO32: return "gotoff_lo";
424-
case VK_VE_PLT_HI32: return "plt_hi";
425-
case VK_VE_PLT_LO32: return "plt_lo";
426-
case VK_VE_TLS_GD_HI32: return "tls_gd_hi";
427-
case VK_VE_TLS_GD_LO32: return "tls_gd_lo";
428-
case VK_VE_TPOFF_HI32: return "tpoff_hi";
429-
case VK_VE_TPOFF_LO32: return "tpoff_lo";
430288
// clang-format on
431289
}
432290
llvm_unreachable("Invalid variant kind");

llvm/lib/MC/MCParser/AsmParser.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,7 +1229,8 @@ bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc,
12291229

12301230
// Lookup the symbol variant if used.
12311231
if (!Split.second.empty()) {
1232-
Variant = getTargetParser().getVariantKindForName(Split.second);
1232+
Variant =
1233+
MCSymbolRefExpr::VariantKind(MAI.getVariantKindForName(Split.second));
12331234
if (Variant != MCSymbolRefExpr::VK_Invalid) {
12341235
SymbolName = Split.first;
12351236
} else if (MAI.doesAllowAtInName() && !MAI.useParensForSymbolVariant()) {
@@ -1279,7 +1280,8 @@ bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc,
12791280
std::pair<StringRef, StringRef> Split = IDVal.split('@');
12801281
MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
12811282
if (Split.first.size() != IDVal.size()) {
1282-
Variant = getTargetParser().getVariantKindForName(Split.second);
1283+
Variant = MCSymbolRefExpr::VariantKind(
1284+
MAI.getVariantKindForName(Split.second));
12831285
if (Variant == MCSymbolRefExpr::VK_Invalid)
12841286
return TokError("invalid variant '" + Split.second + "'");
12851287
IDVal = Split.first;
@@ -1469,8 +1471,8 @@ bool AsmParser::parseExpression(const MCExpr *&Res, SMLoc &EndLoc) {
14691471
if (Lexer.isNot(AsmToken::Identifier))
14701472
return TokError("unexpected symbol modifier following '@'");
14711473

1472-
MCSymbolRefExpr::VariantKind Variant =
1473-
TS.getVariantKindForName(getTok().getIdentifier());
1474+
auto Variant = MCSymbolRefExpr::VariantKind(
1475+
MAI.getVariantKindForName(getTok().getIdentifier()));
14741476
if (Variant == MCSymbolRefExpr::VK_Invalid)
14751477
return TokError("invalid variant '" + getTok().getIdentifier() + "'");
14761478

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

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,8 +1612,6 @@ 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;
16171615
bool ParseDirective(AsmToken DirectiveID) override;
16181616
ParseStatus parseOperand(OperandVector &Operands, StringRef Mnemonic,
16191617
OperandMode Mode = OperandMode_Default);
@@ -5452,20 +5450,6 @@ bool AMDGPUAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
54525450
llvm_unreachable("Implement any new match types added!");
54535451
}
54545452

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-
54695453
bool AMDGPUAsmParser::ParseAsAbsoluteExpression(uint32_t &Ret) {
54705454
int64_t Tmp = -1;
54715455
if (!isToken(AsmToken::Integer) && !isToken(AsmToken::Identifier)) {

llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCAsmInfo.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,23 @@
99

1010
#include "AMDGPUMCAsmInfo.h"
1111
#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
12+
#include "llvm/MC/MCExpr.h"
1213
#include "llvm/MC/MCSubtargetInfo.h"
1314
#include "llvm/TargetParser/Triple.h"
1415

1516
using namespace llvm;
1617

18+
const MCAsmInfo::VariantKindDesc variantKindDescs[] = {
19+
{MCSymbolRefExpr::VK_GOTPCREL, "gotpcrel"},
20+
{MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_LO, "gotpcrel32@lo"},
21+
{MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_HI, "gotpcrel32@hi"},
22+
{MCSymbolRefExpr::VK_AMDGPU_REL32_LO, "rel32@lo"},
23+
{MCSymbolRefExpr::VK_AMDGPU_REL32_HI, "rel32@hi"},
24+
{MCSymbolRefExpr::VK_AMDGPU_REL64, "rel64"},
25+
{MCSymbolRefExpr::VK_AMDGPU_ABS32_LO, "abs32@lo"},
26+
{MCSymbolRefExpr::VK_AMDGPU_ABS32_HI, "abs32@hi"},
27+
};
28+
1729
AMDGPUMCAsmInfo::AMDGPUMCAsmInfo(const Triple &TT,
1830
const MCTargetOptions &Options) {
1931
CodePointerSize = (TT.getArch() == Triple::amdgcn) ? 8 : 4;
@@ -42,6 +54,7 @@ AMDGPUMCAsmInfo::AMDGPUMCAsmInfo(const Triple &TT,
4254
DwarfRegNumForCFI = true;
4355

4456
UseIntegratedAssembler = false;
57+
initializeVariantKinds(variantKindDescs);
4558
}
4659

4760
bool AMDGPUMCAsmInfo::shouldOmitSectionDirective(StringRef SectionName) const {

0 commit comments

Comments
 (0)