diff options
Diffstat (limited to 'llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp | 25 | 
1 files changed, 24 insertions, 1 deletions
| diff --git a/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp index 4685c0e2e37..139477221a4 100644 --- a/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp @@ -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; | 

