mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-23 04:52:54 +02:00
[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
3bf809b0e4
commit
53e20b7442
@ -323,6 +323,15 @@ bool StripDeadDebugInfo::runOnModule(Module &M) {
|
||||
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()) {
|
||||
// Create our live global variable list.
|
||||
bool GlobalVariableChange = false;
|
||||
@ -341,6 +350,11 @@ bool StripDeadDebugInfo::runOnModule(Module &M) {
|
||||
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
|
||||
// variable list with our new live global variable list.
|
||||
if (GlobalVariableChange) {
|
||||
@ -352,5 +366,16 @@ bool StripDeadDebugInfo::runOnModule(Module &M) {
|
||||
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;
|
||||
}
|
||||
|
@ -3,6 +3,9 @@
|
||||
; CHECK: ModuleID = '{{.*}}'
|
||||
; CHECK-NOT: "bar"
|
||||
; CHECK-NOT: "abcd"
|
||||
; CHECK-NOT: "GCC"
|
||||
; CHECK: "Globals"
|
||||
; CHECK: "abcd2"
|
||||
|
||||
source_filename = "test/Transforms/StripSymbols/strip-dead-debug-info.ll"
|
||||
|
||||
@ -29,7 +32,7 @@ attributes #0 = { nounwind readnone }
|
||||
attributes #1 = { nounwind readnone ssp }
|
||||
attributes #2 = { nounwind readonly ssp }
|
||||
|
||||
!llvm.dbg.cu = !{!4}
|
||||
!llvm.dbg.cu = !{!4, !23, !24}
|
||||
!llvm.module.flags = !{!9}
|
||||
|
||||
!0 = !DIGlobalVariableExpression(var: !1)
|
||||
@ -55,4 +58,8 @@ attributes #2 = { nounwind readonly ssp }
|
||||
!20 = !DILocation(line: 7, scope: !15)
|
||||
!21 = !DILocation(line: 10, scope: !22)
|
||||
!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
Block a user