// This addresses bug 14456. We were not writing
// out the addend to the gprel16 relocation. The
// addend is stored in the instruction immediate
// field.

// RUN: llvm-mc -mcpu=mips32r2 -triple=mipsel-pc-linux -filetype=obj -relocation-model=static %s -o - \
// RUN: | llvm-objdump -disassemble -mattr +mips32r2 - \
// RUN: | FileCheck %s
// RUN: llvm-mc -mcpu=mips32r2 -triple=mips-pc-linux -filetype=obj -relocation-model=static %s -o - \
// RUN: | llvm-objdump -disassemble -mattr +mips32r2 - \
// RUN: | FileCheck %s

	.text
	.abicalls
	.option	pic0
	.section	.mdebug.abi32,"",@progbits
	.file	"/home/espindola/llvm/llvm/test/MC/Mips/mips_gprel16.ll"
	.text
	.globl	testvar1
	.align	2
	.type	testvar1,@function
	.set	nomips16
	.ent	testvar1
testvar1:                               # @testvar1
	.frame	$sp,0,$ra
	.mask 	0x00000000,0
	.fmask	0x00000000,0
	.set	noreorder
	.set	nomacro
	.set	noat
# BB#0:                                 # %entry
// CHECK: lw ${{[0-9]+}}, 0($gp)
	lw	$1, %gp_rel(var1)($gp)
	jr	$ra
	sltu	$2, $zero, $1
	.set	at
	.set	macro
	.set	reorder
	.end	testvar1
$tmp0:
	.size	testvar1, ($tmp0)-testvar1

	.globl	testvar2
	.align	2
	.type	testvar2,@function
	.set	nomips16
	.ent	testvar2
testvar2:                               # @testvar2
	.frame	$sp,0,$ra
	.mask 	0x00000000,0
	.fmask	0x00000000,0
	.set	noreorder
	.set	nomacro
	.set	noat
# BB#0:                                 # %entry
// CHECK: lw ${{[0-9]+}}, 4($gp)
	lw	$1, %gp_rel(var2)($gp)
	jr	$ra
	sltu	$2, $zero, $1
	.set	at
	.set	macro
	.set	reorder
	.end	testvar2
$tmp1:
	.size	testvar2, ($tmp1)-testvar2

	.type	var1,@object            # @var1
	.local	var1
	.comm	var1,4,4
	.type	var2,@object            # @var2
	.local	var2
	.comm	var2,4,4

