From 791931a3ae5f78b4a1da3551ead7fdee77f180b1 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Wed, 18 Oct 2023 14:52:49 -0700 Subject: [PATCH] [DWARFLinker] Only extract unit DIEs when cloning clang modules (#69495) Reduce memory usage by only extract unit DIEs when cloning clang modules. We don't need the full debug info yet at this stage. This reduces peak memory usage of dsymutil when linking the swift driver by multiple gigabytes. rdar://117156180 (cherry picked from commit 077d89f0ee840d88a7d59a4f85d152d9c6f4758a) --- llvm/lib/DWARFLinker/DWARFLinker.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp index c15d916aaf13a8..ffc28c4e9c5edc 100644 --- a/llvm/lib/DWARFLinker/DWARFLinker.cpp +++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -2658,12 +2658,12 @@ Error DWARFLinker::link() { continue; } - // In a first phase, just read in the debug info and load all clang modules. + // Clone all the clang modules with requires extracting the DIE units. We + // don't need the full debug info until the Analyze phase. OptContext.CompileUnits.reserve( OptContext.File.Dwarf->getNumCompileUnits()); - for (const auto &CU : OptContext.File.Dwarf->compile_units()) { - auto CUDie = CU->getUnitDIE(false); + auto CUDie = CU->getUnitDIE(/*ExtractUnitDIEOnly=*/true); if (Options.Verbose) { outs() << "Input compilation unit:"; DIDumpOptions DumpOpts; @@ -2704,9 +2704,9 @@ Error DWARFLinker::link() { return; for (const auto &CU : Context.File.Dwarf->compile_units()) { - // The !isClangModuleRef condition effectively skips over fully resolved - // skeleton units. - auto CUDie = CU->getUnitDIE(); + // Previously we only extracted the unit DIEs. We need the full debug info + // now. + auto CUDie = CU->getUnitDIE(/*ExtractUnitDIEOnly=*/false); std::string PCMFile = getPCMFile(CUDie, Options.ObjectPrefixMap); if (!CUDie || LLVM_UNLIKELY(Options.Update) ||