/// 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());
if (HasDotTypeDotSizeDirective)
O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n";
+ // Emit post-function debug information.
+ DW.EndFunction(MF);
+
// We didn't modify anything.
return false;
}
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();
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 {
default: break;
}
+ // Emit initial debug information.
+ DW.BeginModule(M);
+
return AsmPrinter::doInitialization(M);
}
}
}
+ // Emit initial debug information.
+ DW.EndModule(M);
+
AsmPrinter::doFinalization(M);
return false; // success
}
#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>
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;
// 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);
"xor{l} $dst, $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
//===----------------------------------------------------------------------===//
/// 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());
}
}
+ // Emit post-function debug information.
+ DW.EndFunction(MF);
+
// We didn't modify anything.
return false;
}
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 {