[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