[lld] [LLD][COFF] Display the size of all consumed inputs with `/summary` (PR #157279)
Alexandre Ganea via llvm-commits
llvm-commits at lists.llvm.org
Sat Sep 6 08:40:41 PDT 2025
https://github.com/aganea updated https://github.com/llvm/llvm-project/pull/157279
>From 188edc2e1ae6734c1e2e257b7bb3ddd52c8158a7 Mon Sep 17 00:00:00 2001
From: Alexandre Ganea <aganea at havenstudios.com>
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<ObjFile *> objFileInstances;
std::map<std::string, PDBInputFile *> pdbInputFileInstances;
std::vector<ImportFile *> 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<ObjFile>(file)->parseLazy();
} else {
+ ctx.consumedInputsSize += file->mb.getBufferSize();
file->parse();
if (auto *f = dyn_cast<ObjFile>(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 <aganea at havenstudios.com>
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
More information about the llvm-commits
mailing list