[lld] [lld-macho] Parallelize ObjFile::sourceFile() during STABS emission. (PR #222087)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 8 10:56:51 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld-macho
@llvm/pr-subscribers-lld
Author: Liza Burakova (liza371)
<details>
<summary>Changes</summary>
This is part of the ld64.lld performance improvements tracked by #<!-- -->222068
Currently, SymtabSection::emitStabs() calls emitBeginSourceStab() it passes in file->sourceFile(), which will call
ObjFile::sourceFile(). This method reads the component's root DIE, which is a bottleneck when done serially as at this stage the DWARF sections have not been parsed yet.
This commit parallelizes the calls to ObjFile::sourceFile(), as we already have the file ids stable sorted.
AI tool use: this is one of the commits that was prototyped by AI. I rewrote this commit and ran the benchmarking myself.
**Benchmarks for mac_debug_component_sym_2**
Benchmark 1: Apple ld
Time (mean ± σ): 2.244 s ± 0.025 s [User: 9.294 s, System: 8.530 s]
Range (min … max): 2.204 s … 2.300 s 20 runs
Benchmark 2: LLD Baseline
Time (mean ± σ): 8.411 s ± 0.721 s [User: 7.080 s, System: 2.718 s]
Range (min … max): 7.821 s … 11.171 s 20 runs
Benchmark 3: LLD Optimized
Time (mean ± σ): 8.082 s ± 0.283 s [User: 7.597 s, System: 2.677 s]
Range (min … max): 7.617 s … 8.664 s 20 runs
**Benchmarks for mac_rel_component_sym_2**
Benchmark 1: Apple ld
Time (mean ± σ): 1.195 s ± 0.006 s [User: 2.621 s, System: 12.442 s]
Range (min … max): 1.186 s … 1.209 s 20 runs
Benchmark 2: LLD Baseline
Time (mean ± σ): 2.528 s ± 0.023 s [User: 1.971 s, System: 1.533 s]
Range (min … max): 2.489 s … 2.575 s 20 runs
Benchmark 3: LLD Optimized
Time (mean ± σ): 2.239 s ± 0.033 s [User: 2.356 s, System: 1.650 s]
Range (min … max): 2.190 s … 2.345 s 20 runs
We did not see notable improvements for Chromium release builds with symbol level 0 or 1, which is not super surprising as this change is targeting debug symbols.
---
Full diff: https://github.com/llvm/llvm-project/pull/222087.diff
1 Files Affected:
- (modified) lld/MachO/SyntheticSections.cpp (+14-2)
``````````diff
diff --git a/lld/MachO/SyntheticSections.cpp b/lld/MachO/SyntheticSections.cpp
index c4277d54edd38..a179f7edd10c0 100644
--- a/lld/MachO/SyntheticSections.cpp
+++ b/lld/MachO/SyntheticSections.cpp
@@ -1239,7 +1239,6 @@ void SymtabSection::emitStabs() {
if (auto *defined = dyn_cast<Defined>(sym)) {
// Excluded symbols should have been filtered out in finalizeContents().
assert(defined->includeInSymtab);
-
if (defined->isAbsolute())
continue;
@@ -1263,10 +1262,22 @@ void SymtabSection::emitStabs() {
llvm::stable_sort(symbolsNeedingStabs, llvm::less_second());
+ std::vector<ObjFile *> stabFiles;
+ for (const SortingPair &pair : symbolsNeedingStabs) {
+ ObjFile* file = cast<ObjFile>(pair.first->originalIsec->getFile());
+ if (stabFiles.empty() || stabFiles.back() != file)
+ stabFiles.push_back(file);
+ }
+ std::vector<std::string> stabSourceFiles(stabFiles.size());
+ parallelFor(0, stabFiles.size(), [&](size_t i) {
+ stabSourceFiles[i] = stabFiles[i]->sourceFile();
+ });
+
// Emit STABS symbols so that dsymutil and/or the debugger can map address
// regions in the final binary to the source and object files from which they
// originated.
InputFile *lastFile = nullptr;
+ size_t stabFileIdx = 0;
for (SortingPair &pair : symbolsNeedingStabs) {
Defined *defined = pair.first;
// When emitting STABS entries for a symbol, always use the original
@@ -1282,7 +1293,8 @@ void SymtabSection::emitStabs() {
emitEndSourceStab();
lastFile = file;
- emitBeginSourceStab(file->sourceFile());
+ assert(stabFiles[stabFileIdx] == file);
+ emitBeginSourceStab(stabSourceFiles[stabFileIdx++]);
emitObjectFileStab(file);
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/222087
More information about the llvm-commits
mailing list