diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index 9c528f10fca..c619655e7a2 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -65,6 +65,8 @@ namespace llvm { // Necessary for external weak linkage support std::set ExtWeakSymbols; + /// Fast - Generating code via fast instruction selection. + bool Fast; public: /// Output stream on which we're printing assembly code. /// @@ -82,6 +84,9 @@ namespace llvm { /// const TargetRegisterInfo *TRI; + /// The current machine function. + const MachineFunction *MF; + /// Name-mangler for global names. /// Mangler *Mang; @@ -101,7 +106,8 @@ namespace llvm { bool IsInTextSection; protected: - AsmPrinter(raw_ostream &o, TargetMachine &TM, const TargetAsmInfo *T); + AsmPrinter(raw_ostream &o, TargetMachine &TM, + const TargetAsmInfo *T, bool F); public: virtual ~AsmPrinter(); diff --git a/include/llvm/CodeGen/DwarfWriter.h b/include/llvm/CodeGen/DwarfWriter.h index 14fc89bf18c..c7682c29218 100644 --- a/include/llvm/CodeGen/DwarfWriter.h +++ b/include/llvm/CodeGen/DwarfWriter.h @@ -49,9 +49,6 @@ private: /// DwarfException *DE; - /// FastCodeGen - True if generating code via the "fast" isel. - /// - bool FastCodeGen; public: static char ID; // Pass identification, replacement for typeid @@ -107,9 +104,6 @@ public: /// ShouldEmitDwarfDebug - Returns true if Dwarf debugging declarations should /// be emitted. bool ShouldEmitDwarfDebug() const; - - bool getFastCodeGen() const { return FastCodeGen; } - void setFastCodeGen(bool Fast) { FastCodeGen = Fast; } }; diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index d4dd79572ed..fd71ba971e7 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -37,8 +37,8 @@ using namespace llvm; char AsmPrinter::ID = 0; AsmPrinter::AsmPrinter(raw_ostream &o, TargetMachine &tm, - const TargetAsmInfo *T) - : MachineFunctionPass(&ID), FunctionNumber(0), O(o), + const TargetAsmInfo *T, bool F) + : MachineFunctionPass(&ID), FunctionNumber(0), Fast(F), O(o), TM(tm), TAI(T), TRI(tm.getRegisterInfo()), IsInTextSection(false) {} diff --git a/lib/CodeGen/SelectionDAG/FastISel.cpp b/lib/CodeGen/SelectionDAG/FastISel.cpp index c1b93bf422d..fb3d101f122 100644 --- a/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -370,7 +370,6 @@ bool FastISel::SelectCall(User *I) { unsigned Line = Subprogram.getLineNumber(); unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile); setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0))); - DW->setFastCodeGen(true); if (DW->getRecordSourceLineCount() != 1) { const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index bc417138bfd..4791465b096 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -3915,7 +3915,6 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) { if (Fast) DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(), getRoot(), LabelID)); - DW->setFastCodeGen(Fast); } return 0; diff --git a/lib/Target/ARM/ARM.h b/lib/Target/ARM/ARM.h index 0358230c66a..87d2cffe2aa 100644 --- a/lib/Target/ARM/ARM.h +++ b/lib/Target/ARM/ARM.h @@ -89,7 +89,9 @@ inline static const char *ARMCondCodeToString(ARMCC::CondCodes CC) { } FunctionPass *createARMISelDag(ARMTargetMachine &TM); -FunctionPass *createARMCodePrinterPass(raw_ostream &O, ARMTargetMachine &TM); +FunctionPass *createARMCodePrinterPass(raw_ostream &O, + ARMTargetMachine &TM, + bool Fast); FunctionPass *createARMCodeEmitterPass(ARMTargetMachine &TM, MachineCodeEmitter &MCE); FunctionPass *createARMLoadStoreOptimizationPass(); diff --git a/lib/Target/ARM/ARMTargetMachine.cpp b/lib/Target/ARM/ARMTargetMachine.cpp index a5d3659d3c7..919c2ffaf8f 100644 --- a/lib/Target/ARM/ARMTargetMachine.cpp +++ b/lib/Target/ARM/ARMTargetMachine.cpp @@ -157,7 +157,7 @@ bool ARMTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast, // Output assembly language. assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(Out, *this)); + PM.add(AsmPrinterCtor(Out, *this, Fast)); return false; } @@ -174,7 +174,7 @@ bool ARMTargetMachine::addCodeEmitter(PassManagerBase &PM, bool Fast, if (DumpAsm) { assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(errs(), *this)); + PM.add(AsmPrinterCtor(errs(), *this, Fast)); } return false; @@ -187,7 +187,7 @@ bool ARMTargetMachine::addSimpleCodeEmitter(PassManagerBase &PM, bool Fast, if (DumpAsm) { assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(errs(), *this)); + PM.add(AsmPrinterCtor(errs(), *this, Fast)); } return false; diff --git a/lib/Target/ARM/ARMTargetMachine.h b/lib/Target/ARM/ARMTargetMachine.h index 6fe9a222b4d..54037407427 100644 --- a/lib/Target/ARM/ARMTargetMachine.h +++ b/lib/Target/ARM/ARMTargetMachine.h @@ -40,7 +40,8 @@ protected: // To avoid having target depend on the asmprinter stuff libraries, asmprinter // set this functions to ctor pointer at startup time if they are linked in. typedef FunctionPass *(*AsmPrinterCtorFn)(raw_ostream &o, - ARMTargetMachine &tm); + ARMTargetMachine &tm, + bool fast); static AsmPrinterCtorFn AsmPrinterCtor; public: diff --git a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp index 822cc2eb75b..2f1da52f2d2 100644 --- a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp @@ -42,13 +42,7 @@ using namespace llvm; STATISTIC(EmittedInsts, "Number of machine instrs printed"); namespace { - struct VISIBILITY_HIDDEN ARMAsmPrinter : public AsmPrinter { - ARMAsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T) - : AsmPrinter(O, TM, T), DW(0), MMI(NULL), AFI(NULL), MCP(NULL), - InCPMode(false) { - Subtarget = &TM.getSubtarget(); - } - + class VISIBILITY_HIDDEN ARMAsmPrinter : public AsmPrinter { DwarfWriter *DW; MachineModuleInfo *MMI; @@ -85,7 +79,14 @@ namespace { /// True if asm printer is printing a series of CONSTPOOL_ENTRY. bool InCPMode; - + public: + ARMAsmPrinter(raw_ostream &O, TargetMachine &TM, + const TargetAsmInfo *T, bool F) + : AsmPrinter(O, TM, T, F), DW(0), MMI(NULL), AFI(NULL), MCP(NULL), + InCPMode(false) { + Subtarget = &TM.getSubtarget(); + } + virtual const char *getPassName() const { return "ARM Assembly Printer"; } @@ -183,6 +184,8 @@ namespace { /// method to print assembly for each instruction. /// bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) { + this->MF = &MF; + AFI = MF.getInfo(); MCP = MF.getConstantPool(); @@ -1039,8 +1042,9 @@ bool ARMAsmPrinter::doFinalization(Module &M) { /// regardless of whether the function is in SSA form. /// FunctionPass *llvm::createARMCodePrinterPass(raw_ostream &o, - ARMTargetMachine &tm) { - return new ARMAsmPrinter(o, tm, tm.getTargetAsmInfo()); + ARMTargetMachine &tm, + bool fast) { + return new ARMAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } namespace { diff --git a/lib/Target/Alpha/Alpha.h b/lib/Target/Alpha/Alpha.h index 9af46d0c70f..e885c80b27a 100644 --- a/lib/Target/Alpha/Alpha.h +++ b/lib/Target/Alpha/Alpha.h @@ -25,7 +25,8 @@ namespace llvm { FunctionPass *createAlphaISelDag(AlphaTargetMachine &TM); FunctionPass *createAlphaCodePrinterPass(raw_ostream &OS, - TargetMachine &TM); + TargetMachine &TM, + bool Fast); FunctionPass *createAlphaPatternInstructionSelector(TargetMachine &TM); FunctionPass *createAlphaCodeEmitterPass(AlphaTargetMachine &TM, MachineCodeEmitter &MCE); diff --git a/lib/Target/Alpha/AlphaTargetMachine.cpp b/lib/Target/Alpha/AlphaTargetMachine.cpp index c65485b061c..db3567fa61a 100644 --- a/lib/Target/Alpha/AlphaTargetMachine.cpp +++ b/lib/Target/Alpha/AlphaTargetMachine.cpp @@ -88,14 +88,14 @@ bool AlphaTargetMachine::addPreEmitPass(PassManagerBase &PM, bool Fast) { bool AlphaTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast, raw_ostream &Out) { PM.add(createAlphaLLRPPass(*this)); - PM.add(createAlphaCodePrinterPass(Out, *this)); + PM.add(createAlphaCodePrinterPass(Out, *this, Fast)); return false; } bool AlphaTargetMachine::addCodeEmitter(PassManagerBase &PM, bool Fast, bool DumpAsm, MachineCodeEmitter &MCE) { PM.add(createAlphaCodeEmitterPass(*this, MCE)); if (DumpAsm) - PM.add(createAlphaCodePrinterPass(errs(), *this)); + PM.add(createAlphaCodePrinterPass(errs(), *this, Fast)); return false; } bool AlphaTargetMachine::addSimpleCodeEmitter(PassManagerBase &PM, diff --git a/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp b/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp index fdfee1bc150..536e5920f38 100644 --- a/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp +++ b/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp @@ -33,13 +33,12 @@ STATISTIC(EmittedInsts, "Number of machine instrs printed"); namespace { struct VISIBILITY_HIDDEN AlphaAsmPrinter : public AsmPrinter { - /// Unique incrementer for label values for referencing Global values. /// - AlphaAsmPrinter(raw_ostream &o, TargetMachine &tm, const TargetAsmInfo *T) - : AsmPrinter(o, tm, T) { - } + AlphaAsmPrinter(raw_ostream &o, TargetMachine &tm, + const TargetAsmInfo *T, bool F) + : AsmPrinter(o, tm, T, F) {} virtual const char *getPassName() const { return "Alpha Assembly Printer"; @@ -68,8 +67,9 @@ namespace { /// regardless of whether the function is in SSA form. /// FunctionPass *llvm::createAlphaCodePrinterPass(raw_ostream &o, - TargetMachine &tm) { - return new AlphaAsmPrinter(o, tm, tm.getTargetAsmInfo()); + TargetMachine &tm, + bool fast) { + return new AlphaAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } #include "AlphaGenAsmWriter.inc" @@ -139,6 +139,8 @@ void AlphaAsmPrinter::printOp(const MachineOperand &MO, bool IsCallOp) { /// method to print assembly for each instruction. /// bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) { + this->MF = &MF; + SetupMachineFunction(MF); O << "\n\n"; diff --git a/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp b/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp index e9b3fc2d26b..474a8ad3a4c 100644 --- a/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp +++ b/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp @@ -45,13 +45,12 @@ namespace { const std::string bss_section(".bss"); - struct VISIBILITY_HIDDEN SPUAsmPrinter : public AsmPrinter { + class VISIBILITY_HIDDEN SPUAsmPrinter : public AsmPrinter { std::set FnStubs, GVStubs; - - SPUAsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T) : - AsmPrinter(O, TM, T) - { - } + public: + SPUAsmPrinter(raw_ostream &O, TargetMachine &TM, + const TargetAsmInfo *T, bool F) : + AsmPrinter(O, TM, T, F) {} virtual const char *getPassName() const { return "STI CBEA SPU Assembly Printer"; @@ -285,17 +284,13 @@ namespace { }; /// LinuxAsmPrinter - SPU assembly printer, customized for Linux - struct VISIBILITY_HIDDEN LinuxAsmPrinter : public SPUAsmPrinter { - + class VISIBILITY_HIDDEN LinuxAsmPrinter : public SPUAsmPrinter { DwarfWriter *DW; MachineModuleInfo *MMI; - + public: LinuxAsmPrinter(raw_ostream &O, SPUTargetMachine &TM, - const TargetAsmInfo *T) : - SPUAsmPrinter(O, TM, T), - DW(0), - MMI(0) - { } + const TargetAsmInfo *T, bool F) + : SPUAsmPrinter(O, TM, T, F), DW(0), MMI(0) {} virtual const char *getPassName() const { return "STI CBEA SPU Assembly Printer"; @@ -427,6 +422,8 @@ void SPUAsmPrinter::printMachineInstruction(const MachineInstr *MI) { bool LinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF) { + this->MF = &MF; + SetupMachineFunction(MF); O << "\n\n"; @@ -613,6 +610,7 @@ bool LinuxAsmPrinter::doFinalization(Module &M) { /// that the Linux SPU assembler can deal with. /// FunctionPass *llvm::createSPUAsmPrinterPass(raw_ostream &o, - SPUTargetMachine &tm) { - return new LinuxAsmPrinter(o, tm, tm.getTargetAsmInfo()); + SPUTargetMachine &tm, + bool fast) { + return new LinuxAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } diff --git a/lib/Target/CellSPU/SPU.h b/lib/Target/CellSPU/SPU.h index a6a911067fd..a7a9a771820 100644 --- a/lib/Target/CellSPU/SPU.h +++ b/lib/Target/CellSPU/SPU.h @@ -23,7 +23,9 @@ namespace llvm { class raw_ostream; FunctionPass *createSPUISelDag(SPUTargetMachine &TM); - FunctionPass *createSPUAsmPrinterPass(raw_ostream &o, SPUTargetMachine &tm); + FunctionPass *createSPUAsmPrinterPass(raw_ostream &o, + SPUTargetMachine &tm, + bool fast); /*--== Utility functions/predicates/etc used all over the place: --==*/ //! Predicate test for a signed 10-bit value diff --git a/lib/Target/CellSPU/SPUTargetMachine.cpp b/lib/Target/CellSPU/SPUTargetMachine.cpp index 217da2c9ff4..ba5d2f2507c 100644 --- a/lib/Target/CellSPU/SPUTargetMachine.cpp +++ b/lib/Target/CellSPU/SPUTargetMachine.cpp @@ -90,6 +90,6 @@ SPUTargetMachine::addInstSelector(PassManagerBase &PM, bool Fast) bool SPUTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast, raw_ostream &Out) { - PM.add(createSPUAsmPrinterPass(Out, *this)); + PM.add(createSPUAsmPrinterPass(Out, *this, Fast)); return false; } diff --git a/lib/Target/IA64/IA64.h b/lib/Target/IA64/IA64.h index 030a23382f7..ab9e67764e1 100644 --- a/lib/Target/IA64/IA64.h +++ b/lib/Target/IA64/IA64.h @@ -35,7 +35,9 @@ FunctionPass *createIA64BundlingPass(IA64TargetMachine &TM); /// using the given target machine description. This should work /// regardless of whether the function is in SSA form. /// -FunctionPass *createIA64CodePrinterPass(raw_ostream &o, IA64TargetMachine &tm); +FunctionPass *createIA64CodePrinterPass(raw_ostream &o, + IA64TargetMachine &tm, + bool fast); } // End llvm namespace diff --git a/lib/Target/IA64/IA64AsmPrinter.cpp b/lib/Target/IA64/IA64AsmPrinter.cpp index 567e04c4b15..00474309d56 100644 --- a/lib/Target/IA64/IA64AsmPrinter.cpp +++ b/lib/Target/IA64/IA64AsmPrinter.cpp @@ -34,12 +34,12 @@ using namespace llvm; STATISTIC(EmittedInsts, "Number of machine instrs printed"); namespace { - struct IA64AsmPrinter : public AsmPrinter { + class IA64AsmPrinter : public AsmPrinter { std::set ExternalFunctionNames, ExternalObjectNames; - - IA64AsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T) - : AsmPrinter(O, TM, T) { - } + public: + IA64AsmPrinter(raw_ostream &O, TargetMachine &TM, + const TargetAsmInfo *T, bool F) + : AsmPrinter(O, TM, T, F) {} virtual const char *getPassName() const { return "IA64 Assembly Printer"; @@ -124,6 +124,8 @@ namespace { /// method to print assembly for each instruction. /// bool IA64AsmPrinter::runOnMachineFunction(MachineFunction &MF) { + this->MF = &MF; + SetupMachineFunction(MF); O << "\n\n"; @@ -365,6 +367,7 @@ bool IA64AsmPrinter::doFinalization(Module &M) { /// the given target machine description. /// FunctionPass *llvm::createIA64CodePrinterPass(raw_ostream &o, - IA64TargetMachine &tm) { - return new IA64AsmPrinter(o, tm, tm.getTargetAsmInfo()); + IA64TargetMachine &tm, + bool fast) { + return new IA64AsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } diff --git a/lib/Target/IA64/IA64TargetMachine.cpp b/lib/Target/IA64/IA64TargetMachine.cpp index 459e8ed7a23..1cac9e4ea69 100644 --- a/lib/Target/IA64/IA64TargetMachine.cpp +++ b/lib/Target/IA64/IA64TargetMachine.cpp @@ -84,7 +84,7 @@ bool IA64TargetMachine::addPreEmitPass(PassManagerBase &PM, bool Fast) { } bool IA64TargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast, raw_ostream &Out) { - PM.add(createIA64CodePrinterPass(Out, *this)); + PM.add(createIA64CodePrinterPass(Out, *this, Fast)); return false; } diff --git a/lib/Target/Mips/Mips.h b/lib/Target/Mips/Mips.h index 03f5a525ba6..28c11b0eb91 100644 --- a/lib/Target/Mips/Mips.h +++ b/lib/Target/Mips/Mips.h @@ -24,7 +24,8 @@ namespace llvm { FunctionPass *createMipsISelDag(MipsTargetMachine &TM); FunctionPass *createMipsDelaySlotFillerPass(MipsTargetMachine &TM); FunctionPass *createMipsCodePrinterPass(raw_ostream &OS, - MipsTargetMachine &TM); + MipsTargetMachine &TM, + bool Fast); } // end namespace llvm; // Defines symbolic names for Mips registers. This defines a mapping from diff --git a/lib/Target/Mips/MipsAsmPrinter.cpp b/lib/Target/Mips/MipsAsmPrinter.cpp index 94cd71a7609..732c5d796ca 100644 --- a/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/lib/Target/Mips/MipsAsmPrinter.cpp @@ -46,13 +46,12 @@ using namespace llvm; STATISTIC(EmittedInsts, "Number of machine instrs printed"); namespace { - struct VISIBILITY_HIDDEN MipsAsmPrinter : public AsmPrinter { - + class VISIBILITY_HIDDEN MipsAsmPrinter : public AsmPrinter { const MipsSubtarget *Subtarget; - + public: MipsAsmPrinter(raw_ostream &O, MipsTargetMachine &TM, - const TargetAsmInfo *T): - AsmPrinter(O, TM, T) { + const TargetAsmInfo *T, bool F) + : AsmPrinter(O, TM, T, F) { Subtarget = &TM.getSubtarget(); } @@ -91,9 +90,9 @@ namespace { /// using the given target machine description. This should work /// regardless of whether the function is in SSA form. FunctionPass *llvm::createMipsCodePrinterPass(raw_ostream &o, - MipsTargetMachine &tm) -{ - return new MipsAsmPrinter(o, tm, tm.getTargetAsmInfo()); + MipsTargetMachine &tm, + bool fast) { + return new MipsAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } //===----------------------------------------------------------------------===// @@ -266,6 +265,8 @@ emitFunctionEnd(MachineFunction &MF) bool MipsAsmPrinter:: runOnMachineFunction(MachineFunction &MF) { + this->MF = &MF; + SetupMachineFunction(MF); // Print out constants referenced by the function diff --git a/lib/Target/Mips/MipsTargetMachine.cpp b/lib/Target/Mips/MipsTargetMachine.cpp index ff2e5b81589..4b13b78d020 100644 --- a/lib/Target/Mips/MipsTargetMachine.cpp +++ b/lib/Target/Mips/MipsTargetMachine.cpp @@ -128,6 +128,6 @@ addAssemblyEmitter(PassManagerBase &PM, bool Fast, raw_ostream &Out) { // Output assembly language. - PM.add(createMipsCodePrinterPass(Out, *this)); + PM.add(createMipsCodePrinterPass(Out, *this, Fast)); return false; } diff --git a/lib/Target/PIC16/PIC16.h b/lib/Target/PIC16/PIC16.h index e37ef4f2090..eb7fdf914ac 100644 --- a/lib/Target/PIC16/PIC16.h +++ b/lib/Target/PIC16/PIC16.h @@ -74,7 +74,8 @@ namespace PIC16CC { FunctionPass *createPIC16ISelDag(PIC16TargetMachine &TM); FunctionPass *createPIC16CodePrinterPass(raw_ostream &OS, - PIC16TargetMachine &TM); + PIC16TargetMachine &TM, + bool Fast); } // end namespace llvm; // Defines symbolic names for PIC16 registers. This defines a mapping from diff --git a/lib/Target/PIC16/PIC16AsmPrinter.cpp b/lib/Target/PIC16/PIC16AsmPrinter.cpp index 8e80eeabe2d..a073be248e4 100644 --- a/lib/Target/PIC16/PIC16AsmPrinter.cpp +++ b/lib/Target/PIC16/PIC16AsmPrinter.cpp @@ -90,6 +90,8 @@ bool PIC16AsmPrinter::printMachineInstruction(const MachineInstr *MI) { /// method to print assembly for each instruction. /// bool PIC16AsmPrinter::runOnMachineFunction(MachineFunction &MF) { + this->MF = &MF; + // This calls the base class function required to be called at beginning // of runOnMachineFunction. SetupMachineFunction(MF); @@ -133,8 +135,9 @@ bool PIC16AsmPrinter::runOnMachineFunction(MachineFunction &MF) { /// regardless of whether the function is in SSA form. /// FunctionPass *llvm::createPIC16CodePrinterPass(raw_ostream &o, - PIC16TargetMachine &tm) { - return new PIC16AsmPrinter(o, tm, tm.getTargetAsmInfo()); + PIC16TargetMachine &tm, + bool fast) { + return new PIC16AsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } void PIC16AsmPrinter::printOperand(const MachineInstr *MI, int opNum) { diff --git a/lib/Target/PIC16/PIC16AsmPrinter.h b/lib/Target/PIC16/PIC16AsmPrinter.h index ce79afd6079..39036863309 100644 --- a/lib/Target/PIC16/PIC16AsmPrinter.h +++ b/lib/Target/PIC16/PIC16AsmPrinter.h @@ -24,8 +24,9 @@ namespace llvm { struct VISIBILITY_HIDDEN PIC16AsmPrinter : public AsmPrinter { - PIC16AsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T) - : AsmPrinter(O, TM, T) { + PIC16AsmPrinter(raw_ostream &O, TargetMachine &TM, + const TargetAsmInfo *T, bool F) + : AsmPrinter(O, TM, T, F) { CurrentBankselLabelInBasicBlock = ""; IsRomData = false; } diff --git a/lib/Target/PIC16/PIC16TargetMachine.cpp b/lib/Target/PIC16/PIC16TargetMachine.cpp index 06f11174e1b..8ca0727ffac 100644 --- a/lib/Target/PIC16/PIC16TargetMachine.cpp +++ b/lib/Target/PIC16/PIC16TargetMachine.cpp @@ -64,7 +64,7 @@ bool PIC16TargetMachine::addInstSelector(PassManagerBase &PM, bool Fast) { bool PIC16TargetMachine:: addAssemblyEmitter(PassManagerBase &PM, bool Fast, raw_ostream &Out) { // Output assembly language. - PM.add(createPIC16CodePrinterPass(Out, *this)); + PM.add(createPIC16CodePrinterPass(Out, *this, Fast)); return false; } diff --git a/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp b/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp index 6c5d8b9d476..cc0efa8fd31 100644 --- a/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp @@ -49,13 +49,15 @@ using namespace llvm; STATISTIC(EmittedInsts, "Number of machine instrs printed"); namespace { - struct VISIBILITY_HIDDEN PPCAsmPrinter : public AsmPrinter { + class VISIBILITY_HIDDEN PPCAsmPrinter : public AsmPrinter { + protected: StringSet<> FnStubs, GVStubs, HiddenGVStubs; const PPCSubtarget &Subtarget; - - PPCAsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T) - : AsmPrinter(O, TM, T), Subtarget(TM.getSubtarget()) { - } + public: + PPCAsmPrinter(raw_ostream &O, TargetMachine &TM, + const TargetAsmInfo *T, bool F) + : AsmPrinter(O, TM, T, F), + Subtarget(TM.getSubtarget()) {} virtual const char *getPassName() const { return "PowerPC Assembly Printer"; @@ -291,14 +293,13 @@ namespace { }; /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux - struct VISIBILITY_HIDDEN PPCLinuxAsmPrinter : public PPCAsmPrinter { + class VISIBILITY_HIDDEN PPCLinuxAsmPrinter : public PPCAsmPrinter { DwarfWriter *DW; MachineModuleInfo *MMI; - + public: PPCLinuxAsmPrinter(raw_ostream &O, PPCTargetMachine &TM, - const TargetAsmInfo *T) - : PPCAsmPrinter(O, TM, T), DW(0), MMI(0) { - } + const TargetAsmInfo *T, bool F) + : PPCAsmPrinter(O, TM, T, F), DW(0), MMI(0) {} virtual const char *getPassName() const { return "Linux PPC Assembly Printer"; @@ -320,15 +321,14 @@ namespace { /// PPCDarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac /// OS X - struct VISIBILITY_HIDDEN PPCDarwinAsmPrinter : public PPCAsmPrinter { - + class VISIBILITY_HIDDEN PPCDarwinAsmPrinter : public PPCAsmPrinter { DwarfWriter *DW; MachineModuleInfo *MMI; raw_ostream &OS; + public: PPCDarwinAsmPrinter(raw_ostream &O, PPCTargetMachine &TM, - const TargetAsmInfo *T) - : PPCAsmPrinter(O, TM, T), DW(0), MMI(0), OS(O) { - } + const TargetAsmInfo *T, bool F) + : PPCAsmPrinter(O, TM, T, F), DW(0), MMI(0), OS(O) {} virtual const char *getPassName() const { return "Darwin PPC Assembly Printer"; @@ -571,6 +571,7 @@ void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) { /// method to print assembly for each instruction. /// bool PPCLinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF) { + this->MF = &MF; SetupMachineFunction(MF); O << "\n\n"; @@ -764,6 +765,8 @@ bool PPCLinuxAsmPrinter::doFinalization(Module &M) { /// method to print assembly for each instruction. /// bool PPCDarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) { + this->MF = &MF; + SetupMachineFunction(MF); O << "\n\n"; @@ -1146,13 +1149,14 @@ bool PPCDarwinAsmPrinter::doFinalization(Module &M) { /// Darwin assembler can deal with. /// FunctionPass *llvm::createPPCAsmPrinterPass(raw_ostream &o, - PPCTargetMachine &tm) { + PPCTargetMachine &tm, + bool fast) { const PPCSubtarget *Subtarget = &tm.getSubtarget(); if (Subtarget->isDarwin()) { - return new PPCDarwinAsmPrinter(o, tm, tm.getTargetAsmInfo()); + return new PPCDarwinAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } else { - return new PPCLinuxAsmPrinter(o, tm, tm.getTargetAsmInfo()); + return new PPCLinuxAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } } diff --git a/lib/Target/PowerPC/PPC.h b/lib/Target/PowerPC/PPC.h index 773b9c169b4..09809285f71 100644 --- a/lib/Target/PowerPC/PPC.h +++ b/lib/Target/PowerPC/PPC.h @@ -27,7 +27,8 @@ namespace llvm { FunctionPass *createPPCBranchSelectionPass(); FunctionPass *createPPCISelDag(PPCTargetMachine &TM); FunctionPass *createPPCAsmPrinterPass(raw_ostream &OS, - PPCTargetMachine &TM); + PPCTargetMachine &TM, + bool Fast); FunctionPass *createPPCCodeEmitterPass(PPCTargetMachine &TM, MachineCodeEmitter &MCE); } // end namespace llvm; diff --git a/lib/Target/PowerPC/PPCTargetMachine.cpp b/lib/Target/PowerPC/PPCTargetMachine.cpp index 0ff65d2a0d3..d142fd161d6 100644 --- a/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -146,7 +146,7 @@ bool PPCTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast, raw_ostream &Out) { assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(Out, *this)); + PM.add(AsmPrinterCtor(Out, *this, Fast)); return false; } @@ -176,7 +176,7 @@ bool PPCTargetMachine::addCodeEmitter(PassManagerBase &PM, bool Fast, if (DumpAsm) { assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(errs(), *this)); + PM.add(AsmPrinterCtor(errs(), *this, Fast)); } return false; @@ -189,7 +189,7 @@ bool PPCTargetMachine::addSimpleCodeEmitter(PassManagerBase &PM, bool Fast, if (DumpAsm) { assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(errs(), *this)); + PM.add(AsmPrinterCtor(errs(), *this, Fast)); } return false; diff --git a/lib/Target/PowerPC/PPCTargetMachine.h b/lib/Target/PowerPC/PPCTargetMachine.h index 8d65fd2479f..7cee5937317 100644 --- a/lib/Target/PowerPC/PPCTargetMachine.h +++ b/lib/Target/PowerPC/PPCTargetMachine.h @@ -45,7 +45,8 @@ protected: // To avoid having target depend on the asmprinter stuff libraries, asmprinter // set this functions to ctor pointer at startup time if they are linked in. typedef FunctionPass *(*AsmPrinterCtorFn)(raw_ostream &o, - PPCTargetMachine &tm); + PPCTargetMachine &tm, + bool fast); static AsmPrinterCtorFn AsmPrinterCtor; public: diff --git a/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp b/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp index f720d47570e..80976bb2591 100644 --- a/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp +++ b/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp @@ -40,17 +40,17 @@ using namespace llvm; STATISTIC(EmittedInsts, "Number of machine instrs printed"); namespace { - struct VISIBILITY_HIDDEN SparcAsmPrinter : public AsmPrinter { - SparcAsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T) - : AsmPrinter(O, TM, T) { - } - + class VISIBILITY_HIDDEN SparcAsmPrinter : public AsmPrinter { /// We name each basic block in a Function with a unique number, so /// that we can consistently refer to them later. This is cleared /// at the beginning of each call to runOnMachineFunction(). /// typedef std::map ValueMapTy; ValueMapTy NumberForBB; + public: + SparcAsmPrinter(raw_ostream &O, TargetMachine &TM, + const TargetAsmInfo *T, bool F) + : AsmPrinter(O, TM, T, F) {} virtual const char *getPassName() const { return "Sparc Assembly Printer"; @@ -81,14 +81,17 @@ namespace { /// regardless of whether the function is in SSA form. /// FunctionPass *llvm::createSparcCodePrinterPass(raw_ostream &o, - TargetMachine &tm) { - return new SparcAsmPrinter(o, tm, tm.getTargetAsmInfo()); + TargetMachine &tm, + bool fast) { + return new SparcAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } /// runOnMachineFunction - This uses the printInstruction() /// method to print assembly for each instruction. /// bool SparcAsmPrinter::runOnMachineFunction(MachineFunction &MF) { + this->MF = &MF; + SetupMachineFunction(MF); // Print out constants referenced by the function diff --git a/lib/Target/Sparc/Sparc.h b/lib/Target/Sparc/Sparc.h index baac8f0159a..c48118a0f11 100644 --- a/lib/Target/Sparc/Sparc.h +++ b/lib/Target/Sparc/Sparc.h @@ -24,7 +24,8 @@ namespace llvm { class raw_ostream; FunctionPass *createSparcISelDag(SparcTargetMachine &TM); - FunctionPass *createSparcCodePrinterPass(raw_ostream &OS, TargetMachine &TM); + FunctionPass *createSparcCodePrinterPass(raw_ostream &OS, + TargetMachine &TM, bool Fast); FunctionPass *createSparcDelaySlotFillerPass(TargetMachine &TM); FunctionPass *createSparcFPMoverPass(TargetMachine &TM); } // end namespace llvm; diff --git a/lib/Target/Sparc/SparcTargetMachine.cpp b/lib/Target/Sparc/SparcTargetMachine.cpp index 21c4205b37d..784800fd922 100644 --- a/lib/Target/Sparc/SparcTargetMachine.cpp +++ b/lib/Target/Sparc/SparcTargetMachine.cpp @@ -85,6 +85,6 @@ bool SparcTargetMachine::addPreEmitPass(PassManagerBase &PM, bool Fast) { bool SparcTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast, raw_ostream &Out) { // Output assembly language. - PM.add(createSparcCodePrinterPass(Out, *this)); + PM.add(createSparcCodePrinterPass(Out, *this, Fast)); return false; } diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h index 6be9958dcf1..35407343dc0 100644 --- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h +++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h @@ -28,15 +28,14 @@ namespace llvm { struct MachineJumpTableInfo; -struct VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter { - MachineFunction *MF; +class VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter { DwarfWriter *DW; MachineModuleInfo *MMI; const X86Subtarget *Subtarget; - + public: X86ATTAsmPrinter(raw_ostream &O, X86TargetMachine &TM, - const TargetAsmInfo *T) - : AsmPrinter(O, TM, T), DW(0), MMI(0) { + const TargetAsmInfo *T, bool F) + : AsmPrinter(O, TM, T, F), DW(0), MMI(0) { Subtarget = &TM.getSubtarget(); } diff --git a/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp index 48ee11f5a9d..9282f5f33d7 100644 --- a/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp @@ -24,13 +24,14 @@ using namespace llvm; /// machine description. /// FunctionPass *llvm::createX86CodePrinterPass(raw_ostream &o, - X86TargetMachine &tm) { + X86TargetMachine &tm, + bool fast) { const X86Subtarget *Subtarget = &tm.getSubtarget(); if (Subtarget->isFlavorIntel()) { - return new X86IntelAsmPrinter(o, tm, tm.getTargetAsmInfo()); + return new X86IntelAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } else { - return new X86ATTAsmPrinter(o, tm, tm.getTargetAsmInfo()); + return new X86ATTAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } } diff --git a/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp index 4dedd026aa1..c4389aa4062 100644 --- a/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp @@ -122,6 +122,7 @@ void X86IntelAsmPrinter::decorateName(std::string &Name, /// method to print assembly for each instruction. /// bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) { + this->MF = &MF; SetupMachineFunction(MF); O << "\n\n"; diff --git a/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.h b/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.h index 9762e938964..5a399b3a4a4 100644 --- a/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.h +++ b/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.h @@ -26,9 +26,8 @@ namespace llvm { struct VISIBILITY_HIDDEN X86IntelAsmPrinter : public AsmPrinter { X86IntelAsmPrinter(raw_ostream &O, X86TargetMachine &TM, - const TargetAsmInfo *T) - : AsmPrinter(O, TM, T) { - } + const TargetAsmInfo *T, bool F) + : AsmPrinter(O, TM, T, F) {} virtual const char *getPassName() const { return "X86 Intel-Style Assembly Printer"; diff --git a/lib/Target/X86/X86.h b/lib/Target/X86/X86.h index 135787b98a9..76fc4ffc83f 100644 --- a/lib/Target/X86/X86.h +++ b/lib/Target/X86/X86.h @@ -42,7 +42,9 @@ FunctionPass *createX87FPRegKillInserterPass(); /// assembly code for a MachineFunction to the given output stream, /// using the given target machine description. /// -FunctionPass *createX86CodePrinterPass(raw_ostream &o, X86TargetMachine &tm); +FunctionPass *createX86CodePrinterPass(raw_ostream &o, + X86TargetMachine &tm, + bool fast); /// createX86CodeEmitterPass - Return a pass that emits the collected X86 code /// to the specified MCE object. diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index 10638df2e44..5fbe71e0b33 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -210,7 +210,7 @@ bool X86TargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast, raw_ostream &Out) { assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(Out, *this)); + PM.add(AsmPrinterCtor(Out, *this, Fast)); return false; } @@ -236,7 +236,7 @@ bool X86TargetMachine::addCodeEmitter(PassManagerBase &PM, bool Fast, if (DumpAsm) { assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(errs(), *this)); + PM.add(AsmPrinterCtor(errs(), *this, Fast)); } return false; @@ -248,7 +248,7 @@ bool X86TargetMachine::addSimpleCodeEmitter(PassManagerBase &PM, bool Fast, if (DumpAsm) { assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(errs(), *this)); + PM.add(AsmPrinterCtor(errs(), *this, Fast)); } return false; diff --git a/lib/Target/X86/X86TargetMachine.h b/lib/Target/X86/X86TargetMachine.h index bb56d96533a..49cf163e6ff 100644 --- a/lib/Target/X86/X86TargetMachine.h +++ b/lib/Target/X86/X86TargetMachine.h @@ -44,7 +44,8 @@ protected: // To avoid having target depend on the asmprinter stuff libraries, asmprinter // set this functions to ctor pointer at startup time if they are linked in. typedef FunctionPass *(*AsmPrinterCtorFn)(raw_ostream &o, - X86TargetMachine &tm); + X86TargetMachine &tm, + bool fast); static AsmPrinterCtorFn AsmPrinterCtor; public: diff --git a/lib/Target/XCore/XCore.h b/lib/Target/XCore/XCore.h index 347ac47ac3e..361a2ee2bb8 100644 --- a/lib/Target/XCore/XCore.h +++ b/lib/Target/XCore/XCore.h @@ -23,7 +23,8 @@ namespace llvm { FunctionPass *createXCoreISelDag(XCoreTargetMachine &TM); FunctionPass *createXCoreCodePrinterPass(raw_ostream &OS, - XCoreTargetMachine &TM); + XCoreTargetMachine &TM, + bool Fast); } // end namespace llvm; // Defines symbolic names for XCore registers. This defines a mapping from diff --git a/lib/Target/XCore/XCoreAsmPrinter.cpp b/lib/Target/XCore/XCoreAsmPrinter.cpp index 9e6e19fe44f..3a30f107d85 100644 --- a/lib/Target/XCore/XCoreAsmPrinter.cpp +++ b/lib/Target/XCore/XCoreAsmPrinter.cpp @@ -53,14 +53,14 @@ static cl::opt MaxThreads("xcore-max-threads", cl::Optional, cl::init(8)); namespace { - struct VISIBILITY_HIDDEN XCoreAsmPrinter : public AsmPrinter { - XCoreAsmPrinter(raw_ostream &O, XCoreTargetMachine &TM, - const TargetAsmInfo *T) - : AsmPrinter(O, TM, T), DW(0), - Subtarget(*TM.getSubtargetImpl()) { } - + class VISIBILITY_HIDDEN XCoreAsmPrinter : public AsmPrinter { DwarfWriter *DW; const XCoreSubtarget &Subtarget; + public: + XCoreAsmPrinter(raw_ostream &O, XCoreTargetMachine &TM, + const TargetAsmInfo *T, bool F) + : AsmPrinter(O, TM, T, F), DW(0), + Subtarget(*TM.getSubtargetImpl()) {} virtual const char *getPassName() const { return "XCore Assembly Printer"; @@ -104,8 +104,9 @@ namespace { /// regardless of whether the function is in SSA form. /// FunctionPass *llvm::createXCoreCodePrinterPass(raw_ostream &o, - XCoreTargetMachine &tm) { - return new XCoreAsmPrinter(o, tm, tm.getTargetAsmInfo()); + XCoreTargetMachine &tm, + bool fast) { + return new XCoreAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast); } // PrintEscapedString - Print each character of the specified string, escaping @@ -293,6 +294,8 @@ emitFunctionEnd(MachineFunction &MF) /// bool XCoreAsmPrinter::runOnMachineFunction(MachineFunction &MF) { + this->MF = &MF; + SetupMachineFunction(MF); // Print out constants referenced by the function diff --git a/lib/Target/XCore/XCoreTargetMachine.cpp b/lib/Target/XCore/XCoreTargetMachine.cpp index b3853044bb9..74ae3e0fcc5 100644 --- a/lib/Target/XCore/XCoreTargetMachine.cpp +++ b/lib/Target/XCore/XCoreTargetMachine.cpp @@ -63,6 +63,6 @@ bool XCoreTargetMachine::addInstSelector(PassManagerBase &PM, bool Fast) { bool XCoreTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast, raw_ostream &Out) { // Output assembly language. - PM.add(createXCoreCodePrinterPass(Out, *this)); + PM.add(createXCoreCodePrinterPass(Out, *this, Fast)); return false; } diff --git a/utils/TableGen/AsmWriterEmitter.cpp b/utils/TableGen/AsmWriterEmitter.cpp index 128b89363b6..e7fe8c369bd 100644 --- a/utils/TableGen/AsmWriterEmitter.cpp +++ b/utils/TableGen/AsmWriterEmitter.cpp @@ -641,9 +641,7 @@ void AsmWriterEmitter::run(std::ostream &O) { O << "\";\n\n"; O << " if (TAI->doesSupportDebugInformation() &&\n" - << " DW->ShouldEmitDwarfDebug() &&\n" - << " !DW->getFastCodeGen()) {\n" - << " const MachineFunction *MF = MI->getParent()->getParent();\n" + << " DW->ShouldEmitDwarfDebug() && !Fast) {\n" << " DebugLoc CurDL = MI->getDebugLoc();\n\n" << " if (!CurDL.isUnknown()) {\n" << " static DebugLocTuple PrevDLT(~0U, ~0U, ~0U);\n"