forked from OSchip/llvm-project
Update processDebugLoc() so that it can be used to process debug info before and after printing an instruction.
llvm-svn: 83363
This commit is contained in:
parent
2980a22028
commit
051454a16f
|
@ -141,7 +141,7 @@ namespace llvm {
|
|||
mutable const Function *LastFn;
|
||||
mutable unsigned Counter;
|
||||
|
||||
// Private state for processDebugLock()
|
||||
// Private state for processDebugLoc()
|
||||
mutable DebugLocTuple PrevDLT;
|
||||
|
||||
protected:
|
||||
|
@ -357,8 +357,8 @@ namespace llvm {
|
|||
virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV);
|
||||
|
||||
/// processDebugLoc - Processes the debug information of each machine
|
||||
/// instruction's DebugLoc.
|
||||
void processDebugLoc(const MachineInstr *MI);
|
||||
/// instruction's DebugLoc.
|
||||
void processDebugLoc(const MachineInstr *MI, bool BeforePrintingInsn);
|
||||
|
||||
/// printInlineAsm - This method formats and prints the specified machine
|
||||
/// instruction that is an inline asm.
|
||||
|
|
|
@ -237,7 +237,7 @@ public:
|
|||
/// MachineInstruction. This is called before emitting any bytes associated
|
||||
/// with the instruction. Even if successive instructions have the same debug
|
||||
/// location, this method will be called for each one.
|
||||
virtual void processDebugLoc(DebugLoc DL) {}
|
||||
virtual void processDebugLoc(DebugLoc DL, bool BeforePrintintInsn) {}
|
||||
|
||||
/// emitLabel - Emits a label
|
||||
virtual void emitLabel(uint64_t LabelID) = 0;
|
||||
|
|
|
@ -1353,18 +1353,20 @@ void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const {
|
|||
|
||||
/// processDebugLoc - Processes the debug information of each machine
|
||||
/// instruction's DebugLoc.
|
||||
void AsmPrinter::processDebugLoc(const MachineInstr *MI) {
|
||||
void AsmPrinter::processDebugLoc(const MachineInstr *MI,
|
||||
bool BeforePrintingInsn) {
|
||||
if (!MAI || !DW)
|
||||
return;
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
if (MAI->doesSupportDebugInformation() && DW->ShouldEmitDwarfDebug()) {
|
||||
if (!DL.isUnknown()) {
|
||||
DebugLocTuple CurDLT = MF->getDebugLocTuple(DL);
|
||||
|
||||
if (CurDLT.CompileUnit != 0 && PrevDLT != CurDLT) {
|
||||
printLabel(DW->RecordSourceLine(CurDLT.Line, CurDLT.Col,
|
||||
CurDLT.CompileUnit));
|
||||
O << '\n';
|
||||
if (BeforePrintingInsn) {
|
||||
if (CurDLT.CompileUnit != 0 && PrevDLT != CurDLT) {
|
||||
printLabel(DW->RecordSourceLine(CurDLT.Line, CurDLT.Col,
|
||||
CurDLT.CompileUnit));
|
||||
O << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
PrevDLT = CurDLT;
|
||||
|
|
|
@ -346,7 +346,7 @@ template<class CodeEmitter>
|
|||
void Emitter<CodeEmitter>::emitInstruction(const MachineInstr &MI) {
|
||||
DEBUG(errs() << "JIT: " << (void*)MCE.getCurrentPCValue() << ":\t" << MI);
|
||||
|
||||
MCE.processDebugLoc(MI.getDebugLoc());
|
||||
MCE.processDebugLoc(MI.getDebugLoc(), true);
|
||||
|
||||
NumEmitted++; // Keep track of the # of mi's emitted
|
||||
switch (MI.getDesc().TSFlags & ARMII::FormMask) {
|
||||
|
@ -409,6 +409,7 @@ void Emitter<CodeEmitter>::emitInstruction(const MachineInstr &MI) {
|
|||
emitMiscInstruction(MI);
|
||||
break;
|
||||
}
|
||||
MCE.processDebugLoc(MI.getDebugLoc(), false);
|
||||
}
|
||||
|
||||
template<class CodeEmitter>
|
||||
|
|
|
@ -1038,11 +1038,12 @@ void ARMAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
|||
}}
|
||||
|
||||
// Call the autogenerated instruction printer routines.
|
||||
processDebugLoc(MI);
|
||||
processDebugLoc(MI, true);
|
||||
printInstruction(MI);
|
||||
if (VerboseAsm && !MI->getDebugLoc().isUnknown())
|
||||
EmitComments(*MI);
|
||||
O << '\n';
|
||||
processDebugLoc(MI, false);
|
||||
}
|
||||
|
||||
void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) {
|
||||
|
|
|
@ -116,7 +116,7 @@ void Emitter<CodeEmitter>::emitBasicBlock(MachineBasicBlock &MBB) {
|
|||
for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end();
|
||||
I != E; ++I) {
|
||||
const MachineInstr &MI = *I;
|
||||
MCE.processDebugLoc(MI.getDebugLoc());
|
||||
MCE.processDebugLoc(MI.getDebugLoc(), true);
|
||||
switch(MI.getOpcode()) {
|
||||
default:
|
||||
MCE.emitWordLE(getBinaryCodeForInstr(*I));
|
||||
|
@ -128,6 +128,7 @@ void Emitter<CodeEmitter>::emitBasicBlock(MachineBasicBlock &MBB) {
|
|||
case TargetInstrInfo::KILL:
|
||||
break; //skip these
|
||||
}
|
||||
MCE.processDebugLoc(MI.getDebugLoc(), false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -177,13 +177,13 @@ bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||
II != E; ++II) {
|
||||
// Print the assembly for the instruction.
|
||||
++EmittedInsts;
|
||||
processDebugLoc(II);
|
||||
|
||||
processDebugLoc(II, true);
|
||||
printInstruction(II);
|
||||
|
||||
if (VerboseAsm && !II->getDebugLoc().isUnknown())
|
||||
EmitComments(*II);
|
||||
O << '\n';
|
||||
processDebugLoc(II, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -146,13 +146,14 @@ bool BlackfinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||
for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end();
|
||||
II != E; ++II) {
|
||||
// Print the assembly for the instruction.
|
||||
processDebugLoc(II);
|
||||
processDebugLoc(II, true);
|
||||
|
||||
printInstruction(II);
|
||||
if (VerboseAsm && !II->getDebugLoc().isUnknown())
|
||||
EmitComments(*II);
|
||||
O << '\n';
|
||||
|
||||
processDebugLoc(II, false);
|
||||
++EmittedInsts;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -405,11 +405,11 @@ bool SPUAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
|
|||
///
|
||||
void SPUAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
||||
++EmittedInsts;
|
||||
processDebugLoc(MI);
|
||||
processDebugLoc(MI, true);
|
||||
printInstruction(MI);
|
||||
|
||||
if (VerboseAsm && !MI->getDebugLoc().isUnknown())
|
||||
EmitComments(*MI);
|
||||
processDebugLoc(MI, false);
|
||||
O << '\n';
|
||||
}
|
||||
|
||||
|
|
|
@ -148,7 +148,7 @@ bool MSP430AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||
void MSP430AsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
||||
++EmittedInsts;
|
||||
|
||||
processDebugLoc(MI);
|
||||
processDebugLoc(MI, true);
|
||||
|
||||
// Call the autogenerated instruction printer routines.
|
||||
printInstruction(MI);
|
||||
|
@ -156,6 +156,8 @@ void MSP430AsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
|||
if (VerboseAsm && !MI->getDebugLoc().isUnknown())
|
||||
EmitComments(*MI);
|
||||
O << '\n';
|
||||
|
||||
processDebugLoc(MI, false);
|
||||
}
|
||||
|
||||
void MSP430AsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
|
||||
|
|
|
@ -278,7 +278,7 @@ bool MipsAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||
|
||||
for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end();
|
||||
II != E; ++II) {
|
||||
processDebugLoc(II);
|
||||
processDebugLoc(II, true);
|
||||
|
||||
// Print the assembly for the instruction.
|
||||
printInstruction(II);
|
||||
|
@ -286,7 +286,8 @@ bool MipsAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||
if (VerboseAsm && !II->getDebugLoc().isUnknown())
|
||||
EmitComments(*II);
|
||||
O << '\n';
|
||||
|
||||
|
||||
processDebugLoc(II, false);
|
||||
++EmittedInsts;
|
||||
}
|
||||
|
||||
|
|
|
@ -43,13 +43,12 @@ PIC16AsmPrinter::PIC16AsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
|
|||
}
|
||||
|
||||
bool PIC16AsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
||||
processDebugLoc(MI);
|
||||
|
||||
processDebugLoc(MI, true);
|
||||
printInstruction(MI);
|
||||
|
||||
if (VerboseAsm && !MI->getDebugLoc().isUnknown())
|
||||
EmitComments(*MI);
|
||||
O << '\n';
|
||||
processDebugLoc(MI, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -545,7 +545,7 @@ void PPCAsmPrinter::printPredicateOperand(const MachineInstr *MI, unsigned OpNo,
|
|||
void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
||||
++EmittedInsts;
|
||||
|
||||
processDebugLoc(MI);
|
||||
processDebugLoc(MI, true);
|
||||
|
||||
// Check for slwi/srwi mnemonics.
|
||||
if (MI->getOpcode() == PPC::RLWINM) {
|
||||
|
@ -595,6 +595,8 @@ void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
|||
if (VerboseAsm && !MI->getDebugLoc().isUnknown())
|
||||
EmitComments(*MI);
|
||||
O << '\n';
|
||||
|
||||
processDebugLoc(MI, false);
|
||||
}
|
||||
|
||||
/// runOnMachineFunction - This uses the printMachineInstruction()
|
||||
|
|
|
@ -132,7 +132,7 @@ void Emitter<CodeEmitter>::emitBasicBlock(MachineBasicBlock &MBB) {
|
|||
|
||||
for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ++I){
|
||||
const MachineInstr &MI = *I;
|
||||
MCE.processDebugLoc(MI.getDebugLoc());
|
||||
MCE.processDebugLoc(MI.getDebugLoc(), true);
|
||||
switch (MI.getOpcode()) {
|
||||
default:
|
||||
MCE.emitWordBE(getBinaryCodeForInstr(MI));
|
||||
|
@ -151,6 +151,7 @@ void Emitter<CodeEmitter>::emitBasicBlock(MachineBasicBlock &MBB) {
|
|||
MCE.emitWordBE(0x48000005); // bl 1
|
||||
break;
|
||||
}
|
||||
MCE.processDebugLoc(MI.getDebugLoc(), false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -124,13 +124,13 @@ bool SparcAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||
for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end();
|
||||
II != E; ++II) {
|
||||
// Print the assembly for the instruction.
|
||||
processDebugLoc(II);
|
||||
processDebugLoc(II, true);
|
||||
printInstruction(II);
|
||||
|
||||
if (VerboseAsm && !II->getDebugLoc().isUnknown())
|
||||
EmitComments(*II);
|
||||
O << '\n';
|
||||
|
||||
processDebugLoc(II, false);
|
||||
++EmittedInsts;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -156,7 +156,7 @@ bool SystemZAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||
void SystemZAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
||||
++EmittedInsts;
|
||||
|
||||
processDebugLoc(MI);
|
||||
processDebugLoc(MI, true);
|
||||
|
||||
// Call the autogenerated instruction printer routines.
|
||||
printInstruction(MI);
|
||||
|
@ -164,6 +164,8 @@ void SystemZAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
|||
if (VerboseAsm && !MI->getDebugLoc().isUnknown())
|
||||
EmitComments(*MI);
|
||||
O << '\n';
|
||||
|
||||
processDebugLoc(MI, false);
|
||||
}
|
||||
|
||||
void SystemZAsmPrinter::printPCRelImmOperand(const MachineInstr *MI, int OpNum){
|
||||
|
|
|
@ -653,13 +653,15 @@ bool X86AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
|
|||
void X86AsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
||||
++EmittedInsts;
|
||||
|
||||
processDebugLoc(MI);
|
||||
processDebugLoc(MI, true);
|
||||
|
||||
printInstructionThroughMCStreamer(MI);
|
||||
|
||||
if (VerboseAsm && !MI->getDebugLoc().isUnknown())
|
||||
EmitComments(*MI);
|
||||
O << '\n';
|
||||
|
||||
processDebugLoc(MI, false);
|
||||
}
|
||||
|
||||
void X86AsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
||||
|
|
|
@ -481,7 +481,7 @@ void Emitter<CodeEmitter>::emitInstruction(const MachineInstr &MI,
|
|||
const TargetInstrDesc *Desc) {
|
||||
DEBUG(errs() << MI);
|
||||
|
||||
MCE.processDebugLoc(MI.getDebugLoc());
|
||||
MCE.processDebugLoc(MI.getDebugLoc(), true);
|
||||
|
||||
unsigned Opcode = Desc->Opcode;
|
||||
|
||||
|
@ -859,6 +859,8 @@ void Emitter<CodeEmitter>::emitInstruction(const MachineInstr &MI,
|
|||
#endif
|
||||
llvm_unreachable(0);
|
||||
}
|
||||
|
||||
MCE.processDebugLoc(MI.getDebugLoc(), false);
|
||||
}
|
||||
|
||||
// Adapt the Emitter / CodeEmitter interfaces to MCCodeEmitter.
|
||||
|
|
|
@ -352,7 +352,7 @@ bool XCoreAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
|
|||
void XCoreAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
||||
++EmittedInsts;
|
||||
|
||||
processDebugLoc(MI);
|
||||
processDebugLoc(MI, true);
|
||||
|
||||
// Check for mov mnemonic
|
||||
unsigned src, dst, srcSR, dstSR;
|
||||
|
@ -365,6 +365,8 @@ void XCoreAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
|||
if (VerboseAsm && !MI->getDebugLoc().isUnknown())
|
||||
EmitComments(*MI);
|
||||
O << '\n';
|
||||
|
||||
processDebugLoc(MI, false);
|
||||
}
|
||||
|
||||
// Force static initialization.
|
||||
|
|
Loading…
Reference in New Issue