From 188edc2e1ae6734c1e2e257b7bb3ddd52c8158a7 Mon Sep 17 00:00:00 2001 From: Alexandre Ganea Date: Sat, 6 Sep 2025 11:25:27 -0400 Subject: [PATCH 1/2] [LLD][COFF] Display the size of all consumed inputs with `/summary` When `/summary` is used, we now also display the cumulative size of all input OBJ files, including those pulled from archives. Lazy OBJ files that were not pulled in are not accounted for. Example output: ``` > lld-link ... /summary ``` --- lld/COFF/COFFLinkerContext.h | 1 + lld/COFF/Driver.cpp | 1 + lld/COFF/PDB.cpp | 6 +++++- lld/test/COFF/pdb-type-server-simple.test | 23 ++++++++++++----------- lld/test/COFF/precomp-link-samename.test | 7 ++++--- lld/test/COFF/precomp-link.test | 23 ++++++++++++----------- lld/test/COFF/precomp-summary-fail.test | 23 ++++++++++++----------- 7 files changed, 47 insertions(+), 37 deletions(-) diff --git a/lld/COFF/COFFLinkerContext.h b/lld/COFF/COFFLinkerContext.h index f45b754384ef9..b44263b5a3390 100644 --- a/lld/COFF/COFFLinkerContext.h +++ b/lld/COFF/COFFLinkerContext.h @@ -61,6 +61,7 @@ class COFFLinkerContext : public CommonLinkerContext { std::vector objFileInstances; std::map pdbInputFileInstances; std::vector importFileInstances; + std::int64_t consumedInputsSize = 0; MergeChunk *mergeChunkInstances[Log2MaxSectionAlignment + 1] = {}; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 852c509a5c77d..ba208c212d67e 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -205,6 +205,7 @@ void LinkerDriver::addFile(InputFile *file) { else cast(file)->parseLazy(); } else { + ctx.consumedInputsSize += file->mb.getBufferSize(); file->parse(); if (auto *f = dyn_cast(file)) { ctx.objFileInstances.push_back(f); diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp index 94eeae2797971..a275a68bbc3e8 100644 --- a/lld/COFF/PDB.cpp +++ b/lld/COFF/PDB.cpp @@ -44,6 +44,7 @@ #include "llvm/Object/CVDebugRecord.h" #include "llvm/Support/CRC.h" #include "llvm/Support/Endian.h" +#include "llvm/Support/FormatAdapters.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/Path.h" #include "llvm/Support/ScopedPrinter.h" @@ -1247,11 +1248,14 @@ void PDBLinker::printStats() { << std::string(80, '-') << '\n'; auto print = [&](uint64_t v, StringRef s) { - stream << format_decimal(v, 15) << " " << s << '\n'; + stream << formatv("{0}", + fmt_align(formatv("{0:N}", v), AlignStyle::Right, 20)) + << " " << s << '\n'; }; print(ctx.objFileInstances.size(), "Input OBJ files (expanded from all cmd-line inputs)"); + print(ctx.consumedInputsSize, "Size of all consumed OBJ files (non-lazy)"); print(ctx.typeServerSourceMappings.size(), "PDB type server dependencies"); print(ctx.precompSourceMappings.size(), "Precomp OBJ dependencies"); print(nbTypeRecords, "Input type records"); diff --git a/lld/test/COFF/pdb-type-server-simple.test b/lld/test/COFF/pdb-type-server-simple.test index 93d66cde4f712..7881323c05d45 100644 --- a/lld/test/COFF/pdb-type-server-simple.test +++ b/lld/test/COFF/pdb-type-server-simple.test @@ -106,17 +106,18 @@ CHECK-LABEL: Mod 0002 | `* Linker *`: SUMMARY: Summary SUMMARY-NEXT: -------------------------------------------------------------------------------- -SUMMARY-NEXT: 2 Input OBJ files (expanded from all cmd-line inputs) -SUMMARY-NEXT: 1 PDB type server dependencies -SUMMARY-NEXT: 0 Precomp OBJ dependencies -SUMMARY-NEXT: 25 Input type records -SUMMARY-NEXT: 868 Input type records bytes -SUMMARY-NEXT: 9 Merged TPI records -SUMMARY-NEXT: 16 Merged IPI records -SUMMARY-NEXT: 3 Output PDB strings -SUMMARY-NEXT: 4 Global symbol records -SUMMARY-NEXT: 14 Module symbol records -SUMMARY-NEXT: 2 Public symbol records +SUMMARY-NEXT: 2 Input OBJ files (expanded from all cmd-line inputs) +SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy) +SUMMARY-NEXT: 1 PDB type server dependencies +SUMMARY-NEXT: 0 Precomp OBJ dependencies +SUMMARY-NEXT: 25 Input type records +SUMMARY-NEXT: 868 Input type records bytes +SUMMARY-NEXT: 9 Merged TPI records +SUMMARY-NEXT: 16 Merged IPI records +SUMMARY-NEXT: 3 Output PDB strings +SUMMARY-NEXT: 4 Global symbol records +SUMMARY-NEXT: 14 Module symbol records +SUMMARY-NEXT: 2 Public symbol records SUMMARY: Top 10 types responsible for the most TPI input: SUMMARY-NEXT: index total bytes count size diff --git a/lld/test/COFF/precomp-link-samename.test b/lld/test/COFF/precomp-link-samename.test index f44abf289d867..8cd2533087f09 100644 --- a/lld/test/COFF/precomp-link-samename.test +++ b/lld/test/COFF/precomp-link-samename.test @@ -12,9 +12,10 @@ CHECK-NOT: LF_ENDPRECOMP SUMMARY: Summary SUMMARY-NEXT: -------------------------------------------------------------------------------- -SUMMARY-NEXT: 4 Input OBJ files (expanded from all cmd-line inputs) -SUMMARY-NEXT: 0 PDB type server dependencies -SUMMARY-NEXT: 2 Precomp OBJ dependencies +SUMMARY-NEXT: 4 Input OBJ files (expanded from all cmd-line inputs) +SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy) +SUMMARY-NEXT: 0 PDB type server dependencies +SUMMARY-NEXT: 2 Precomp OBJ dependencies // precompa/precomp.cpp #include "precomp.h" diff --git a/lld/test/COFF/precomp-link.test b/lld/test/COFF/precomp-link.test index ce90603d0bb87..ffe6f57c9ed46 100644 --- a/lld/test/COFF/precomp-link.test +++ b/lld/test/COFF/precomp-link.test @@ -59,17 +59,18 @@ CHECK-NOT: LF_ENDPRECOMP SUMMARY: Summary SUMMARY-NEXT: -------------------------------------------------------------------------------- -SUMMARY-NEXT: 3 Input OBJ files (expanded from all cmd-line inputs) -SUMMARY-NEXT: 0 PDB type server dependencies -SUMMARY-NEXT: 1 Precomp OBJ dependencies -SUMMARY-NEXT: 1066 Input type records -SUMMARY-NEXT: 55968 Input type records bytes -SUMMARY-NEXT: 874 Merged TPI records -SUMMARY-NEXT: 170 Merged IPI records -SUMMARY-NEXT: 5 Output PDB strings -SUMMARY-NEXT: 167 Global symbol records -SUMMARY-NEXT: 20 Module symbol records -SUMMARY-NEXT: 3 Public symbol records +SUMMARY-NEXT: 3 Input OBJ files (expanded from all cmd-line inputs) +SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy) +SUMMARY-NEXT: 0 PDB type server dependencies +SUMMARY-NEXT: 1 Precomp OBJ dependencies +SUMMARY-NEXT: 1,066 Input type records +SUMMARY-NEXT: 55,968 Input type records bytes +SUMMARY-NEXT: 874 Merged TPI records +SUMMARY-NEXT: 170 Merged IPI records +SUMMARY-NEXT: 5 Output PDB strings +SUMMARY-NEXT: 167 Global symbol records +SUMMARY-NEXT: 20 Module symbol records +SUMMARY-NEXT: 3 Public symbol records // precomp.h #pragma once diff --git a/lld/test/COFF/precomp-summary-fail.test b/lld/test/COFF/precomp-summary-fail.test index 5ebba9a1d3c74..49a7ca18afdbe 100644 --- a/lld/test/COFF/precomp-summary-fail.test +++ b/lld/test/COFF/precomp-summary-fail.test @@ -11,14 +11,15 @@ RUN: /dll /out:%t.dll /debug /summary | FileCheck %s -check-prefix SUMMARY SUMMARY: Summary SUMMARY-NEXT: -------------------------------------------------------------------------------- -SUMMARY-NEXT: 2 Input OBJ files (expanded from all cmd-line inputs) -SUMMARY-NEXT: 0 PDB type server dependencies -SUMMARY-NEXT: 1 Precomp OBJ dependencies -SUMMARY-NEXT: 8 Input type records -SUMMARY-NEXT: 232 Input type records bytes -SUMMARY-NEXT: 3 Merged TPI records -SUMMARY-NEXT: 2 Merged IPI records -SUMMARY-NEXT: 1 Output PDB strings -SUMMARY-NEXT: 0 Global symbol records -SUMMARY-NEXT: 4 Module symbol records -SUMMARY-NEXT: 0 Public symbol records +SUMMARY-NEXT: 2 Input OBJ files (expanded from all cmd-line inputs) +SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy) +SUMMARY-NEXT: 0 PDB type server dependencies +SUMMARY-NEXT: 1 Precomp OBJ dependencies +SUMMARY-NEXT: 8 Input type records +SUMMARY-NEXT: 232 Input type records bytes +SUMMARY-NEXT: 3 Merged TPI records +SUMMARY-NEXT: 2 Merged IPI records +SUMMARY-NEXT: 1 Output PDB strings +SUMMARY-NEXT: 0 Global symbol records +SUMMARY-NEXT: 4 Module symbol records +SUMMARY-NEXT: 0 Public symbol records From 4a81e5cb98af0349f02831542ae2195484c3d763 Mon Sep 17 00:00:00 2001 From: Alexandre Ganea Date: Sat, 6 Sep 2025 11:40:23 -0400 Subject: [PATCH 2/2] Clarify size is in bytes --- lld/COFF/PDB.cpp | 5 +++-- lld/test/COFF/pdb-type-server-simple.test | 4 ++-- lld/test/COFF/precomp-link-samename.test | 2 +- lld/test/COFF/precomp-link.test | 4 ++-- lld/test/COFF/precomp-summary-fail.test | 4 ++-- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp index a275a68bbc3e8..e5c62af28fdd2 100644 --- a/lld/COFF/PDB.cpp +++ b/lld/COFF/PDB.cpp @@ -1255,11 +1255,12 @@ void PDBLinker::printStats() { print(ctx.objFileInstances.size(), "Input OBJ files (expanded from all cmd-line inputs)"); - print(ctx.consumedInputsSize, "Size of all consumed OBJ files (non-lazy)"); + print(ctx.consumedInputsSize, + "Size of all consumed OBJ files (non-lazy), in bytes"); print(ctx.typeServerSourceMappings.size(), "PDB type server dependencies"); print(ctx.precompSourceMappings.size(), "Precomp OBJ dependencies"); print(nbTypeRecords, "Input type records"); - print(nbTypeRecordsBytes, "Input type records bytes"); + print(nbTypeRecordsBytes, "Size of all input type records, in bytes"); print(builder.getTpiBuilder().getRecordCount(), "Merged TPI records"); print(builder.getIpiBuilder().getRecordCount(), "Merged IPI records"); print(pdbStrTab.size(), "Output PDB strings"); diff --git a/lld/test/COFF/pdb-type-server-simple.test b/lld/test/COFF/pdb-type-server-simple.test index 7881323c05d45..5323a078ac432 100644 --- a/lld/test/COFF/pdb-type-server-simple.test +++ b/lld/test/COFF/pdb-type-server-simple.test @@ -107,11 +107,11 @@ CHECK-LABEL: Mod 0002 | `* Linker *`: SUMMARY: Summary SUMMARY-NEXT: -------------------------------------------------------------------------------- SUMMARY-NEXT: 2 Input OBJ files (expanded from all cmd-line inputs) -SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy) +SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy), in bytes SUMMARY-NEXT: 1 PDB type server dependencies SUMMARY-NEXT: 0 Precomp OBJ dependencies SUMMARY-NEXT: 25 Input type records -SUMMARY-NEXT: 868 Input type records bytes +SUMMARY-NEXT: 868 Size of all input type records, in bytes SUMMARY-NEXT: 9 Merged TPI records SUMMARY-NEXT: 16 Merged IPI records SUMMARY-NEXT: 3 Output PDB strings diff --git a/lld/test/COFF/precomp-link-samename.test b/lld/test/COFF/precomp-link-samename.test index 8cd2533087f09..c80774c5d539b 100644 --- a/lld/test/COFF/precomp-link-samename.test +++ b/lld/test/COFF/precomp-link-samename.test @@ -13,7 +13,7 @@ CHECK-NOT: LF_ENDPRECOMP SUMMARY: Summary SUMMARY-NEXT: -------------------------------------------------------------------------------- SUMMARY-NEXT: 4 Input OBJ files (expanded from all cmd-line inputs) -SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy) +SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy), in bytes SUMMARY-NEXT: 0 PDB type server dependencies SUMMARY-NEXT: 2 Precomp OBJ dependencies diff --git a/lld/test/COFF/precomp-link.test b/lld/test/COFF/precomp-link.test index ffe6f57c9ed46..1c26042a44c33 100644 --- a/lld/test/COFF/precomp-link.test +++ b/lld/test/COFF/precomp-link.test @@ -60,11 +60,11 @@ CHECK-NOT: LF_ENDPRECOMP SUMMARY: Summary SUMMARY-NEXT: -------------------------------------------------------------------------------- SUMMARY-NEXT: 3 Input OBJ files (expanded from all cmd-line inputs) -SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy) +SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy), in bytes SUMMARY-NEXT: 0 PDB type server dependencies SUMMARY-NEXT: 1 Precomp OBJ dependencies SUMMARY-NEXT: 1,066 Input type records -SUMMARY-NEXT: 55,968 Input type records bytes +SUMMARY-NEXT: 55,968 Size of all input type records, in bytes SUMMARY-NEXT: 874 Merged TPI records SUMMARY-NEXT: 170 Merged IPI records SUMMARY-NEXT: 5 Output PDB strings diff --git a/lld/test/COFF/precomp-summary-fail.test b/lld/test/COFF/precomp-summary-fail.test index 49a7ca18afdbe..0d528c76c2180 100644 --- a/lld/test/COFF/precomp-summary-fail.test +++ b/lld/test/COFF/precomp-summary-fail.test @@ -12,11 +12,11 @@ RUN: /dll /out:%t.dll /debug /summary | FileCheck %s -check-prefix SUMMARY SUMMARY: Summary SUMMARY-NEXT: -------------------------------------------------------------------------------- SUMMARY-NEXT: 2 Input OBJ files (expanded from all cmd-line inputs) -SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy) +SUMMARY-NEXT: Size of all consumed OBJ files (non-lazy), in bytes SUMMARY-NEXT: 0 PDB type server dependencies SUMMARY-NEXT: 1 Precomp OBJ dependencies SUMMARY-NEXT: 8 Input type records -SUMMARY-NEXT: 232 Input type records bytes +SUMMARY-NEXT: 232 Size of all input type records, in bytes SUMMARY-NEXT: 3 Merged TPI records SUMMARY-NEXT: 2 Merged IPI records SUMMARY-NEXT: 1 Output PDB strings