aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj
diff options
context:
space:
mode:
authorMeng Zhuo <mengzhuo1203@gmail.com>2024-09-12 20:03:59 +0800
committerMeng Zhuo <mengzhuo@iscas.ac.cn>2025-02-13 19:04:13 -0800
commit371ee1469cf30ecdbc8d1b55cf307a310ff3d630 (patch)
tree79810d3af5613304c5260d7d140930a6ae7b625b /src/cmd/internal/obj
parent5ff7a634e19a3e8e8a24bbdb948de19695234943 (diff)
downloadgo-371ee1469cf30ecdbc8d1b55cf307a310ff3d630.tar.xz
cmd/link,cmd/internal: add R_GOT_PCREL_ITYPE_RELOC for riscv64
This CL adds new relocation type for riscv64: R_GOT_PCREL_ITYPE_RELOC which generate an AUIPC + I-type pair with relocation type of GOT_HI20 and PCREL_LO12_I. According to RISCV elf psabi doc, medium position independent code model, the GNU as example is: ``` # Calculate address of non-local symbol .Ltmp3: aupipc a0, %got_pcrel_hi(symbol) ld a0, %pcrel_lo(.Ltmp3)(a0) ``` Change-Id: I719dd05e009ca2d9291f0689b346c059f9c56918 Reviewed-on: https://go-review.googlesource.com/c/go/+/612635 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Joel Sing <joel@sing.id.au> Reviewed-by: Cherry Mui <cherryyz@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/cmd/internal/obj')
-rw-r--r--src/cmd/internal/obj/riscv/cpu.go5
-rw-r--r--src/cmd/internal/obj/riscv/obj.go9
2 files changed, 13 insertions, 1 deletions
diff --git a/src/cmd/internal/obj/riscv/cpu.go b/src/cmd/internal/obj/riscv/cpu.go
index 69a8516696..2b75ed38a6 100644
--- a/src/cmd/internal/obj/riscv/cpu.go
+++ b/src/cmd/internal/obj/riscv/cpu.go
@@ -317,6 +317,11 @@ const (
// it is the first instruction in an AUIPC + S-type pair that needs a
// R_RISCV_PCREL_STYPE relocation.
NEED_PCREL_STYPE_RELOC
+
+ // NEED_GOT_PCREL_ITYPE_RELOC is set on AUIPC instructions to indicate that
+ // it is the first instruction in an AUIPC + I-type pair that needs a
+ // R_RISCV_GOT_PCREL_ITYPE relocation.
+ NEED_GOT_PCREL_ITYPE_RELOC
)
// RISC-V mnemonics, as defined in the "opcodes" and "opcodes-pseudo" files
diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go
index 381dc08560..54c34af2f4 100644
--- a/src/cmd/internal/obj/riscv/obj.go
+++ b/src/cmd/internal/obj/riscv/obj.go
@@ -215,11 +215,15 @@ func markRelocs(p *obj.Prog) {
switch p.From.Name {
case obj.NAME_EXTERN, obj.NAME_STATIC:
p.Mark |= NEED_PCREL_ITYPE_RELOC
+ case obj.NAME_GOTREF:
+ p.Mark |= NEED_GOT_PCREL_ITYPE_RELOC
}
case p.From.Type == obj.TYPE_MEM && p.To.Type == obj.TYPE_REG:
switch p.From.Name {
case obj.NAME_EXTERN, obj.NAME_STATIC:
p.Mark |= NEED_PCREL_ITYPE_RELOC
+ case obj.NAME_GOTREF:
+ p.Mark |= NEED_GOT_PCREL_ITYPE_RELOC
}
case p.From.Type == obj.TYPE_REG && p.To.Type == obj.TYPE_MEM:
switch p.To.Name {
@@ -2203,7 +2207,7 @@ func instructionsForMOV(p *obj.Prog) []*instruction {
// MOV c(Rs), Rd -> L $c, Rs, Rd
inss = instructionsForLoad(p, movToLoad(p.As), addrToReg(p.From))
- case obj.NAME_EXTERN, obj.NAME_STATIC:
+ case obj.NAME_EXTERN, obj.NAME_STATIC, obj.NAME_GOTREF:
if p.From.Sym.Type == objabi.STLSBSS {
return instructionsForTLSLoad(p)
}
@@ -2631,6 +2635,9 @@ func assemble(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
} else if p.Mark&NEED_PCREL_STYPE_RELOC == NEED_PCREL_STYPE_RELOC {
rt = objabi.R_RISCV_PCREL_STYPE
addr = &p.To
+ } else if p.Mark&NEED_GOT_PCREL_ITYPE_RELOC == NEED_GOT_PCREL_ITYPE_RELOC {
+ rt = objabi.R_RISCV_GOT_PCREL_ITYPE
+ addr = &p.From
} else {
break
}