mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-21 18:29:46 +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:
parent
22a01da9de
commit
87e9d8c051
@ -794,29 +794,6 @@ DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(const DIVariable &DV,
|
||||
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.
|
||||
void DwarfDebug::collectVariableInfoFromMMITable(
|
||||
SmallPtrSetImpl<const MDNode *> &Processed) {
|
||||
@ -1277,7 +1254,7 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
||||
}
|
||||
|
||||
void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
|
||||
if (addCurrentFnArgument(Var, LS))
|
||||
if (InfoHolder.addCurrentFnArgument(Var, LS))
|
||||
return;
|
||||
addNonArgumentScopeVariable(LS, Var);
|
||||
}
|
||||
|
@ -70,6 +70,7 @@ void DwarfFile::emitUnits(const MCSymbol *ASectionSym) {
|
||||
Asm->OutStreamer.EmitLabel(TheU->getLabelEnd());
|
||||
}
|
||||
}
|
||||
|
||||
// Compute the size and offset for each DIE.
|
||||
void DwarfFile::computeSizeAndOffsets() {
|
||||
// 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) {
|
||||
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 {
|
||||
class AsmPrinter;
|
||||
class DbgVariable;
|
||||
class DwarfUnit;
|
||||
class DIEAbbrev;
|
||||
class MCSymbol;
|
||||
class DIE;
|
||||
class LexicalScope;
|
||||
class StringRef;
|
||||
class DwarfDebug;
|
||||
class MCSection;
|
||||
@ -81,6 +83,8 @@ public:
|
||||
|
||||
/// \brief Returns the string pool.
|
||||
DwarfStringPool &getStringPool() { return StrPool; }
|
||||
|
||||
bool addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope);
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user