diff options
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/Target/X86/X86ATTAsmPrinter.cpp | 14 | ||||
-rwxr-xr-x | lib/Target/X86/X86ATTAsmPrinter.h | 2 | ||||
-rw-r--r-- | lib/Target/X86/X86AsmPrinter.cpp | 6 | ||||
-rwxr-xr-x | lib/Target/X86/X86AsmPrinter.h | 38 | ||||
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 4 | ||||
-rw-r--r-- | lib/Target/X86/X86InstrInfo.td | 13 | ||||
-rwxr-xr-x | lib/Target/X86/X86IntelAsmPrinter.cpp | 10 | ||||
-rwxr-xr-x | lib/Target/X86/X86IntelAsmPrinter.h | 2 |
8 files changed, 83 insertions, 6 deletions
diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index e9da1855dd..e50100e752 100755 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -27,9 +27,16 @@ using namespace x86; /// method to print assembly for each instruction. /// 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); O << "\n\n"; + // Emit pre-function debug information. + DW.BeginFunction(MF); + // Print out constants referenced by the function EmitConstantPool(MF.getConstantPool()); @@ -81,6 +88,9 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { if (HasDotTypeDotSizeDirective) O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n"; + // Emit post-function debug information. + DW.EndFunction(MF); + // We didn't modify anything. return false; } @@ -101,7 +111,9 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, case MachineOperand::MO_SignExtendedImmed: case MachineOperand::MO_UnextendedImmed: - O << '$' << (int)MO.getImmedValue(); + if (!Modifier || strcmp(Modifier, "debug") != 0) + O << '$'; + O << (int)MO.getImmedValue(); return; case MachineOperand::MO_MachineBasicBlock: { MachineBasicBlock *MBBOp = MO.getMachineBasicBlock(); diff --git a/lib/Target/X86/X86ATTAsmPrinter.h b/lib/Target/X86/X86ATTAsmPrinter.h index 2fc1aa57b4..325b43d32b 100755 --- a/lib/Target/X86/X86ATTAsmPrinter.h +++ b/lib/Target/X86/X86ATTAsmPrinter.h @@ -21,7 +21,7 @@ namespace llvm { namespace x86 { struct X86ATTAsmPrinter : public X86SharedAsmPrinter { - X86ATTAsmPrinter(std::ostream &O, TargetMachine &TM) + X86ATTAsmPrinter(std::ostream &O, TargetMachine &TM) : X86SharedAsmPrinter(O, TM) { } virtual const char *getPassName() const { diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index bd96cb93c7..edc2397e60 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -75,6 +75,9 @@ bool X86SharedAsmPrinter::doInitialization(Module &M) { default: break; } + // Emit initial debug information. + DW.BeginModule(M); + return AsmPrinter::doInitialization(M); } @@ -187,6 +190,9 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { } } + // Emit initial debug information. + DW.EndModule(M); + AsmPrinter::doFinalization(M); return false; // success } diff --git a/lib/Target/X86/X86AsmPrinter.h b/lib/Target/X86/X86AsmPrinter.h index b27cdf067d..5b27c56457 100755 --- a/lib/Target/X86/X86AsmPrinter.h +++ b/lib/Target/X86/X86AsmPrinter.h @@ -18,6 +18,8 @@ #include "X86.h" #include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/CodeGen/DwarfWriter.h" +#include "llvm/CodeGen/MachineDebugInfo.h" #include "llvm/ADT/Statistic.h" #include <set> @@ -27,14 +29,46 @@ namespace x86 { 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 { + X86DwarfWriter DW; + X86SharedAsmPrinter(std::ostream &O, TargetMachine &TM) - : AsmPrinter(O, TM), forDarwin(false) { } + : AsmPrinter(O, TM), DW(O, this), forDarwin(false) { } bool doInitialization(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 std::set<std::string> FnStubs, GVStubs, LinkOnceStubs; diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index eaabfd6a96..b59dad3a67 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -168,7 +168,9 @@ X86TargetLowering::X86TargetLowering(TargetMachine &TM) // We don't have line number support yet. setOperationAction(ISD::LOCATION, 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 setOperationAction(ISD::VASTART , MVT::Other, Custom); diff --git a/lib/Target/X86/X86InstrInfo.td b/lib/Target/X86/X86InstrInfo.td index 6831428c6e..fd1410ba0b 100644 --- a/lib/Target/X86/X86InstrInfo.td +++ b/lib/Target/X86/X86InstrInfo.td @@ -2353,6 +2353,19 @@ def MOV32r0 : I<0x31, MRMInitReg, (ops R32:$dst), [(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 //===----------------------------------------------------------------------===// diff --git a/lib/Target/X86/X86IntelAsmPrinter.cpp b/lib/Target/X86/X86IntelAsmPrinter.cpp index ed673df9fe..5bc8b24372 100755 --- a/lib/Target/X86/X86IntelAsmPrinter.cpp +++ b/lib/Target/X86/X86IntelAsmPrinter.cpp @@ -26,9 +26,16 @@ using namespace x86; /// method to print assembly for each instruction. /// 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); O << "\n\n"; + // Emit pre-function debug information. + DW.BeginFunction(MF); + // Print out constants referenced by the function 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. return false; } diff --git a/lib/Target/X86/X86IntelAsmPrinter.h b/lib/Target/X86/X86IntelAsmPrinter.h index 02c654fcb1..cf8d3cf366 100755 --- a/lib/Target/X86/X86IntelAsmPrinter.h +++ b/lib/Target/X86/X86IntelAsmPrinter.h @@ -23,7 +23,7 @@ namespace llvm { namespace x86 { struct X86IntelAsmPrinter : public X86SharedAsmPrinter { - X86IntelAsmPrinter(std::ostream &O, TargetMachine &TM) + X86IntelAsmPrinter(std::ostream &O, TargetMachine &TM) : X86SharedAsmPrinter(O, TM) { } virtual const char *getPassName() const { |