From 6135a96792ca05f6366e5dbaee6208e84589c47f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 14 Nov 2010 22:22:59 +0000 Subject: [PATCH] reimplement ppc asmprinter "toc" handling to use a VariantKind on the operand, required for .o file writing and fixing the PowerPC/mult-alt-generic-powerpc64.ll failure with the new instprinter. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119087 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCExpr.h | 4 +++- lib/MC/MCExpr.cpp | 3 ++- lib/Target/PowerPC/PPCAsmPrinter.cpp | 26 ++++++++++++++++++++++++++ lib/Target/PowerPC/PPCInstr64Bit.td | 4 +--- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/include/llvm/MC/MCExpr.h b/include/llvm/MC/MCExpr.h index 3f25dc05628..22b1447b95e 100644 --- a/include/llvm/MC/MCExpr.h +++ b/include/llvm/MC/MCExpr.h @@ -141,6 +141,7 @@ public: VK_TLSLDM, VK_TPOFF, VK_DTPOFF, + VK_TLVP, // Mach-O thread local variable relocation VK_ARM_HI16, // The R_ARM_MOVT_ABS relocation (:upper16: in the .s file) VK_ARM_LO16, // The R_ARM_MOVW_ABS_NC relocation (:lower16: in the .w file) // FIXME: We'd really like to use the generic Kinds listed above for these. @@ -150,7 +151,8 @@ public: VK_ARM_GOTOFF, VK_ARM_TPOFF, VK_ARM_GOTTPOFF, - VK_TLVP // Mach-O thread local variable relocation + + VK_PPC_TOC }; private: diff --git a/lib/MC/MCExpr.cpp b/lib/MC/MCExpr.cpp index fa98b55dde8..e6f2a8f7908 100644 --- a/lib/MC/MCExpr.cpp +++ b/lib/MC/MCExpr.cpp @@ -187,6 +187,7 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) { case VK_TLSLDM: return "TLSLDM"; case VK_TPOFF: return "TPOFF"; case VK_DTPOFF: return "DTPOFF"; + case VK_TLVP: return "TLVP"; case VK_ARM_HI16: return ":upper16:"; case VK_ARM_LO16: return ":lower16:"; case VK_ARM_PLT: return "(PLT)"; @@ -195,7 +196,7 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) { case VK_ARM_TPOFF: return "(tpoff)"; case VK_ARM_GOTTPOFF: return "(gottpoff)"; case VK_ARM_TLSGD: return "(tldgd)"; - case VK_TLVP: return "TLVP"; + case VK_PPC_TOC: return "toc"; } } diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index 8cd87de66d4..d694b430178 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -560,6 +560,32 @@ void PPCAsmPrinter::EmitInstruction(const MachineInstr *MI) { switch (MI->getOpcode()) { default: break; + case PPC::LDtoc: { + // Transform %X3 = LDtoc , %X2 + LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); + + // Change the opcode to LD, and the global address operand to be a + // reference to the TOC entry we will synthesize later. + TmpInst.setOpcode(PPC::LD); + const MachineOperand &MO = MI->getOperand(1); + assert(MO.isGlobal()); + + // Map symbol -> label of TOC entry. + MCSymbol *&TOCEntry = TOC[Mang->getSymbol(MO.getGlobal())]; + if (TOCEntry == 0) { + TOCEntry = OutContext. + GetOrCreateSymbol(StringRef(MAI->getPrivateGlobalPrefix()) + + "C" + Twine(LabelID++)); + } + + const MCExpr *Exp = + MCSymbolRefExpr::Create(TOCEntry, MCSymbolRefExpr::VK_PPC_TOC, + OutContext); + TmpInst.getOperand(1) = MCOperand::CreateExpr(Exp); + OutStreamer.EmitInstruction(TmpInst); + return; + } + case PPC::MFCRpseud: // Transform: %R3 = MFCRpseud %CR7 // Into: %R3 = MFCR ;; cr7 diff --git a/lib/Target/PowerPC/PPCInstr64Bit.td b/lib/Target/PowerPC/PPCInstr64Bit.td index a0781b98705..3cae32642ca 100644 --- a/lib/Target/PowerPC/PPCInstr64Bit.td +++ b/lib/Target/PowerPC/PPCInstr64Bit.td @@ -566,7 +566,7 @@ def LDinto_toc: DSForm_1<58, 0, (outs), (ins G8RC:$reg), let RST = 2, DS = 40, RA = 1 in def LDtoc_restore : DSForm_1<58, 0, (outs), (ins), "ld 2, 40(1)", LdStLD, - []>, isPPC64; + [(PPCtoc_restore)]>, isPPC64; def LDX : XForm_1<31, 21, (outs G8RC:$rD), (ins memrr:$src), "ldx $rD, $src", LdStLD, [(set G8RC:$rD, (load xaddr:$src))]>, isPPC64; @@ -579,8 +579,6 @@ def LDU : DSForm_1<58, 1, (outs G8RC:$rD, ptr_rc:$ea_result), (ins memrix:$addr } -def : Pat<(PPCtoc_restore), - (LDtoc_restore)>; def : Pat<(PPCload ixaddr:$src), (LD ixaddr:$src)>; def : Pat<(PPCload xaddr:$src), -- 2.11.0