forked from OSchip/llvm-project
Add a llvm::shuffle and use it in lld
With this --shuffle-sections=seed produces the same result in every host. Reviewed By: grimar, MaskRay Differential Revision: https://reviews.llvm.org/D74971
This commit is contained in:
parent
e48849a240
commit
7b44f0428a
|
@ -1218,7 +1218,7 @@ static void maybeShuffle(DenseMap<const InputSectionBase *, int> &order) {
|
|||
prio = curPrio++;
|
||||
uint32_t seed = *config->shuffleSectionSeed;
|
||||
std::mt19937 g(seed ? seed : std::random_device()());
|
||||
std::shuffle(priorities.begin(), priorities.end(), g);
|
||||
llvm::shuffle(priorities.begin(), priorities.end(), g);
|
||||
int prioIndex = 0;
|
||||
for (InputSectionBase *sec : inputSections) {
|
||||
if (order.try_emplace(sec, priorities[prioIndex]).second)
|
||||
|
|
|
@ -21,12 +21,12 @@
|
|||
# CHECK: Hex dump of section '.init_array'
|
||||
# CHECK-NEXT: 0x{{[0-9a-f]+}} ff
|
||||
# ORDERED-SAME: 000102 03040506 0708090a 0b
|
||||
# SHUFFLED-NOT: 000102 03040506 0708090a 0b
|
||||
# SHUFFLED-SAME: 04000b 06010a08 09070203 05
|
||||
|
||||
# CHECK: Hex dump of section '.fini_array'
|
||||
# CHECK-NEXT: 0x{{[0-9a-f]+}} ff
|
||||
# ORDERED-SAME: 000102 03040506 0708090a 0b
|
||||
# SHUFFLED-NOT: 000102 03040506 0708090a 0b
|
||||
# ORDERED-SAME: 000102 03040506 0708090a 0b
|
||||
# SHUFFLED-SAME: 090401 070b0003 080a0605 02
|
||||
|
||||
## With a SECTIONS command, SHT_INIT_ARRAY prirotities are ignored.
|
||||
## All .init_array* are shuffled together.
|
||||
|
@ -40,11 +40,8 @@
|
|||
|
||||
# CHECK2: Hex dump of section '.init_array'
|
||||
# ORDERED2-NEXT: 0x{{[0-9a-f]+}} 00010203 04050607 08090a0b ff
|
||||
# SHUFFLED2-NOT: 0x{{[0-9a-f]+}} 00010203 04050607 08090a0b ff
|
||||
# SHUFFLED2-NEXT: 0x{{[0-9a-f]+}} 04000b06 010a0809 07ff0203 05
|
||||
|
||||
## std::shuffle have different implementations.
|
||||
## When the number of input sections are large, it is almost guaranteed
|
||||
## to have an unordered result with --shuffle-sections=.
|
||||
.irp i,0,1,2,3,4,5,6,7,8,9,10,11
|
||||
.section .init,"ax",@progbits,unique,\i
|
||||
.byte \i
|
||||
|
|
|
@ -6,6 +6,12 @@
|
|||
# CHECK: Hex dump of section '.text':
|
||||
# CHECK-NEXT: 01020304
|
||||
|
||||
## --shuffle-sections= shuffles input sections.
|
||||
# RUN: ld.lld --shuffle-sections=1 %t.o -o %t1.out
|
||||
# RUN: llvm-readelf -x .text %t1.out | FileCheck %s --check-prefix=SHUFFLE1
|
||||
# SHUFFLE1: Hex dump of section '.text':
|
||||
# SHUFFLE1-NEXT: 0204cccc 0103
|
||||
|
||||
## Test that --shuffle-sections= can be used with --symbol-ordering-file
|
||||
# RUN: echo "foo" > %t_order.txt
|
||||
# RUN: echo "_start " >> %t_order.txt
|
||||
|
@ -13,12 +19,12 @@
|
|||
# RUN: ld.lld --symbol-ordering-file %t_order.txt --shuffle-sections=2 %t.o -o %t2.out
|
||||
# RUN: llvm-readelf -x .text %t2.out | FileCheck %s --check-prefix=SHUFFLE2
|
||||
# SHUFFLE2: Hex dump of section '.text':
|
||||
# SHUFFLE2-NEXT: 02cccccc 01{{....}}
|
||||
# SHUFFLE2-NEXT: 02cccccc 010304
|
||||
|
||||
# RUN: ld.lld --symbol-ordering-file %t_order.txt --shuffle-sections=3 %t.o -o %t3.out
|
||||
# RUN: llvm-readelf -x .text %t3.out | FileCheck %s --check-prefix=SHUFFLE3
|
||||
# SHUFFLE3: Hex dump of section '.text':
|
||||
# SHUFFLE3-NEXT: 02cccccc 01{{....}}
|
||||
# SHUFFLE3-NEXT: 02cccccc 010403
|
||||
|
||||
## .text has an alignment of 4.
|
||||
.global _start
|
||||
|
|
|
@ -1007,6 +1007,16 @@ struct are_base_of<T, U, Ts...> {
|
|||
// Extra additions for arrays
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// We have a copy here so that LLVM behaves the same when using different
|
||||
// standard libraries.
|
||||
template <class Iterator, class RNG>
|
||||
void shuffle(Iterator first, Iterator last, RNG &&g) {
|
||||
// It would be better to use a std::uniform_int_distribution,
|
||||
// but that would be stdlib dependent.
|
||||
for (auto size = last - first; size > 1; ++first, (void)--size)
|
||||
std::iter_swap(first, first + g() % size);
|
||||
}
|
||||
|
||||
/// Find the length of an array.
|
||||
template <class T, std::size_t N>
|
||||
constexpr inline size_t array_lengthof(T (&)[N]) {
|
||||
|
|
Loading…
Reference in New Issue