Enable Dwarf debugging info.

llvm-svn: 26581
This commit is contained in:
Evan Cheng 2006-03-07 02:02:57 +00:00
parent 53ef5a032c
commit 30d7b70b73
8 changed files with 83 additions and 6 deletions

View File

@ -27,9 +27,16 @@ using namespace x86;
/// method to print assembly for each instruction. /// method to print assembly for each instruction.
/// ///
bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
// Let PassManager know we need debug information and relay
// the MachineDebugInfo address on to DwarfWriter.
DW.SetDebugInfo(&getAnalysis<MachineDebugInfo>());
SetupMachineFunction(MF); SetupMachineFunction(MF);
O << "\n\n"; O << "\n\n";
// Emit pre-function debug information.
DW.BeginFunction(MF);
// Print out constants referenced by the function // Print out constants referenced by the function
EmitConstantPool(MF.getConstantPool()); EmitConstantPool(MF.getConstantPool());
@ -81,6 +88,9 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
if (HasDotTypeDotSizeDirective) if (HasDotTypeDotSizeDirective)
O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n"; O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n";
// Emit post-function debug information.
DW.EndFunction(MF);
// We didn't modify anything. // We didn't modify anything.
return false; return false;
} }
@ -101,7 +111,9 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
case MachineOperand::MO_SignExtendedImmed: case MachineOperand::MO_SignExtendedImmed:
case MachineOperand::MO_UnextendedImmed: case MachineOperand::MO_UnextendedImmed:
O << '$' << (int)MO.getImmedValue(); if (!Modifier || strcmp(Modifier, "debug") != 0)
O << '$';
O << (int)MO.getImmedValue();
return; return;
case MachineOperand::MO_MachineBasicBlock: { case MachineOperand::MO_MachineBasicBlock: {
MachineBasicBlock *MBBOp = MO.getMachineBasicBlock(); MachineBasicBlock *MBBOp = MO.getMachineBasicBlock();

View File

@ -21,7 +21,7 @@ namespace llvm {
namespace x86 { namespace x86 {
struct X86ATTAsmPrinter : public X86SharedAsmPrinter { struct X86ATTAsmPrinter : public X86SharedAsmPrinter {
X86ATTAsmPrinter(std::ostream &O, TargetMachine &TM) X86ATTAsmPrinter(std::ostream &O, TargetMachine &TM)
: X86SharedAsmPrinter(O, TM) { } : X86SharedAsmPrinter(O, TM) { }
virtual const char *getPassName() const { virtual const char *getPassName() const {

View File

@ -75,6 +75,9 @@ bool X86SharedAsmPrinter::doInitialization(Module &M) {
default: break; default: break;
} }
// Emit initial debug information.
DW.BeginModule(M);
return AsmPrinter::doInitialization(M); return AsmPrinter::doInitialization(M);
} }
@ -187,6 +190,9 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
} }
} }
// Emit initial debug information.
DW.EndModule(M);
AsmPrinter::doFinalization(M); AsmPrinter::doFinalization(M);
return false; // success return false; // success
} }

View File

@ -18,6 +18,8 @@
#include "X86.h" #include "X86.h"
#include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/CodeGen/DwarfWriter.h"
#include "llvm/CodeGen/MachineDebugInfo.h"
#include "llvm/ADT/Statistic.h" #include "llvm/ADT/Statistic.h"
#include <set> #include <set>
@ -27,14 +29,46 @@ namespace x86 {
extern Statistic<> EmittedInsts; extern Statistic<> EmittedInsts;
/// X86DwarfWriter - Dwarf debug info writer customized for Darwin/Mac OS X
///
struct X86DwarfWriter : public DwarfWriter {
// Ctor.
X86DwarfWriter(std::ostream &o, AsmPrinter *ap)
: DwarfWriter(o, ap)
{
needsSet = true;
DwarfAbbrevSection = ".section __DWARFA,__debug_abbrev";
DwarfInfoSection = ".section __DWARFA,__debug_info";
DwarfLineSection = ".section __DWARFA,__debug_line";
DwarfFrameSection = ".section __DWARFA,__debug_frame";
DwarfPubNamesSection = ".section __DWARFA,__debug_pubnames";
DwarfPubTypesSection = ".section __DWARFA,__debug_pubtypes";
DwarfStrSection = ".section __DWARFA,__debug_str";
DwarfLocSection = ".section __DWARFA,__debug_loc";
DwarfARangesSection = ".section __DWARFA,__debug_aranges";
DwarfRangesSection = ".section __DWARFA,__debug_ranges";
DwarfMacInfoSection = ".section __DWARFA,__debug_macinfo";
TextSection = ".text";
DataSection = ".data";
}
};
struct X86SharedAsmPrinter : public AsmPrinter { struct X86SharedAsmPrinter : public AsmPrinter {
X86DwarfWriter DW;
X86SharedAsmPrinter(std::ostream &O, TargetMachine &TM) X86SharedAsmPrinter(std::ostream &O, TargetMachine &TM)
: AsmPrinter(O, TM), forDarwin(false) { } : AsmPrinter(O, TM), DW(O, this), forDarwin(false) { }
bool doInitialization(Module &M); bool doInitialization(Module &M);
bool doFinalization(Module &M); bool doFinalization(Module &M);
bool forDarwin; // FIXME: eliminate. void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
AU.addRequired<MachineDebugInfo>();
MachineFunctionPass::getAnalysisUsage(AU);
}
bool forDarwin; // FIXME: eliminate.
// Necessary for Darwin to print out the apprioriate types of linker stubs // Necessary for Darwin to print out the apprioriate types of linker stubs
std::set<std::string> FnStubs, GVStubs, LinkOnceStubs; std::set<std::string> FnStubs, GVStubs, LinkOnceStubs;

View File

@ -168,7 +168,9 @@ X86TargetLowering::X86TargetLowering(TargetMachine &TM)
// We don't have line number support yet. // We don't have line number support yet.
setOperationAction(ISD::LOCATION, MVT::Other, Expand); setOperationAction(ISD::LOCATION, MVT::Other, Expand);
setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand); setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand);
setOperationAction(ISD::DEBUG_LABEL, MVT::Other, Expand); // FIXME - use subtarget debug flags
if (!TM.getSubtarget<X86Subtarget>().isTargetDarwin())
setOperationAction(ISD::DEBUG_LABEL, MVT::Other, Expand);
// VASTART needs to be custom lowered to use the VarArgsFrameIndex // VASTART needs to be custom lowered to use the VarArgsFrameIndex
setOperationAction(ISD::VASTART , MVT::Other, Custom); setOperationAction(ISD::VASTART , MVT::Other, Custom);

View File

@ -2352,6 +2352,19 @@ def MOV32r0 : I<0x31, MRMInitReg, (ops R32:$dst),
"xor{l} $dst, $dst", "xor{l} $dst, $dst",
[(set R32:$dst, 0)]>; [(set R32:$dst, 0)]>;
//===----------------------------------------------------------------------===//
// DWARF Pseudo Instructions
//
def DWARF_LOC : I<0, Pseudo, (ops i32imm:$line, i32imm:$col, i32imm:$file),
"; .loc $file, $line, $col",
[(dwarf_loc (i32 imm:$line), (i32 imm:$col),
(i32 imm:$file))]>;
def DWARF_LABEL : I<0, Pseudo, (ops i32imm:$id),
"\nLdebug_loc${id:debug}:",
[(dwarf_label (i32 imm:$id))]>;
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Non-Instruction Patterns // Non-Instruction Patterns
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

View File

@ -26,9 +26,16 @@ using namespace x86;
/// method to print assembly for each instruction. /// method to print assembly for each instruction.
/// ///
bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) { bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
// Let PassManager know we need debug information and relay
// the MachineDebugInfo address on to DwarfWriter.
DW.SetDebugInfo(&getAnalysis<MachineDebugInfo>());
SetupMachineFunction(MF); SetupMachineFunction(MF);
O << "\n\n"; O << "\n\n";
// Emit pre-function debug information.
DW.BeginFunction(MF);
// Print out constants referenced by the function // Print out constants referenced by the function
EmitConstantPool(MF.getConstantPool()); EmitConstantPool(MF.getConstantPool());
@ -56,6 +63,9 @@ bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
} }
} }
// Emit post-function debug information.
DW.EndFunction(MF);
// We didn't modify anything. // We didn't modify anything.
return false; return false;
} }

View File

@ -23,7 +23,7 @@ namespace llvm {
namespace x86 { namespace x86 {
struct X86IntelAsmPrinter : public X86SharedAsmPrinter { struct X86IntelAsmPrinter : public X86SharedAsmPrinter {
X86IntelAsmPrinter(std::ostream &O, TargetMachine &TM) X86IntelAsmPrinter(std::ostream &O, TargetMachine &TM)
: X86SharedAsmPrinter(O, TM) { } : X86SharedAsmPrinter(O, TM) { }
virtual const char *getPassName() const { virtual const char *getPassName() const {