[lld] [lld][COFF] Remove duplicate strtab entries (PR #141197)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 22 21:42:53 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld-coff
Author: Haohai Wen (HaohaiWen)
<details>
<summary>Changes</summary>
String table size is too big for large binary when symbol table is
enabled. Some strings in strtab is same so it can be reused.
---
Full diff: https://github.com/llvm/llvm-project/pull/141197.diff
1 Files Affected:
- (modified) lld/COFF/Writer.cpp (+8-4)
``````````diff
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index db6133e20a037..6ec83a5f77e5a 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -285,6 +285,7 @@ class Writer {
std::unique_ptr<FileOutputBuffer> &buffer;
std::map<PartialSectionKey, PartialSection *> partialSections;
std::vector<char> strtab;
+ StringMap<size_t> strtabMap;
std::vector<llvm::object::coff_symbol16> outputSymtab;
std::vector<ECCodeMapEntry> codeMap;
IdataContents idata;
@@ -1439,10 +1440,13 @@ void Writer::assignOutputSectionIndices() {
size_t Writer::addEntryToStringTable(StringRef str) {
assert(str.size() > COFF::NameSize);
- size_t offsetOfEntry = strtab.size() + 4; // +4 for the size field
- strtab.insert(strtab.end(), str.begin(), str.end());
- strtab.push_back('\0');
- return offsetOfEntry;
+ size_t newOffsetOfEntry = strtab.size() + 4; // +4 for the size field
+ auto res = strtabMap.try_emplace(str, newOffsetOfEntry);
+ if (res.second) {
+ strtab.insert(strtab.end(), str.begin(), str.end());
+ strtab.push_back('\0');
+ }
+ return res.first->getValue();
}
std::optional<coff_symbol16> Writer::createSymbol(Defined *def) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/141197
More information about the llvm-commits
mailing list