diff options
author | Eric Christopher <echristo@apple.com> | 2010-06-17 00:51:48 +0000 |
---|---|---|
committer | Eric Christopher <echristo@apple.com> | 2010-06-17 00:51:48 +0000 |
commit | e98ad835435b82347eac3708e561928a35c62865 (patch) | |
tree | 869eb5b042a19e28e8a3a6bb02cb99928fe61dce | |
parent | 04b8d3cc4914ffe74f1c78fbf0ff4c8c3299cbea (diff) | |
download | external_llvm-e98ad835435b82347eac3708e561928a35c62865.zip external_llvm-e98ad835435b82347eac3708e561928a35c62865.tar.gz external_llvm-e98ad835435b82347eac3708e561928a35c62865.tar.bz2 |
Hack to let the move lowering handle dynamic-no-pic absolute moves of
TLVP:
movl _a@TLVP, %eax
Daniel: Please review if you get a chance.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106194 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/AsmPrinter/X86MCInstLower.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp index a97517b..43c654e 100644 --- a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp +++ b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp @@ -277,10 +277,21 @@ static void SimplifyShortMoveForm(MCInst &Inst, unsigned Opcode) { return; // Check whether this is an absolute address. - if (Inst.getOperand(AddrBase + 0).getReg() != 0 || - Inst.getOperand(AddrBase + 2).getReg() != 0 || - Inst.getOperand(AddrBase + 4).getReg() != 0 || - Inst.getOperand(AddrBase + 1).getImm() != 1) + // FIXME: We know TLVP symbol refs aren't, but there should be a better way + // to do this here. + bool Absolute = true; + if (Inst.getOperand(AddrOp).isExpr()) { + const MCExpr *MCE = Inst.getOperand(AddrOp).getExpr(); + if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(MCE)) + if (SRE->getKind() == MCSymbolRefExpr::VK_TLVP) + Absolute = false; + } + + if (Absolute && + (Inst.getOperand(AddrBase + 0).getReg() != 0 || + Inst.getOperand(AddrBase + 2).getReg() != 0 || + Inst.getOperand(AddrBase + 4).getReg() != 0 || + Inst.getOperand(AddrBase + 1).getImm() != 1)) return; // If so, rewrite the instruction. |