Index: llvm/trunk/lib/Transforms/IPO/StripSymbols.cpp =================================================================== --- llvm/trunk/lib/Transforms/IPO/StripSymbols.cpp +++ llvm/trunk/lib/Transforms/IPO/StripSymbols.cpp @@ -323,6 +323,15 @@ 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 @@ 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 @@ 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; } Index: llvm/trunk/test/Transforms/StripSymbols/strip-dead-debug-info.ll =================================================================== --- llvm/trunk/test/Transforms/StripSymbols/strip-dead-debug-info.ll +++ llvm/trunk/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 #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 @@ !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)