mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-02 05:17:15 +00:00
[DebugInfo] Sink DwarfDebug::addCurrentFnArgument down into DwarfFile.
Variable handling will be sunk into DwarfFile so that abstract variables and the like can be shared across multiple CUs (to handle cross-CU inlining, for example). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220453 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -794,29 +794,6 @@ DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(const DIVariable &DV,
|
|||||||
createAbstractVariable(Cleansed, Scope);
|
createAbstractVariable(Cleansed, Scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If Var is a current function argument then add it to CurrentFnArguments list.
|
|
||||||
bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
|
|
||||||
if (Scope->getParent())
|
|
||||||
return false;
|
|
||||||
DIVariable DV = Var->getVariable();
|
|
||||||
if (DV.getTag() != dwarf::DW_TAG_arg_variable)
|
|
||||||
return false;
|
|
||||||
unsigned ArgNo = DV.getArgNumber();
|
|
||||||
if (ArgNo == 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
size_t Size = CurrentFnArguments.size();
|
|
||||||
if (Size == 0)
|
|
||||||
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)
|
|
||||||
CurrentFnArguments.resize(ArgNo * 2);
|
|
||||||
assert(!CurrentFnArguments[ArgNo - 1]);
|
|
||||||
CurrentFnArguments[ArgNo - 1] = Var;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collect variable information from side table maintained by MMI.
|
// Collect variable information from side table maintained by MMI.
|
||||||
void DwarfDebug::collectVariableInfoFromMMITable(
|
void DwarfDebug::collectVariableInfoFromMMITable(
|
||||||
SmallPtrSetImpl<const MDNode *> &Processed) {
|
SmallPtrSetImpl<const MDNode *> &Processed) {
|
||||||
@@ -1277,7 +1254,7 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
|
void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
|
||||||
if (addCurrentFnArgument(Var, LS))
|
if (InfoHolder.addCurrentFnArgument(Var, LS))
|
||||||
return;
|
return;
|
||||||
addNonArgumentScopeVariable(LS, Var);
|
addNonArgumentScopeVariable(LS, Var);
|
||||||
}
|
}
|
||||||
|
@@ -70,6 +70,7 @@ void DwarfFile::emitUnits(const MCSymbol *ASectionSym) {
|
|||||||
Asm->OutStreamer.EmitLabel(TheU->getLabelEnd());
|
Asm->OutStreamer.EmitLabel(TheU->getLabelEnd());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute the size and offset for each DIE.
|
// Compute the size and offset for each DIE.
|
||||||
void DwarfFile::computeSizeAndOffsets() {
|
void DwarfFile::computeSizeAndOffsets() {
|
||||||
// Offset from the first CU in the debug info section is 0 initially.
|
// Offset from the first CU in the debug info section is 0 initially.
|
||||||
@@ -155,4 +156,26 @@ void DwarfFile::emitStrings(const MCSection *StrSection,
|
|||||||
const MCSection *OffsetSection) {
|
const MCSection *OffsetSection) {
|
||||||
StrPool.emit(*Asm, StrSection, OffsetSection);
|
StrPool.emit(*Asm, StrSection, OffsetSection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If Var is a current function argument then add it to CurrentFnArguments list.
|
||||||
|
bool DwarfFile::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
|
||||||
|
if (Scope->getParent())
|
||||||
|
return false;
|
||||||
|
DIVariable DV = Var->getVariable();
|
||||||
|
if (DV.getTag() != dwarf::DW_TAG_arg_variable)
|
||||||
|
return false;
|
||||||
|
unsigned ArgNo = DV.getArgNumber();
|
||||||
|
if (ArgNo == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto &CurrentFnArguments = DD.getCurrentFnArguments();
|
||||||
|
|
||||||
|
// llvm::Function argument size is not good indicator of how many
|
||||||
|
// arguments does the function have at source level.
|
||||||
|
if (ArgNo > CurrentFnArguments.size())
|
||||||
|
CurrentFnArguments.resize(ArgNo * 2);
|
||||||
|
assert(!CurrentFnArguments[ArgNo - 1]);
|
||||||
|
CurrentFnArguments[ArgNo - 1] = Var;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,10 +24,12 @@
|
|||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
class AsmPrinter;
|
class AsmPrinter;
|
||||||
|
class DbgVariable;
|
||||||
class DwarfUnit;
|
class DwarfUnit;
|
||||||
class DIEAbbrev;
|
class DIEAbbrev;
|
||||||
class MCSymbol;
|
class MCSymbol;
|
||||||
class DIE;
|
class DIE;
|
||||||
|
class LexicalScope;
|
||||||
class StringRef;
|
class StringRef;
|
||||||
class DwarfDebug;
|
class DwarfDebug;
|
||||||
class MCSection;
|
class MCSection;
|
||||||
@@ -81,6 +83,8 @@ public:
|
|||||||
|
|
||||||
/// \brief Returns the string pool.
|
/// \brief Returns the string pool.
|
||||||
DwarfStringPool &getStringPool() { return StrPool; }
|
DwarfStringPool &getStringPool() { return StrPool; }
|
||||||
|
|
||||||
|
bool addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user