[llvm-commits] [llvm] r81629 - in /llvm/trunk/lib/Target/X86/AsmPrinter: X86MCInstLower.cpp X86MCInstLower.h

Chris Lattner sabre at nondot.org
Sat Sep 12 14:01:20 PDT 2009


Author: lattner
Date: Sat Sep 12 16:01:20 2009
New Revision: 81629

URL: http://llvm.org/viewvc/llvm-project?rev=81629&view=rev
Log:
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.

Modified:
    llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp
    llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.h

Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp?rev=81629&r1=81628&r2=81629&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp Sat Sep 12 16:01:20 2009
@@ -78,7 +78,6 @@
   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 @@
   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 @@
     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;

Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.h?rev=81629&r1=81628&r2=81629&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.h (original)
+++ llvm/trunk/lib/Target/X86/AsmPrinter/X86MCInstLower.h Sat Sep 12 16:01:20 2009
@@ -10,7 +10,6 @@
 #ifndef X86_MCINSTLOWER_H
 #define X86_MCINSTLOWER_H
 
-
 namespace llvm {
   class MCContext;
   class MCInst;
@@ -22,10 +21,13 @@
   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 @@
   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;





More information about the llvm-commits mailing list