6
6
//
7
7
// ===----------------------------------------------------------------------===//
8
8
9
+ #include " MCTargetDesc/SystemZMCExpr.h"
9
10
#include " MCTargetDesc/SystemZMCFixups.h"
10
11
#include " MCTargetDesc/SystemZMCTargetDesc.h"
11
12
#include " llvm/BinaryFormat/ELF.h"
@@ -33,6 +34,8 @@ class SystemZELFObjectWriter : public MCELFObjectTargetWriter {
33
34
// Override MCELFObjectTargetWriter.
34
35
unsigned getRelocType (MCContext &Ctx, const MCValue &Target,
35
36
const MCFixup &Fixup, bool IsPCRel) const override ;
37
+ bool needsRelocateWithSymbol (const MCValue &Val, const MCSymbol &Sym,
38
+ unsigned Type) const override ;
36
39
};
37
40
38
41
} // end anonymous namespace
@@ -155,43 +158,57 @@ unsigned SystemZELFObjectWriter::getRelocType(MCContext &Ctx,
155
158
unsigned Kind = Fixup.getKind ();
156
159
if (Kind >= FirstLiteralRelocationKind)
157
160
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:
161
178
if (IsPCRel)
162
179
return getPCRelReloc (Ctx, Loc, Kind);
163
180
return getAbsoluteReloc (Ctx, Loc, Kind);
164
181
165
- case MCSymbolRefExpr ::VK_NTPOFF:
182
+ case SystemZMCExpr ::VK_NTPOFF:
166
183
assert (!IsPCRel && " NTPOFF shouldn't be PC-relative" );
167
184
return getTLSLEReloc (Ctx, Loc, Kind);
168
185
169
- case MCSymbolRefExpr ::VK_INDNTPOFF:
186
+ case SystemZMCExpr ::VK_INDNTPOFF:
170
187
if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL)
171
188
return ELF::R_390_TLS_IEENT;
172
189
Ctx.reportError (Loc, " Only PC-relative INDNTPOFF accesses are supported for now" );
173
190
return 0 ;
174
191
175
- case MCSymbolRefExpr ::VK_DTPOFF:
192
+ case SystemZMCExpr ::VK_DTPOFF:
176
193
assert (!IsPCRel && " DTPOFF shouldn't be PC-relative" );
177
194
return getTLSLDOReloc (Ctx, Loc, Kind);
178
195
179
- case MCSymbolRefExpr ::VK_TLSLDM:
196
+ case SystemZMCExpr ::VK_TLSLDM:
180
197
assert (!IsPCRel && " TLSLDM shouldn't be PC-relative" );
181
198
return getTLSLDMReloc (Ctx, Loc, Kind);
182
199
183
- case MCSymbolRefExpr ::VK_TLSGD:
200
+ case SystemZMCExpr ::VK_TLSGD:
184
201
assert (!IsPCRel && " TLSGD shouldn't be PC-relative" );
185
202
return getTLSGDReloc (Ctx, Loc, Kind);
186
203
187
- case MCSymbolRefExpr ::VK_GOT:
188
- case MCSymbolRefExpr ::VK_GOTENT:
204
+ case SystemZMCExpr ::VK_GOT:
205
+ case SystemZMCExpr ::VK_GOTENT:
189
206
if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL)
190
207
return ELF::R_390_GOTENT;
191
208
Ctx.reportError (Loc, " Only PC-relative GOT accesses are supported for now" );
192
209
return 0 ;
193
210
194
- case MCSymbolRefExpr ::VK_PLT:
211
+ case SystemZMCExpr ::VK_PLT:
195
212
assert (IsPCRel && " @PLT shouldn't be PC-relative" );
196
213
return getPLTReloc (Ctx, Loc, Kind);
197
214
@@ -200,6 +217,18 @@ unsigned SystemZELFObjectWriter::getRelocType(MCContext &Ctx,
200
217
}
201
218
}
202
219
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
+
203
232
std::unique_ptr<MCObjectTargetWriter>
204
233
llvm::createSystemZELFObjectWriter (uint8_t OSABI) {
205
234
return std::make_unique<SystemZELFObjectWriter>(OSABI);
0 commit comments