164 lines · plain
1# RUN: rm -rf %t && mkdir -p %t2# RUN: llvm-mc --triple=loongarch64 --filetype=obj -o %t/elf_reloc.o %s3# RUN: llvm-jitlink --noexec \4# RUN: --abs external_data=0xdeadbeef \5# RUN: --abs external_func=0xcafef00d \6# RUN: --check %s %t/elf_reloc.o7 .text8 9 .globl main10 .p2align 211 .type main,@function12main:13 ret14 15 .size main, .-main16 17## Check R_LARCH_B26 relocation of a local function call.18 19# jitlink-check: decode_operand(local_func_call26, 0)[27:0] = \20# jitlink-check: (local_func - local_func_call26)[27:0]21# jitlink-check: decode_operand(local_func_jump26, 0)[27:0] = \22# jitlink-check: (local_func - local_func_jump26)[27:0]23 .globl local_func24 .p2align 225 .type local_func,@function26local_func:27 ret28 .size local_func, .-local_func29 30 .globl local_func_call2631 .p2align 232local_func_call26:33 bl local_func34 .size local_func_call26, .-local_func_call2635 36 .globl local_func_jump2637 .p2align 238local_func_jump26:39 b local_func40 .size local_func_jump26, .-local_func_jump2641 42## Check R_LARCH_PCALA_HI20 / R_LARCH_PCALA_LO12 relocation of a local symbol.43 44# jitlink-check: decode_operand(test_pcalau12i_pcrel, 1)[19:0] = \45# jitlink-check: (named_data - test_pcalau12i_pcrel)[31:12] + \46# jitlink-check: named_data[11:11]47# jitlink-check: decode_operand(test_addi_pcrel_lo12, 2)[11:0] = \48# jitlink-check: (named_data)[11:0]49 .globl test_pcalau12i_pcrel50 .p2align 251test_pcalau12i_pcrel:52 pcalau12i $a0, %pc_hi20(named_data)53 .size test_pcalau12i_pcrel, .-test_pcalau12i_pcrel54 55 .globl test_addi_pcrel_lo1256 .p2align 257test_addi_pcrel_lo12:58 addi.d $a0, $a0, %pc_lo12(named_data)59 .size test_addi_pcrel_lo12, .-test_addi_pcrel_lo1260 61## Check that calls/jumps to external functions trigger the generation of stubs62## and GOT entries.63 64# jitlink-check: *{8}(got_addr(elf_reloc.o, external_func)) = external_func65# jitlink-check: decode_operand(test_external_call, 0) = \66# jitlink-check: (stub_addr(elf_reloc.o, external_func) - \67# jitlink-check: test_external_call)[27:0]68# jitlink-check: decode_operand(test_external_jump, 0) = \69# jitlink-check: (stub_addr(elf_reloc.o, external_func) - \70# jitlink-check: test_external_jump)[27:0]71# jitlink-check: decode_operand(test_external_call36, 1)[19:0] = \72# jitlink-check: (stub_addr(elf_reloc.o, external_func) - \73# jitlink-check: test_external_call36 + (1<<17))[37:18]74# jitlink-check: decode_operand(test_external_call36 + 4, 2)[17:0] = \75# jitlink-check: (stub_addr(elf_reloc.o, external_func) - \76# jitlink-check: test_external_call36)[17:0]77 .globl test_external_call78 .p2align 279test_external_call:80 bl external_func81 .size test_external_call, .-test_external_call82 83 .globl test_external_jump84 .p2align 285test_external_jump:86 b external_func87 .size test_external_jump, .-test_external_jump88 89 .globl test_external_call3690 .p2align 291test_external_call36:92 pcaddu18i $ra, %call36(external_func)93 jirl $ra, $ra, 094 .size test_external_call36, .-test_external_call3695 96## Check R_LARCH_GOT_PC_HI20 / R_LARCH_GOT_PC_LO12 handling with a reference to97## an external symbol. Validate both the reference to the GOT entry, and also98## the content of the GOT entry.99 100# jitlink-check: *{8}(got_addr(elf_reloc.o, external_data)) = external_data101# jitlink-check: decode_operand(test_gotpage_external, 1)[19:0] = \102# jitlink-check: (got_addr(elf_reloc.o, external_data)[31:12] - \103# jitlink-check: test_gotpage_external[31:12] + \104# jitlink-check: got_addr(elf_reloc.o, external_data)[11:11])[19:0]105# jitlink-check: decode_operand(test_gotoffset12_external, 2)[11:0] = \106# jitlink-check: got_addr(elf_reloc.o, external_data)[11:0]107 .globl test_gotpage_external108 .p2align 2109test_gotpage_external:110 pcalau12i $a0, %got_pc_hi20(external_data)111 .size test_gotpage_external, .-test_gotpage_external112 113 .globl test_gotoffset12_external114 .p2align 2115test_gotoffset12_external:116 ld.d $a0, $a0, %got_pc_lo12(external_data)117 .size test_gotoffset12_external, .-test_gotoffset12_external118 119## Check R_LARCH_CALL36 relocation of a local function call.120 121# jitlink-check: decode_operand(local_func_call36, 1)[19:0] = \122# jitlink-check: ((local_func - local_func_call36) + (1<<17))[37:18]123# jitlink-check: decode_operand(local_func_call36 + 4, 2)[17:0] = \124# jitlink-check: (local_func - local_func_call36)[17:0]125 .globl local_func_call36126 .p2align 2127local_func_call36:128 pcaddu18i $ra, %call36(local_func)129 jirl $ra, $ra, 0130 .size local_func_call36, .-local_func_call36131 132## Check R_LARCH_B16 relocation for compare and branch instructions.133 134# jitlink-check: decode_operand(test_br16, 2)[17:0] = \135# jitlink-check: (test_br16_target - test_br16)[17:0]136 .globl test_br16, test_br16_target137 .p2align 2138test_br16:139 beq $t1, $t2, %b16(test_br16_target)140 .skip (1 << 16)141test_br16_target:142 .size test_br16, .-test_br16143 144## Check R_LARCH_B21 relocation for compare and branch instructions.145 146# jitlink-check: decode_operand(test_br21, 1)[22:0] = \147# jitlink-check: (test_br21_target - test_br21)[22:0]148 .globl test_br21, test_br21_target149 .p2align 2150test_br21:151 beqz $t1, %b21(test_br21_target)152 .skip (1 << 21)153test_br21_target:154 .size test_br21, .-test_br21155 156 157 .globl named_data158 .p2align 4159 .type named_data,@object160named_data:161 .quad 0x2222222222222222162 .quad 0x3333333333333333163 .size named_data, .-named_data164