[PATCH v2 2/2] RISC-V: Support assembler modifier %got_pcrel_hi.

Fangrui Song i@maskray.me
Sun Mar 8 05:46:48 GMT 2020


Is "assembler operator" more conventional than "assembler modifier"?

On 2020-03-03, Nelson Chu wrote:
>	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.
>---
> gas/config/tc-riscv.c                    |  1 +
> gas/doc/c-riscv.texi                     | 17 +++++++++++++++++
> gas/testsuite/gas/riscv/no-relax-reloc.d |  4 +++-
> gas/testsuite/gas/riscv/no-relax-reloc.s |  7 +++++--
> gas/testsuite/gas/riscv/relax-reloc.d    |  7 +++++--
> gas/testsuite/gas/riscv/relax-reloc.s    |  7 +++++--
> 6 files changed, 36 insertions(+), 7 deletions(-)
>
>diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
>index ddd4d14..168561e 100644
>--- a/gas/config/tc-riscv.c
>+++ b/gas/config/tc-riscv.c
>@@ -1308,6 +1308,7 @@ static const struct percent_op_match percent_op_utype[] =
> {
>   {"%tprel_hi", BFD_RELOC_RISCV_TPREL_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_gd_pcrel_hi", BFD_RELOC_RISCV_TLS_GD_HI20},
>   {"%hi", BFD_RELOC_RISCV_HI20},
>diff --git a/gas/doc/c-riscv.texi b/gas/doc/c-riscv.texi
>index 6e932dc..488cf56 100644
>--- a/gas/doc/c-riscv.texi
>+++ b/gas/doc/c-riscv.texi
>@@ -257,6 +257,23 @@ Or you can use the pseudo lla/lw/sw/... instruction to do this.
> 	lla  a0, @var{symbol}
> @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})
> 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
>diff --git a/gas/testsuite/gas/riscv/no-relax-reloc.d b/gas/testsuite/gas/riscv/no-relax-reloc.d
>index 62f28e0..c2ca1aa 100644
>--- a/gas/testsuite/gas/riscv/no-relax-reloc.d
>+++ b/gas/testsuite/gas/riscv/no-relax-reloc.d
>@@ -9,4 +9,6 @@ RELOCATION RECORDS FOR .*
> 0+4 R_RISCV_LO12_I.*
> 0+8 R_RISCV_PCREL_HI20.*
> 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.*
>diff --git a/gas/testsuite/gas/riscv/no-relax-reloc.s b/gas/testsuite/gas/riscv/no-relax-reloc.s
>index 7f1a484..2aab995 100644
>--- a/gas/testsuite/gas/riscv/no-relax-reloc.s
>+++ b/gas/testsuite/gas/riscv/no-relax-reloc.s
>@@ -2,7 +2,10 @@ target:
> 	lui	a5,%hi(target)
> 	lw	a5,%lo(target)(a5)
>
>-        .LA0: auipc     a5,%pcrel_hi(bar)
>-        lw      a0,%pcrel_lo(.LA0)(a5)
>+	.LA0: auipc     a5,%pcrel_hi(symbol1)
>+	lw      a0,%pcrel_lo(.LA0)(a5)
>+
>+	.LA1: auipc     a5,%got_pcrel_hi(symbol2)
>+	lw      a0,%pcrel_lo(.LA1)(a5)
>
> 	call target
>diff --git a/gas/testsuite/gas/riscv/relax-reloc.d b/gas/testsuite/gas/riscv/relax-reloc.d
>index f5f592c..623218e 100644
>--- a/gas/testsuite/gas/riscv/relax-reloc.d
>+++ b/gas/testsuite/gas/riscv/relax-reloc.d
>@@ -13,5 +13,8 @@ RELOCATION RECORDS FOR .*
> 0+8 R_RISCV_RELAX.*
> 0+c R_RISCV_PCREL_LO12_I.*
> 0+c R_RISCV_RELAX.*
>-0+10 R_RISCV_CALL.*
>-0+10 R_RISCV_RELAX.*
>+0+10 R_RISCV_GOT_HI20.*
>+0+14 R_RISCV_PCREL_LO12_I.*
>+0+14 R_RISCV_RELAX.*
>+0+18 R_RISCV_CALL.*
>+0+18 R_RISCV_RELAX.*
>diff --git a/gas/testsuite/gas/riscv/relax-reloc.s b/gas/testsuite/gas/riscv/relax-reloc.s
>index 7f1a484..2aab995 100644
>--- a/gas/testsuite/gas/riscv/relax-reloc.s
>+++ b/gas/testsuite/gas/riscv/relax-reloc.s
>@@ -2,7 +2,10 @@ target:
> 	lui	a5,%hi(target)
> 	lw	a5,%lo(target)(a5)
>
>-        .LA0: auipc     a5,%pcrel_hi(bar)
>-        lw      a0,%pcrel_lo(.LA0)(a5)
>+	.LA0: auipc     a5,%pcrel_hi(symbol1)
>+	lw      a0,%pcrel_lo(.LA0)(a5)
>+
>+	.LA1: auipc     a5,%got_pcrel_hi(symbol2)
>+	lw      a0,%pcrel_lo(.LA1)(a5)
>
> 	call target



More information about the Binutils mailing list