mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-26 23:24:34 +00:00
Use the existing begin and end symbol for debug info.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231338 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -556,7 +556,7 @@ void AsmPrinter::EmitFunctionHeader() {
|
|||||||
OutStreamer.EmitLabel(DeadBlockSyms[i]);
|
OutStreamer.EmitLabel(DeadBlockSyms[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!MMI->getLandingPads().empty()) {
|
if (!MMI->getLandingPads().empty() || MMI->hasDebugInfo()) {
|
||||||
CurrentFnBegin = createTempSymbol("func_begin", getFunctionNumber());
|
CurrentFnBegin = createTempSymbol("func_begin", getFunctionNumber());
|
||||||
|
|
||||||
if (MAI->useAssignmentForEHBegin()) {
|
if (MAI->useAssignmentForEHBegin()) {
|
||||||
@ -882,7 +882,8 @@ void AsmPrinter::EmitFunctionBody() {
|
|||||||
// Emit target-specific gunk after the function body.
|
// Emit target-specific gunk after the function body.
|
||||||
EmitFunctionBodyEnd();
|
EmitFunctionBodyEnd();
|
||||||
|
|
||||||
if (!MMI->getLandingPads().empty() || MAI->hasDotTypeDotSizeDirective()) {
|
if (!MMI->getLandingPads().empty() || MMI->hasDebugInfo() ||
|
||||||
|
MAI->hasDotTypeDotSizeDirective()) {
|
||||||
// Create a symbol for the end of function.
|
// Create a symbol for the end of function.
|
||||||
CurrentFnEnd = createTempSymbol("func_end", getFunctionNumber());
|
CurrentFnEnd = createTempSymbol("func_end", getFunctionNumber());
|
||||||
OutStreamer.EmitLabel(CurrentFnEnd);
|
OutStreamer.EmitLabel(CurrentFnEnd);
|
||||||
|
@ -287,7 +287,7 @@ void DwarfCompileUnit::attachLowHighPC(DIE &D, const MCSymbol *Begin,
|
|||||||
DIE &DwarfCompileUnit::updateSubprogramScopeDIE(DISubprogram SP) {
|
DIE &DwarfCompileUnit::updateSubprogramScopeDIE(DISubprogram SP) {
|
||||||
DIE *SPDie = getOrCreateSubprogramDIE(SP, includeMinimalInlineScopes());
|
DIE *SPDie = getOrCreateSubprogramDIE(SP, includeMinimalInlineScopes());
|
||||||
|
|
||||||
attachLowHighPC(*SPDie, DD->getFunctionBeginSym(), DD->getFunctionEndSym());
|
attachLowHighPC(*SPDie, Asm->getFunctionBegin(), Asm->getFunctionEnd());
|
||||||
if (!DD->getCurrentFunction()->getTarget().Options.DisableFramePointerElim(
|
if (!DD->getCurrentFunction()->getTarget().Options.DisableFramePointerElim(
|
||||||
*DD->getCurrentFunction()))
|
*DD->getCurrentFunction()))
|
||||||
addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr);
|
addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr);
|
||||||
|
@ -207,7 +207,6 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
|
|||||||
DwarfLineSectionSym = nullptr;
|
DwarfLineSectionSym = nullptr;
|
||||||
DwarfAddrSectionSym = nullptr;
|
DwarfAddrSectionSym = nullptr;
|
||||||
DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = nullptr;
|
DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = nullptr;
|
||||||
FunctionBeginSym = FunctionEndSym = nullptr;
|
|
||||||
CurFn = nullptr;
|
CurFn = nullptr;
|
||||||
CurMI = nullptr;
|
CurMI = nullptr;
|
||||||
|
|
||||||
@ -855,7 +854,7 @@ DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
|
|||||||
if (End != nullptr)
|
if (End != nullptr)
|
||||||
EndLabel = getLabelAfterInsn(End);
|
EndLabel = getLabelAfterInsn(End);
|
||||||
else if (std::next(I) == Ranges.end())
|
else if (std::next(I) == Ranges.end())
|
||||||
EndLabel = FunctionEndSym;
|
EndLabel = Asm->getFunctionEnd();
|
||||||
else
|
else
|
||||||
EndLabel = getLabelBeforeInsn(std::next(I)->first);
|
EndLabel = getLabelBeforeInsn(std::next(I)->first);
|
||||||
assert(EndLabel && "Forgot label after instruction ending a range!");
|
assert(EndLabel && "Forgot label after instruction ending a range!");
|
||||||
@ -1146,11 +1145,6 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
|||||||
else
|
else
|
||||||
Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
|
Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
|
||||||
|
|
||||||
// Emit a label for the function so that we have a beginning address.
|
|
||||||
FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber());
|
|
||||||
// Assumes in correct section after the entry point.
|
|
||||||
Asm->OutStreamer.EmitLabel(FunctionBeginSym);
|
|
||||||
|
|
||||||
// Calculate history for local variables.
|
// Calculate history for local variables.
|
||||||
calculateDbgValueHistory(MF, Asm->MF->getSubtarget().getRegisterInfo(),
|
calculateDbgValueHistory(MF, Asm->MF->getSubtarget().getRegisterInfo(),
|
||||||
DbgValues);
|
DbgValues);
|
||||||
@ -1161,12 +1155,12 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
|||||||
if (Ranges.empty())
|
if (Ranges.empty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// The first mention of a function argument gets the FunctionBeginSym
|
// The first mention of a function argument gets the CurrentFnBegin
|
||||||
// label, so arguments are visible when breaking at function entry.
|
// label, so arguments are visible when breaking at function entry.
|
||||||
DIVariable DIVar(Ranges.front().first->getDebugVariable());
|
DIVariable DIVar(Ranges.front().first->getDebugVariable());
|
||||||
if (DIVar.isVariable() && DIVar.getTag() == dwarf::DW_TAG_arg_variable &&
|
if (DIVar.isVariable() && DIVar.getTag() == dwarf::DW_TAG_arg_variable &&
|
||||||
getDISubprogram(DIVar.getContext()).describes(MF->getFunction())) {
|
getDISubprogram(DIVar.getContext()).describes(MF->getFunction())) {
|
||||||
LabelsBeforeInsn[Ranges.front().first] = FunctionBeginSym;
|
LabelsBeforeInsn[Ranges.front().first] = Asm->getFunctionBegin();
|
||||||
if (Ranges.front().first->getDebugExpression().isBitPiece()) {
|
if (Ranges.front().first->getDebugExpression().isBitPiece()) {
|
||||||
// Mark all non-overlapping initial pieces.
|
// Mark all non-overlapping initial pieces.
|
||||||
for (auto I = Ranges.begin(); I != Ranges.end(); ++I) {
|
for (auto I = Ranges.begin(); I != Ranges.end(); ++I) {
|
||||||
@ -1175,7 +1169,7 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
|||||||
[&](DbgValueHistoryMap::InstrRange Pred) {
|
[&](DbgValueHistoryMap::InstrRange Pred) {
|
||||||
return !piecesOverlap(Piece, Pred.first->getDebugExpression());
|
return !piecesOverlap(Piece, Pred.first->getDebugExpression());
|
||||||
}))
|
}))
|
||||||
LabelsBeforeInsn[I->first] = FunctionBeginSym;
|
LabelsBeforeInsn[I->first] = Asm->getFunctionBegin();
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1190,7 +1184,7 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PrevInstLoc = DebugLoc();
|
PrevInstLoc = DebugLoc();
|
||||||
PrevLabel = FunctionBeginSym;
|
PrevLabel = Asm->getFunctionBegin();
|
||||||
|
|
||||||
// Record beginning of function.
|
// Record beginning of function.
|
||||||
PrologEndLoc = findPrologueEndLoc(MF);
|
PrologEndLoc = findPrologueEndLoc(MF);
|
||||||
@ -1221,11 +1215,6 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define end label for subprogram.
|
|
||||||
FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
|
|
||||||
// Assumes in correct section after the entry point.
|
|
||||||
Asm->OutStreamer.EmitLabel(FunctionEndSym);
|
|
||||||
|
|
||||||
// Set DwarfDwarfCompileUnitID in MCContext to default value.
|
// Set DwarfDwarfCompileUnitID in MCContext to default value.
|
||||||
Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
|
Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
|
||||||
|
|
||||||
@ -1237,7 +1226,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
|||||||
collectVariableInfo(TheCU, SP, ProcessedVars);
|
collectVariableInfo(TheCU, SP, ProcessedVars);
|
||||||
|
|
||||||
// Add the range of this function to the list of ranges for the CU.
|
// Add the range of this function to the list of ranges for the CU.
|
||||||
TheCU.addRange(RangeSpan(FunctionBeginSym, FunctionEndSym));
|
TheCU.addRange(RangeSpan(Asm->getFunctionBegin(), Asm->getFunctionEnd()));
|
||||||
|
|
||||||
// Under -gmlt, skip building the subprogram if there are no inlined
|
// Under -gmlt, skip building the subprogram if there are no inlined
|
||||||
// subroutines inside it.
|
// subroutines inside it.
|
||||||
|
@ -249,7 +249,6 @@ class DwarfDebug : public AsmPrinterHandler {
|
|||||||
MCSymbol *DwarfInfoSectionSym, *DwarfAbbrevSectionSym;
|
MCSymbol *DwarfInfoSectionSym, *DwarfAbbrevSectionSym;
|
||||||
MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym;
|
MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym;
|
||||||
MCSymbol *DwarfDebugLocSectionSym, *DwarfLineSectionSym, *DwarfAddrSectionSym;
|
MCSymbol *DwarfDebugLocSectionSym, *DwarfLineSectionSym, *DwarfAddrSectionSym;
|
||||||
MCSymbol *FunctionBeginSym, *FunctionEndSym;
|
|
||||||
MCSymbol *DwarfInfoDWOSectionSym, *DwarfAbbrevDWOSectionSym;
|
MCSymbol *DwarfInfoDWOSectionSym, *DwarfAbbrevDWOSectionSym;
|
||||||
MCSymbol *DwarfTypesDWOSectionSym;
|
MCSymbol *DwarfTypesDWOSectionSym;
|
||||||
MCSymbol *DwarfStrDWOSectionSym;
|
MCSymbol *DwarfStrDWOSectionSym;
|
||||||
@ -627,8 +626,6 @@ public:
|
|||||||
void addAccelType(StringRef Name, const DIE &Die, char Flags);
|
void addAccelType(StringRef Name, const DIE &Die, char Flags);
|
||||||
|
|
||||||
const MachineFunction *getCurrentFunction() const { return CurFn; }
|
const MachineFunction *getCurrentFunction() const { return CurFn; }
|
||||||
const MCSymbol *getFunctionBeginSym() const { return FunctionBeginSym; }
|
|
||||||
const MCSymbol *getFunctionEndSym() const { return FunctionEndSym; }
|
|
||||||
|
|
||||||
iterator_range<ImportedEntityMap::const_iterator>
|
iterator_range<ImportedEntityMap::const_iterator>
|
||||||
findImportedEntitiesForScope(const MDNode *Scope) const {
|
findImportedEntitiesForScope(const MDNode *Scope) const {
|
||||||
|
@ -364,10 +364,7 @@ void WinCodeViewLineTables::endFunction(const MachineFunction *MF) {
|
|||||||
FnDebugInfo.erase(GV);
|
FnDebugInfo.erase(GV);
|
||||||
VisitedFunctions.pop_back();
|
VisitedFunctions.pop_back();
|
||||||
} else {
|
} else {
|
||||||
// Define end label for subprogram.
|
CurFn->End = Asm->getFunctionEnd();
|
||||||
MCSymbol *FunctionEndSym = Asm->OutStreamer.getContext().CreateTempSymbol();
|
|
||||||
Asm->OutStreamer.EmitLabel(FunctionEndSym);
|
|
||||||
CurFn->End = FunctionEndSym;
|
|
||||||
}
|
}
|
||||||
CurFn = nullptr;
|
CurFn = nullptr;
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
; The module ctor has no debug info. All we have to do is don't crash.
|
; The module ctor has no debug info. All we have to do is don't crash.
|
||||||
; X86: _asan.module_ctor:
|
; X86: _asan.module_ctor:
|
||||||
|
; X86-NEXT: L{{.*}}:
|
||||||
; X86-NEXT: # BB
|
; X86-NEXT: # BB
|
||||||
; X86-NEXT: calll ___asan_init_v3
|
; X86-NEXT: calll ___asan_init_v3
|
||||||
; X86-NEXT: retl
|
; X86-NEXT: retl
|
||||||
|
@ -115,6 +115,7 @@
|
|||||||
; OBJ32: }
|
; OBJ32: }
|
||||||
|
|
||||||
; X64-LABEL: f:
|
; X64-LABEL: f:
|
||||||
|
; X64-NEXT: .L{{.*}}:{{$}}
|
||||||
; X64-NEXT: [[START:.*]]:{{$}}
|
; X64-NEXT: [[START:.*]]:{{$}}
|
||||||
; X64: # BB
|
; X64: # BB
|
||||||
; X64: subq $40, %rsp
|
; X64: subq $40, %rsp
|
||||||
|
@ -144,6 +144,7 @@
|
|||||||
; OBJ32: }
|
; OBJ32: }
|
||||||
|
|
||||||
; X64-LABEL: f:
|
; X64-LABEL: f:
|
||||||
|
; X64-NEXT: .L{{.*}}:{{$}}
|
||||||
; X64-NEXT: [[START:.*]]:{{$}}
|
; X64-NEXT: [[START:.*]]:{{$}}
|
||||||
; X64: # BB
|
; X64: # BB
|
||||||
; X64: subq $40, %rsp
|
; X64: subq $40, %rsp
|
||||||
|
@ -278,6 +278,7 @@
|
|||||||
; OBJ32: }
|
; OBJ32: }
|
||||||
|
|
||||||
; X64-LABEL: x:
|
; X64-LABEL: x:
|
||||||
|
; X64-NEXT: .L{{.*}}:
|
||||||
; X64-NEXT: [[X_START:.*]]:{{$}}
|
; X64-NEXT: [[X_START:.*]]:{{$}}
|
||||||
; X64: # BB
|
; X64: # BB
|
||||||
; X64: subq $40, %rsp
|
; X64: subq $40, %rsp
|
||||||
@ -290,6 +291,7 @@
|
|||||||
; X64-NEXT: [[END_OF_X:.*]]:
|
; X64-NEXT: [[END_OF_X:.*]]:
|
||||||
;
|
;
|
||||||
; X64-LABEL: y:
|
; X64-LABEL: y:
|
||||||
|
; X64-NEXT: .L{{.*}}:
|
||||||
; X64-NEXT: [[Y_START:.*]]:{{$}}
|
; X64-NEXT: [[Y_START:.*]]:{{$}}
|
||||||
; X64: # BB
|
; X64: # BB
|
||||||
; X64: subq $40, %rsp
|
; X64: subq $40, %rsp
|
||||||
@ -302,6 +304,7 @@
|
|||||||
; X64-NEXT: [[END_OF_Y:.*]]:
|
; X64-NEXT: [[END_OF_Y:.*]]:
|
||||||
;
|
;
|
||||||
; X64-LABEL: f:
|
; X64-LABEL: f:
|
||||||
|
; X64-NEXT: .L{{.*}}:
|
||||||
; X64-NEXT: [[F_START:.*]]:{{$}}
|
; X64-NEXT: [[F_START:.*]]:{{$}}
|
||||||
; X64: # BB
|
; X64: # BB
|
||||||
; X64: subq $40, %rsp
|
; X64: subq $40, %rsp
|
||||||
|
@ -107,6 +107,7 @@
|
|||||||
; OBJ32: }
|
; OBJ32: }
|
||||||
|
|
||||||
; X64-LABEL: f:
|
; X64-LABEL: f:
|
||||||
|
; X64-NEXT: .L{{.*}}:{{$}}
|
||||||
; X64-NEXT: [[START:.*]]:{{$}}
|
; X64-NEXT: [[START:.*]]:{{$}}
|
||||||
; X64: # BB
|
; X64: # BB
|
||||||
; X64: subq $40, %rsp
|
; X64: subq $40, %rsp
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
; with debug information available. This used to be PR19239.
|
; with debug information available. This used to be PR19239.
|
||||||
|
|
||||||
; X86-LABEL: {{^}}"?bar@@YAXHZZ":
|
; X86-LABEL: {{^}}"?bar@@YAXHZZ":
|
||||||
|
; X86-NEXT: L{{.*}}:
|
||||||
; X86-NEXT: # BB
|
; X86-NEXT: # BB
|
||||||
; X86-NEXT: [[JMP_LINE:^L.*]]:{{$}}
|
; X86-NEXT: [[JMP_LINE:^L.*]]:{{$}}
|
||||||
; X86: jmp "?foo@@YAXXZ"
|
; X86: jmp "?foo@@YAXXZ"
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
; Then it's addressed via %rsp:
|
; Then it's addressed via %rsp:
|
||||||
; CHECK: .quad [[START_LABEL]]-.Lfunc_begin0
|
; CHECK: .quad [[START_LABEL]]-.Lfunc_begin0
|
||||||
; CHECK-NEXT: .Lfunc_end06-.Lfunc_begin0
|
; CHECK-NEXT: .Lfunc_end0-.Lfunc_begin0
|
||||||
; CHECK: DW_OP_breg7
|
; CHECK: DW_OP_breg7
|
||||||
; CHECK-NEXT: [[OFFSET]]
|
; CHECK-NEXT: [[OFFSET]]
|
||||||
; CHECK: DW_OP_deref
|
; CHECK: DW_OP_deref
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
; CHECK: .Ldebug_loc{{[0-9]+}}:
|
; CHECK: .Ldebug_loc{{[0-9]+}}:
|
||||||
; CHECK: DW_OP_breg1
|
; CHECK: DW_OP_breg1
|
||||||
; CHECK: .quad [[START_LABEL]]-.Lfunc_begin0
|
; CHECK: .quad [[START_LABEL]]-.Lfunc_begin0
|
||||||
; CHECK-NEXT: .quad .Lfunc_end09-.Lfunc_begin0
|
; CHECK-NEXT: .quad .Lfunc_end0-.Lfunc_begin0
|
||||||
; CHECK: DW_OP_breg6
|
; CHECK: DW_OP_breg6
|
||||||
; CHECK: DW_OP_deref
|
; CHECK: DW_OP_deref
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user