Skip to content

Commit 1e7d914

Browse files
MaskRayfrederik-h
authored andcommitted
Move PowerPC-specific MCSymbolRefExpr::VariantKind to PPCMCExpr
Most changes are mechanic, except: * ELFObjectWriter::shouldRelocateWithSymbol: .TOC.@tocbase does not register the undefined symbol. Move the handling into the Sym->isUndefined() code path. * ELFObjectWriter::fixSymbolsInTLSFixups's VK_PPC* cases are moved to PPCELFObjectWriter::getRelocType. We should do similar refactoring for other targets and eventually remove fixSymbolsInTLSFixups. In the future, we should classify PPCMCExpr similar to AArch64MCExpr.
1 parent d97b546 commit 1e7d914

17 files changed

+512
-482
lines changed

llvm/include/llvm/MC/MCExpr.h

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -256,67 +256,6 @@ class MCSymbolRefExpr : public MCExpr {
256256
VK_AVR_DIFF32,
257257
VK_AVR_PM,
258258

259-
VK_PPC_GOT_LO, // symbol@got@l
260-
VK_PPC_GOT_HI, // symbol@got@h
261-
VK_PPC_GOT_HA, // symbol@got@ha
262-
VK_PPC_TOCBASE, // symbol@tocbase
263-
VK_PPC_TOC, // symbol@toc
264-
VK_PPC_TOC_LO, // symbol@toc@l
265-
VK_PPC_TOC_HI, // symbol@toc@h
266-
VK_PPC_TOC_HA, // symbol@toc@ha
267-
VK_PPC_U, // symbol@u
268-
VK_PPC_L, // symbol@l
269-
VK_PPC_DTPMOD, // symbol@dtpmod
270-
VK_PPC_TPREL_LO, // symbol@tprel@l
271-
VK_PPC_TPREL_HI, // symbol@tprel@h
272-
VK_PPC_TPREL_HA, // symbol@tprel@ha
273-
VK_PPC_TPREL_HIGH, // symbol@tprel@high
274-
VK_PPC_TPREL_HIGHA, // symbol@tprel@higha
275-
VK_PPC_TPREL_HIGHER, // symbol@tprel@higher
276-
VK_PPC_TPREL_HIGHERA, // symbol@tprel@highera
277-
VK_PPC_TPREL_HIGHEST, // symbol@tprel@highest
278-
VK_PPC_TPREL_HIGHESTA, // symbol@tprel@highesta
279-
VK_PPC_DTPREL_LO, // symbol@dtprel@l
280-
VK_PPC_DTPREL_HI, // symbol@dtprel@h
281-
VK_PPC_DTPREL_HA, // symbol@dtprel@ha
282-
VK_PPC_DTPREL_HIGH, // symbol@dtprel@high
283-
VK_PPC_DTPREL_HIGHA, // symbol@dtprel@higha
284-
VK_PPC_DTPREL_HIGHER, // symbol@dtprel@higher
285-
VK_PPC_DTPREL_HIGHERA, // symbol@dtprel@highera
286-
VK_PPC_DTPREL_HIGHEST, // symbol@dtprel@highest
287-
VK_PPC_DTPREL_HIGHESTA, // symbol@dtprel@highesta
288-
VK_PPC_GOT_TPREL, // symbol@got@tprel
289-
VK_PPC_GOT_TPREL_LO, // symbol@got@tprel@l
290-
VK_PPC_GOT_TPREL_HI, // symbol@got@tprel@h
291-
VK_PPC_GOT_TPREL_HA, // symbol@got@tprel@ha
292-
VK_PPC_GOT_DTPREL, // symbol@got@dtprel
293-
VK_PPC_GOT_DTPREL_LO, // symbol@got@dtprel@l
294-
VK_PPC_GOT_DTPREL_HI, // symbol@got@dtprel@h
295-
VK_PPC_GOT_DTPREL_HA, // symbol@got@dtprel@ha
296-
VK_PPC_TLS, // symbol@tls
297-
VK_PPC_GOT_TLSGD, // symbol@got@tlsgd
298-
VK_PPC_GOT_TLSGD_LO, // symbol@got@tlsgd@l
299-
VK_PPC_GOT_TLSGD_HI, // symbol@got@tlsgd@h
300-
VK_PPC_GOT_TLSGD_HA, // symbol@got@tlsgd@ha
301-
VK_PPC_AIX_TLSGD, // symbol@gd
302-
VK_PPC_AIX_TLSGDM, // symbol@m
303-
VK_PPC_AIX_TLSIE, // symbol@ie
304-
VK_PPC_AIX_TLSLE, // symbol@le
305-
VK_PPC_AIX_TLSLD, // symbol@ld
306-
VK_PPC_AIX_TLSML, // symbol@ml
307-
VK_PPC_GOT_TLSLD, // symbol@got@tlsld
308-
VK_PPC_GOT_TLSLD_LO, // symbol@got@tlsld@l
309-
VK_PPC_GOT_TLSLD_HI, // symbol@got@tlsld@h
310-
VK_PPC_GOT_TLSLD_HA, // symbol@got@tlsld@ha
311-
VK_PPC_GOT_PCREL, // symbol@got@pcrel
312-
VK_PPC_GOT_TLSGD_PCREL, // symbol@got@tlsgd@pcrel
313-
VK_PPC_GOT_TLSLD_PCREL, // symbol@got@tlsld@pcrel
314-
VK_PPC_GOT_TPREL_PCREL, // symbol@got@tprel@pcrel
315-
VK_PPC_TLS_PCREL, // symbol@tls@pcrel
316-
VK_PPC_LOCAL, // symbol@local
317-
VK_PPC_NOTOC, // symbol@notoc
318-
VK_PPC_PCREL_OPT, // .reloc expr, R_PPC64_PCREL_OPT, expr
319-
320259
VK_COFF_IMGREL32, // symbol@imgrel (image-relative)
321260

322261
VK_Hexagon_LO16,

llvm/lib/MC/ELFObjectWriter.cpp

Lines changed: 10 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,14 +1261,6 @@ bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
12611261
switch (Kind) {
12621262
default:
12631263
break;
1264-
// The .odp creation emits a relocation against the symbol ".TOC." which
1265-
// create a R_PPC64_TOC relocation. However the relocation symbol name
1266-
// in final object creation should be NULL, since the symbol does not
1267-
// really exist, it is just the reference to TOC base for the current
1268-
// object file. Since the symbol is undefined, returning false results
1269-
// in a relocation with a null section which is the desired result.
1270-
case MCSymbolRefExpr::VK_PPC_TOCBASE:
1271-
return false;
12721264

12731265
// These VariantKind cause the relocation to refer to something other than
12741266
// the symbol itself, like a linker generated table. Since the address of
@@ -1278,17 +1270,22 @@ bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
12781270
case MCSymbolRefExpr::VK_PLT:
12791271
case MCSymbolRefExpr::VK_GOTPCREL:
12801272
case MCSymbolRefExpr::VK_GOTPCREL_NORELAX:
1281-
case MCSymbolRefExpr::VK_PPC_GOT_LO:
1282-
case MCSymbolRefExpr::VK_PPC_GOT_HI:
1283-
case MCSymbolRefExpr::VK_PPC_GOT_HA:
12841273
return true;
12851274
}
12861275

12871276
// An undefined symbol is not in any section, so the relocation has to point
12881277
// to the symbol itself.
12891278
assert(Sym && "Expected a symbol");
1290-
if (Sym->isUndefined())
1291-
return true;
1279+
if (Sym->isUndefined()) {
1280+
// The .odp creation emits a relocation against the symbol ".TOC." which
1281+
// create a R_PPC64_TOC relocation. However the relocation symbol name
1282+
// in final object creation should be NULL, since the symbol does not
1283+
// really exist, it is just the reference to TOC base for the current
1284+
// object file. Since the symbol is undefined, returning false results
1285+
// in a relocation with a null section which is the desired result.
1286+
return !(Type == ELF::R_PPC64_TOC &&
1287+
TargetObjectWriter->getEMachine() == ELF::EM_PPC64);
1288+
}
12921289

12931290
// For memory-tagged symbols, ensure that the relocation uses the symbol. For
12941291
// tagged symbols, we emit an empty relocation (R_AARCH64_NONE) in a special
@@ -1539,45 +1536,6 @@ void ELFObjectWriter::fixSymbolsInTLSFixups(MCAssembler &Asm,
15391536
case MCSymbolRefExpr::VK_TPREL:
15401537
case MCSymbolRefExpr::VK_DTPOFF:
15411538
case MCSymbolRefExpr::VK_DTPREL:
1542-
case MCSymbolRefExpr::VK_PPC_DTPMOD:
1543-
case MCSymbolRefExpr::VK_PPC_TPREL_LO:
1544-
case MCSymbolRefExpr::VK_PPC_TPREL_HI:
1545-
case MCSymbolRefExpr::VK_PPC_TPREL_HA:
1546-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGH:
1547-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHA:
1548-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER:
1549-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA:
1550-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST:
1551-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA:
1552-
case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
1553-
case MCSymbolRefExpr::VK_PPC_DTPREL_HI:
1554-
case MCSymbolRefExpr::VK_PPC_DTPREL_HA:
1555-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGH:
1556-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHA:
1557-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER:
1558-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA:
1559-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST:
1560-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA:
1561-
case MCSymbolRefExpr::VK_PPC_GOT_TPREL:
1562-
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO:
1563-
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI:
1564-
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA:
1565-
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_PCREL:
1566-
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL:
1567-
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO:
1568-
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI:
1569-
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA:
1570-
case MCSymbolRefExpr::VK_PPC_TLS:
1571-
case MCSymbolRefExpr::VK_PPC_TLS_PCREL:
1572-
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD:
1573-
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO:
1574-
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI:
1575-
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA:
1576-
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_PCREL:
1577-
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD:
1578-
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO:
1579-
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI:
1580-
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA:
15811539
break;
15821540
}
15831541
Asm.registerSymbol(symRef.getSymbol());

llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -745,8 +745,8 @@ struct PPCOperand : public MCParsedAsmOperand {
745745
return CreateImm(CE->getValue(), S, E, IsPPC64);
746746

747747
if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(Val))
748-
if (SRE->getKind() == MCSymbolRefExpr::VK_PPC_TLS ||
749-
SRE->getKind() == MCSymbolRefExpr::VK_PPC_TLS_PCREL)
748+
if (getVariantKind(SRE) == PPCMCExpr::VK_TLS ||
749+
getVariantKind(SRE) == PPCMCExpr::VK_TLS_PCREL)
750750
return CreateTLSReg(SRE, S, E, IsPPC64);
751751

752752
if (const PPCMCExpr *TE = dyn_cast<PPCMCExpr>(Val)) {
@@ -1374,7 +1374,7 @@ const MCExpr *
13741374
PPCAsmParser::extractModifierFromExpr(const MCExpr *E,
13751375
PPCMCExpr::VariantKind &Variant) {
13761376
MCContext &Context = getParser().getContext();
1377-
Variant = PPCMCExpr::VK_PPC_None;
1377+
Variant = PPCMCExpr::VK_None;
13781378

13791379
switch (E->getKind()) {
13801380
case MCExpr::Target:
@@ -1383,16 +1383,16 @@ PPCAsmParser::extractModifierFromExpr(const MCExpr *E,
13831383

13841384
case MCExpr::SymbolRef: {
13851385
const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E);
1386-
1387-
switch ((PPCMCExpr::VariantKind)SRE->getKind()) {
1386+
Variant = (PPCMCExpr::VariantKind)SRE->getKind();
1387+
switch (Variant) {
13881388
case PPCMCExpr::VK_LO:
13891389
Variant = PPCMCExpr::VK_LO;
13901390
break;
13911391
case PPCMCExpr::VK_HI:
13921392
Variant = PPCMCExpr::VK_HI;
13931393
break;
1394-
case PPCMCExpr::VK_PPC_HA:
1395-
Variant = PPCMCExpr::VK_PPC_HA;
1394+
case PPCMCExpr::VK_HA:
1395+
Variant = PPCMCExpr::VK_HA;
13961396
break;
13971397
case PPCMCExpr::VK_HIGH:
13981398
Variant = PPCMCExpr::VK_HIGH;
@@ -1439,9 +1439,9 @@ PPCAsmParser::extractModifierFromExpr(const MCExpr *E,
14391439
if (!LHS) LHS = BE->getLHS();
14401440
if (!RHS) RHS = BE->getRHS();
14411441

1442-
if (LHSVariant == PPCMCExpr::VK_PPC_None)
1442+
if (LHSVariant == PPCMCExpr::VK_None)
14431443
Variant = RHSVariant;
1444-
else if (RHSVariant == PPCMCExpr::VK_PPC_None)
1444+
else if (RHSVariant == PPCMCExpr::VK_None)
14451445
Variant = LHSVariant;
14461446
else if (LHSVariant == RHSVariant)
14471447
Variant = LHSVariant;
@@ -1539,8 +1539,9 @@ bool PPCAsmParser::parseOperand(OperandVector &Operands) {
15391539
if (!(parseOptionalToken(AsmToken::Identifier) &&
15401540
Tok.getString().compare_insensitive("plt") == 0))
15411541
return Error(Tok.getLoc(), "expected 'plt'");
1542-
EVal = MCSymbolRefExpr::create(getContext().getOrCreateSymbol(TlsGetAddr),
1543-
MCSymbolRefExpr::VK_PLT, getContext());
1542+
EVal = MCSymbolRefExpr::create(
1543+
getContext().getOrCreateSymbol(TlsGetAddr),
1544+
MCSymbolRefExpr::VariantKind(PPCMCExpr::VK_PLT), getContext());
15441545
if (parseOptionalToken(AsmToken::Plus)) {
15451546
const MCExpr *Addend = nullptr;
15461547
SMLoc EndLoc;
@@ -1856,7 +1857,7 @@ PPCAsmParser::applyModifierToExpr(const MCExpr *E,
18561857
switch (PPCMCExpr::VariantKind(Variant)) {
18571858
case PPCMCExpr::VariantKind::VK_LO:
18581859
case PPCMCExpr::VariantKind::VK_HI:
1859-
case PPCMCExpr::VariantKind::VK_PPC_HA:
1860+
case PPCMCExpr::VariantKind::VK_HA:
18601861
case PPCMCExpr::VariantKind::VK_HIGH:
18611862
case PPCMCExpr::VariantKind::VK_HIGHA:
18621863
case PPCMCExpr::VariantKind::VK_HIGHER:

0 commit comments

Comments
 (0)