172 lines
4.8 KiB
ArmAsm
172 lines
4.8 KiB
ArmAsm
|
# RUN: rm -rf %t && mkdir -p %t
|
||
|
# RUN: llvm-mc -triple=mips64el-unknown-linux -filetype=obj -o %t/test_ELF_Mips64N64.o %s
|
||
|
# RUN: llc -mtriple=mips64el-unknown-linux -filetype=obj -o %t/test_ELF_ExternalFunction_Mips64N64.o %S/Inputs/ExternalFunction.ll
|
||
|
# 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
|
||
|
|
||
|
# RUN: llvm-mc -triple=mips64-unknown-linux -filetype=obj -o %t/test_ELF_Mips64N64.o %s
|
||
|
# RUN: llc -mtriple=mips64-unknown-linux -filetype=obj -o %t/test_ELF_ExternalFunction_Mips64N64.o %S/Inputs/ExternalFunction.ll
|
||
|
# 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
|
||
|
|
||
|
.data
|
||
|
# Test R_MIPS_PC32 relocation.
|
||
|
# rtdyld-check: *{4}(R_MIPS_PC32) = (foo - R_MIPS_PC32)[31:0]
|
||
|
R_MIPS_PC32:
|
||
|
.word foo-.
|
||
|
# rtdyld-check: *{4}(R_MIPS_PC32 + 4) = (foo - tmp1)[31:0]
|
||
|
tmp1:
|
||
|
.4byte foo-tmp1
|
||
|
|
||
|
.text
|
||
|
.abicalls
|
||
|
.section .mdebug.abi64,"",@progbits
|
||
|
.nan legacy
|
||
|
.file "ELF_Mips64N64_PIC_relocations.ll"
|
||
|
.text
|
||
|
.globl bar
|
||
|
.align 3
|
||
|
.type bar,@function
|
||
|
.set nomicromips
|
||
|
.set nomips16
|
||
|
.ent bar
|
||
|
bar:
|
||
|
.frame $fp,40,$ra
|
||
|
.mask 0x00000000,0
|
||
|
.fmask 0x00000000,0
|
||
|
.set noreorder
|
||
|
.set nomacro
|
||
|
.set noat
|
||
|
daddiu $sp, $sp, -40
|
||
|
sd $ra, 32($sp)
|
||
|
sd $fp, 24($sp)
|
||
|
move $fp, $sp
|
||
|
sd $4, 16($fp)
|
||
|
lb $2, 0($4)
|
||
|
sd $4, 8($fp)
|
||
|
|
||
|
# Test R_MIPS_26 relocation.
|
||
|
# rtdyld-check: decode_operand(insn1, 0)[27:0] = stub_addr(test_ELF_Mips64N64.o/.text, foo)[27:0]
|
||
|
insn1:
|
||
|
.option pic0
|
||
|
jal foo
|
||
|
.option pic2
|
||
|
nop
|
||
|
|
||
|
# Test R_MIPS_PC16 relocation.
|
||
|
# rtdyld-check: decode_operand(insn2, 1)[17:0] = (foo - insn2)[17:0]
|
||
|
insn2:
|
||
|
bal foo
|
||
|
nop
|
||
|
|
||
|
move $sp, $fp
|
||
|
ld $ra, 32($sp)
|
||
|
ld $fp, 24($sp)
|
||
|
daddiu $sp, $sp, 32
|
||
|
jr $ra
|
||
|
nop
|
||
|
.set at
|
||
|
.set macro
|
||
|
.set reorder
|
||
|
.end bar
|
||
|
$func_end0:
|
||
|
.size bar, ($func_end0)-bar
|
||
|
|
||
|
.globl main
|
||
|
.align 3
|
||
|
.type main,@function
|
||
|
.set nomicromips
|
||
|
.set nomips16
|
||
|
.ent main
|
||
|
main:
|
||
|
.frame $fp,32,$ra
|
||
|
.mask 0x00000000,0
|
||
|
.fmask 0x00000000,0
|
||
|
.set noreorder
|
||
|
.set nomacro
|
||
|
.set noat
|
||
|
daddiu $sp, $sp, -32
|
||
|
sd $ra, 24($sp)
|
||
|
sd $fp, 16($sp)
|
||
|
sd $gp, 8($sp)
|
||
|
move $fp, $sp
|
||
|
|
||
|
# Check upper 16-bits of offset between the address of main function
|
||
|
# and the global offset table.
|
||
|
# rtdyld-check: decode_operand(insn3, 1)[15:0] = ((section_addr(test_ELF_Mips64N64.o, .got) + 0x7ff0) - main + 0x8000)[31:16]
|
||
|
insn3:
|
||
|
lui $1, %hi(%neg(%gp_rel(main)))
|
||
|
daddu $1, $1, $25
|
||
|
|
||
|
# Check lower 16-bits of offset between the address of main function
|
||
|
# and the global offset table.
|
||
|
# rtdyld-check: decode_operand(insn4, 2)[15:0] = ((section_addr(test_ELF_Mips64N64.o, .got) + 0x7ff0) - main)[15:0]
|
||
|
insn4:
|
||
|
daddiu $1, $1, %lo(%neg(%gp_rel(main)))
|
||
|
sw $zero, 4($fp)
|
||
|
|
||
|
# $gp register contains address of the .got section + 0x7FF0. 0x7FF0 is
|
||
|
# the offset of $gp from the beginning of the .got section. Check that we are
|
||
|
# loading address of the page pointer from correct offset. In this case
|
||
|
# the page pointer is the first entry in the .got section, so offset will be
|
||
|
# 0 - 0x7FF0.
|
||
|
# rtdyld-check: decode_operand(insn5, 2)[15:0] = 0x8010
|
||
|
#
|
||
|
# Check that the global offset table contains the page pointer.
|
||
|
# rtdyld-check: *{8}(section_addr(test_ELF_Mips64N64.o, .got)) = (_str + 0x8000) & 0xffffffffffff0000
|
||
|
insn5:
|
||
|
ld $25, %got_page(_str)($1)
|
||
|
|
||
|
# Check the offset of _str from the page pointer.
|
||
|
# rtdyld-check: decode_operand(insn6, 2)[15:0] = _str[15:0]
|
||
|
insn6:
|
||
|
daddiu $25, $25, %got_ofst(_str)
|
||
|
|
||
|
# Check that we are loading address of var from correct offset. In this case
|
||
|
# var is the second entry in the .got section, so offset will be 8 - 0x7FF0.
|
||
|
# rtdyld-check: decode_operand(insn7, 2)[15:0] = 0x8018
|
||
|
#
|
||
|
# Check that the global offset table contains the address of the var.
|
||
|
# rtdyld-check: *{8}(section_addr(test_ELF_Mips64N64.o, .got) + 8) = var
|
||
|
insn7:
|
||
|
ld $2, %got_disp(var)($1)
|
||
|
sd $25, 0($2)
|
||
|
|
||
|
# Check that we are loading address of bar from correct offset. In this case
|
||
|
# bar is the third entry in the .got section, so offset will be 16 - 0x7FF0.
|
||
|
# rtdyld-check: decode_operand(insn8, 2)[15:0] = 0x8020
|
||
|
#
|
||
|
# Check that the global offset table contains the address of the bar.
|
||
|
# rtdyld-check: *{8}(section_addr(test_ELF_Mips64N64.o, .got) + 16) = bar
|
||
|
insn8:
|
||
|
ld $2, %call16(bar)($1)
|
||
|
|
||
|
move $4, $25
|
||
|
move $gp, $1
|
||
|
move $25, $2
|
||
|
jalr $25
|
||
|
nop
|
||
|
move $sp, $fp
|
||
|
ld $gp, 8($sp)
|
||
|
ld $fp, 16($sp)
|
||
|
ld $ra, 24($sp)
|
||
|
daddiu $sp, $sp, 32
|
||
|
jr $ra
|
||
|
nop
|
||
|
.set at
|
||
|
.set macro
|
||
|
.set reorder
|
||
|
.end main
|
||
|
$func_end1:
|
||
|
.size main, ($func_end1)-main
|
||
|
|
||
|
.type _str,@object
|
||
|
.section .rodata.str1.1,"aMS",@progbits,1
|
||
|
_str:
|
||
|
.asciz "test"
|
||
|
.size _str, 5
|
||
|
|
||
|
.type var,@object
|
||
|
.comm var,8,8
|
||
|
|
||
|
.section ".note.GNU-stack","",@progbits
|
||
|
.text
|