forked from OSchip/llvm-project
parent
53ef5a032c
commit
30d7b70b73
|
@ -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();
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue