llvm-project/lld/test/ELF/arm-symbol-ordering-file.s
YongKang Zhu 2324c2e3c3 [LLD] Two tweaks to symbol ordering scheme
When `--symbol-ordering-file` is specified, the linker today will always put
hot contributions in the middle of cold ones when targeting RISC machine, so
to minimize the chances that branch thunks need be generated for hot code
calling into cold code. This is not necessary when user specifies an ordering
of read-only data (vs. function) symbols, or when output section is small such
that no branch thunk would ever be required. The latter is common for mobile
apps. For example, among all the native ARM64 libraries in Facebook Instagram
App for Android, 80% of them have text section smaller than 64KB and the
largest text section seen is less than 8MB, well below the distance that a
BRANCH26 can reach.

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D128382
2022-07-12 11:34:17 -07:00

72 lines
1.6 KiB
ArmAsm

# REQUIRES: arm
# RUN: split-file %s %t
# RUN: llvm-mc -filetype=obj -triple=armv7-unknown-linux %t/small.s -o %t.small.o
# RUN: llvm-mc -filetype=obj -triple=armv7-unknown-linux %t/large.s -o %t.large.o
# RUN: llvm-objcopy --set-section-flags .bar=alloc,readonly %t.large.o %t.large.RO.o
# RUN: echo ordered > %t_order.txt
# RUN: ld.lld --symbol-ordering-file %t_order.txt %t.small.o -o %t2.small.out
# RUN: ld.lld --symbol-ordering-file %t_order.txt %t.large.o -o %t2.large.out
# RUN: ld.lld --symbol-ordering-file %t_order.txt %t.large.RO.o -o %t2.large.RO.out
# RUN: llvm-nm -n %t2.small.out | FileCheck --check-prefix=SMALL %s
# RUN: llvm-nm -n %t2.large.out | FileCheck --check-prefix=LARGE %s
# RUN: llvm-nm -n %t2.large.RO.out | FileCheck --check-prefix=SMALL %s
# RUN: rm -f %t.*.o %t2.*.out
# SMALL: ordered
# SMALL-NEXT: unordered1
# SMALL-NEXT: unordered2
# SMALL-NEXT: unordered3
# SMALL-NEXT: unordered4
# LARGE: unordered1
# LARGE-NEXT: unordered2
# LARGE-NEXT: ordered
# LARGE-NEXT: unordered3
# LARGE-NEXT: unordered4
#--- small.s
.section .foo,"ax",%progbits,unique,1
unordered1:
.zero 1
.section .foo,"ax",%progbits,unique,2
unordered2:
.zero 1
.section .foo,"ax",%progbits,unique,3
unordered3:
.zero 2
.section .foo,"ax",%progbits,unique,4
unordered4:
.zero 4
.section .foo,"ax",%progbits,unique,5
ordered:
.zero 1
#--- large.s
.section .bar,"ax",%progbits,unique,1
unordered1:
.zero 0xC00000
.section .bar,"ax",%progbits,unique,2
unordered2:
.zero 0xC00000
.section .bar,"ax",%progbits,unique,3
unordered3:
.zero 0xC00000
.section .bar,"ax",%progbits,unique,4
unordered4:
.zero 0xC00000
.section .bar,"ax",%progbits,unique,5
ordered:
.zero 8