[StripDeadDebugInfo] Drop dead CUs entirely
Summary: Prior to this while it would delete the dead DIGlobalVariables, it would leave dead DICompileUnits and everything referenced therefrom. For a bit bitcode file with thousands of compile units those dead nodes easily outnumbered the real ones. Clean that up. Reviewed By: aprantl Differential Revision: https://reviews.llvm.org/D31720 llvm-svn: 299692
This commit is contained in:
parent
b122ed9181
commit
bacc64b5fa
|
@ -323,6 +323,15 @@ bool StripDeadDebugInfo::runOnModule(Module &M) {
|
||||||
LiveGVs.insert(GVE);
|
LiveGVs.insert(GVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::set<DICompileUnit *> LiveCUs;
|
||||||
|
// Any CU referenced from a function is live.
|
||||||
|
for (Function &F : M.functions()) {
|
||||||
|
DISubprogram *SP = F.getSubprogram();
|
||||||
|
if (SP && SP->getUnit())
|
||||||
|
LiveCUs.insert(SP->getUnit());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasDeadCUs = false;
|
||||||
for (DICompileUnit *DIC : F.compile_units()) {
|
for (DICompileUnit *DIC : F.compile_units()) {
|
||||||
// Create our live global variable list.
|
// Create our live global variable list.
|
||||||
bool GlobalVariableChange = false;
|
bool GlobalVariableChange = false;
|
||||||
|
@ -341,6 +350,11 @@ bool StripDeadDebugInfo::runOnModule(Module &M) {
|
||||||
GlobalVariableChange = true;
|
GlobalVariableChange = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!LiveGlobalVariables.empty())
|
||||||
|
LiveCUs.insert(DIC);
|
||||||
|
else if (!LiveCUs.count(DIC))
|
||||||
|
HasDeadCUs = true;
|
||||||
|
|
||||||
// If we found dead global variables, replace the current global
|
// If we found dead global variables, replace the current global
|
||||||
// variable list with our new live global variable list.
|
// variable list with our new live global variable list.
|
||||||
if (GlobalVariableChange) {
|
if (GlobalVariableChange) {
|
||||||
|
@ -352,5 +366,16 @@ bool StripDeadDebugInfo::runOnModule(Module &M) {
|
||||||
LiveGlobalVariables.clear();
|
LiveGlobalVariables.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (HasDeadCUs) {
|
||||||
|
// Delete the old node and replace it with a new one
|
||||||
|
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
|
||||||
|
NMD->clearOperands();
|
||||||
|
if (!LiveCUs.empty()) {
|
||||||
|
for (DICompileUnit *CU : LiveCUs)
|
||||||
|
NMD->addOperand(CU);
|
||||||
|
}
|
||||||
|
Changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
return Changed;
|
return Changed;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,9 @@
|
||||||
; CHECK: ModuleID = '{{.*}}'
|
; CHECK: ModuleID = '{{.*}}'
|
||||||
; CHECK-NOT: "bar"
|
; CHECK-NOT: "bar"
|
||||||
; CHECK-NOT: "abcd"
|
; CHECK-NOT: "abcd"
|
||||||
|
; CHECK-NOT: "GCC"
|
||||||
|
; CHECK: "Globals"
|
||||||
|
; CHECK: "abcd2"
|
||||||
|
|
||||||
source_filename = "test/Transforms/StripSymbols/strip-dead-debug-info.ll"
|
source_filename = "test/Transforms/StripSymbols/strip-dead-debug-info.ll"
|
||||||
|
|
||||||
|
@ -29,7 +32,7 @@ attributes #0 = { nounwind readnone }
|
||||||
attributes #1 = { nounwind readnone ssp }
|
attributes #1 = { nounwind readnone ssp }
|
||||||
attributes #2 = { nounwind readonly ssp }
|
attributes #2 = { nounwind readonly ssp }
|
||||||
|
|
||||||
!llvm.dbg.cu = !{!4}
|
!llvm.dbg.cu = !{!4, !23, !24}
|
||||||
!llvm.module.flags = !{!9}
|
!llvm.module.flags = !{!9}
|
||||||
|
|
||||||
!0 = !DIGlobalVariableExpression(var: !1)
|
!0 = !DIGlobalVariableExpression(var: !1)
|
||||||
|
@ -55,4 +58,8 @@ attributes #2 = { nounwind readonly ssp }
|
||||||
!20 = !DILocation(line: 7, scope: !15)
|
!20 = !DILocation(line: 7, scope: !15)
|
||||||
!21 = !DILocation(line: 10, scope: !22)
|
!21 = !DILocation(line: 10, scope: !22)
|
||||||
!22 = distinct !DILexicalBlock(scope: !15, file: !2, line: 7)
|
!22 = distinct !DILexicalBlock(scope: !15, file: !2, line: 7)
|
||||||
|
!23 = distinct !DICompileUnit(language: DW_LANG_C89, file: !2, producer: "GCC", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !5, retainedTypes: !5, globals: !5)
|
||||||
|
!24 = distinct !DICompileUnit(language: DW_LANG_C89, file: !2, producer: "Globals", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !5, retainedTypes: !5, globals: !25)
|
||||||
|
!25 = !{!26}
|
||||||
|
!26 = !DIGlobalVariableExpression(var: !27, expr: !DIExpression(DW_OP_constu, 0, DW_OP_stack_value))
|
||||||
|
!27 = !DIGlobalVariable(name: "abcd2", scope: !2, file: !2, line: 2, type: !3, isLocal: true, isDefinition: true)
|
||||||
|
|
Loading…
Reference in New Issue