mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 22:24:07 +00:00
Add debug support for X86/ELF targets (Linux). This allows llvm-gcc4
generated object modules to be debugged with gdb. Hopefully this helps pre-release debugging. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31299 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -227,6 +227,10 @@ namespace llvm {
|
|||||||
///
|
///
|
||||||
bool HasDotFile; // Defaults to false.
|
bool HasDotFile; // Defaults to false.
|
||||||
|
|
||||||
|
/// RequiresFrameSection - true if the Dwarf2 output needs a frame section
|
||||||
|
///
|
||||||
|
bool DwarfRequiresFrameSection; // Defaults to false.
|
||||||
|
|
||||||
/// DwarfAbbrevSection - Section directive for Dwarf abbrev.
|
/// DwarfAbbrevSection - Section directive for Dwarf abbrev.
|
||||||
///
|
///
|
||||||
const char *DwarfAbbrevSection; // Defaults to ".debug_abbrev".
|
const char *DwarfAbbrevSection; // Defaults to ".debug_abbrev".
|
||||||
@ -417,6 +421,9 @@ namespace llvm {
|
|||||||
bool hasDotFile() const {
|
bool hasDotFile() const {
|
||||||
return HasDotFile;
|
return HasDotFile;
|
||||||
}
|
}
|
||||||
|
bool getDwarfRequiresFrameSection() const {
|
||||||
|
return DwarfRequiresFrameSection;
|
||||||
|
}
|
||||||
const char *getDwarfAbbrevSection() const {
|
const char *getDwarfAbbrevSection() const {
|
||||||
return DwarfAbbrevSection;
|
return DwarfAbbrevSection;
|
||||||
}
|
}
|
||||||
|
@ -1921,8 +1921,8 @@ CompileUnit *Dwarf::NewCompileUnit(CompileUnitDesc *UnitDesc,
|
|||||||
unsigned ID) {
|
unsigned ID) {
|
||||||
// Construct debug information entry.
|
// Construct debug information entry.
|
||||||
DIE *Die = new DIE(DW_TAG_compile_unit);
|
DIE *Die = new DIE(DW_TAG_compile_unit);
|
||||||
Die->AddDelta (DW_AT_stmt_list, DW_FORM_data4, DWLabel("line", 0),
|
Die->AddDelta (DW_AT_stmt_list, DW_FORM_data4, DWLabel("section_line", 0),
|
||||||
DWLabel("section_line", 0));
|
DWLabel("section_line", 0));
|
||||||
// Die->AddLabel (DW_AT_high_pc, DW_FORM_addr, DWLabel("text_end", 0));
|
// Die->AddLabel (DW_AT_high_pc, DW_FORM_addr, DWLabel("text_end", 0));
|
||||||
// Die->AddLabel (DW_AT_low_pc, DW_FORM_addr, DWLabel("text_begin", 0));
|
// Die->AddLabel (DW_AT_low_pc, DW_FORM_addr, DWLabel("text_begin", 0));
|
||||||
Die->AddString(DW_AT_producer, DW_FORM_string, UnitDesc->getProducer());
|
Die->AddString(DW_AT_producer, DW_FORM_string, UnitDesc->getProducer());
|
||||||
@ -2175,21 +2175,20 @@ void Dwarf::EmitInitial() {
|
|||||||
didInitial = true;
|
didInitial = true;
|
||||||
|
|
||||||
// Dwarf sections base addresses.
|
// Dwarf sections base addresses.
|
||||||
Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0);
|
if (TAI->getDwarfRequiresFrameSection()) {
|
||||||
EmitLabel("section_frame", 0);
|
Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0);
|
||||||
|
EmitLabel("section_frame", 0);
|
||||||
|
}
|
||||||
Asm->SwitchToDataSection(TAI->getDwarfInfoSection(), 0);
|
Asm->SwitchToDataSection(TAI->getDwarfInfoSection(), 0);
|
||||||
EmitLabel("section_info", 0);
|
EmitLabel("section_info", 0);
|
||||||
EmitLabel("info", 0);
|
|
||||||
Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection(), 0);
|
Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection(), 0);
|
||||||
EmitLabel("section_abbrev", 0);
|
EmitLabel("section_abbrev", 0);
|
||||||
EmitLabel("abbrev", 0);
|
|
||||||
Asm->SwitchToDataSection(TAI->getDwarfARangesSection(), 0);
|
Asm->SwitchToDataSection(TAI->getDwarfARangesSection(), 0);
|
||||||
EmitLabel("section_aranges", 0);
|
EmitLabel("section_aranges", 0);
|
||||||
Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection(), 0);
|
Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection(), 0);
|
||||||
EmitLabel("section_macinfo", 0);
|
EmitLabel("section_macinfo", 0);
|
||||||
Asm->SwitchToDataSection(TAI->getDwarfLineSection(), 0);
|
Asm->SwitchToDataSection(TAI->getDwarfLineSection(), 0);
|
||||||
EmitLabel("section_line", 0);
|
EmitLabel("section_line", 0);
|
||||||
EmitLabel("line", 0);
|
|
||||||
Asm->SwitchToDataSection(TAI->getDwarfLocSection(), 0);
|
Asm->SwitchToDataSection(TAI->getDwarfLocSection(), 0);
|
||||||
EmitLabel("section_loc", 0);
|
EmitLabel("section_loc", 0);
|
||||||
Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection(), 0);
|
Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection(), 0);
|
||||||
@ -2198,7 +2197,6 @@ void Dwarf::EmitInitial() {
|
|||||||
EmitLabel("section_str", 0);
|
EmitLabel("section_str", 0);
|
||||||
Asm->SwitchToDataSection(TAI->getDwarfRangesSection(), 0);
|
Asm->SwitchToDataSection(TAI->getDwarfRangesSection(), 0);
|
||||||
EmitLabel("section_ranges", 0);
|
EmitLabel("section_ranges", 0);
|
||||||
|
|
||||||
Asm->SwitchToTextSection(TAI->getTextSection(), 0);
|
Asm->SwitchToTextSection(TAI->getTextSection(), 0);
|
||||||
EmitLabel("text_begin", 0);
|
EmitLabel("text_begin", 0);
|
||||||
Asm->SwitchToDataSection(TAI->getDataSection(), 0);
|
Asm->SwitchToDataSection(TAI->getDataSection(), 0);
|
||||||
@ -2629,6 +2627,9 @@ void Dwarf::EmitDebugLines() const {
|
|||||||
/// EmitInitialDebugFrame - Emit common frame info into a debug frame section.
|
/// EmitInitialDebugFrame - Emit common frame info into a debug frame section.
|
||||||
///
|
///
|
||||||
void Dwarf::EmitInitialDebugFrame() {
|
void Dwarf::EmitInitialDebugFrame() {
|
||||||
|
if (TAI->getDwarfRequiresFrameSection())
|
||||||
|
return;
|
||||||
|
|
||||||
int stackGrowth =
|
int stackGrowth =
|
||||||
Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
|
Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
|
||||||
TargetFrameInfo::StackGrowsUp ?
|
TargetFrameInfo::StackGrowsUp ?
|
||||||
@ -2664,6 +2665,9 @@ void Dwarf::EmitInitialDebugFrame() {
|
|||||||
/// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
|
/// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
|
||||||
/// section.
|
/// section.
|
||||||
void Dwarf::EmitFunctionDebugFrame() {
|
void Dwarf::EmitFunctionDebugFrame() {
|
||||||
|
if (TAI->getDwarfRequiresFrameSection())
|
||||||
|
return;
|
||||||
|
|
||||||
// Start the dwarf frame section.
|
// Start the dwarf frame section.
|
||||||
Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0);
|
Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0);
|
||||||
|
|
||||||
|
@ -64,6 +64,7 @@ TargetAsmInfo::TargetAsmInfo() :
|
|||||||
HasLEB128(false),
|
HasLEB128(false),
|
||||||
HasDotLoc(false),
|
HasDotLoc(false),
|
||||||
HasDotFile(false),
|
HasDotFile(false),
|
||||||
|
DwarfRequiresFrameSection(true),
|
||||||
DwarfAbbrevSection(".debug_abbrev"),
|
DwarfAbbrevSection(".debug_abbrev"),
|
||||||
DwarfInfoSection(".debug_info"),
|
DwarfInfoSection(".debug_info"),
|
||||||
DwarfLineSection(".debug_line"),
|
DwarfLineSection(".debug_line"),
|
||||||
|
@ -52,7 +52,7 @@ std::string X86ATTAsmPrinter::getSectionForFunction(const Function &F) const {
|
|||||||
/// method to print assembly for each instruction.
|
/// method to print assembly for each instruction.
|
||||||
///
|
///
|
||||||
bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||||
if (Subtarget->isTargetDarwin()) {
|
if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) {
|
||||||
// Let PassManager know we need debug information and relay
|
// Let PassManager know we need debug information and relay
|
||||||
// the MachineDebugInfo address on to DwarfWriter.
|
// the MachineDebugInfo address on to DwarfWriter.
|
||||||
DW.SetDebugInfo(&getAnalysis<MachineDebugInfo>());
|
DW.SetDebugInfo(&getAnalysis<MachineDebugInfo>());
|
||||||
@ -111,7 +111,7 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
F->getLinkage() == Function::WeakLinkage))
|
F->getLinkage() == Function::WeakLinkage))
|
||||||
O << "_llvm$workaround$fake$stub_" << CurrentFnName << ":\n";
|
O << "_llvm$workaround$fake$stub_" << CurrentFnName << ":\n";
|
||||||
|
|
||||||
if (Subtarget->isTargetDarwin()) {
|
if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) {
|
||||||
// Emit pre-function debug information.
|
// Emit pre-function debug information.
|
||||||
DW.BeginFunction(&MF);
|
DW.BeginFunction(&MF);
|
||||||
}
|
}
|
||||||
@ -141,7 +141,7 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
if (TAI->hasDotTypeDotSizeDirective())
|
if (TAI->hasDotTypeDotSizeDirective())
|
||||||
O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n";
|
O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n";
|
||||||
|
|
||||||
if (Subtarget->isTargetDarwin()) {
|
if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) {
|
||||||
// Emit post-function debug information.
|
// Emit post-function debug information.
|
||||||
DW.EndFunction();
|
DW.EndFunction();
|
||||||
}
|
}
|
||||||
|
@ -114,6 +114,9 @@ bool X86SharedAsmPrinter::doInitialization(Module &M) {
|
|||||||
if (!Subtarget->is64Bit())
|
if (!Subtarget->is64Bit())
|
||||||
X86PICStyle = PICStyle::Stub;
|
X86PICStyle = PICStyle::Stub;
|
||||||
|
|
||||||
|
// Emit initial debug information.
|
||||||
|
DW.BeginModule(&M);
|
||||||
|
} else if (Subtarget->isTargetELF()) {
|
||||||
// Emit initial debug information.
|
// Emit initial debug information.
|
||||||
DW.BeginModule(&M);
|
DW.BeginModule(&M);
|
||||||
}
|
}
|
||||||
@ -278,7 +281,7 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
|
|||||||
O << "\t.long\t0\n";
|
O << "\t.long\t0\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit initial debug information.
|
// Emit final debug information.
|
||||||
DW.EndModule();
|
DW.EndModule();
|
||||||
|
|
||||||
// Funny Darwin hack: This flag tells the linker that no global symbols
|
// Funny Darwin hack: This flag tells the linker that no global symbols
|
||||||
@ -287,6 +290,9 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
|
|||||||
// linker can safely perform dead code stripping. Since LLVM never
|
// linker can safely perform dead code stripping. Since LLVM never
|
||||||
// generates code that does this, it is always safe to set.
|
// generates code that does this, it is always safe to set.
|
||||||
O << "\t.subsections_via_symbols\n";
|
O << "\t.subsections_via_symbols\n";
|
||||||
|
} else if (Subtarget->isTargetELF()) {
|
||||||
|
// Emit final debug information.
|
||||||
|
DW.EndModule();
|
||||||
}
|
}
|
||||||
|
|
||||||
AsmPrinter::doFinalization(M);
|
AsmPrinter::doFinalization(M);
|
||||||
|
@ -67,7 +67,7 @@ struct VISIBILITY_HIDDEN X86SharedAsmPrinter : public AsmPrinter {
|
|||||||
|
|
||||||
void getAnalysisUsage(AnalysisUsage &AU) const {
|
void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
if (Subtarget->isTargetDarwin()) {
|
if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) {
|
||||||
AU.addRequired<MachineDebugInfo>();
|
AU.addRequired<MachineDebugInfo>();
|
||||||
}
|
}
|
||||||
MachineFunctionPass::getAnalysisUsage(AU);
|
MachineFunctionPass::getAnalysisUsage(AU);
|
||||||
|
@ -219,7 +219,7 @@ X86TargetLowering::X86TargetLowering(TargetMachine &TM)
|
|||||||
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);
|
||||||
// FIXME - use subtarget debug flags
|
// FIXME - use subtarget debug flags
|
||||||
if (!Subtarget->isTargetDarwin())
|
if (!Subtarget->isTargetDarwin() && !Subtarget->isTargetELF())
|
||||||
setOperationAction(ISD::DEBUG_LABEL, MVT::Other, Expand);
|
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
|
||||||
|
@ -2451,9 +2451,9 @@ def DWARF_LOC : I<0, Pseudo, (ops i32imm:$line, i32imm:$col, i32imm:$file),
|
|||||||
[(dwarf_loc (i32 imm:$line), (i32 imm:$col),
|
[(dwarf_loc (i32 imm:$line), (i32 imm:$col),
|
||||||
(i32 imm:$file))]>;
|
(i32 imm:$file))]>;
|
||||||
|
|
||||||
def DWARF_LABEL : I<0, Pseudo, (ops i32imm:$id),
|
def DWARF_LABEL : I<0, Pseudo, (ops i32imm:$id),
|
||||||
"\nLdebug_loc${id:debug}:",
|
"\n${:private}debug_loc${id:debug}:",
|
||||||
[(dwarf_label (i32 imm:$id))]>;
|
[(dwarf_label (i32 imm:$id))]>;
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Non-Instruction Patterns
|
// Non-Instruction Patterns
|
||||||
|
@ -60,6 +60,30 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
|
|||||||
DwarfRangesSection = ".section __DWARF,__debug_ranges,regular,debug";
|
DwarfRangesSection = ".section __DWARF,__debug_ranges,regular,debug";
|
||||||
DwarfMacInfoSection = ".section __DWARF,__debug_macinfo,regular,debug";
|
DwarfMacInfoSection = ".section __DWARF,__debug_macinfo,regular,debug";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case X86Subtarget::isELF:
|
||||||
|
// Set up DWARF directives
|
||||||
|
HasLEB128 = true; // Target asm supports leb128 directives (little-endian)
|
||||||
|
// bool HasLEB128; // Defaults to false.
|
||||||
|
// hasDotLoc - True if target asm supports .loc directives.
|
||||||
|
// bool HasDotLoc; // Defaults to false.
|
||||||
|
// HasDotFile - True if target asm supports .file directives.
|
||||||
|
// bool HasDotFile; // Defaults to false.
|
||||||
|
PrivateGlobalPrefix = "."; // Prefix for private global symbols
|
||||||
|
DwarfRequiresFrameSection = false;
|
||||||
|
DwarfAbbrevSection = "\t.section\t.debug_abbrev,\"\",@progbits";
|
||||||
|
DwarfInfoSection = "\t.section\t.debug_info,\"\",@progbits";
|
||||||
|
DwarfLineSection = "\t.section\t.debug_line,\"\",@progbits";
|
||||||
|
DwarfFrameSection = "\t.section\t.debug_frame,\"\",@progbits";
|
||||||
|
DwarfPubNamesSection ="\t.section\t.debug_pubnames,\"\",@progbits";
|
||||||
|
DwarfPubTypesSection ="\t.section\t.debug_pubtypes,\"\",@progbits";
|
||||||
|
DwarfStrSection = "\t.section\t.debug_str,\"\",@progbits";
|
||||||
|
DwarfLocSection = "\t.section\t.debug_loc,\"\",@progbits";
|
||||||
|
DwarfARangesSection = "\t.section\t.debug_aranges,\"\",@progbits";
|
||||||
|
DwarfRangesSection = "\t.section\t.debug_ranges,\"\",@progbits";
|
||||||
|
DwarfMacInfoSection = "\t.section\t.debug_macinfo,\"\",@progbits";
|
||||||
|
break;
|
||||||
|
|
||||||
case X86Subtarget::isCygwin:
|
case X86Subtarget::isCygwin:
|
||||||
GlobalPrefix = "_";
|
GlobalPrefix = "_";
|
||||||
COMMDirectiveTakesAlignment = false;
|
COMMDirectiveTakesAlignment = false;
|
||||||
|
Reference in New Issue
Block a user