Home | History | Annotate | Download | only in Mips
      1 # RUN: rm -rf %t && mkdir -p %t
      2 # RUN: llvm-mc -triple=mips64el-unknown-linux -target-abi n32 -filetype=obj -o %t/test_ELF_N32.o %s
      3 # RUN: llc -mtriple=mips64el-unknown-linux -target-abi n32 -filetype=obj -o %t/test_ELF_ExternalFunction_N32.o %S/Inputs/ExternalFunction.ll
      4 # RUN: llvm-rtdyld -triple=mips64el-unknown-linux -verify -map-section test_ELF_N32.o,.text=0x1000 -map-section test_ELF_ExternalFunction_N32.o,.text=0x10000 -check=%s %t/test_ELF_N32.o %t/test_ELF_ExternalFunction_N32.o
      5 
      6 # RUN: llvm-mc -triple=mips64-unknown-linux -target-abi n32 -filetype=obj -o %t/test_ELF_N32.o %s
      7 # RUN: llc -mtriple=mips64-unknown-linux -target-abi n32 -filetype=obj -o %t/test_ELF_ExternalFunction_N32.o %S/Inputs/ExternalFunction.ll
      8 # RUN: llvm-rtdyld -triple=mips64-unknown-linux -verify -map-section test_ELF_N32.o,.text=0x1000 -map-section test_ELF_ExternalFunction_N32.o,.text=0x10000 -check=%s %t/test_ELF_N32.o %t/test_ELF_ExternalFunction_N32.o
      9 
     10 	.data
     11 # Test R_MIPS_PC32 relocation.
     12 # rtdyld-check: *{4}(R_MIPS_PC32) = (foo - R_MIPS_PC32)[31:0]
     13 R_MIPS_PC32:
     14 	.word foo-.
     15 # rtdyld-check: *{4}(R_MIPS_PC32 + 4) = (foo - tmp1)[31:0]
     16 tmp1:
     17 	.4byte foo-tmp1
     18 
     19 	.text
     20 	.abicalls
     21 	.section	.mdebug.abi64,"",@progbits
     22 	.nan	legacy
     23 	.file	"ELF_N32_PIC_relocations.ll"
     24 	.text
     25 	.globl	bar
     26 	.align	3
     27 	.type	bar,@function
     28 	.set	nomicromips
     29 	.set	nomips16
     30 	.ent	bar
     31 bar:
     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_N32.o, .text, foo)[27:0]
     48 insn1:
     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]
     56 insn2:
     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
     79 main:
     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 # $gp register contains address of the .got section + 0x7FF0. 0x7FF0 is
     93 # the offset of $gp from the beginning of the .got section. Check that we are
     94 # loading address of the page pointer from correct offset. In this case
     95 # the page pointer is the first entry in the .got section, so offset will be
     96 # 0 - 0x7FF0.
     97 # rtdyld-check:  decode_operand(insn5, 2)[15:0] = 0x8010
     98 #
     99 # Check that the global offset table contains the page pointer.
    100 # rtdyld-check: *{4}(section_addr(test_ELF_N32.o, .got)) = (_str + 0x8000) & 0xffff0000
    101 insn5:
    102 	ld	$25, %got_page(_str)($1)
    103 
    104 # Check the offset of _str from the page pointer.
    105 # rtdyld-check:  decode_operand(insn6, 2)[15:0] = _str[15:0]
    106 insn6:
    107 	daddiu	$25, $25, %got_ofst(_str)
    108 
    109 # Check that we are loading address of var from correct offset. In this case
    110 # var is the second entry in the .got section, so offset will be 4 - 0x7FF0.
    111 # rtdyld-check:  decode_operand(insn7, 2)[15:0] = 0x8014
    112 #
    113 # Check that the global offset table contains the address of the var.
    114 # rtdyld-check: *{4}(section_addr(test_ELF_N32.o, .got) + 4) = var
    115 insn7:
    116 	ld	$2, %got_disp(var)($1)
    117 	sd	$25, 0($2)
    118 
    119 # Check that we are loading address of bar from correct offset. In this case
    120 # bar is the third entry in the .got section, so offset will be 8 - 0x7FF0.
    121 # rtdyld-check:  decode_operand(insn8, 2)[15:0] = 0x8018
    122 #
    123 # Check that the global offset table contains the address of the bar.
    124 # rtdyld-check: *{4}(section_addr(test_ELF_N32.o, .got) + 8) = bar
    125 insn8:
    126 	ld	$2, %call16(bar)($1)
    127 
    128 	move	 $4, $25
    129 	move	 $gp, $1
    130 	move	 $25, $2
    131 	jalr	$25
    132 	nop
    133 	move	 $sp, $fp
    134 	ld	$gp, 8($sp)
    135 	ld	$fp, 16($sp)
    136 	ld	$ra, 24($sp)
    137 	daddiu	$sp, $sp, 32
    138 	jr	$ra
    139 	nop
    140 	.set	at
    141 	.set	macro
    142 	.set	reorder
    143 	.end	main
    144 $func_end1:
    145 	.size	main, ($func_end1)-main
    146 
    147 	.type	_str,@object
    148 	.section	.rodata.str1.1,"aMS",@progbits,1
    149 _str:
    150 	.asciz	"test"
    151 	.size	_str, 5
    152 
    153 	.type	var,@object
    154 	.comm	var,8,8
    155 
    156 	.section	".note.GNU-stack","",@progbits
    157 	.text
    158