[lld] aed0a08 - [lld/mac] Make symbol table order deterministic

Nico Weber via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 29 06:30:02 PDT 2021


Author: Nico Weber
Date: 2021-06-29T09:29:49-04:00
New Revision: aed0a08c69cfb274a1e005e3bd9865ac15c2dfb7

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

LOG: [lld/mac] Make symbol table order deterministic

SymtabSection::emitStabs() writes the symbol table in the order
of externalSymbols, which has the order of symtab->getSymbols(),
which is just the order symbols are added to the symbol table.

In practice, symbols in the symbol files of input .o files are
sorted, but since that's not guaranteed we sort them in
ObjFile::parseSymbols(). To make sure several symbols with the same
address keep the order they're in the input file, we have to use
stable_sort().

In practice, std::sort() on already-sorted inputs won't change the order
of just adjacent elements, and while in theory std::sort() could use a
random pivot, in practice the code should be deterministic as it was
previously too.

But now lld/test/MachO/stabs.s passes with LLVM_ENABLE_EXPENSIVE_CHECKS=ON
(the last test that was failing with that set).

Fixes a regression from D99972.

While here, remove an empty section in stabs.s and move
.subsections_via_symbols to the end where it usually is (this part no
behavior change).

Differential Revision: https://reviews.llvm.org/D105071

Added: 
    

Modified: 
    lld/MachO/InputFiles.cpp
    lld/test/MachO/stabs.s

Removed: 
    


################################################################################
diff  --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp
index 4025a4c55ab1..f75c65f9370d 100644
--- a/lld/MachO/InputFiles.cpp
+++ b/lld/MachO/InputFiles.cpp
@@ -601,7 +601,7 @@ void ObjFile::parseSymbols(ArrayRef<typename LP::section> sectionHeaders,
       continue;
 
     std::vector<uint32_t> &symbolIndices = symbolsBySection[i];
-    llvm::sort(symbolIndices, [&](uint32_t lhs, uint32_t rhs) {
+    llvm::stable_sort(symbolIndices, [&](uint32_t lhs, uint32_t rhs) {
       return nList[lhs].n_value < nList[rhs].n_value;
     });
     uint64_t sectionAddr = sectionHeaders[i].addr;

diff  --git a/lld/test/MachO/stabs.s b/lld/test/MachO/stabs.s
index f6c529774de6..bafd6e2c6a9c 100644
--- a/lld/test/MachO/stabs.s
+++ b/lld/test/MachO/stabs.s
@@ -191,14 +191,14 @@ Ldebug_info_start0:
   .long  Lset3
   .byte  0                       ## End Of Children Mark
 Ldebug_info_end0:
-.subsections_via_symbols
-.section  __DWARF,__debug_line,regular,debug
 
 .section OTHER,more_text,regular,pure_instructions
 .globl _fun
 _fun:
   ret
 
+.subsections_via_symbols
+
 #--- foo.s
 .text
 .globl  _foo
@@ -240,13 +240,13 @@ Ldebug_info_start0:
   .long  Lset3
   .byte  0                       ## End Of Children Mark
 Ldebug_info_end0:
-.subsections_via_symbols
-.section  __DWARF,__debug_line,regular,debug
 
 .section  __DWARF,__debug_aranges,regular,debug
 ltmp1:
   .byte 0
 
+.subsections_via_symbols
+
 #--- no-debug.s
 ## This file has no debug info.
 .text


        


More information about the llvm-commits mailing list