mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-22 10:24:26 +00:00
Reland 196270 "Generalize debug info / EH emission in AsmPrinter"
Addressing the existense AMDGPUAsmPrinter and other subclasses of AsmPrinter git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196288 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -197,6 +197,7 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
|
||||
DwarfAddrSectionSym = 0;
|
||||
DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
|
||||
FunctionBeginSym = FunctionEndSym = 0;
|
||||
CurFn = 0; CurMI = 0;
|
||||
|
||||
// Turn on accelerator tables for Darwin by default, pubnames by
|
||||
// default for non-Darwin, and handle split dwarf.
|
||||
@ -1144,6 +1145,8 @@ void DwarfDebug::endSections() {
|
||||
|
||||
// Emit all Dwarf sections that should come after the content.
|
||||
void DwarfDebug::endModule() {
|
||||
assert(CurFn == 0);
|
||||
assert(CurMI == 0);
|
||||
|
||||
if (!FirstCU)
|
||||
return;
|
||||
@ -1225,8 +1228,7 @@ DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
|
||||
}
|
||||
|
||||
// If Var is a current function argument then add it to CurrentFnArguments list.
|
||||
bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
|
||||
DbgVariable *Var, LexicalScope *Scope) {
|
||||
bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
|
||||
if (!LScopes.isCurrentFunctionScope(Scope))
|
||||
return false;
|
||||
DIVariable DV = Var->getVariable();
|
||||
@ -1238,7 +1240,7 @@ bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
|
||||
|
||||
size_t Size = CurrentFnArguments.size();
|
||||
if (Size == 0)
|
||||
CurrentFnArguments.resize(MF->getFunction()->arg_size());
|
||||
CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
|
||||
// llvm::Function argument size is not good indicator of how many
|
||||
// arguments does the function have at source level.
|
||||
if (ArgNo > Size)
|
||||
@ -1249,7 +1251,7 @@ bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
|
||||
|
||||
// Collect variable information from side table maintained by MMI.
|
||||
void DwarfDebug::collectVariableInfoFromMMITable(
|
||||
const MachineFunction *MF, SmallPtrSet<const MDNode *, 16> &Processed) {
|
||||
SmallPtrSet<const MDNode *, 16> &Processed) {
|
||||
MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
|
||||
for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
|
||||
VE = VMap.end();
|
||||
@ -1270,7 +1272,7 @@ void DwarfDebug::collectVariableInfoFromMMITable(
|
||||
DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
|
||||
DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
|
||||
RegVar->setFrameIndex(VP.first);
|
||||
if (!addCurrentFnArgument(MF, RegVar, Scope))
|
||||
if (!addCurrentFnArgument(RegVar, Scope))
|
||||
addScopeVariable(Scope, RegVar);
|
||||
if (AbsDbgVariable)
|
||||
AbsDbgVariable->setFrameIndex(VP.first);
|
||||
@ -1317,11 +1319,10 @@ static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
|
||||
|
||||
// Find variables for each lexical scope.
|
||||
void
|
||||
DwarfDebug::collectVariableInfo(const MachineFunction *MF,
|
||||
SmallPtrSet<const MDNode *, 16> &Processed) {
|
||||
DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
|
||||
|
||||
// Grab the variable info that was squirreled away in the MMI side-table.
|
||||
collectVariableInfoFromMMITable(MF, Processed);
|
||||
collectVariableInfoFromMMITable(Processed);
|
||||
|
||||
for (SmallVectorImpl<const MDNode *>::const_iterator
|
||||
UVI = UserVariables.begin(),
|
||||
@ -1341,7 +1342,7 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,
|
||||
DIVariable DV(Var);
|
||||
LexicalScope *Scope = NULL;
|
||||
if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
|
||||
DISubprogram(DV.getContext()).describes(MF->getFunction()))
|
||||
DISubprogram(DV.getContext()).describes(CurFn->getFunction()))
|
||||
Scope = LScopes.getCurrentFunctionScope();
|
||||
else if (MDNode *IA = DV.getInlinedAt())
|
||||
Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
|
||||
@ -1355,7 +1356,7 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,
|
||||
assert(MInsn->isDebugValue() && "History must begin with debug value");
|
||||
DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
|
||||
DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this);
|
||||
if (!addCurrentFnArgument(MF, RegVar, Scope))
|
||||
if (!addCurrentFnArgument(RegVar, Scope))
|
||||
addScopeVariable(Scope, RegVar);
|
||||
if (AbsVar)
|
||||
AbsVar->setMInsn(MInsn);
|
||||
@ -1437,6 +1438,8 @@ MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
|
||||
|
||||
// Process beginning of an instruction.
|
||||
void DwarfDebug::beginInstruction(const MachineInstr *MI) {
|
||||
assert(CurMI == 0);
|
||||
CurMI = MI;
|
||||
// Check if source location changes, but ignore DBG_VALUE locations.
|
||||
if (!MI->isDebugValue()) {
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
@ -1478,14 +1481,16 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
|
||||
}
|
||||
|
||||
// Process end of an instruction.
|
||||
void DwarfDebug::endInstruction(const MachineInstr *MI) {
|
||||
void DwarfDebug::endInstruction() {
|
||||
assert(CurMI != 0);
|
||||
// Don't create a new label after DBG_VALUE instructions.
|
||||
// They don't generate code.
|
||||
if (!MI->isDebugValue())
|
||||
if (!CurMI->isDebugValue())
|
||||
PrevLabel = 0;
|
||||
|
||||
DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
|
||||
LabelsAfterInsn.find(MI);
|
||||
LabelsAfterInsn.find(CurMI);
|
||||
CurMI = 0;
|
||||
|
||||
// No label needed.
|
||||
if (I == LabelsAfterInsn.end())
|
||||
@ -1565,6 +1570,7 @@ static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
|
||||
// Gather pre-function debug information. Assumes being called immediately
|
||||
// after the function entry point has been emitted.
|
||||
void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
||||
CurFn = MF;
|
||||
|
||||
// If there's no debug info for the function we're not going to do anything.
|
||||
if (!MMI->hasDebugInfo())
|
||||
@ -1792,8 +1798,19 @@ void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
|
||||
|
||||
// Gather and emit post-function debug information.
|
||||
void DwarfDebug::endFunction(const MachineFunction *MF) {
|
||||
if (!MMI->hasDebugInfo() || LScopes.empty())
|
||||
// Every beginFunction(MF) call should be followed by an endFunction(MF) call,
|
||||
// though the beginFunction may not be called at all.
|
||||
// We should handle both cases.
|
||||
if (CurFn == 0)
|
||||
CurFn = MF;
|
||||
else
|
||||
assert(CurFn == MF);
|
||||
assert(CurFn != 0);
|
||||
|
||||
if (!MMI->hasDebugInfo() || LScopes.empty()) {
|
||||
CurFn = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// Define end label for subprogram.
|
||||
FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
|
||||
@ -1803,7 +1820,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
||||
Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
|
||||
|
||||
SmallPtrSet<const MDNode *, 16> ProcessedVars;
|
||||
collectVariableInfo(MF, ProcessedVars);
|
||||
collectVariableInfo(ProcessedVars);
|
||||
|
||||
LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
|
||||
CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
|
||||
@ -1837,7 +1854,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
||||
|
||||
DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
|
||||
|
||||
if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
|
||||
if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn))
|
||||
TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
|
||||
|
||||
// Clear debug info
|
||||
@ -1853,6 +1870,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
||||
LabelsBeforeInsn.clear();
|
||||
LabelsAfterInsn.clear();
|
||||
PrevLabel = NULL;
|
||||
CurFn = 0;
|
||||
}
|
||||
|
||||
// Register a source line with debug info. Returns the unique label that was
|
||||
|
Reference in New Issue
Block a user