From bacc64b5fae4b8716a6f0313927932182d0d815b Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Thu, 6 Apr 2017 19:26:22 +0000 Subject: [PATCH] [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 --- llvm/lib/Transforms/IPO/StripSymbols.cpp | 25 ++++++++++++++++++++++ .../StripSymbols/strip-dead-debug-info.ll | 11 ++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Transforms/IPO/StripSymbols.cpp b/llvm/lib/Transforms/IPO/StripSymbols.cpp index 8f6f161..4d52f5f 100644 --- a/llvm/lib/Transforms/IPO/StripSymbols.cpp +++ b/llvm/lib/Transforms/IPO/StripSymbols.cpp @@ -323,6 +323,15 @@ bool StripDeadDebugInfo::runOnModule(Module &M) { LiveGVs.insert(GVE); } + std::set 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; } diff --git a/llvm/test/Transforms/StripSymbols/strip-dead-debug-info.ll b/llvm/test/Transforms/StripSymbols/strip-dead-debug-info.ll index 0e252d7..eb8ff50 100644 --- a/llvm/test/Transforms/StripSymbols/strip-dead-debug-info.ll +++ b/llvm/test/Transforms/StripSymbols/strip-dead-debug-info.ll @@ -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) -- 2.7.4