[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