|
17 | 17 | #include "llvm/MC/MCContext.h"
|
18 | 18 | #include "llvm/MC/MCObjectStreamer.h"
|
19 | 19 | #include "llvm/MC/MCSymbolELF.h"
|
| 20 | +#include "llvm/MC/MCValue.h" |
20 | 21 | #include "llvm/Support/Casting.h"
|
21 | 22 |
|
22 | 23 | using namespace llvm;
|
@@ -183,71 +184,11 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::VariantKind Kind) {
|
183 | 184 | bool SparcMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
|
184 | 185 | const MCAssembler *Asm,
|
185 | 186 | const MCFixup *Fixup) const {
|
186 |
| - return getSubExpr()->evaluateAsRelocatable(Res, Asm, Fixup); |
187 |
| -} |
188 |
| - |
189 |
| -static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) { |
190 |
| - switch (Expr->getKind()) { |
191 |
| - case MCExpr::Target: |
192 |
| - llvm_unreachable("Can't handle nested target expr!"); |
193 |
| - break; |
194 |
| - |
195 |
| - case MCExpr::Constant: |
196 |
| - break; |
197 |
| - |
198 |
| - case MCExpr::Binary: { |
199 |
| - const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr); |
200 |
| - fixELFSymbolsInTLSFixupsImpl(BE->getLHS(), Asm); |
201 |
| - fixELFSymbolsInTLSFixupsImpl(BE->getRHS(), Asm); |
202 |
| - break; |
203 |
| - } |
204 |
| - |
205 |
| - case MCExpr::SymbolRef: { |
206 |
| - const MCSymbolRefExpr &SymRef = *cast<MCSymbolRefExpr>(Expr); |
207 |
| - cast<MCSymbolELF>(SymRef.getSymbol()).setType(ELF::STT_TLS); |
208 |
| - break; |
209 |
| - } |
210 |
| - |
211 |
| - case MCExpr::Unary: |
212 |
| - fixELFSymbolsInTLSFixupsImpl(cast<MCUnaryExpr>(Expr)->getSubExpr(), Asm); |
213 |
| - break; |
214 |
| - } |
215 |
| - |
216 |
| -} |
217 |
| - |
218 |
| -void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const { |
219 |
| - switch(getKind()) { |
220 |
| - default: return; |
221 |
| - case VK_Sparc_TLS_GD_CALL: |
222 |
| - case VK_Sparc_TLS_LDM_CALL: { |
223 |
| - // The corresponding relocations reference __tls_get_addr, as they call it, |
224 |
| - // but this is only implicit; we must explicitly add it to our symbol table |
225 |
| - // to bind it for these uses. |
226 |
| - MCSymbol *Symbol = Asm.getContext().getOrCreateSymbol("__tls_get_addr"); |
227 |
| - Asm.registerSymbol(*Symbol); |
228 |
| - auto ELFSymbol = cast<MCSymbolELF>(Symbol); |
229 |
| - if (!ELFSymbol->isBindingSet()) |
230 |
| - ELFSymbol->setBinding(ELF::STB_GLOBAL); |
231 |
| - [[fallthrough]]; |
232 |
| - } |
233 |
| - case VK_Sparc_TLS_GD_HI22: |
234 |
| - case VK_Sparc_TLS_GD_LO10: |
235 |
| - case VK_Sparc_TLS_GD_ADD: |
236 |
| - case VK_Sparc_TLS_LDM_HI22: |
237 |
| - case VK_Sparc_TLS_LDM_LO10: |
238 |
| - case VK_Sparc_TLS_LDM_ADD: |
239 |
| - case VK_Sparc_TLS_LDO_HIX22: |
240 |
| - case VK_Sparc_TLS_LDO_LOX10: |
241 |
| - case VK_Sparc_TLS_LDO_ADD: |
242 |
| - case VK_Sparc_TLS_IE_HI22: |
243 |
| - case VK_Sparc_TLS_IE_LO10: |
244 |
| - case VK_Sparc_TLS_IE_LD: |
245 |
| - case VK_Sparc_TLS_IE_LDX: |
246 |
| - case VK_Sparc_TLS_IE_ADD: |
247 |
| - case VK_Sparc_TLS_LE_HIX22: |
248 |
| - case VK_Sparc_TLS_LE_LOX10: break; |
249 |
| - } |
250 |
| - fixELFSymbolsInTLSFixupsImpl(getSubExpr(), Asm); |
| 187 | + if (!getSubExpr()->evaluateAsRelocatable(Res, Asm, Fixup)) |
| 188 | + return false; |
| 189 | + Res = |
| 190 | + MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind()); |
| 191 | + return true; |
251 | 192 | }
|
252 | 193 |
|
253 | 194 | void SparcMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
|
|
0 commit comments