1# RUN: rm -rf %t && mkdir -p %t 2# RUN: llvm-mc -triple=mips64el-unknown-linux -filetype=obj -o %t/test_ELF_Mips64N64.o %s 3# RUN: llc -mtriple=mips64el-unknown-linux -filetype=obj -o %t/test_ELF_ExternalFunction_Mips64N64.o %S/Inputs/ExternalFunction.ll 4# RUN: llvm-rtdyld -triple=mips64el-unknown-linux -verify -map-section test_ELF_Mips64N64.o,.text=0x1000 -map-section test_ELF_ExternalFunction_Mips64N64.o,.text=0x10000 -check=%s %t/test_ELF_Mips64N64.o %t/test_ELF_ExternalFunction_Mips64N64.o 5 6# RUN: llvm-mc -triple=mips64-unknown-linux -filetype=obj -o %t/test_ELF_Mips64N64.o %s 7# RUN: llc -mtriple=mips64-unknown-linux -filetype=obj -o %t/test_ELF_ExternalFunction_Mips64N64.o %S/Inputs/ExternalFunction.ll 8# RUN: llvm-rtdyld -triple=mips64-unknown-linux -verify -map-section test_ELF_Mips64N64.o,.text=0x1000 -map-section test_ELF_ExternalFunction_Mips64N64.o,.text=0x10000 -check=%s %t/test_ELF_Mips64N64.o %t/test_ELF_ExternalFunction_Mips64N64.o 9 10 .data 11# Test R_MIPS_PC32 relocation. 12# rtdyld-check: *{4}(R_MIPS_PC32) = (foo - R_MIPS_PC32)[31:0] 13R_MIPS_PC32: 14 .word foo-. 15# rtdyld-check: *{4}(R_MIPS_PC32 + 4) = (foo - tmp1)[31:0] 16tmp1: 17 .4byte foo-tmp1 18 19 .text 20 .abicalls 21 .section .mdebug.abi64,"",@progbits 22 .nan legacy 23 .file "ELF_Mips64N64_PIC_relocations.ll" 24 .text 25 .globl bar 26 .align 3 27 .type bar,@function 28 .set nomicromips 29 .set nomips16 30 .ent bar 31bar: 32 .frame $fp,40,$ra 33 .mask 0x00000000,0 34 .fmask 0x00000000,0 35 .set noreorder 36 .set nomacro 37 .set noat 38 daddiu $sp, $sp, -40 39 sd $ra, 32($sp) 40 sd $fp, 24($sp) 41 move $fp, $sp 42 sd $4, 16($fp) 43 lb $2, 0($4) 44 sd $4, 8($fp) 45 46# Test R_MIPS_26 relocation. 47# rtdyld-check: decode_operand(insn1, 0)[27:0] = stub_addr(test_ELF_Mips64N64.o/.text, foo)[27:0] 48insn1: 49 .option pic0 50 jal foo 51 .option pic2 52 nop 53 54# Test R_MIPS_PC16 relocation. 55# rtdyld-check: decode_operand(insn2, 1)[17:0] = (foo - insn2)[17:0] 56insn2: 57 bal foo 58 nop 59 60 move $sp, $fp 61 ld $ra, 32($sp) 62 ld $fp, 24($sp) 63 daddiu $sp, $sp, 32 64 jr $ra 65 nop 66 .set at 67 .set macro 68 .set reorder 69 .end bar 70$func_end0: 71 .size bar, ($func_end0)-bar 72 73 .globl main 74 .align 3 75 .type main,@function 76 .set nomicromips 77 .set nomips16 78 .ent main 79main: 80 .frame $fp,32,$ra 81 .mask 0x00000000,0 82 .fmask 0x00000000,0 83 .set noreorder 84 .set nomacro 85 .set noat 86 daddiu $sp, $sp, -32 87 sd $ra, 24($sp) 88 sd $fp, 16($sp) 89 sd $gp, 8($sp) 90 move $fp, $sp 91 92# Check upper 16-bits of offset between the address of main function 93# and the global offset table. 94# rtdyld-check: decode_operand(insn3, 1)[15:0] = ((section_addr(test_ELF_Mips64N64.o, .got) + 0x7ff0) - main + 0x8000)[31:16] 95insn3: 96 lui $1, %hi(%neg(%gp_rel(main))) 97 daddu $1, $1, $25 98 99# Check lower 16-bits of offset between the address of main function 100# and the global offset table. 101# rtdyld-check: decode_operand(insn4, 2)[15:0] = ((section_addr(test_ELF_Mips64N64.o, .got) + 0x7ff0) - main)[15:0] 102insn4: 103 daddiu $1, $1, %lo(%neg(%gp_rel(main))) 104 sw $zero, 4($fp) 105 106# $gp register contains address of the .got section + 0x7FF0. 0x7FF0 is 107# the offset of $gp from the beginning of the .got section. Check that we are 108# loading address of the page pointer from correct offset. In this case 109# the page pointer is the first entry in the .got section, so offset will be 110# 0 - 0x7FF0. 111# rtdyld-check: decode_operand(insn5, 2)[15:0] = 0x8010 112# 113# Check that the global offset table contains the page pointer. 114# rtdyld-check: *{8}(section_addr(test_ELF_Mips64N64.o, .got)) = (_str + 0x8000) & 0xffffffffffff0000 115insn5: 116 ld $25, %got_page(_str)($1) 117 118# Check the offset of _str from the page pointer. 119# rtdyld-check: decode_operand(insn6, 2)[15:0] = _str[15:0] 120insn6: 121 daddiu $25, $25, %got_ofst(_str) 122 123# Check that we are loading address of var from correct offset. In this case 124# var is the second entry in the .got section, so offset will be 8 - 0x7FF0. 125# rtdyld-check: decode_operand(insn7, 2)[15:0] = 0x8018 126# 127# Check that the global offset table contains the address of the var. 128# rtdyld-check: *{8}(section_addr(test_ELF_Mips64N64.o, .got) + 8) = var 129insn7: 130 ld $2, %got_disp(var)($1) 131 sd $25, 0($2) 132 133# Check that we are loading address of bar from correct offset. In this case 134# bar is the third entry in the .got section, so offset will be 16 - 0x7FF0. 135# rtdyld-check: decode_operand(insn8, 2)[15:0] = 0x8020 136# 137# Check that the global offset table contains the address of the bar. 138# rtdyld-check: *{8}(section_addr(test_ELF_Mips64N64.o, .got) + 16) = bar 139insn8: 140 ld $2, %call16(bar)($1) 141 142 move $4, $25 143 move $gp, $1 144 move $25, $2 145 jalr $25 146 nop 147 move $sp, $fp 148 ld $gp, 8($sp) 149 ld $fp, 16($sp) 150 ld $ra, 24($sp) 151 daddiu $sp, $sp, 32 152 jr $ra 153 nop 154 .set at 155 .set macro 156 .set reorder 157 .end main 158$func_end1: 159 .size main, ($func_end1)-main 160 161 .type _str,@object 162 .section .rodata.str1.1,"aMS",@progbits,1 163_str: 164 .asciz "test" 165 .size _str, 5 166 167 .type var,@object 168 .comm var,8,8 169 170 .section ".note.GNU-stack","",@progbits 171 .text 172