1# REQUIRES: hexagon 2# RUN: llvm-mc -mno-fixup -filetype=obj -triple=hexagon-unknown-elf %s -o %t.o 3# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf %S/Inputs/hexagon-shared.s -o %t2.o 4# RUN: ld.lld -shared %t2.o -soname so -o %t3.so 5# RUN: ld.lld -shared %t.o %t3.so -o %t4.so 6# RUN: ld.lld -Bsymbolic -shared %t.o %t3.so -o %t5.so 7# RUN: llvm-objdump -d -j .plt %t4.so | FileCheck --check-prefix=PLT %s 8# RUN: llvm-objdump -d -j .text %t4.so | FileCheck --check-prefix=TEXT %s 9# RUN: llvm-objdump -D -j .got %t4.so | FileCheck --check-prefix=GOT %s 10# RUN: llvm-readelf -r %t4.so | FileCheck --check-prefix=RELO %s 11# RUN: llvm-readelf -r %t5.so | FileCheck --check-prefix=SYMBOLIC %s 12 13.global _start, foo, hidden_symbol 14.hidden hidden_symbol 15_start: 16# When -Bsymbolic is specified calls to locally resolvables should 17# not generate a plt. 18call ##foo 19# Calls to hidden_symbols should not trigger a plt. 20call ##hidden_symbol 21 22# _HEX_32_PCREL 23.word _DYNAMIC - . 24call ##bar 25 26# R_HEX_PLT_B22_PCREL 27call bar@PLT 28# R_HEX_B15_PCREL_X 29if (p0) jump bar 30# R_HEX_B9_PCREL_X 31{ r0 = #0; jump bar } 32 33# R_HEX_GOT_11_X and R_HEX_GOT_32_6_X 34r2=add(pc,##_GLOBAL_OFFSET_TABLE_@PCREL) 35r0 = memw (r2+##bar@GOT) 36jumpr r0 37 38# R_HEX_GOT_16_X 39r0 = add(r1,##bar@GOT) 40 41# R_HEX_GOT_16_X, duplex 42{ r0 = add(r0,##bar@GOT) 43 memw(r0) = r2 } 44 45 46# foo is local so no plt will be generated 47foo: 48 jumpr lr 49 50hidden_symbol: 51 jumpr lr 52 53# R_HEX_32 54.data 55.global var 56.type var,@object 57.p2align 2 58var: 59 .word 10 60 .size var, 4 61.global pvar 62.type pvar,@object 63pvar: 64 .word var 65 .size pvar, 4 66 67 68# PLT: { immext(#131264 69# PLT-NEXT: r28 = add(pc,##131268) } 70# PLT-NEXT: { r14 -= add(r28,#16) 71# PLT-NEXT: r15 = memw(r28+#8) 72# PLT-NEXT: r28 = memw(r28+#4) } 73# PLT-NEXT: { r14 = asr(r14,#2) 74# PLT-NEXT: jumpr r28 } 75# PLT-NEXT: { trap0(#219) } 76# PLT-NEXT: immext(#131200) 77# PLT-NEXT: r14 = add(pc,##131252) } 78# PLT-NEXT: r28 = memw(r14+#0) } 79# PLT-NEXT: jumpr r28 } 80 81# TEXT: 8c 00 01 00 0001008c 82# TEXT: { call 0x102d0 } 83# TEXT: if (p0) jump:nt 0x102d0 84# TEXT: r0 = #0 ; jump 0x102d0 85# TEXT: r0 = add(r1,##-65548) 86# TEXT: r0 = add(r0,##-65548); memw(r0+#0) = r2 } 87 88# GOT: .got: 89# GOT: 00 00 00 00 00000000 <unknown> 90 91# RELO: R_HEX_GLOB_DAT 92# RELO: R_HEX_32 93# RELO: Relocation section '.rela.plt' at offset 0x22c contains 2 entries: 94# RELO: R_HEX_JMP_SLOT {{.*}} foo 95# RELO-NEXT: R_HEX_JMP_SLOT {{.*}} bar 96# RELO-NOT: R_HEX_JMP_SLOT {{.*}} hidden 97 98# Make sure that no PLT is generated for a local call. 99# SYMBOLIC: Relocation section '.rela.plt' at offset 0x22c contains 1 entries: 100# SYMBOLIC: R_HEX_JMP_SLOT {{.*}} bar 101# SYMBOLIC-NOT: R_HEX_JMP_SLOT {{.*}} foo 102