add MCInstLower support for lowering ARM::PICADD, a pseudo op for pic stuffola.
authorChris Lattner <sabre@nondot.org>
Mon, 19 Oct 2009 22:23:04 +0000 (22:23 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 19 Oct 2009 22:23:04 +0000 (22:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84553 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp
lib/Target/ARM/AsmPrinter/ARMInstPrinter.h

index 4685c0e2e37972e5c544be880351bc6530f60f6e..139477221a482a0bfcc8ac7a0e79f8c13f7e7cbd 100644 (file)
@@ -1313,6 +1313,7 @@ extern "C" void LLVMInitializeARMAsmPrinter() {
 void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {
   ARMMCInstLower MCInstLowering(OutContext, *Mang, getFunctionNumber(), *MAI);
   switch (MI->getOpcode()) {
+  default: break;
   case TargetInstrInfo::DBG_LABEL:
   case TargetInstrInfo::EH_LABEL:
   case TargetInstrInfo::GC_LABEL:
@@ -1327,7 +1328,29 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {
   case TargetInstrInfo::IMPLICIT_DEF:
     printImplicitDef(MI);
     return;
-  default: break;
+  case ARM::PICADD: { // FIXME: Remove asm string from td file.
+    // This is a pseudo op for a label + instruction sequence, which looks like:
+    // LPC0:
+    //     add r0, pc, r0
+    // This adds the address of LPC0 to r0.
+    
+    // Emit the label.
+    // FIXME: MOVE TO SHARED PLACE.
+    SmallString<60> Name;
+    int Id = (int)MI->getOperand(2).getImm();
+    raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "PC" << Id;
+    OutStreamer.EmitLabel(OutContext.GetOrCreateSymbol(Name.str()));
+    
+    
+    // Form and emit tha dd.
+    MCInst AddInst;
+    AddInst.setOpcode(ARM::ADDrr);
+    AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
+    AddInst.addOperand(MCOperand::CreateReg(ARM::PC));
+    AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg()));
+    printMCInst(&AddInst);
+    return;
+  }
   }
       
   MCInst TmpInst;
index 6738bbf27ca88666c87fb24f00018e5b21e741e4..4d9c592e64b5f5e55594d986e7e4eaf4a8fcab91 100644 (file)
@@ -157,3 +157,10 @@ void ARMInstPrinter::printRegisterList(const MCInst *MI, unsigned OpNum) {
   }
   O << "}";
 }
+
+
+
+void ARMInstPrinter::printPCLabel(const MCInst *MI, unsigned OpNum) {
+  // FIXME: remove this.
+  abort();
+}
index 4f744c400cb144b544059e1f3481d34856326cdf..d4f6033152c5a68d886ef4af19d164b848a607d9 100644 (file)
@@ -71,7 +71,6 @@ public:
   
   void printPredicateOperand(const MCInst *MI, unsigned OpNum) {}
   void printSBitModifierOperand(const MCInst *MI, unsigned OpNum) {}
-  void printPCLabel(const MCInst *MI, unsigned OpNum) {}
   void printRegisterList(const MCInst *MI, unsigned OpNum);
   void printCPInstOperand(const MCInst *MI, unsigned OpNum,
                           const char *Modifier) {}
@@ -79,9 +78,9 @@ public:
   void printJT2BlockOperand(const MCInst *MI, unsigned OpNum) {}
   void printTBAddrMode(const MCInst *MI, unsigned OpNum) {}
   void printNoHashImmediate(const MCInst *MI, unsigned OpNum) {}
-  
-  
-  // FIXME:
+
+  void printPCLabel(const MCInst *MI, unsigned OpNum);  
+  // FIXME: Implement.
   void PrintSpecial(const MCInst *MI, const char *Kind) {}
 };