[lld] 12dd8df - [PDB] Do not record PGO or coverage public symbols
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Wed May 19 12:41:36 PDT 2021
Author: Reid Kleckner
Date: 2021-05-19T12:41:31-07:00
New Revision: 12dd8df38b5da0e7bbbcc842308a251ce11800d5
URL: https://github.com/llvm/llvm-project/commit/12dd8df38b5da0e7bbbcc842308a251ce11800d5
DIFF: https://github.com/llvm/llvm-project/commit/12dd8df38b5da0e7bbbcc842308a251ce11800d5.diff
LOG: [PDB] Do not record PGO or coverage public symbols
These symbols are long, and they tend to cause the PDB file size to
overflow. They are generally not necessary when debugging problems in
user code.
This change reduces the size of chrome.dll.pdb with coverage from
6,937,108,480 bytes to 4,690,210,816 bytes.
Differential Revision: https://reviews.llvm.org/D102719
Added:
lld/test/COFF/pgo-pubs.s
Modified:
lld/COFF/PDB.cpp
Removed:
################################################################################
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp
index 6791d523da37f..cb8b27b6f485e 100644
--- a/lld/COFF/PDB.cpp
+++ b/lld/COFF/PDB.cpp
@@ -1185,8 +1185,25 @@ void PDBLinker::addPublicsToPDB() {
// Only emit external, defined, live symbols that have a chunk. Static,
// non-external symbols do not appear in the symbol table.
auto *def = dyn_cast<Defined>(s);
- if (def && def->isLive() && def->getChunk())
+ if (def && def->isLive() && def->getChunk()) {
+ // Don't emit a public symbol for coverage data symbols. LLVM code
+ // coverage (and PGO) create a __profd_ and __profc_ symbol for every
+ // function. C++ mangled names are long, and tend to dominate symbol size.
+ // Including these names triples the size of the public stream, which
+ // results in bloated PDB files. These symbols generally are not helpful
+ // for debugging, so suppress them.
+ StringRef name = def->getName();
+ if (name.data()[0] == '_' && name.data()[1] == '_') {
+ // Drop the '_' prefix for x86.
+ if (config->machine == I386)
+ name = name.drop_front(1);
+ if (name.startswith("__profd_") || name.startswith("__profc_") ||
+ name.startswith("__covrec_")) {
+ return;
+ }
+ }
publics.push_back(createPublic(def));
+ }
});
if (!publics.empty()) {
diff --git a/lld/test/COFF/pgo-pubs.s b/lld/test/COFF/pgo-pubs.s
new file mode 100644
index 0000000000000..c72ee2468f3c8
--- /dev/null
+++ b/lld/test/COFF/pgo-pubs.s
@@ -0,0 +1,71 @@
+# REQUIRES: x86
+# RUN: llvm-mc -triple=x86_64-windows-msvc -filetype=obj -o %t.obj %s
+# RUN: lld-link %t.obj -out:%t.exe -pdb:%t.pdb -debug -entry:main -subsystem:console
+# RUN: llvm-pdbutil dump -publics %t.pdb | FileCheck %s
+
+# Check that there are no __prof[dc] or __covrec public symbols.
+
+# CHECK-NOT: __profd
+# CHECK-NOT: __profc
+# CHECK-NOT: __covrec
+# CHECK: S_PUB32 {{.*}} `main`
+# CHECK-NOT: __profd
+# CHECK-NOT: __profc
+# CHECK-NOT: __covrec
+
+
+# The following assembly is simplified from this C code:
+# int main() {
+# return 0;
+# }
+
+# Compiled like so:
+# clang-cl -c pgo-pubs.c -fprofile-instr-generate -fcoverage-mapping -clang:-save-temps
+
+
+ .text
+ .intel_syntax noprefix
+ .globl main # -- Begin function main
+main: # @main
+# %bb.0: # %entry
+ xor eax, eax
+ ret
+
+ .section .lcovfun$M,"dr",discard,__covrec_DB956436E78DD5FAu
+ .globl __covrec_DB956436E78DD5FAu # @__covrec_DB956436E78DD5FAu
+ .p2align 3
+__covrec_DB956436E78DD5FAu:
+ .quad -2624081020897602054 # 0xdb956436e78dd5fa
+ .long 9 # 0x9
+ .quad 24 # 0x18
+ .quad 2164039332547799183 # 0x1e08364eb07c288f
+ .ascii "\001\001\000\001\001\b\f\002\002"
+
+ .section .lcovmap$M,"dr"
+ .p2align 3 # @__llvm_coverage_mapping
+.L__llvm_coverage_mapping:
+ .long 0 # 0x0
+ .long 40 # 0x28
+ .long 0 # 0x0
+ .long 5 # 0x5
+ .ascii "\002%\000\031C:\\src\\llvm-project\\build\npgo-pubs.i"
+
+ .section .lprfc$M,"dw"
+ .p2align 3 # @__profc_main
+__profc_main:
+ .zero 8
+
+ .section .lprfd$M,"dw"
+ .p2align 3 # @__profd_main
+__profd_main:
+ .quad -2624081020897602054 # 0xdb956436e78dd5fa
+ .quad 24 # 0x18
+ .quad __profc_main
+ .quad main
+ .quad 0
+ .long 1 # 0x1
+ .zero 4
+
+ .section .lprfn$M,"dr"
+.L__llvm_prf_nm: # @__llvm_prf_nm
+ .ascii "\004\000main"
More information about the llvm-commits
mailing list