forked from OSchip/llvm-project
parent
53ef5a032c
commit
30d7b70b73
|
@ -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();
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -2352,6 +2352,19 @@ def MOV32r0 : I<0x31, MRMInitReg, (ops R32:$dst),
|
|||
"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
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue