From cdc95607940b2acb66cb184dec08d4cc8a469042 Mon Sep 17 00:00:00 2001 From: Meng Zhuo Date: Thu, 12 Sep 2024 20:15:56 +0800 Subject: all: implement plugin build mode for riscv64 Change-Id: I8d7bbeebbf4a46f2fd8d630b1edbaf79b8ffccc5 Reviewed-on: https://go-review.googlesource.com/c/go/+/420114 Reviewed-by: Dmitri Shuralyov Reviewed-by: Michael Knyszek Reviewed-by: Joel Sing TryBot-Bypass: Joel Sing --- src/cmd/link/internal/riscv64/asm.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'src/cmd/link') diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index 8e5d5be41e..527f09e17c 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -20,7 +20,26 @@ import ( // fakeLabelName matches the RISCV_FAKE_LABEL_NAME from binutils. const fakeLabelName = ".L0 " -func gentext(ctxt *ld.Link, ldr *loader.Loader) {} +func gentext(ctxt *ld.Link, ldr *loader.Loader) { + initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) + if initfunc == nil { + return + } + + // Emit the following function: + // + // go.link.addmoduledatainit: + // auipc a0, %pcrel_hi(local.moduledata) + // addi a0, %pcrel_lo(local.moduledata) + // j runtime.addmoduledata + + sz := initfunc.AddSymRef(ctxt.Arch, ctxt.Moduledata, 0, objabi.R_RISCV_PCREL_ITYPE, 8) + initfunc.SetUint32(ctxt.Arch, sz-8, 0x00000517) // auipc a0, %pcrel_hi(local.moduledata) + initfunc.SetUint32(ctxt.Arch, sz-4, 0x00050513) // addi a0, %pcrel_lo(local.moduledata) + + sz = initfunc.AddSymRef(ctxt.Arch, addmoduledata, 0, objabi.R_RISCV_JAL, 4) + initfunc.SetUint32(ctxt.Arch, sz-4, 0x0000006f) // j runtime.addmoduledata +} func findHI20Reloc(ldr *loader.Loader, s loader.Sym, val int64) *loader.Reloc { outer := ldr.OuterSym(s) -- cgit v1.3-5-g9baa