|
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