[lld] 4ae1c2c - [ELF] Delete unneeded hack for discarding empty name local symbol

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 25 11:55:35 PDT 2021


Author: Fangrui Song
Date: 2021-10-25T11:55:31-07:00
New Revision: 4ae1c2c6f1b3a0085a0fb0909005e62da156e051

URL: https://github.com/llvm/llvm-project/commit/4ae1c2c6f1b3a0085a0fb0909005e62da156e051
DIFF: https://github.com/llvm/llvm-project/commit/4ae1c2c6f1b3a0085a0fb0909005e62da156e051.diff

LOG: [ELF] Delete unneeded hack for discarding empty name local symbol

This actually improves GNU ld compatibility.
Correct assemblers don't create such symbols.

Also simplify the code.

Added: 
    

Modified: 
    lld/ELF/Writer.cpp

Removed: 
    lld/test/ELF/Inputs/discard-merge-unnamed.o
    lld/test/ELF/discard-merge-unnamed.s


################################################################################
diff  --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 3e2e9a528353e..c9b613d82547e 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -727,16 +727,11 @@ static bool shouldKeepInSymtab(const Defined &sym) {
   // * --discard-locals is used.
   // * The symbol is in a SHF_MERGE section, which is normally the reason for
   //   the assembler keeping the .L symbol.
-  StringRef name = sym.getName();
-  bool isLocal = name.startswith(".L") || name.empty();
-  if (!isLocal)
-    return true;
-
-  if (config->discard == DiscardPolicy::Locals)
+  if (sym.getName().startswith(".L") &&
+      (config->discard == DiscardPolicy::Locals ||
+       (sym.section && (sym.section->flags & SHF_MERGE))))
     return false;
-
-  SectionBase *sec = sym.section;
-  return !sec || !(sec->flags & SHF_MERGE);
+  return true;
 }
 
 static bool includeInSymtab(const Symbol &b) {

diff  --git a/lld/test/ELF/Inputs/discard-merge-unnamed.o b/lld/test/ELF/Inputs/discard-merge-unnamed.o
deleted file mode 100644
index 040addf04f4ec..0000000000000
Binary files a/lld/test/ELF/Inputs/discard-merge-unnamed.o and /dev/null 
diff er

diff  --git a/lld/test/ELF/discard-merge-unnamed.s b/lld/test/ELF/discard-merge-unnamed.s
deleted file mode 100644
index 2bd38737081b5..0000000000000
--- a/lld/test/ELF/discard-merge-unnamed.s
+++ /dev/null
@@ -1,27 +0,0 @@
-// RUN: ld.lld %p/Inputs/discard-merge-unnamed.o -o %t2 -shared
-// RUN: llvm-readobj --symbols %t2 | FileCheck %s
-
-// Test that the unnamed symbol is SHF_MERGE is omitted.
-
-// CHECK:      Symbols [
-// CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name:  (0)
-// CHECK-NEXT:     Value: 0x0
-// CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local
-// CHECK-NEXT:     Type: None
-// CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: Undefined
-// CHECK-NEXT:   }
-// CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: _DYNAMIC
-// CHECK-NEXT:     Value:
-// CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local
-// CHECK-NEXT:     Type: None
-// CHECK-NEXT:     Other [ (0x2)
-// CHECK-NEXT:       STV_HIDDEN
-// CHECK-NEXT:     ]
-// CHECK-NEXT:     Section: .dynamic
-// CHECK-NEXT:   }
-// CHECK-NEXT: ]


        


More information about the llvm-commits mailing list