brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · b4d6826 Raw
101 lines · plain
1## Check that BOLT symbolizer properly handles loads from GOT, including2## instruction sequences changed/relaxed by the linker.3 4# RUN: split-file %s %t5 6# RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown %t/main.s \7# RUN:   -o %t/main.o8# RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown %t/near.s \9# RUN:   -o %t/near.o10# RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown %t/far.s \11# RUN:   -o %t/far.o12# RUN: %clang %cflags %t/main.o %t/near.o %t/far.o -o %t/main.exe -Wl,-q -static13# RUN: llvm-bolt %t/main.exe -o %t/main.bolt --keep-nops --print-disasm \14# RUN:   --print-only=_start | FileCheck %s15 16#--- main.s17 18	.text19	.globl _start20	.p2align        221	.type _start, @function22# CHECK-LABEL: _start23_start:24 25## Function address load relaxable into nop+adr.26# CHECK: 			nop27# CHECK-NEXT: adr x0, near28	adrp    x0, :got:near29	ldr     x0, [x0, :got_lo12:near]30 31## Function address load relaxable into adrp+add.32# CHECK-NEXT: adrp x1, far33# CHECK-NEXT: add  x1, x1, :lo12:far34	adrp    x1, :got:far35	ldr     x1, [x1, :got_lo12:far]36 37## Non-relaxable due to the instruction in-between.38# CHECK-NEXT: adrp x2, __BOLT_got_zero39# CHECK-NEXT: nop40# CHECK-NEXT: ldr  x2, [x2, :lo12:__BOLT_got_zero{{.*}}]41	adrp    x2, :got:near42	nop43	ldr     x2, [x2, :got_lo12:near]44 45## Load data object with local visibility. Relaxable into adrp+add.46# CHECK-NEXT: adrp x3, "local_far_data/1"47# CHECK-NEXT: add  x3, x3, :lo12:"local_far_data/1"48  adrp    x3, :got:local_far_data49  ldr     x3, [x3, :got_lo12:local_far_data]50 51## Global data reference relaxable into adrp+add.52# CHECK-NEXT: adrp x4, far_data53# CHECK-NEXT: add  x4, x4, :lo12:far_data54  adrp    x4, :got:far_data55  ldr     x4, [x4, :got_lo12:far_data]56 57	ret58	.size _start, .-_start59 60.weak near61.weak far62.weak far_data63 64## Data object separated by more than 1MB from _start.65  .data66  .type local_far_data, @object67local_far_data:68  .xword 069.size   local_far_data, .-local_far_data70 71#--- near.s72 73	.text74	.globl near75	.type near, @function76near:77  ret78.size   near, .-near79 80#--- far.s81 82  .text83 84## Insert 1MB of empty space to make objects after it unreachable by adr85## instructions in _start.86  .space 0x10000087 88	.globl far89	.type far, @function90far:91  ret92.size   far, .-far93 94  .data95  .globl far_data96  .type far_data, @object97far_data:98  .xword 099.size   far_data, .-far_data100 101