/// 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;
}
cl::desc("Print LLVM IR produced by the loop-reduce pass"));
static cl::opt<bool> PrintISelInput("print-isel-input", cl::Hidden,
cl::desc("Print LLVM IR input to isel pass"));
+static cl::opt<bool> PrintEmittedAsm("print-emitted-asm", cl::Hidden,
+ cl::desc("Dump emitter generated instructions as assembly"));
FileModel::Model
LLVMTargetMachine::addPassesToEmitFile(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());
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());
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;
}
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.
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);
}
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
}
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()) {
// 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;
}
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;
};
}
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);
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;
}
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.