RISC-V: Support assembler modifier %got_pcrel_hi.

gas/
	* config/tc-riscv.c: Support the modifier %got_pcrel_hi.
	* doc/c-riscv.texi: Add documentation.
	* testsuite/gas/riscv/no-relax-reloc.d: Add test case for the new
	modifier %got_pcrel_hi.
	* testsuite/gas/riscv/no-relax-reloc.s: Likewise.
	* testsuite/gas/riscv/relax-reloc.d: Likewise.
	* testsuite/gas/riscv/relax-reloc.s: Likewise.
This commit is contained in:
Nelson Chu
2020-03-03 21:08:05 -08:00
committed by Jim Wilson
parent de48783e2f
commit dee35d026c
7 changed files with 45 additions and 7 deletions

@ -1,5 +1,14 @@
2020-03-04 Nelson Chu <nelson.chu@sifive.com> 2020-03-04 Nelson Chu <nelson.chu@sifive.com>
* config/tc-riscv.c (percent_op_utype): Support the modifier
%got_pcrel_hi.
* doc/c-riscv.texi: Add documentation.
* testsuite/gas/riscv/no-relax-reloc.d: Add test case for the new
modifier %got_pcrel_hi.
* testsuite/gas/riscv/no-relax-reloc.s: Likewise.
* testsuite/gas/riscv/relax-reloc.d: Likewise.
* testsuite/gas/riscv/relax-reloc.s: Likewise.
* doc/c-riscv.texi (relocation modifiers): Add documentation. * doc/c-riscv.texi (relocation modifiers): Add documentation.
(RISC-V-Formats): Update the section name from "Instruction Formats" (RISC-V-Formats): Update the section name from "Instruction Formats"
to "RISC-V Instruction Formats". to "RISC-V Instruction Formats".

@ -1308,6 +1308,7 @@ static const struct percent_op_match percent_op_utype[] =
{ {
{"%tprel_hi", BFD_RELOC_RISCV_TPREL_HI20}, {"%tprel_hi", BFD_RELOC_RISCV_TPREL_HI20},
{"%pcrel_hi", BFD_RELOC_RISCV_PCREL_HI20}, {"%pcrel_hi", BFD_RELOC_RISCV_PCREL_HI20},
{"%got_pcrel_hi", BFD_RELOC_RISCV_GOT_HI20},
{"%tls_ie_pcrel_hi", BFD_RELOC_RISCV_TLS_GOT_HI20}, {"%tls_ie_pcrel_hi", BFD_RELOC_RISCV_TLS_GOT_HI20},
{"%tls_gd_pcrel_hi", BFD_RELOC_RISCV_TLS_GD_HI20}, {"%tls_gd_pcrel_hi", BFD_RELOC_RISCV_TLS_GD_HI20},
{"%hi", BFD_RELOC_RISCV_HI20}, {"%hi", BFD_RELOC_RISCV_HI20},

@ -257,6 +257,23 @@ Or you can use the pseudo lla/lw/sw/... instruction to do this.
lla a0, @var{symbol} lla a0, @var{symbol}
@end smallexample @end smallexample
@item %got_pcrel_hi(@var{symbol})
The high 20 bits of relative address between pc and the GOT entry of
@var{symbol}. This is usually used with the %pcrel_lo modifier to access
the GOT entry.
@smallexample
@var{label}:
auipc a0, %got_pcrel_hi(@var{symbol}) // R_RISCV_GOT_HI20
addi a0, a0, %pcrel_lo(@var{label}) // R_RISCV_PCREL_LO12_I
@var{label}:
auipc a0, %got_pcrel_hi(@var{symbol}) // R_RISCV_GOT_HI20
load/store a0, %pcrel_lo(@var{label})(a0) // R_RISCV_PCREL_LO12_I/S
@end smallexample
Also, the pseudo la instruction with PIC has similar behavior.
@item %tprel_add(@var{symbol}) @item %tprel_add(@var{symbol})
This is used purely to associate the R_RISCV_TPREL_ADD relocation for This is used purely to associate the R_RISCV_TPREL_ADD relocation for
TLS relaxation. This one is only valid as the fourth operand to the normally TLS relaxation. This one is only valid as the fourth operand to the normally

@ -9,4 +9,6 @@ RELOCATION RECORDS FOR .*
0+4 R_RISCV_LO12_I.* 0+4 R_RISCV_LO12_I.*
0+8 R_RISCV_PCREL_HI20.* 0+8 R_RISCV_PCREL_HI20.*
0+c R_RISCV_PCREL_LO12_I.* 0+c R_RISCV_PCREL_LO12_I.*
0+10 R_RISCV_CALL.* 0+10 R_RISCV_GOT_HI20.*
0+14 R_RISCV_PCREL_LO12_I.*
0+18 R_RISCV_CALL.*

@ -2,7 +2,10 @@ target:
lui a5,%hi(target) lui a5,%hi(target)
lw a5,%lo(target)(a5) lw a5,%lo(target)(a5)
.LA0: auipc a5,%pcrel_hi(bar) .LA0: auipc a5,%pcrel_hi(symbol1)
lw a0,%pcrel_lo(.LA0)(a5) lw a0,%pcrel_lo(.LA0)(a5)
.LA1: auipc a5,%got_pcrel_hi(symbol2)
lw a0,%pcrel_lo(.LA1)(a5)
call target call target

@ -13,5 +13,8 @@ RELOCATION RECORDS FOR .*
0+8 R_RISCV_RELAX.* 0+8 R_RISCV_RELAX.*
0+c R_RISCV_PCREL_LO12_I.* 0+c R_RISCV_PCREL_LO12_I.*
0+c R_RISCV_RELAX.* 0+c R_RISCV_RELAX.*
0+10 R_RISCV_CALL.* 0+10 R_RISCV_GOT_HI20.*
0+10 R_RISCV_RELAX.* 0+14 R_RISCV_PCREL_LO12_I.*
0+14 R_RISCV_RELAX.*
0+18 R_RISCV_CALL.*
0+18 R_RISCV_RELAX.*

@ -2,7 +2,10 @@ target:
lui a5,%hi(target) lui a5,%hi(target)
lw a5,%lo(target)(a5) lw a5,%lo(target)(a5)
.LA0: auipc a5,%pcrel_hi(bar) .LA0: auipc a5,%pcrel_hi(symbol1)
lw a0,%pcrel_lo(.LA0)(a5) lw a0,%pcrel_lo(.LA0)(a5)
.LA1: auipc a5,%got_pcrel_hi(symbol2)
lw a0,%pcrel_lo(.LA1)(a5)
call target call target