From: Chris Lattner Date: Sat, 12 Sep 2009 21:01:20 +0000 (+0000) Subject: X86MCInstLower::Lower should only not emit anything to OutStreamer, X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=e9434dbff40aafcd7e33210f88ff79e0dc7c833d;p=oota-llvm.git X86MCInstLower::Lower should only not emit anything to OutStreamer, this means that it can only lower one MachineInstr to one MCInst. To make this fly, we need to pull out handling of MO_GOT_ABSOLUTE_ADDRESS (which generates an implicit label) out of X86MCInstLower. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81629 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp index 9946506441b..625be15390b 100644 --- a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp +++ b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp @@ -78,7 +78,6 @@ GetGlobalAddressSymbol(const MachineOperand &MO) const { switch (MO.getTargetFlags()) { default: llvm_unreachable("Unknown target flag on GV operand"); case X86II::MO_NO_FLAG: // No flag. - case X86II::MO_GOT_ABSOLUTE_ADDRESS: // Doesn't modify symbol name. case X86II::MO_PIC_BASE_OFFSET: // Doesn't modify symbol name. break; case X86II::MO_DLLIMPORT: { @@ -268,29 +267,9 @@ MCOperand X86MCInstLower::LowerSymbolOperand(const MachineOperand &MO, case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: // Subtract the pic base. Expr = MCBinaryExpr::CreateSub(Expr, - MCSymbolRefExpr::Create(GetPICBaseSymbol(), - Ctx), + MCSymbolRefExpr::Create(GetPICBaseSymbol(), Ctx), Ctx); break; - case X86II::MO_GOT_ABSOLUTE_ADDRESS: { - // For this, we want to print something like: - // MYSYMBOL + (. - PICBASE) - // However, we can't generate a ".", so just emit a new label here and refer - // to it. We know that this operand flag occurs at most once per function. - SmallString<64> Name; - raw_svector_ostream(Name) << AsmPrinter.MAI->getPrivateGlobalPrefix() - << "picbaseref" << AsmPrinter.getFunctionNumber(); - MCSymbol *DotSym = Ctx.GetOrCreateSymbol(Name.str()); -// FIXME: This instruction should be lowered before we get here... - AsmPrinter.OutStreamer.EmitLabel(DotSym); - - const MCExpr *DotExpr = MCSymbolRefExpr::Create(DotSym, Ctx); - const MCExpr *PICBase = MCSymbolRefExpr::Create(GetPICBaseSymbol(), - Ctx); - DotExpr = MCBinaryExpr::CreateSub(DotExpr, PICBase, Ctx); - Expr = MCBinaryExpr::CreateAdd(Expr, DotExpr, Ctx); - break; - } } if (!MO.isJTI() && MO.getOffset()) @@ -460,7 +439,45 @@ printInstructionThroughMCStreamer(const MachineInstr *MI) { TmpInst.getOperand(0) = MCOperand::CreateReg(MI->getOperand(0).getReg()); printInstruction(&TmpInst); return; - } + } + + case X86::ADD32ri: { + // Lower the MO_GOT_ABSOLUTE_ADDRESS form of ADD32ri. + if (MI->getOperand(2).getTargetFlags() != X86II::MO_GOT_ABSOLUTE_ADDRESS) + break; + + // Okay, we have something like: + // EAX = ADD32ri EAX, MO_GOT_ABSOLUTE_ADDRESS(@MYGLOBAL) + + // For this, we want to print something like: + // MYGLOBAL + (. - PICBASE) + // However, we can't generate a ".", so just emit a new label here and refer + // to it. We know that this operand flag occurs at most once per function. + SmallString<64> Name; + raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() + << "picbaseref" << getFunctionNumber(); + MCSymbol *DotSym = OutContext.GetOrCreateSymbol(Name.str()); + OutStreamer.EmitLabel(DotSym); + + // Now that we have emitted the label, lower the complex operand expression. + MCSymbol *OpSym = MCInstLowering.GetExternalSymbolSymbol(MI->getOperand(2)); + + const MCExpr *DotExpr = MCSymbolRefExpr::Create(DotSym, OutContext); + const MCExpr *PICBase = + MCSymbolRefExpr::Create(MCInstLowering.GetPICBaseSymbol(), OutContext); + DotExpr = MCBinaryExpr::CreateSub(DotExpr, PICBase, OutContext); + + DotExpr = MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(OpSym,OutContext), + DotExpr, OutContext); + + MCInst TmpInst; + TmpInst.setOpcode(X86::ADD32ri); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); + TmpInst.addOperand(MCOperand::CreateExpr(DotExpr)); + printInstruction(&TmpInst); + return; + } } MCInst TmpInst; diff --git a/lib/Target/X86/AsmPrinter/X86MCInstLower.h b/lib/Target/X86/AsmPrinter/X86MCInstLower.h index b7b2bb0eb4c..2f9691ed097 100644 --- a/lib/Target/X86/AsmPrinter/X86MCInstLower.h +++ b/lib/Target/X86/AsmPrinter/X86MCInstLower.h @@ -10,7 +10,6 @@ #ifndef X86_MCINSTLOWER_H #define X86_MCINSTLOWER_H - namespace llvm { class MCContext; class MCInst; @@ -22,10 +21,13 @@ namespace llvm { class X86ATTAsmPrinter; class X86Subtarget; +/// X86MCInstLower - This class is used to lower an MachineInstr into an MCInst. class X86MCInstLower { MCContext &Ctx; Mangler *Mang; X86ATTAsmPrinter &AsmPrinter; + + const X86Subtarget &getSubtarget() const; public: X86MCInstLower(MCContext &ctx, Mangler *mang, X86ATTAsmPrinter &asmprinter) : Ctx(ctx), Mang(mang), AsmPrinter(asmprinter) {} @@ -33,9 +35,6 @@ public: void Lower(const MachineInstr *MI, MCInst &OutMI) const; MCSymbol *GetPICBaseSymbol() const; - -private: - const X86Subtarget &getSubtarget() const; MCOperand LowerMBBOperand(const MachineOperand &MO) const; MCSymbol *GetGlobalAddressSymbol(const MachineOperand &MO) const;