290 lines · plain
1# REQUIRES: system-linux2# RUN: rm -rf %t && mkdir -p %t3# RUN: llvm-mc --triple=powerpc64le-unknown-linux-gnu --filetype=obj -o \4# RUN: %t/elf_reloc.o --defsym LE=1 %s5# RUN: llvm-jitlink --noexec \6# RUN: --abs external_data=0xdeadbeef \7# RUN: --abs external_func=0xcafef00d \8# RUN: --abs external_func_notoc=0x88880000 \9# RUN: --abs external_addr14_func=0x0880 \10# RUN: --abs external_addr16_data=0x6000 \11# RUN: --abs external_addr32_data=0x36668840 \12# RUN: --abs pcrel_external_var=0x36668860 \13# RUN: --abs pcrel_external_tls=0x36668880 \14# RUN: --check %s %t/elf_reloc.o15# RUN: llvm-mc --triple=powerpc64-unknown-linux-gnu --filetype=obj -o \16# RUN: %t/elf_reloc.o %s17# RUN: llvm-jitlink --noexec \18# RUN: --abs external_data=0xdeadbeef \19# RUN: --abs external_func=0xcafef00d \20# RUN: --abs external_func_notoc=0x88880000 \21# RUN: --abs external_addr14_func=0x0880 \22# RUN: --abs external_addr16_data=0x6000 \23# RUN: --abs external_addr32_data=0x36668840 \24# RUN: --abs pcrel_external_var=0x36668860 \25# RUN: --abs pcrel_external_tls=0x36668880 \26# RUN: --check %s %t/elf_reloc.o27 28# There seems to be issue with cross-build using dlsym for *host* symbols.29# Disabling for SystemZ - reloc_tlsgd_pcrel34 fails to resolve __tls_get_addr.30# UNSUPPORTED: target=s390{{.*}}31 32# jitlink-check: section_addr(elf_reloc.o, $__GOT) + 0x8000 = __TOC__33 .text34 .abiversion 235 .global external_addr32_data36 .global external_addr16_data37 .global main38 .p2align 439 .type main,@function40main:41 li 3, 042 blr43 .size main, .-main44 45# Check R_PPC64_REL16_HA and R_PPC64_REL16_LO46# jitlink-check: decode_operand(test_rel16, 2) & 0xffff = \47# jitlink-check: (((__TOC__ - test_rel16) + 0x8000) >> 16) & 0xffff48# jitlink-check: decode_operand(test_rel16 + 4, 2) & 0xffff = \49# jitlink-check: (__TOC__ - test_rel16) & 0xffff50 .global test_rel1651 .p2align 452 .type test_re16,@function53test_rel16:54 .Ltest_rel16_begin:55 addis 2, 12, .TOC.-.Ltest_rel16_begin@ha56 addi 2, 2, .TOC.-.Ltest_rel16_begin@l57 li 3, 058 blr59 .size test_rel16, .-test_rel1660 61# Check R_PPC64_ADDR64, R_PPC64_TOC16_HA and R_PPC64_TOC16_LO62# jitlink-check: *{8}(got_addr(elf_reloc.o, external_data)) = external_data63# jitlink-check: decode_operand(test_tocrel16, 2) & 0xffff = \64# jitlink-check: (((got_addr(elf_reloc.o, external_data) - __TOC__) + 0x8000) >> 16) & 0xffff65# jitlink-check: decode_operand(test_tocrel16 + 4, 1) & 0xffff = \66# jitlink-check: (got_addr(elf_reloc.o, external_data) - __TOC__) & 0xffff67 .global test_tocrel1668 .p2align 469 .type test_tocrel16,@function70test_tocrel16:71 addis 3, 2, .LC0@toc@ha72 ld 3, .LC0@toc@l(3)73 blr74 .size test_tocrel16, .-test_tocrel1675 76# Check R_PPC64_REL2477# jitlink-check: *{8}(got_addr(elf_reloc.o, external_func)) = external_func78# jitlink-check: decode_operand(test_external_call, 0) = \79# jitlink-check: (stub_addr(elf_reloc.o, external_func) - test_external_call) >> 280# Check r2 is saved.81# jitlink-check: *{4}(stub_addr(elf_reloc.o, external_func)) = 0xf841001882 .global test_external_call83 .p2align 484 .type test_external_call,@function85test_external_call:86 bl external_func87 nop88 blr89 .size test_external_call, .-test_external_call90 91# FIXME: Current implementation allows only one plt call stub for a target function,92# so we can't re-use `external_func` as target here.93# Check R_PPC64_REL24_NOTOC94# jitlink-check: *{8}(got_addr(elf_reloc.o, external_func_notoc)) = external_func_notoc95# jitlink-check: decode_operand(test_external_call_notoc, 0) = \96# jitlink-check: (stub_addr(elf_reloc.o, external_func_notoc) - test_external_call_notoc) >> 297# jitlink-check: (*{4}(stub_addr(elf_reloc.o, external_func_notoc) + 16)) & 0xffff = \98# jitlink-check: ((((got_addr(elf_reloc.o, external_func_notoc) - stub_addr(elf_reloc.o, external_func_notoc)) - 8) + 0x8000) >> 16) & 0xffff99# jitlink-check: (*{4}(stub_addr(elf_reloc.o, external_func_notoc) + 20)) & 0xffff = \100# jitlink-check: ((got_addr(elf_reloc.o, external_func_notoc) - stub_addr(elf_reloc.o, external_func_notoc)) - 8) & 0xffff101 .global test_external_call_notoc102 .p2align 4103 .type test_external_call_notoc,@function104test_external_call_notoc:105 bl external_func_notoc@notoc106 blr107 .size test_external_call_notoc, .-test_external_call_notoc108 109# Check R_PPC64_PCREL34110# jitlink-check: (section_addr(elf_reloc.o, .rodata.str1.1) - test_pcrel34)[33:0] = \111# jitlink-check: ((((*{4}(test_pcrel34)) & 0x3ffff) << 16) | ((*{4}(test_pcrel34 + 4)) & 0xffff))[33:0]112 .global test_pcrel34113 .p2align 4114 .type test_pcrel34,@function115test_pcrel34:116 paddi 3, 0, .L.str@PCREL, 1117 blr118 .size test_pcrel34, .-test_pcrel34119 120# Check R_PPC64_ADDR14121# jitlink-check: decode_operand(reloc_addr14, 2) << 2 = external_addr14_func122 .global reloc_addr14123 .p2align 4124 .type reloc_addr14,@function125reloc_addr14:126 bca 21, 30, external_addr14_func127 .size reloc_addr14, .-reloc_addr14128 129# Check R_PPC64_TOC16130# jitlink-check: decode_operand(reloc_toc16, 1) & 0xffff = \131# jitlink-check: (section_addr(elf_reloc.o, .rodata.str1.1) - __TOC__) & 0xffff132# jitlink-check: decode_operand(reloc_toc16 + 4, 1) & 0xffff = \133# jitlink-check: ((section_addr(elf_reloc.o, .rodata.str1.1) - __TOC__) >> 16) & 0xffff134# jitlink-check: decode_operand(reloc_toc16 + 8, 1) & 0xffff = \135# jitlink-check: (((section_addr(elf_reloc.o, .rodata.str1.1) - __TOC__) + 0x8000) >> 16) & 0xffff136# jitlink-check: decode_operand(reloc_toc16 + 12, 1) & 0xffff = \137# jitlink-check: (section_addr(elf_reloc.o, .rodata.str1.1) - __TOC__) & 0xffff138 .global reloc_toc16139 .p2align 4140 .type reloc_toc16,@function141reloc_toc16:142.ifdef LE143 li 3, 0144 .reloc reloc_toc16, R_PPC64_TOC16, .L.str145 li 3, 0146 .reloc reloc_toc16+4, R_PPC64_TOC16_HI, .L.str147 li 3, 0148 .reloc reloc_toc16+8, R_PPC64_TOC16_HA, .L.str149 li 3, 0150 .reloc reloc_toc16+12, R_PPC64_TOC16_DS, .L.str151.else152 li 3, 0153 .reloc reloc_toc16+2, R_PPC64_TOC16, .L.str154 li 3, 0155 .reloc reloc_toc16+6, R_PPC64_TOC16_HI, .L.str156 li 3, 0157 .reloc reloc_toc16+10, R_PPC64_TOC16_HA, .L.str158 li 3, 0159 .reloc reloc_toc16+14, R_PPC64_TOC16_DS, .L.str160.endif161 blr162 .size reloc_toc16, .-reloc_toc16163 164# Check R_PPC64_ADDR16*165# R_PPC64_ADDR16_DS166# jitlink-check: decode_operand(reloc_addr16, 1) & 0xffff = \167# jitlink-check: external_addr16_data168# R_PPC64_ADDR16_LO169# jitlink-check: decode_operand(reloc_addr16 + 4, 1) & 0xffff = \170# jitlink-check: external_addr32_data & 0xffff171# R_PPC64_ADDR16_LO_DS172# jitlink-check: decode_operand(reloc_addr16 + 8, 1) & 0xffff = \173# jitlink-check: external_addr32_data & 0xffff174# R_PPC64_ADDR16175# jitlink-check: decode_operand(reloc_addr16 + 12, 1) & 0xffff = \176# jitlink-check: external_addr16_data177# R_PPC64_ADDR16_HI178# jitlink-check: decode_operand(reloc_addr16 + 16, 1) & 0xffff = \179# jitlink-check: (external_addr32_data >> 16) & 0xffff180# R_PPC64_ADDR16_HA181# jitlink-check: decode_operand(reloc_addr16 + 20, 1) & 0xffff = \182# jitlink-check: ((external_addr32_data + 0x8000) >> 16) & 0xffff183# R_PPC64_ADDR16_HIGH184# jitlink-check: decode_operand(reloc_addr16 + 24, 1) & 0xffff = \185# jitlink-check: (external_addr32_data >> 16) & 0xffff186# R_PPC64_ADDR16_HIGHA187# jitlink-check: decode_operand(reloc_addr16 + 28, 1) & 0xffff = \188# jitlink-check: ((external_addr32_data + 0x8000) >> 16) & 0xffff189# R_PPC64_ADDR16_HIGHER190# jitlink-check: decode_operand(reloc_addr16 + 32, 1) & 0xffff = \191# jitlink-check: (external_addr32_data >> 32) & 0xffff192# R_PPC64_ADDR16_HIGHERA193# jitlink-check: decode_operand(reloc_addr16 + 36, 1) & 0xffff = \194# jitlink-check: ((external_addr32_data + 0x8000) >> 32) & 0xffff195# R_PPC64_ADDR16_HIGHEST196# jitlink-check: decode_operand(reloc_addr16 + 40, 1) & 0xffff = \197# jitlink-check: (external_addr32_data >> 48) & 0xffff198# R_PPC64_ADDR16_HIGHESTA199# jitlink-check: decode_operand(reloc_addr16 + 44, 1) & 0xffff = \200# jitlink-check: ((external_addr32_data + 0x8000) >> 48) & 0xffff201 .global reloc_addr16202 .p2align 4203 .type reloc_addr16,@function204reloc_addr16:205.ifdef LE206 li 3, 0207 .reloc reloc_addr16, R_PPC64_ADDR16_DS, external_addr16_data208 li 3, 0209 .reloc reloc_addr16+4, R_PPC64_ADDR16_LO, external_addr32_data210 li 3, 0211 .reloc reloc_addr16+8, R_PPC64_ADDR16_LO_DS, external_addr32_data212 li 3, 0213 .reloc reloc_addr16+12, R_PPC64_ADDR16, external_addr16_data214 li 3, 0215 .reloc reloc_addr16+16, R_PPC64_ADDR16_HI, external_addr32_data216.else217 li 3, 0218 .reloc reloc_addr16+2, R_PPC64_ADDR16_DS, external_addr16_data219 li 3, 0220 .reloc reloc_addr16+6, R_PPC64_ADDR16_LO, external_addr32_data221 li 3, 0222 .reloc reloc_addr16+10, R_PPC64_ADDR16_LO_DS, external_addr32_data223 li 3, 0224 .reloc reloc_addr16+14, R_PPC64_ADDR16, external_addr16_data225 li 3, 0226 .reloc reloc_addr16+18, R_PPC64_ADDR16_HI, external_addr32_data227.endif228 li 3, external_addr32_data@ha229 li 3, external_addr32_data@high230 li 3, external_addr32_data@higha231 li 3, external_addr32_data@higher232 li 3, external_addr32_data@highera233 li 3, external_addr32_data@highest234 li 3, external_addr32_data@highesta235 blr236 .size reloc_addr16, .-reloc_addr16237 238# Check R_PPC64_REL16*239# jitlink-check: decode_operand(reloc_rel16, 1) & 0xffff = \240# jitlink-check: (__TOC__ - reloc_rel16) & 0xffff241# jitlink-check: decode_operand(reloc_rel16 + 4, 1) & 0xffff = \242# jitlink-check: ((__TOC__ - reloc_rel16) >> 16) & 0xffff243 .global reloc_rel16244 .p2align 4245 .type reloc_rel16,@function246reloc_rel16:247 li 3, .TOC.-reloc_rel16248 li 3, .TOC.-reloc_rel16@h249 blr250 .size reloc_rel16, .-reloc_rel16251 252# Check R_PPC64_GOT_PCREL34253# jitlink-check: (got_addr(elf_reloc.o, pcrel_external_var) - reloc_got_pcrel34)[33:0] = \254# jitlink-check: ((((*{4}(reloc_got_pcrel34)) & 0x3ffff) << 16) | ((*{4}(reloc_got_pcrel34 + 4)) & 0xffff))[33:0]255 .global reloc_got_pcrel34256 .p2align 4257 .type reloc_got_pcrel34,@function258reloc_got_pcrel34:259 pld 3,pcrel_external_var@got@pcrel(0),1260.Lpcrel0:261 .reloc .Lpcrel0-8,R_PPC64_PCREL_OPT,.-(.Lpcrel0-8)262 blr263 .size reloc_got_pcrel34,.-reloc_got_pcrel34264 265 .global reloc_tlsgd_pcrel34266 .p2align 4267 .type reloc_tlsgd_pcrel34,@function268reloc_tlsgd_pcrel34:269 mflr 0270 std 0, 16(1)271 stdu 1, -32(1)272 paddi 3, 0, pcrel_external_tls@got@tlsgd@pcrel, 1273 bl __tls_get_addr@notoc(a@tlsgd)274 lwa 3, 0(3)275 addi 1, 1, 32276 ld 0, 16(1)277 mtlr 0278 blr279 .size reloc_tlsgd_pcrel34,.-reloc_tlsgd_pcrel34280 281 .type .L.str,@object282 .section .rodata.str1.1,"aMS",@progbits,1283.L.str:284 .asciz "Hey!"285 .size .L.str, 5286 287 .section .toc,"aw",@progbits288.LC0:289 .tc external_data[TC],external_data290