mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 08:17:40 +00:00
Provide gmlt-like inline scope information in the skeleton CU to facilitate symbolication without needing the .dwo files
Clang -gsplit-dwarf self-host -O0, binary increases by 0.0005%, -O2, binary increases by 25%. A large binary inside Google, split-dwarf, -O0, and other internal flags (GDB index, etc) increases by 1.8%, optimized build is 35%. The size impact may be somewhat greater in .o files (I haven't measured that much - since the linked executable -O0 numbers seemed low enough) due to relocations. These relocations could be removed if we taught the llvm-symbolizer to handle indexed addressing in the .o file (GDB can't cope with this just yet, but GDB won't be reading this info anyway). Also debug_ranges could be shared between .o and .dwo, though ideally debug_ranges would get a schema that could used index(+offset) addressing, and move to the .dwo file, then we'd be back to sharing addresses in the address pool again. But for now, these sizes seem small enough to go ahead with this. Verified that no other DW_TAGs are produced into the .o file other than subprograms and inlined_subroutines. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221306 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -330,6 +330,12 @@ bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
|
||||
return !getLabelAfterInsn(Ranges.front().second);
|
||||
}
|
||||
|
||||
template <typename Func> void forBothCUs(DwarfCompileUnit &CU, Func F) {
|
||||
F(CU);
|
||||
if (auto *SkelCU = CU.getSkeleton())
|
||||
F(*SkelCU);
|
||||
}
|
||||
|
||||
void DwarfDebug::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) {
|
||||
assert(Scope && Scope->getScopeNode());
|
||||
assert(Scope->isAbstractScope());
|
||||
@@ -341,7 +347,10 @@ void DwarfDebug::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) {
|
||||
|
||||
// Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
|
||||
// was inlined from another compile unit.
|
||||
SPMap[SP]->constructAbstractSubprogramScopeDIE(Scope);
|
||||
auto &CU = SPMap[SP];
|
||||
forBothCUs(*CU, [&](DwarfCompileUnit &CU) {
|
||||
CU.constructAbstractSubprogramScopeDIE(Scope);
|
||||
});
|
||||
}
|
||||
|
||||
void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const {
|
||||
@@ -506,7 +515,9 @@ void DwarfDebug::finishVariableDefinitions() {
|
||||
|
||||
void DwarfDebug::finishSubprogramDefinitions() {
|
||||
for (const auto &P : SPMap)
|
||||
P.second->finishSubprogramDefinition(DISubprogram(P.first));
|
||||
forBothCUs(*P.second, [&](DwarfCompileUnit &CU) {
|
||||
CU.finishSubprogramDefinition(DISubprogram(P.first));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1286,6 +1297,9 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
||||
}
|
||||
|
||||
TheCU.constructSubprogramScopeDIE(FnScope);
|
||||
if (auto *SkelCU = TheCU.getSkeleton())
|
||||
if (!LScopes.getAbstractScopesList().empty())
|
||||
SkelCU->constructSubprogramScopeDIE(FnScope);
|
||||
|
||||
// Clear debug info
|
||||
// Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
|
||||
@@ -1984,6 +1998,9 @@ void DwarfDebug::emitDebugRanges() {
|
||||
for (const auto &I : CUMap) {
|
||||
DwarfCompileUnit *TheCU = I.second;
|
||||
|
||||
if (auto *Skel = TheCU->getSkeleton())
|
||||
TheCU = Skel;
|
||||
|
||||
// Iterate over the misc ranges for the compile units in the module.
|
||||
for (const RangeSpanList &List : TheCU->getRangeLists()) {
|
||||
// Emit our symbol so we can find the beginning of the range.
|
||||
|
||||
Reference in New Issue
Block a user