diff options
Diffstat (limited to 'lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp')
| -rw-r--r-- | lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp | 237 | 
1 files changed, 78 insertions, 159 deletions
diff --git a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp index e1f386ee3dd3..f60cc33c1561 100644 --- a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp @@ -30,6 +30,7 @@  #include "llvm/CodeGen/MachineModuleInfoImpls.h"  #include "llvm/CodeGen/MachineFunctionPass.h"  #include "llvm/CodeGen/MachineJumpTableInfo.h" +#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"  #include "llvm/MC/MCAsmInfo.h"  #include "llvm/MC/MCContext.h"  #include "llvm/MC/MCInst.h" @@ -37,13 +38,11 @@  #include "llvm/MC/MCStreamer.h"  #include "llvm/MC/MCSymbol.h"  #include "llvm/Target/TargetData.h" -#include "llvm/Target/TargetLoweringObjectFile.h"  #include "llvm/Target/TargetMachine.h"  #include "llvm/Target/TargetOptions.h"  #include "llvm/Target/TargetRegistry.h"  #include "llvm/ADT/SmallPtrSet.h"  #include "llvm/ADT/SmallString.h" -#include "llvm/ADT/Statistic.h"  #include "llvm/ADT/StringExtras.h"  #include "llvm/ADT/StringSet.h"  #include "llvm/Support/CommandLine.h" @@ -53,8 +52,6 @@  #include <cctype>  using namespace llvm; -STATISTIC(EmittedInsts, "Number of machine instrs printed"); -  static cl::opt<bool>  EnableMCInst("enable-arm-mcinst-printer", cl::Hidden,              cl::desc("enable experimental asmprinter gunk in the arm backend")); @@ -76,8 +73,9 @@ namespace {    public:      explicit ARMAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM, -                           const MCAsmInfo *T, bool V) -      : AsmPrinter(O, TM, T, V), AFI(NULL), MCP(NULL) { +                           MCContext &Ctx, MCStreamer &Streamer, +                           const MCAsmInfo *T) +      : AsmPrinter(O, TM, Ctx, Streamer, T), AFI(NULL), MCP(NULL) {        Subtarget = &TM.getSubtarget<ARMSubtarget>();      } @@ -85,10 +83,6 @@ namespace {        return "ARM Assembly Printer";      } -    void printMCInst(const MCInst *MI) { -      ARMInstPrinter(O, *MAI, VerboseAsm).printInstruction(MI); -    } -          void printInstructionThroughMCStreamer(const MachineInstr *MI); @@ -162,11 +156,18 @@ namespace {      void printInstruction(const MachineInstr *MI);  // autogenerated.      static const char *getRegisterName(unsigned RegNo); -    void printMachineInstruction(const MachineInstr *MI); +    virtual void EmitInstruction(const MachineInstr *MI);      bool runOnMachineFunction(MachineFunction &F); +     +    virtual void EmitConstantPool() {} // we emit constant pools customly! +    virtual void EmitFunctionEntryLabel();      void EmitStartOfAsmFile(Module &M);      void EmitEndOfAsmFile(Module &M); +    MCSymbol *GetARMSetPICJumpTableLabel2(unsigned uid, unsigned uid2, +                                          const MachineBasicBlock *MBB) const; +    MCSymbol *GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const; +      /// EmitMachineConstantPoolValue - Print a machine constantpool value to      /// the .s file.      virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { @@ -199,7 +200,7 @@ namespace {            MachineModuleInfoMachO &MMIMachO =              MMI->getObjFileInfo<MachineModuleInfoMachO>(); -          const MCSymbol *&StubSym = +          MCSymbol *&StubSym =              GV->hasHiddenVisibility() ? MMIMachO.getHiddenGVStubEntry(Sym) :                                          MMIMachO.getGVStubEntry(Sym);            if (StubSym == 0) @@ -219,7 +220,7 @@ namespace {             O << "-.";           O << ')';        } -      O << '\n'; +      OutStreamer.AddBlankLine();      }      void getAnalysisUsage(AnalysisUsage &AU) const { @@ -233,97 +234,26 @@ namespace {  #include "ARMGenAsmWriter.inc" -/// runOnMachineFunction - This uses the printInstruction() -/// method to print assembly for each instruction. -/// -bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) { -  this->MF = &MF; - -  AFI = MF.getInfo<ARMFunctionInfo>(); -  MCP = MF.getConstantPool(); - -  SetupMachineFunction(MF); -  O << "\n"; - -  // NOTE: we don't print out constant pools here, they are handled as -  // instructions. - -  O << '\n'; - -  // Print out labels for the function. -  const Function *F = MF.getFunction(); -  OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, TM)); - -  switch (F->getLinkage()) { -  default: llvm_unreachable("Unknown linkage type!"); -  case Function::PrivateLinkage: -  case Function::InternalLinkage: -    break; -  case Function::ExternalLinkage: -    O << "\t.globl\t" << *CurrentFnSym << "\n"; -    break; -  case Function::LinkerPrivateLinkage: -  case Function::WeakAnyLinkage: -  case Function::WeakODRLinkage: -  case Function::LinkOnceAnyLinkage: -  case Function::LinkOnceODRLinkage: -    if (Subtarget->isTargetDarwin()) { -      O << "\t.globl\t" << *CurrentFnSym << "\n"; -      O << "\t.weak_definition\t" << *CurrentFnSym << "\n"; -    } else { -      O << MAI->getWeakRefDirective() << *CurrentFnSym << "\n"; -    } -    break; -  } - -  printVisibility(CurrentFnSym, F->getVisibility()); - -  unsigned FnAlign = 1 << MF.getAlignment();  // MF alignment is log2. +void ARMAsmPrinter::EmitFunctionEntryLabel() {    if (AFI->isThumbFunction()) { -    EmitAlignment(FnAlign, F, AFI->getAlign());      O << "\t.code\t16\n";      O << "\t.thumb_func";      if (Subtarget->isTargetDarwin()) -      O << "\t" << *CurrentFnSym; -    O << "\n"; -  } else { -    EmitAlignment(FnAlign, F); -  } - -  O << *CurrentFnSym << ":\n"; -  // Emit pre-function debug information. -  DW->BeginFunction(&MF); - -  if (Subtarget->isTargetDarwin()) { -    // If the function is empty, then we need to emit *something*. Otherwise, -    // the function's label might be associated with something that it wasn't -    // meant to be associated with. We emit a noop in this situation. -    MachineFunction::iterator I = MF.begin(); - -    if (++I == MF.end() && MF.front().empty()) -      O << "\tnop\n"; -  } - -  // Print out code for the function. -  for (MachineFunction::const_iterator I = MF.begin(), E = MF.end(); -       I != E; ++I) { -    // Print a label for the basic block. -    if (I != MF.begin()) -      EmitBasicBlockStart(I); - -    // Print the assembly for the instruction. -    for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end(); -         II != E; ++II) -      printMachineInstruction(II); +      O << '\t' << *CurrentFnSym; +    O << '\n';    } +   +  OutStreamer.EmitLabel(CurrentFnSym); +} -  if (MAI->hasDotTypeDotSizeDirective()) -    O << "\t.size " << *CurrentFnSym << ", .-" << *CurrentFnSym << "\n"; - -  // Emit post-function debug information. -  DW->EndFunction(&MF); +/// runOnMachineFunction - This uses the printInstruction() +/// method to print assembly for each instruction. +/// +bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) { +  AFI = MF.getInfo<ARMFunctionInfo>(); +  MCP = MF.getConstantPool(); -  return false; +  return AsmPrinter::runOnMachineFunction(MF);  }  void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum, @@ -367,7 +297,7 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,      break;    }    case MachineOperand::MO_MachineBasicBlock: -    O << *GetMBBSymbol(MO.getMBB()->getNumber()); +    O << *MO.getMBB()->getSymbol(OutContext);      return;    case MachineOperand::MO_GlobalAddress: {      bool isCallOp = Modifier && !strcmp(Modifier, "call"); @@ -889,7 +819,7 @@ void ARMAsmPrinter::printCPInstOperand(const MachineInstr *MI, int OpNum,    // data itself.    if (!strcmp(Modifier, "label")) {      unsigned ID = MI->getOperand(OpNum).getImm(); -    O << *GetCPISymbol(ID) << ":\n"; +    OutStreamer.EmitLabel(GetCPISymbol(ID));    } else {      assert(!strcmp(Modifier, "cpentry") && "Unknown modifier for CPE");      unsigned CPI = MI->getOperand(OpNum).getIndex(); @@ -904,6 +834,24 @@ void ARMAsmPrinter::printCPInstOperand(const MachineInstr *MI, int OpNum,    }  } +MCSymbol *ARMAsmPrinter:: +GetARMSetPICJumpTableLabel2(unsigned uid, unsigned uid2, +                            const MachineBasicBlock *MBB) const { +  SmallString<60> Name; +  raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() +    << getFunctionNumber() << '_' << uid << '_' << uid2 +    << "_set_" << MBB->getNumber(); +  return OutContext.GetOrCreateSymbol(Name.str()); +} + +MCSymbol *ARMAsmPrinter:: +GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const { +  SmallString<60> Name; +  raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "JTI" +    << getFunctionNumber() << '_' << uid << '_' << uid2; +  return OutContext.GetOrCreateSymbol(Name.str()); +} +  void ARMAsmPrinter::printJTBlockOperand(const MachineInstr *MI, int OpNum) {    assert(!Subtarget->isThumb2() && "Thumb2 should use double-jump jumptables!"); @@ -911,36 +859,34 @@ void ARMAsmPrinter::printJTBlockOperand(const MachineInstr *MI, int OpNum) {    const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id    unsigned JTI = MO1.getIndex(); -  O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() -    << '_' << JTI << '_' << MO2.getImm() << ":\n"; +  MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel2(JTI, MO2.getImm()); +  OutStreamer.EmitLabel(JTISymbol);    const char *JTEntryDirective = MAI->getData32bitsDirective(); -  const MachineFunction *MF = MI->getParent()->getParent();    const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();    const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();    const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs; -  bool UseSet= MAI->getSetDirective() && TM.getRelocationModel() == Reloc::PIC_; +  bool UseSet= MAI->hasSetDirective() && TM.getRelocationModel() == Reloc::PIC_;    SmallPtrSet<MachineBasicBlock*, 8> JTSets;    for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) {      MachineBasicBlock *MBB = JTBBs[i];      bool isNew = JTSets.insert(MBB); -    if (UseSet && isNew) -      printPICJumpTableSetLabel(JTI, MO2.getImm(), MBB); +    if (UseSet && isNew) { +      O << "\t.set\t" +        << *GetARMSetPICJumpTableLabel2(JTI, MO2.getImm(), MBB) << ',' +        << *MBB->getSymbol(OutContext) << '-' << *JTISymbol << '\n'; +    }      O << JTEntryDirective << ' ';      if (UseSet) -      O << MAI->getPrivateGlobalPrefix() << getFunctionNumber() -        << '_' << JTI << '_' << MO2.getImm() -        << "_set_" << MBB->getNumber(); -    else if (TM.getRelocationModel() == Reloc::PIC_) { -      O << *GetMBBSymbol(MBB->getNumber()) -        << '-' << MAI->getPrivateGlobalPrefix() << "JTI" -        << getFunctionNumber() << '_' << JTI << '_' << MO2.getImm(); -    } else { -      O << *GetMBBSymbol(MBB->getNumber()); -    } +      O << *GetARMSetPICJumpTableLabel2(JTI, MO2.getImm(), MBB); +    else if (TM.getRelocationModel() == Reloc::PIC_) +      O << *MBB->getSymbol(OutContext) << '-' << *JTISymbol; +    else +      O << *MBB->getSymbol(OutContext); +      if (i != e-1)        O << '\n';    } @@ -950,10 +896,10 @@ void ARMAsmPrinter::printJT2BlockOperand(const MachineInstr *MI, int OpNum) {    const MachineOperand &MO1 = MI->getOperand(OpNum);    const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id    unsigned JTI = MO1.getIndex(); -  O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() -    << '_' << JTI << '_' << MO2.getImm() << ":\n"; +   +  MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel2(JTI, MO2.getImm()); +  OutStreamer.EmitLabel(JTISymbol); -  const MachineFunction *MF = MI->getParent()->getParent();    const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();    const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();    const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs; @@ -969,13 +915,12 @@ void ARMAsmPrinter::printJT2BlockOperand(const MachineInstr *MI, int OpNum) {        O << MAI->getData8bitsDirective();      else if (HalfWordOffset)        O << MAI->getData16bitsDirective(); -    if (ByteOffset || HalfWordOffset) { -      O << '(' << *GetMBBSymbol(MBB->getNumber()); -      O << "-" << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() -        << '_' << JTI << '_' << MO2.getImm() << ")/2"; -    } else { -      O << "\tb.w " << *GetMBBSymbol(MBB->getNumber()); -    } +     +    if (ByteOffset || HalfWordOffset) +      O << '(' << *MBB->getSymbol(OutContext) << "-" << *JTISymbol << ")/2"; +    else +      O << "\tb.w " << *MBB->getSymbol(OutContext); +      if (i != e-1)        O << '\n';    } @@ -1076,12 +1021,7 @@ bool ARMAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,    return false;  } -void ARMAsmPrinter::printMachineInstruction(const MachineInstr *MI) { -  ++EmittedInsts; - -  // Call the autogenerated instruction printer routines. -  processDebugLoc(MI, true); -   +void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {    if (EnableMCInst) {      printInstructionThroughMCStreamer(MI);    } else { @@ -1090,12 +1030,8 @@ void ARMAsmPrinter::printMachineInstruction(const MachineInstr *MI) {        EmitAlignment(2);      printInstruction(MI); +    OutStreamer.AddBlankLine();    } -   -  if (VerboseAsm) -    EmitComments(*MI); -  O << '\n'; -  processDebugLoc(MI, false);  }  void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) { @@ -1215,20 +1151,6 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {    case ARM::t2MOVi32imm:      assert(0 && "Should be lowered by thumb2it pass");    default: break; -  case TargetInstrInfo::DBG_LABEL: -  case TargetInstrInfo::EH_LABEL: -  case TargetInstrInfo::GC_LABEL: -    printLabel(MI); -    return; -  case TargetInstrInfo::KILL: -    printKill(MI); -    return; -  case TargetInstrInfo::INLINEASM: -    printInlineAsm(MI); -    return; -  case TargetInstrInfo::IMPLICIT_DEF: -    printImplicitDef(MI); -    return;    case ARM::PICADD: { // FIXME: Remove asm string from td file.      // This is a pseudo op for a label + instruction sequence, which looks like:      // LPC0: @@ -1250,7 +1172,7 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {      AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));      AddInst.addOperand(MCOperand::CreateReg(ARM::PC));      AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); -    printMCInst(&AddInst); +    OutStreamer.EmitInstruction(AddInst);      return;    }    case ARM::CONSTPOOL_ENTRY: { // FIXME: Remove asm string from td file. @@ -1291,8 +1213,7 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {        TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(3).getReg()));        TmpInst.addOperand(MCOperand::CreateReg(0));          // cc_out -      printMCInst(&TmpInst); -      O << '\n'; +      OutStreamer.EmitInstruction(TmpInst);      }      { @@ -1306,7 +1227,7 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {        TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(3).getReg()));        TmpInst.addOperand(MCOperand::CreateReg(0));          // cc_out -      printMCInst(&TmpInst); +      OutStreamer.EmitInstruction(TmpInst);      }      return;     } @@ -1325,8 +1246,7 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {        TmpInst.addOperand(MCOperand::CreateImm(MI->getOperand(2).getImm()));        TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(3).getReg())); -      printMCInst(&TmpInst); -      O << '\n'; +      OutStreamer.EmitInstruction(TmpInst);      }      { @@ -1340,7 +1260,7 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {        TmpInst.addOperand(MCOperand::CreateImm(MI->getOperand(2).getImm()));        TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(3).getReg())); -      printMCInst(&TmpInst); +      OutStreamer.EmitInstruction(TmpInst);      }      return; @@ -1349,8 +1269,7 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {    MCInst TmpInst;    MCInstLowering.Lower(MI, TmpInst); -   -  printMCInst(&TmpInst); +  OutStreamer.EmitInstruction(TmpInst);  }  //===----------------------------------------------------------------------===//  | 
