66//
77// ===----------------------------------------------------------------------===//
88
9+ #include " MCTargetDesc/SystemZMCExpr.h"
910#include " MCTargetDesc/SystemZMCFixups.h"
1011#include " MCTargetDesc/SystemZMCTargetDesc.h"
1112#include " llvm/BinaryFormat/ELF.h"
@@ -33,6 +34,8 @@ class SystemZELFObjectWriter : public MCELFObjectTargetWriter {
3334 // Override MCELFObjectTargetWriter.
3435 unsigned getRelocType (MCContext &Ctx, const MCValue &Target,
3536 const MCFixup &Fixup, bool IsPCRel) const override ;
37+ bool needsRelocateWithSymbol (const MCValue &Val, const MCSymbol &Sym,
38+ unsigned Type) const override ;
3639};
3740
3841} // end anonymous namespace
@@ -155,43 +158,57 @@ unsigned SystemZELFObjectWriter::getRelocType(MCContext &Ctx,
155158 unsigned Kind = Fixup.getKind ();
156159 if (Kind >= FirstLiteralRelocationKind)
157160 return Kind - FirstLiteralRelocationKind;
158- MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant ();
159- switch (Modifier) {
160- case MCSymbolRefExpr::VK_None:
161+ auto Specifier = SystemZMCExpr::Specifier (Target.getAccessVariant ());
162+ switch (Specifier) {
163+ case SystemZMCExpr::VK_INDNTPOFF:
164+ case SystemZMCExpr::VK_NTPOFF:
165+ case SystemZMCExpr::VK_TLSGD:
166+ case SystemZMCExpr::VK_TLSLD:
167+ case SystemZMCExpr::VK_TLSLDM:
168+ case SystemZMCExpr::VK_DTPOFF:
169+ if (auto *S = Target.getSymA ())
170+ cast<MCSymbolELF>(S->getSymbol ()).setType (ELF::STT_TLS);
171+ break ;
172+ default :
173+ break ;
174+ }
175+
176+ switch (Specifier) {
177+ case SystemZMCExpr::VK_None:
161178 if (IsPCRel)
162179 return getPCRelReloc (Ctx, Loc, Kind);
163180 return getAbsoluteReloc (Ctx, Loc, Kind);
164181
165- case MCSymbolRefExpr ::VK_NTPOFF:
182+ case SystemZMCExpr ::VK_NTPOFF:
166183 assert (!IsPCRel && " NTPOFF shouldn't be PC-relative" );
167184 return getTLSLEReloc (Ctx, Loc, Kind);
168185
169- case MCSymbolRefExpr ::VK_INDNTPOFF:
186+ case SystemZMCExpr ::VK_INDNTPOFF:
170187 if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL)
171188 return ELF::R_390_TLS_IEENT;
172189 Ctx.reportError (Loc, " Only PC-relative INDNTPOFF accesses are supported for now" );
173190 return 0 ;
174191
175- case MCSymbolRefExpr ::VK_DTPOFF:
192+ case SystemZMCExpr ::VK_DTPOFF:
176193 assert (!IsPCRel && " DTPOFF shouldn't be PC-relative" );
177194 return getTLSLDOReloc (Ctx, Loc, Kind);
178195
179- case MCSymbolRefExpr ::VK_TLSLDM:
196+ case SystemZMCExpr ::VK_TLSLDM:
180197 assert (!IsPCRel && " TLSLDM shouldn't be PC-relative" );
181198 return getTLSLDMReloc (Ctx, Loc, Kind);
182199
183- case MCSymbolRefExpr ::VK_TLSGD:
200+ case SystemZMCExpr ::VK_TLSGD:
184201 assert (!IsPCRel && " TLSGD shouldn't be PC-relative" );
185202 return getTLSGDReloc (Ctx, Loc, Kind);
186203
187- case MCSymbolRefExpr ::VK_GOT:
188- case MCSymbolRefExpr ::VK_GOTENT:
204+ case SystemZMCExpr ::VK_GOT:
205+ case SystemZMCExpr ::VK_GOTENT:
189206 if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL)
190207 return ELF::R_390_GOTENT;
191208 Ctx.reportError (Loc, " Only PC-relative GOT accesses are supported for now" );
192209 return 0 ;
193210
194- case MCSymbolRefExpr ::VK_PLT:
211+ case SystemZMCExpr ::VK_PLT:
195212 assert (IsPCRel && " @PLT shouldn't be PC-relative" );
196213 return getPLTReloc (Ctx, Loc, Kind);
197214
@@ -200,6 +217,18 @@ unsigned SystemZELFObjectWriter::getRelocType(MCContext &Ctx,
200217 }
201218}
202219
220+ bool SystemZELFObjectWriter::needsRelocateWithSymbol (const MCValue &V,
221+ const MCSymbol &Sym,
222+ unsigned Type) const {
223+ switch (getSpecifier (V.getSymA ())) {
224+ case SystemZMCExpr::VK_GOT:
225+ case SystemZMCExpr::VK_PLT:
226+ return true ;
227+ default :
228+ return false ;
229+ }
230+ }
231+
203232std::unique_ptr<MCObjectTargetWriter>
204233llvm::createSystemZELFObjectWriter (uint8_t OSABI) {
205234 return std::make_unique<SystemZELFObjectWriter>(OSABI);
0 commit comments