Loading lld/ELF/Writer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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) Loading lld/test/ELF/shuffle-sections-init-fini.s +4 −7 Original line number Diff line number Diff line Loading @@ -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 # SHUFFLED-SAME: 090401 070b0003 080a0605 02 ## With a SECTIONS command, SHT_INIT_ARRAY prirotities are ignored. ## All .init_array* are shuffled together. Loading @@ -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 Loading lld/test/ELF/shuffle-sections.s +8 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading llvm/include/llvm/ADT/STLExtras.h +10 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
lld/ELF/Writer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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) Loading
lld/test/ELF/shuffle-sections-init-fini.s +4 −7 Original line number Diff line number Diff line Loading @@ -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 # SHUFFLED-SAME: 090401 070b0003 080a0605 02 ## With a SECTIONS command, SHT_INIT_ARRAY prirotities are ignored. ## All .init_array* are shuffled together. Loading @@ -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 Loading
lld/test/ELF/shuffle-sections.s +8 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading
llvm/include/llvm/ADT/STLExtras.h +10 −0 Original line number Diff line number Diff line Loading @@ -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