[lld] [llvm] [lld][COFF] Remove duplicate strtab entries (PR #141197)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 12 20:23:55 PDT 2025
================
@@ -138,13 +138,41 @@ void StringTableBuilder::finalizeInOrder() {
void StringTableBuilder::finalizeStringTable(bool Optimize) {
Finalized = true;
- if (Optimize) {
+ if (Optimize && StringIndexMap.size()) {
std::vector<StringPair *> Strings;
Strings.reserve(StringIndexMap.size());
for (StringPair &P : StringIndexMap)
Strings.push_back(&P);
- multikeySort(Strings, 0);
+ auto getStringPriority = [this](const CachedHashStringRef Str) -> uint8_t {
+ if (StringPriorityMap.contains(Str))
+ return StringPriorityMap[Str];
+ return 0;
+ };
+
+ size_t RangeBegin = 0;
+ MutableArrayRef<StringPair *> StringsRef(Strings);
+ if (StringPriorityMap.size()) {
+ llvm::sort(Strings,
+ [&](const StringPair *LHS, const StringPair *RHS) -> bool {
+ return getStringPriority(LHS->first) >
+ getStringPriority(RHS->first);
+ });
+ // Make sure ArrayRef is valid. Although std::sort implementaion is
+ // normally in-place , it is not guaranteed by standard.
+ StringsRef = Strings;
----------------
MaskRay wrote:
Seems unnecessary. std::sort will sort the elements within the range. If `StringRef` applies to the whole range, it will not be invalidated even if std::sort requires external storage (internally).
https://github.com/llvm/llvm-project/pull/141197
More information about the llvm-commits
mailing list