diff --git a/include/llvm/Target/TargetMachine.h b/include/llvm/Target/TargetMachine.h index e7f211bf151..d193ed4c54c 100644 --- a/include/llvm/Target/TargetMachine.h +++ b/include/llvm/Target/TargetMachine.h @@ -306,17 +306,18 @@ public: /// addCodeEmitter - This pass should be overridden by the target to add a /// code emitter, if supported. If this is not supported, 'true' should be - /// returned. - virtual bool addCodeEmitter(FunctionPassManager &PM, bool Fast, + /// returned. If DumpAsm is true, the generated assembly is printed to cerr. + virtual bool addCodeEmitter(FunctionPassManager &PM, bool Fast, bool DumpAsm, MachineCodeEmitter &MCE) { return true; } /// addSimpleCodeEmitter - This pass should be overridden by the target to add /// a code emitter (without setting flags), if supported. If this is not - /// supported, 'true' should be returned. + /// supported, 'true' should be returned. If DumpAsm is true, the generated + /// assembly is printed to cerr. virtual bool addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE) { + bool DumpAsm, MachineCodeEmitter &MCE) { return true; } diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp index b72704bd805..218e79ac725 100644 --- a/lib/CodeGen/LLVMTargetMachine.cpp +++ b/lib/CodeGen/LLVMTargetMachine.cpp @@ -26,6 +26,8 @@ static cl::opt PrintLSR("print-lsr-output", cl::Hidden, cl::desc("Print LLVM IR produced by the loop-reduce pass")); static cl::opt PrintISelInput("print-isel-input", cl::Hidden, cl::desc("Print LLVM IR input to isel pass")); +static cl::opt PrintEmittedAsm("print-emitted-asm", cl::Hidden, + cl::desc("Dump emitter generated instructions as assembly")); FileModel::Model LLVMTargetMachine::addPassesToEmitFile(FunctionPassManager &PM, @@ -119,7 +121,7 @@ bool LLVMTargetMachine::addPassesToEmitFileFinish(FunctionPassManager &PM, MachineCodeEmitter *MCE, bool Fast) { if (MCE) - addSimpleCodeEmitter(PM, Fast, *MCE); + addSimpleCodeEmitter(PM, Fast, PrintEmittedAsm, *MCE); // Delete machine code for this function PM.add(createMachineCodeDeleter()); @@ -196,7 +198,7 @@ bool LLVMTargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM, if (addPreEmitPass(PM, Fast) && PrintMachineCode) PM.add(createMachineFunctionPrinterPass(cerr)); - addCodeEmitter(PM, Fast, MCE); + addCodeEmitter(PM, Fast, PrintEmittedAsm, MCE); // Delete machine code for this function PM.add(createMachineCodeDeleter()); diff --git a/lib/Target/ARM/ARMTargetMachine.cpp b/lib/Target/ARM/ARMTargetMachine.cpp index 58b3ab98adf..b29f84d6dd3 100644 --- a/lib/Target/ARM/ARMTargetMachine.cpp +++ b/lib/Target/ARM/ARMTargetMachine.cpp @@ -143,18 +143,22 @@ bool ARMTargetMachine::addAssemblyEmitter(FunctionPassManager &PM, bool Fast, bool ARMTargetMachine::addCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE) { + bool DumpAsm, MachineCodeEmitter &MCE) { // FIXME: Move this to TargetJITInfo! setRelocationModel(Reloc::Static); // Machine code emitter pass for ARM. PM.add(createARMCodeEmitterPass(*this, MCE)); + if (DumpAsm) + PM.add(createARMCodePrinterPass(*cerr.stream(), *this)); return false; } bool ARMTargetMachine::addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE) { + bool DumpAsm, MachineCodeEmitter &MCE) { // Machine code emitter pass for ARM. PM.add(createARMCodeEmitterPass(*this, MCE)); + if (DumpAsm) + PM.add(createARMCodePrinterPass(*cerr.stream(), *this)); return false; } diff --git a/lib/Target/ARM/ARMTargetMachine.h b/lib/Target/ARM/ARMTargetMachine.h index 183a5827671..5d65285f777 100644 --- a/lib/Target/ARM/ARMTargetMachine.h +++ b/lib/Target/ARM/ARMTargetMachine.h @@ -61,9 +61,9 @@ public: virtual bool addAssemblyEmitter(FunctionPassManager &PM, bool Fast, std::ostream &Out); virtual bool addCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE); + bool DumpAsm, MachineCodeEmitter &MCE); virtual bool addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE); + bool DumpAsm, MachineCodeEmitter &MCE); }; /// ThumbTargetMachine - Thumb target machine. diff --git a/lib/Target/Alpha/AlphaTargetMachine.cpp b/lib/Target/Alpha/AlphaTargetMachine.cpp index d4137a5a71b..f051da45d82 100644 --- a/lib/Target/Alpha/AlphaTargetMachine.cpp +++ b/lib/Target/Alpha/AlphaTargetMachine.cpp @@ -86,12 +86,14 @@ bool AlphaTargetMachine::addAssemblyEmitter(FunctionPassManager &PM, bool Fast, return false; } bool AlphaTargetMachine::addCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE) { + bool DumpAsm, MachineCodeEmitter &MCE) { PM.add(createAlphaCodeEmitterPass(*this, MCE)); + if (DumpAsm) + PM.add(createAlphaCodePrinterPass(*cerr.stream(), *this)); return false; } bool AlphaTargetMachine::addSimpleCodeEmitter(FunctionPassManager &PM, - bool Fast, + bool Fast, bool DumpAsm, MachineCodeEmitter &MCE) { - return addCodeEmitter(PM, Fast, MCE); + return addCodeEmitter(PM, Fast, DumpAsm, MCE); } diff --git a/lib/Target/Alpha/AlphaTargetMachine.h b/lib/Target/Alpha/AlphaTargetMachine.h index 5a57f63a69f..8eb6f54cafd 100644 --- a/lib/Target/Alpha/AlphaTargetMachine.h +++ b/lib/Target/Alpha/AlphaTargetMachine.h @@ -63,9 +63,9 @@ public: virtual bool addAssemblyEmitter(FunctionPassManager &PM, bool Fast, std::ostream &Out); virtual bool addCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE); + bool DumpAsm, MachineCodeEmitter &MCE); virtual bool addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE); + bool DumpAsm, MachineCodeEmitter &MCE); }; } // end namespace llvm diff --git a/lib/Target/PowerPC/PPCTargetMachine.cpp b/lib/Target/PowerPC/PPCTargetMachine.cpp index 57c84370f3c..86da3d78259 100644 --- a/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -137,7 +137,7 @@ bool PPCTargetMachine::addAssemblyEmitter(FunctionPassManager &PM, bool Fast, } bool PPCTargetMachine::addCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE) { + bool DumpAsm, MachineCodeEmitter &MCE) { // The JIT should use the static relocation model in ppc32 mode, PIC in ppc64. // FIXME: This should be moved to TargetJITInfo!! if (Subtarget.isPPC64()) { @@ -155,12 +155,16 @@ bool PPCTargetMachine::addCodeEmitter(FunctionPassManager &PM, bool Fast, // Machine code emitter pass for PowerPC. PM.add(createPPCCodeEmitterPass(*this, MCE)); + if (DumpAsm) + PM.add(createPPCAsmPrinterPass(*cerr.stream(), *this)); return false; } bool PPCTargetMachine::addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE) { + bool DumpAsm, MachineCodeEmitter &MCE) { // Machine code emitter pass for PowerPC. PM.add(createPPCCodeEmitterPass(*this, MCE)); + if (DumpAsm) + PM.add(createPPCAsmPrinterPass(*cerr.stream(), *this)); return false; } diff --git a/lib/Target/PowerPC/PPCTargetMachine.h b/lib/Target/PowerPC/PPCTargetMachine.h index 10c5b7b0911..a00f8583749 100644 --- a/lib/Target/PowerPC/PPCTargetMachine.h +++ b/lib/Target/PowerPC/PPCTargetMachine.h @@ -70,9 +70,9 @@ public: virtual bool addAssemblyEmitter(FunctionPassManager &PM, bool Fast, std::ostream &Out); virtual bool addCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE); + bool DumpAsm, MachineCodeEmitter &MCE); virtual bool addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE); + bool DumpAsm, MachineCodeEmitter &MCE); virtual const bool getEnableTailMergeDefault() const; }; diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index 4d4bd3feb43..02fbf9596ae 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -170,7 +170,7 @@ bool X86TargetMachine::addAssemblyEmitter(FunctionPassManager &PM, bool Fast, } bool X86TargetMachine::addCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE) { + bool DumpAsm, MachineCodeEmitter &MCE) { // FIXME: Move this to TargetJITInfo! setRelocationModel(Reloc::Static); Subtarget.setPICStyle(PICStyle::None); @@ -180,11 +180,16 @@ bool X86TargetMachine::addCodeEmitter(FunctionPassManager &PM, bool Fast, setCodeModel(CodeModel::Large); PM.add(createX86CodeEmitterPass(*this, MCE)); + if (DumpAsm) + PM.add(createX86CodePrinterPass(*cerr.stream(), *this)); + return false; } bool X86TargetMachine::addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE) { + bool DumpAsm, MachineCodeEmitter &MCE) { PM.add(createX86CodeEmitterPass(*this, MCE)); + if (DumpAsm) + PM.add(createX86CodePrinterPass(*cerr.stream(), *this)); return false; } diff --git a/lib/Target/X86/X86TargetMachine.h b/lib/Target/X86/X86TargetMachine.h index 0a4f1b54c44..56f82252046 100644 --- a/lib/Target/X86/X86TargetMachine.h +++ b/lib/Target/X86/X86TargetMachine.h @@ -65,9 +65,9 @@ public: virtual bool addAssemblyEmitter(FunctionPassManager &PM, bool Fast, std::ostream &Out); virtual bool addCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE); + bool DumpAsm, MachineCodeEmitter &MCE); virtual bool addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, - MachineCodeEmitter &MCE); + bool DumpAsm, MachineCodeEmitter &MCE); }; /// X86_32TargetMachine - X86 32-bit target machine.