summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2025-04-22 00:55:42 +0000
committerCoprDistGit <infra@openeuler.org>2025-04-22 00:55:42 +0000
commite40525e6eefe9c7d1f448fd9f9f5a2f6e9c0e632 (patch)
tree06e4ab7aad41362baa9a143eabda192466714634
parentb56834d5c2724cbea1898c54e64a337ac1703bd5 (diff)
automatic import of golang
-rw-r--r--.gitignore1
-rw-r--r--0001-fix-asan_test-test-case-failure.patch34
-rw-r--r--1000-all-implement-plugin-build-mode-for-riscv64.patch232
-rw-r--r--1001-cmd-link-cmd-internal-add-R_GOT_PCREL_ITYPE_RELOC-fo.patch236
-rw-r--r--1002-cmd-compile-don-t-merge-symbols-on-riscv64-when-dyna.patch589
-rw-r--r--golang.spec513
-rw-r--r--sources1
7 files changed, 1606 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..691f81d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/go1.23.7.src.tar.gz
diff --git a/0001-fix-asan_test-test-case-failure.patch b/0001-fix-asan_test-test-case-failure.patch
new file mode 100644
index 0000000..7be7622
--- /dev/null
+++ b/0001-fix-asan_test-test-case-failure.patch
@@ -0,0 +1,34 @@
+From 1faef79341243aa0c8eafedc6d5d9c10e039fdf4 Mon Sep 17 00:00:00 2001
+From: hanchao <hanchao63@huawei.com>
+Date: Thu, 20 Feb 2025 10:15:20 +0800
+Subject: [PATCH] fix asan_test test case failure
+
+gcc has merged some patches which caused skip failure, now in repairing
+---
+ src/cmd/cgo/internal/testsanitizers/asan_test.go | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/cmd/cgo/internal/testsanitizers/asan_test.go b/src/cmd/cgo/internal/testsanitizers/asan_test.go
+index 7db3562..b2cd19b 100644
+--- a/src/cmd/cgo/internal/testsanitizers/asan_test.go
++++ b/src/cmd/cgo/internal/testsanitizers/asan_test.go
+@@ -15,6 +15,8 @@ import (
+ )
+
+ func TestASAN(t *testing.T) {
++ t.Skipf("gcc has merged some patches which caused skip failure, now in repairing")
++
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ goos, err := goEnv("GOOS")
+@@ -106,6 +108,7 @@ func TestASAN(t *testing.T) {
+ }
+
+ func TestASANLinkerX(t *testing.T) {
++ t.Skipf("gcc has merged some patches which caused skip failure, now in repairing")
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ // Test ASAN with linker's -X flag (see issue 56175).
+--
+2.33.0
+
diff --git a/1000-all-implement-plugin-build-mode-for-riscv64.patch b/1000-all-implement-plugin-build-mode-for-riscv64.patch
new file mode 100644
index 0000000..be28f8f
--- /dev/null
+++ b/1000-all-implement-plugin-build-mode-for-riscv64.patch
@@ -0,0 +1,232 @@
+From 3adb57d3e689f0c3da7a26df52e9218afb18d94f Mon Sep 17 00:00:00 2001
+From: Meng Zhuo <mengzhuo1203@gmail.com>
+Date: Thu, 12 Sep 2024 20:15:56 +0800
+Subject: [PATCH] all: implement plugin build mode for riscv64
+
+Change-Id: I8d7bbeebbf4a46f2fd8d630b1edbaf79b8ffccc5
+Reviewed-on: https://go-review.googlesource.com/c/go/+/420114
+Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
+Reviewed-by: Michael Knyszek <mknyszek@google.com>
+Reviewed-by: Joel Sing <joel@sing.id.au>
+TryBot-Bypass: Joel Sing <joel@sing.id.au>
+---
+ src/cmd/dist/test.go | 2 +-
+ src/cmd/internal/obj/riscv/obj.go | 121 +++++++++++++++++++++++++++
+ src/cmd/link/internal/riscv64/asm.go | 21 ++++-
+ src/internal/platform/supported.go | 2 +-
+ src/runtime/asm_riscv64.s | 9 ++
+ 5 files changed, 152 insertions(+), 3 deletions(-)
+
+diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go
+index 0ffcabe416..b1e3929113 100644
+--- a/src/cmd/dist/test.go
++++ b/src/cmd/dist/test.go
+@@ -1659,7 +1659,7 @@ func buildModeSupported(compiler, buildmode, goos, goarch string) bool {
+
+ case "plugin":
+ switch platform {
+- case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/loong64", "linux/s390x", "linux/ppc64le",
++ case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/loong64", "linux/riscv64", "linux/s390x", "linux/ppc64le",
+ "android/amd64", "android/386",
+ "darwin/amd64", "darwin/arm64",
+ "freebsd/amd64":
+diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go
+index 2055f4836e..44a2246e1f 100644
+--- a/src/cmd/internal/obj/riscv/obj.go
++++ b/src/cmd/internal/obj/riscv/obj.go
+@@ -177,6 +177,127 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
+ p.From.Offset = 0
+ }
+ }
++
++ if ctxt.Flag_dynlink {
++ rewriteToUseGot(ctxt, p, newprog)
++ }
++}
++
++// Rewrite p, if necessary, to access global data via the global offset table.
++func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
++ if p.As == obj.ADUFFCOPY || p.As == obj.ADUFFZERO {
++ // ADUFFxxx $offset
++ // becomes
++ // MOV runtime.duffxxx@GOT, REG_TMP
++ // ADD $offset, REG_TMP
++ // CALL REG_TMP
++ var sym *obj.LSym
++ if p.As == obj.ADUFFCOPY {
++ sym = ctxt.LookupABI("runtime.duffcopy", obj.ABIInternal)
++ } else {
++ sym = ctxt.LookupABI("runtime.duffzero", obj.ABIInternal)
++ }
++ offset := p.To.Offset
++ p.As = AMOV
++ p.From.Type = obj.TYPE_MEM
++ p.From.Name = obj.NAME_GOTREF
++ p.From.Sym = sym
++ p.To.Type = obj.TYPE_REG
++ p.To.Reg = REG_TMP
++ p.To.Name = obj.NAME_NONE
++ p.To.Offset = 0
++ p.To.Sym = nil
++
++ p1 := obj.Appendp(p, newprog)
++ p1.As = AADD
++ p1.From.Type = obj.TYPE_CONST
++ p1.From.Offset = offset
++ p1.To.Type = obj.TYPE_REG
++ p1.To.Reg = REG_TMP
++
++ p2 := obj.Appendp(p1, newprog)
++ p2.As = obj.ACALL
++ p2.To.Type = obj.TYPE_REG
++ p2.To.Reg = REG_TMP
++ }
++
++ // We only care about global data: NAME_EXTERN means a global
++ // symbol in the Go sense and p.Sym.Local is true for a few internally
++ // defined symbols.
++ if p.From.Type == obj.TYPE_ADDR && p.From.Name == obj.NAME_EXTERN && !p.From.Sym.Local() {
++ // MOV $sym, Rx becomes MOV sym@GOT, Rx
++ // MOV $sym+<off>, Rx becomes MOV sym@GOT, Rx; ADD <off>, Rx
++ if p.As != AMOV {
++ ctxt.Diag("don't know how to handle TYPE_ADDR in %v with -dynlink", p)
++ }
++ if p.To.Type != obj.TYPE_REG {
++ ctxt.Diag("don't know how to handle LD instruction to non-register in %v with -dynlink", p)
++ }
++ p.From.Type = obj.TYPE_MEM
++ p.From.Name = obj.NAME_GOTREF
++ if p.From.Offset != 0 {
++ q := obj.Appendp(p, newprog)
++ q.As = AADD
++ q.From.Type = obj.TYPE_CONST
++ q.From.Offset = p.From.Offset
++ q.To = p.To
++ p.From.Offset = 0
++ }
++
++ }
++
++ if p.GetFrom3() != nil && p.GetFrom3().Name == obj.NAME_EXTERN {
++ ctxt.Diag("don't know how to handle %v with -dynlink", p)
++ }
++
++ var source *obj.Addr
++ // MOVx sym, Ry becomes MOV sym@GOT, X31; MOVx (X31), Ry
++ // MOVx Ry, sym becomes MOV sym@GOT, X31; MOV Ry, (X31)
++ // An addition may be inserted between the two MOVs if there is an offset.
++ if p.From.Name == obj.NAME_EXTERN && !p.From.Sym.Local() {
++ if p.To.Name == obj.NAME_EXTERN && !p.To.Sym.Local() {
++ ctxt.Diag("cannot handle NAME_EXTERN on both sides in %v with -dynlink", p)
++ }
++ source = &p.From
++ } else if p.To.Name == obj.NAME_EXTERN && !p.To.Sym.Local() {
++ source = &p.To
++ } else {
++ return
++ }
++ if p.As == obj.ATEXT || p.As == obj.AFUNCDATA || p.As == obj.ACALL || p.As == obj.ARET || p.As == obj.AJMP {
++ return
++ }
++ if source.Sym.Type == objabi.STLSBSS {
++ return
++ }
++ if source.Type != obj.TYPE_MEM {
++ ctxt.Diag("don't know how to handle %v with -dynlink", p)
++ }
++ p1 := obj.Appendp(p, newprog)
++ p1.As = AMOV
++ p1.From.Type = obj.TYPE_MEM
++ p1.From.Sym = source.Sym
++ p1.From.Name = obj.NAME_GOTREF
++ p1.To.Type = obj.TYPE_REG
++ p1.To.Reg = REG_TMP
++
++ p2 := obj.Appendp(p1, newprog)
++ p2.As = p.As
++ p2.From = p.From
++ p2.To = p.To
++ if p.From.Name == obj.NAME_EXTERN {
++ p2.From.Reg = REG_TMP
++ p2.From.Name = obj.NAME_NONE
++ p2.From.Sym = nil
++ } else if p.To.Name == obj.NAME_EXTERN {
++ p2.To.Reg = REG_TMP
++ p2.To.Name = obj.NAME_NONE
++ p2.To.Sym = nil
++ } else {
++ return
++ }
++ obj.Nopout(p)
++
+ }
+
+ // addrToReg extracts the register from an Addr, handling special Addr.Names.
+diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go
+index 6a4dd01240..a9583d21aa 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)
+diff --git a/src/internal/platform/supported.go b/src/internal/platform/supported.go
+index a774247e6b..bad1a6c9c4 100644
+--- a/src/internal/platform/supported.go
++++ b/src/internal/platform/supported.go
+@@ -207,7 +207,7 @@ func BuildModeSupported(compiler, buildmode, goos, goarch string) bool {
+
+ case "plugin":
+ switch platform {
+- case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/loong64", "linux/s390x", "linux/ppc64le",
++ case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/loong64", "linux/riscv64", "linux/s390x", "linux/ppc64le",
+ "android/amd64", "android/386",
+ "darwin/amd64", "darwin/arm64",
+ "freebsd/amd64":
+diff --git a/src/runtime/asm_riscv64.s b/src/runtime/asm_riscv64.s
+index 491635b1cf..231564aca2 100644
+--- a/src/runtime/asm_riscv64.s
++++ b/src/runtime/asm_riscv64.s
+@@ -542,6 +542,15 @@ TEXT runtime·goexit(SB),NOSPLIT|NOFRAME|TOPFRAME,$0-0
+ // traceback from goexit1 must hit code range of goexit
+ MOV ZERO, ZERO // NOP
+
++
++// This is called from .init_array and follows the platform, not the Go ABI.
++TEXT runtime·addmoduledata(SB),NOSPLIT,$0-0
++ // Use X31 as it is a scratch register in both the Go ABI and psABI.
++ MOV runtime·lastmoduledatap(SB), X31
++ MOV X10, moduledata_next(X31)
++ MOV X10, runtime·lastmoduledatap(SB)
++ RET
++
+ // func cgocallback(fn, frame unsafe.Pointer, ctxt uintptr)
+ // See cgocall.go for more details.
+ TEXT ·cgocallback(SB),NOSPLIT,$24-24
+--
+2.48.1.windows.1
+
diff --git a/1001-cmd-link-cmd-internal-add-R_GOT_PCREL_ITYPE_RELOC-fo.patch b/1001-cmd-link-cmd-internal-add-R_GOT_PCREL_ITYPE_RELOC-fo.patch
new file mode 100644
index 0000000..bc42caf
--- /dev/null
+++ b/1001-cmd-link-cmd-internal-add-R_GOT_PCREL_ITYPE_RELOC-fo.patch
@@ -0,0 +1,236 @@
+From 94dcbbcb6dc39b6a3c7c686580cab81be567dc7f Mon Sep 17 00:00:00 2001
+From: Meng Zhuo <mengzhuo1203@gmail.com>
+Date: Thu, 12 Sep 2024 20:03:59 +0800
+Subject: [PATCH] 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>
+---
+ src/cmd/internal/obj/riscv/cpu.go | 5 ++
+ src/cmd/internal/obj/riscv/obj.go | 9 +++-
+ src/cmd/internal/objabi/reloctype.go | 4 ++
+ src/cmd/internal/objabi/reloctype_string.go | 55 +++++++++++----------
+ src/cmd/link/internal/riscv64/asm.go | 19 +++++--
+ 5 files changed, 59 insertions(+), 33 deletions(-)
+
+diff --git a/src/cmd/internal/obj/riscv/cpu.go b/src/cmd/internal/obj/riscv/cpu.go
+index 43ed3bc1f0..a7e2c49a42 100644
+--- a/src/cmd/internal/obj/riscv/cpu.go
++++ b/src/cmd/internal/obj/riscv/cpu.go
+@@ -283,6 +283,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 44a2246e1f..96772a85f0 100644
+--- a/src/cmd/internal/obj/riscv/obj.go
++++ b/src/cmd/internal/obj/riscv/obj.go
+@@ -365,11 +365,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 {
+@@ -2323,7 +2327,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)
+ }
+@@ -2707,6 +2711,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
+ }
+diff --git a/src/cmd/internal/objabi/reloctype.go b/src/cmd/internal/objabi/reloctype.go
+index 8b9927d6eb..587c792742 100644
+--- a/src/cmd/internal/objabi/reloctype.go
++++ b/src/cmd/internal/objabi/reloctype.go
+@@ -291,6 +291,10 @@ const (
+ // address.
+ R_RISCV_GOT_HI20
+
++ // R_RISCV_GOT_PCREL_ITYPE resolves a 32-bit PC-relative GOT entry
++ // address for an AUIPC + I-type instruction pair.
++ R_RISCV_GOT_PCREL_ITYPE
++
+ // R_RISCV_PCREL_HI20 resolves the high 20 bits of a 32-bit PC-relative
+ // address.
+ R_RISCV_PCREL_HI20
+diff --git a/src/cmd/internal/objabi/reloctype_string.go b/src/cmd/internal/objabi/reloctype_string.go
+index 6d8cbb5dd2..6a9abe6796 100644
+--- a/src/cmd/internal/objabi/reloctype_string.go
++++ b/src/cmd/internal/objabi/reloctype_string.go
+@@ -1,4 +1,4 @@
+-// Code generated by "stringer -type=RelocType"; DO NOT EDIT.
++// Code generated by "stringer -type=RelocType .\reloctype.go"; DO NOT EDIT.
+
+ package objabi
+
+@@ -75,35 +75,36 @@ func _() {
+ _ = x[R_RISCV_TLS_IE-65]
+ _ = x[R_RISCV_TLS_LE-66]
+ _ = x[R_RISCV_GOT_HI20-67]
+- _ = x[R_RISCV_PCREL_HI20-68]
+- _ = x[R_RISCV_PCREL_LO12_I-69]
+- _ = x[R_RISCV_PCREL_LO12_S-70]
+- _ = x[R_RISCV_BRANCH-71]
+- _ = x[R_RISCV_RVC_BRANCH-72]
+- _ = x[R_RISCV_RVC_JUMP-73]
+- _ = x[R_PCRELDBL-74]
+- _ = x[R_LOONG64_ADDR_HI-75]
+- _ = x[R_LOONG64_ADDR_LO-76]
+- _ = x[R_LOONG64_TLS_LE_HI-77]
+- _ = x[R_LOONG64_TLS_LE_LO-78]
+- _ = x[R_CALLLOONG64-79]
+- _ = x[R_LOONG64_TLS_IE_HI-80]
+- _ = x[R_LOONG64_TLS_IE_LO-81]
+- _ = x[R_LOONG64_GOT_HI-82]
+- _ = x[R_LOONG64_GOT_LO-83]
+- _ = x[R_JMPLOONG64-84]
+- _ = x[R_ADDRMIPSU-85]
+- _ = x[R_ADDRMIPSTLS-86]
+- _ = x[R_ADDRCUOFF-87]
+- _ = x[R_WASMIMPORT-88]
+- _ = x[R_XCOFFREF-89]
+- _ = x[R_PEIMAGEOFF-90]
+- _ = x[R_INITORDER-91]
++ _ = x[R_RISCV_GOT_PCREL_ITYPE-68]
++ _ = x[R_RISCV_PCREL_HI20-69]
++ _ = x[R_RISCV_PCREL_LO12_I-70]
++ _ = x[R_RISCV_PCREL_LO12_S-71]
++ _ = x[R_RISCV_BRANCH-72]
++ _ = x[R_RISCV_RVC_BRANCH-73]
++ _ = x[R_RISCV_RVC_JUMP-74]
++ _ = x[R_PCRELDBL-75]
++ _ = x[R_LOONG64_ADDR_HI-76]
++ _ = x[R_LOONG64_ADDR_LO-77]
++ _ = x[R_LOONG64_TLS_LE_HI-78]
++ _ = x[R_LOONG64_TLS_LE_LO-79]
++ _ = x[R_CALLLOONG64-80]
++ _ = x[R_LOONG64_TLS_IE_HI-81]
++ _ = x[R_LOONG64_TLS_IE_LO-82]
++ _ = x[R_LOONG64_GOT_HI-83]
++ _ = x[R_LOONG64_GOT_LO-84]
++ _ = x[R_JMPLOONG64-85]
++ _ = x[R_ADDRMIPSU-86]
++ _ = x[R_ADDRMIPSTLS-87]
++ _ = x[R_ADDRCUOFF-88]
++ _ = x[R_WASMIMPORT-89]
++ _ = x[R_XCOFFREF-90]
++ _ = x[R_PEIMAGEOFF-91]
++ _ = x[R_INITORDER-92]
+ }
+
+-const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_USEIFACER_USEIFACEMETHODR_USENAMEDMETHODR_METHODOFFR_KEEPR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_PCREL_LDST8R_ARM64_PCREL_LDST16R_ARM64_PCREL_LDST32R_ARM64_PCREL_LDST64R_ARM64_LDST8R_ARM64_LDST16R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_POWER_TLS_IE_PCREL34R_POWER_TLS_LE_TPREL34R_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_GOT_PCREL34R_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_ADDRPOWER_D34R_ADDRPOWER_PCREL34R_RISCV_JALR_RISCV_JAL_TRAMPR_RISCV_CALLR_RISCV_PCREL_ITYPER_RISCV_PCREL_STYPER_RISCV_TLS_IER_RISCV_TLS_LER_RISCV_GOT_HI20R_RISCV_PCREL_HI20R_RISCV_PCREL_LO12_IR_RISCV_PCREL_LO12_SR_RISCV_BRANCHR_RISCV_RVC_BRANCHR_RISCV_RVC_JUMPR_PCRELDBLR_LOONG64_ADDR_HIR_LOONG64_ADDR_LOR_LOONG64_TLS_LE_HIR_LOONG64_TLS_LE_LOR_CALLLOONG64R_LOONG64_TLS_IE_HIR_LOONG64_TLS_IE_LOR_LOONG64_GOT_HIR_LOONG64_GOT_LOR_JMPLOONG64R_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREFR_PEIMAGEOFFR_INITORDER"
++const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_USEIFACER_USEIFACEMETHODR_USENAMEDMETHODR_METHODOFFR_KEEPR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_PCREL_LDST8R_ARM64_PCREL_LDST16R_ARM64_PCREL_LDST32R_ARM64_PCREL_LDST64R_ARM64_LDST8R_ARM64_LDST16R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_POWER_TLS_IE_PCREL34R_POWER_TLS_LE_TPREL34R_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_GOT_PCREL34R_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_ADDRPOWER_D34R_ADDRPOWER_PCREL34R_RISCV_JALR_RISCV_JAL_TRAMPR_RISCV_CALLR_RISCV_PCREL_ITYPER_RISCV_PCREL_STYPER_RISCV_TLS_IER_RISCV_TLS_LER_RISCV_GOT_HI20R_RISCV_GOT_PCREL_ITYPER_RISCV_PCREL_HI20R_RISCV_PCREL_LO12_IR_RISCV_PCREL_LO12_SR_RISCV_BRANCHR_RISCV_RVC_BRANCHR_RISCV_RVC_JUMPR_PCRELDBLR_LOONG64_ADDR_HIR_LOONG64_ADDR_LOR_LOONG64_TLS_LE_HIR_LOONG64_TLS_LE_LOR_CALLLOONG64R_LOONG64_TLS_IE_HIR_LOONG64_TLS_IE_LOR_LOONG64_GOT_HIR_LOONG64_GOT_LOR_JMPLOONG64R_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREFR_PEIMAGEOFFR_INITORDER"
+
+-var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 53, 59, 68, 79, 88, 99, 109, 116, 123, 131, 139, 147, 153, 159, 165, 175, 184, 194, 210, 226, 237, 243, 254, 264, 273, 286, 300, 314, 328, 344, 355, 368, 387, 407, 427, 447, 460, 474, 488, 502, 517, 531, 545, 556, 578, 600, 614, 629, 652, 669, 687, 708, 723, 742, 753, 770, 782, 801, 820, 834, 848, 864, 882, 902, 922, 936, 954, 970, 980, 997, 1014, 1033, 1052, 1065, 1084, 1103, 1119, 1135, 1147, 1158, 1171, 1182, 1194, 1204, 1216, 1227}
++var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 53, 59, 68, 79, 88, 99, 109, 116, 123, 131, 139, 147, 153, 159, 165, 175, 184, 194, 210, 226, 237, 243, 254, 264, 273, 286, 300, 314, 328, 344, 355, 368, 387, 407, 427, 447, 460, 474, 488, 502, 517, 531, 545, 556, 578, 600, 614, 629, 652, 669, 687, 708, 723, 742, 753, 770, 782, 801, 820, 834, 848, 864, 887, 905, 925, 945, 959, 977, 993, 1003, 1020, 1037, 1056, 1075, 1088, 1107, 1126, 1142, 1158, 1170, 1181, 1194, 1205, 1217, 1227, 1239, 1250}
+
+ func (i RelocType) String() string {
+ i -= 1
+diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go
+index a9583d21aa..81644ea3b6 100644
+--- a/src/cmd/link/internal/riscv64/asm.go
++++ b/src/cmd/link/internal/riscv64/asm.go
+@@ -189,8 +189,11 @@ func genSymsLate(ctxt *ld.Link, ldr *loader.Loader) {
+ relocs := ldr.Relocs(s)
+ for ri := 0; ri < relocs.Count(); ri++ {
+ r := relocs.At(ri)
+- if r.Type() != objabi.R_RISCV_CALL && r.Type() != objabi.R_RISCV_PCREL_ITYPE &&
+- r.Type() != objabi.R_RISCV_PCREL_STYPE && r.Type() != objabi.R_RISCV_TLS_IE {
++ if r.Type() != objabi.R_RISCV_CALL &&
++ r.Type() != objabi.R_RISCV_PCREL_ITYPE &&
++ r.Type() != objabi.R_RISCV_PCREL_STYPE &&
++ r.Type() != objabi.R_RISCV_TLS_IE &&
++ r.Type() != objabi.R_RISCV_GOT_PCREL_ITYPE {
+ continue
+ }
+ if r.Off() == 0 && ldr.SymType(s) == sym.STEXT {
+@@ -252,7 +255,11 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
+ out.Write64(uint64(elf.R_RISCV_JAL) | uint64(elfsym)<<32)
+ out.Write64(uint64(r.Xadd))
+
+- case objabi.R_RISCV_CALL, objabi.R_RISCV_PCREL_ITYPE, objabi.R_RISCV_PCREL_STYPE, objabi.R_RISCV_TLS_IE:
++ case objabi.R_RISCV_CALL,
++ objabi.R_RISCV_PCREL_ITYPE,
++ objabi.R_RISCV_PCREL_STYPE,
++ objabi.R_RISCV_TLS_IE,
++ objabi.R_RISCV_GOT_PCREL_ITYPE:
+ // Find the text symbol for the AUIPC instruction targeted
+ // by this relocation.
+ relocs := ldr.Relocs(s)
+@@ -281,6 +288,8 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
+ hiRel, loRel = elf.R_RISCV_PCREL_HI20, elf.R_RISCV_PCREL_LO12_S
+ case objabi.R_RISCV_TLS_IE:
+ hiRel, loRel = elf.R_RISCV_TLS_GOT_HI20, elf.R_RISCV_PCREL_LO12_I
++ case objabi.R_RISCV_GOT_PCREL_ITYPE:
++ hiRel, loRel = elf.R_RISCV_GOT_HI20, elf.R_RISCV_PCREL_LO12_I
+ }
+ out.Write64(uint64(sectoff))
+ out.Write64(uint64(hiRel) | uint64(elfsym)<<32)
+@@ -445,7 +454,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
+ case objabi.R_RISCV_JAL, objabi.R_RISCV_JAL_TRAMP:
+ return val, 1, true
+
+- case objabi.R_RISCV_CALL, objabi.R_RISCV_PCREL_ITYPE, objabi.R_RISCV_PCREL_STYPE, objabi.R_RISCV_TLS_IE, objabi.R_RISCV_TLS_LE:
++ case objabi.R_RISCV_CALL, objabi.R_RISCV_PCREL_ITYPE, objabi.R_RISCV_PCREL_STYPE, objabi.R_RISCV_TLS_IE, objabi.R_RISCV_TLS_LE, objabi.R_RISCV_GOT_PCREL_ITYPE:
+ return val, 2, true
+ }
+
+@@ -645,7 +654,7 @@ func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc, s loader.Sy
+ case objabi.R_RISCV_JAL, objabi.R_RISCV_JAL_TRAMP:
+ return ld.ExtrelocSimple(ldr, r), true
+
+- case objabi.R_RISCV_CALL, objabi.R_RISCV_PCREL_ITYPE, objabi.R_RISCV_PCREL_STYPE, objabi.R_RISCV_TLS_IE, objabi.R_RISCV_TLS_LE:
++ case objabi.R_RISCV_CALL, objabi.R_RISCV_PCREL_ITYPE, objabi.R_RISCV_PCREL_STYPE, objabi.R_RISCV_TLS_IE, objabi.R_RISCV_TLS_LE, objabi.R_RISCV_GOT_PCREL_ITYPE:
+ return ld.ExtrelocViaOuterSym(ldr, r, s), true
+ }
+ return loader.ExtReloc{}, false
+--
+2.48.1.windows.1
+
diff --git a/1002-cmd-compile-don-t-merge-symbols-on-riscv64-when-dyna.patch b/1002-cmd-compile-don-t-merge-symbols-on-riscv64-when-dyna.patch
new file mode 100644
index 0000000..010f3ea
--- /dev/null
+++ b/1002-cmd-compile-don-t-merge-symbols-on-riscv64-when-dyna.patch
@@ -0,0 +1,589 @@
+From f11737fca5ac7ec43bbd25c07bae6faa6319cddc Mon Sep 17 00:00:00 2001
+From: Meng Zhuo <mengzhuo1203@gmail.com>
+Date: Thu, 12 Sep 2024 19:46:20 +0800
+Subject: [PATCH] cmd/compile: don't merge symbols on riscv64 when dynamic
+ linking
+
+Each plugin is compiled as a separate shared object,
+with its own symbol table. When dynamic linking plugin symbols
+are resolved within the plugin's scope, not globally merged to
+avoid conflicts.
+
+Change-Id: I9e6986085855c17fbd6c39b937cb6129d216f5e9
+Reviewed-on: https://go-review.googlesource.com/c/go/+/435015
+LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
+Reviewed-by: Joel Sing <joel@sing.id.au>
+Reviewed-by: Michael Pratt <mpratt@google.com>
+Reviewed-by: Cherry Mui <cherryyz@google.com>
+---
+ .../compile/internal/ssa/_gen/RISCV64.rules | 82 +++-------
+ .../compile/internal/ssa/rewriteRISCV64.go | 154 +++++++++++-------
+ 2 files changed, 115 insertions(+), 121 deletions(-)
+
+diff --git a/src/cmd/compile/internal/ssa/_gen/RISCV64.rules b/src/cmd/compile/internal/ssa/_gen/RISCV64.rules
+index c2df433315..00d0d91b46 100644
+--- a/src/cmd/compile/internal/ssa/_gen/RISCV64.rules
++++ b/src/cmd/compile/internal/ssa/_gen/RISCV64.rules
+@@ -271,65 +271,29 @@
+
+ // We need to fold MOVaddr into the LD/MOVDstore ops so that the live variable analysis
+ // knows what variables are being read/written by the ops.
+-(MOVBUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
+- (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+-(MOVBload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
+- (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+-(MOVHUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
+- (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+-(MOVHload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
+- (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+-(MOVWUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
+- (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+-(MOVWload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
+- (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+-(MOVDload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
+- (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+-
+-(MOVBstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
+- (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
+-(MOVHstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
+- (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
+-(MOVWstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
+- (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
+-(MOVDstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
+- (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
+-(MOVBstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+- (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
+-(MOVHstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+- (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
+-(MOVWstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+- (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
+-(MOVDstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
+- (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
+-
+-(MOVBUload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
+- (MOVBUload [off1+int32(off2)] {sym} base mem)
+-(MOVBload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
+- (MOVBload [off1+int32(off2)] {sym} base mem)
+-(MOVHUload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
+- (MOVHUload [off1+int32(off2)] {sym} base mem)
+-(MOVHload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
+- (MOVHload [off1+int32(off2)] {sym} base mem)
+-(MOVWUload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
+- (MOVWUload [off1+int32(off2)] {sym} base mem)
+-(MOVWload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
+- (MOVWload [off1+int32(off2)] {sym} base mem)
+-(MOVDload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
+- (MOVDload [off1+int32(off2)] {sym} base mem)
+-
+-(MOVBstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) =>
+- (MOVBstore [off1+int32(off2)] {sym} base val mem)
+-(MOVHstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) =>
+- (MOVHstore [off1+int32(off2)] {sym} base val mem)
+-(MOVWstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) =>
+- (MOVWstore [off1+int32(off2)] {sym} base val mem)
+-(MOVDstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) =>
+- (MOVDstore [off1+int32(off2)] {sym} base val mem)
+-(MOVBstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
+-(MOVHstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
+-(MOVWstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
+-(MOVDstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVDstorezero [off1+int32(off2)] {sym} ptr mem)
++(MOV(B|BU|H|HU|W|WU|D)load [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) &&
++ is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) &&
++ (base.Op != OpSB || !config.ctxt.Flag_dynlink) =>
++ (MOV(B|BU|H|HU|W|WU|D)load [off1+off2] {mergeSym(sym1,sym2)} base mem)
++
++(MOV(B|H|W|D)store [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) &&
++ is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) &&
++ (base.Op != OpSB || !config.ctxt.Flag_dynlink) =>
++ (MOV(B|H|W|D)store [off1+off2] {mergeSym(sym1,sym2)} base val mem)
++
++(MOV(B|H|W|D)storezero [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) &&
++ canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) &&
++ (base.Op != OpSB || !config.ctxt.Flag_dynlink) =>
++ (MOV(B|H|W|D)storezero [off1+off2] {mergeSym(sym1,sym2)} base mem)
++
++(MOV(B|BU|H|HU|W|WU|D)load [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
++ (MOV(B|BU|H|HU|W|WU|D)load [off1+int32(off2)] {sym} base mem)
++
++(MOV(B|H|W|D)store [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) =>
++ (MOV(B|H|W|D)store [off1+int32(off2)] {sym} base val mem)
++
++(MOV(B|H|W|D)storezero [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
++ (MOV(B|H|W|D)storezero [off1+int32(off2)] {sym} base mem)
+
+ // Similarly, fold ADDI into MOVaddr to avoid confusing live variable analysis
+ // with OffPtr -> ADDI.
+diff --git a/src/cmd/compile/internal/ssa/rewriteRISCV64.go b/src/cmd/compile/internal/ssa/rewriteRISCV64.go
+index f033b25bdd..9243702508 100644
+--- a/src/cmd/compile/internal/ssa/rewriteRISCV64.go
++++ b/src/cmd/compile/internal/ssa/rewriteRISCV64.go
+@@ -3870,8 +3870,10 @@ func rewriteValueRISCV64_OpRISCV64FSUBS(v *Value) bool {
+ func rewriteValueRISCV64_OpRISCV64MOVBUload(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
++ b := v.Block
++ config := b.Func.Config
+ // match: (MOVBUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
+- // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
++ // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
+ // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+@@ -3883,7 +3885,7 @@ func rewriteValueRISCV64_OpRISCV64MOVBUload(v *Value) bool {
+ sym2 := auxToSym(v_0.Aux)
+ base := v_0.Args[0]
+ mem := v_1
+- if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
++ if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVBUload)
+@@ -4177,8 +4179,10 @@ func rewriteValueRISCV64_OpRISCV64MOVBUreg(v *Value) bool {
+ func rewriteValueRISCV64_OpRISCV64MOVBload(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
++ b := v.Block
++ config := b.Func.Config
+ // match: (MOVBload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
+- // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
++ // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
+ // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+@@ -4190,7 +4194,7 @@ func rewriteValueRISCV64_OpRISCV64MOVBload(v *Value) bool {
+ sym2 := auxToSym(v_0.Aux)
+ base := v_0.Args[0]
+ mem := v_1
+- if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
++ if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVBload)
+@@ -4303,8 +4307,10 @@ func rewriteValueRISCV64_OpRISCV64MOVBstore(v *Value) bool {
+ v_2 := v.Args[2]
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
++ b := v.Block
++ config := b.Func.Config
+ // match: (MOVBstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem)
+- // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
++ // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
+ // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+@@ -4317,7 +4323,7 @@ func rewriteValueRISCV64_OpRISCV64MOVBstore(v *Value) bool {
+ base := v_0.Args[0]
+ val := v_1
+ mem := v_2
+- if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
++ if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVBstore)
+@@ -4471,9 +4477,11 @@ func rewriteValueRISCV64_OpRISCV64MOVBstore(v *Value) bool {
+ func rewriteValueRISCV64_OpRISCV64MOVBstorezero(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
+- // match: (MOVBstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem)
+- // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+- // result: (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
++ b := v.Block
++ config := b.Func.Config
++ // match: (MOVBstorezero [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
++ // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
++ // result: (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+ sym1 := auxToSym(v.Aux)
+@@ -4482,20 +4490,20 @@ func rewriteValueRISCV64_OpRISCV64MOVBstorezero(v *Value) bool {
+ }
+ off2 := auxIntToInt32(v_0.AuxInt)
+ sym2 := auxToSym(v_0.Aux)
+- ptr := v_0.Args[0]
++ base := v_0.Args[0]
+ mem := v_1
+- if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
++ if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVBstorezero)
+ v.AuxInt = int32ToAuxInt(off1 + off2)
+ v.Aux = symToAux(mergeSym(sym1, sym2))
+- v.AddArg2(ptr, mem)
++ v.AddArg2(base, mem)
+ return true
+ }
+- // match: (MOVBstorezero [off1] {sym} (ADDI [off2] ptr) mem)
++ // match: (MOVBstorezero [off1] {sym} (ADDI [off2] base) mem)
+ // cond: is32Bit(int64(off1)+off2)
+- // result: (MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
++ // result: (MOVBstorezero [off1+int32(off2)] {sym} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+@@ -4503,7 +4511,7 @@ func rewriteValueRISCV64_OpRISCV64MOVBstorezero(v *Value) bool {
+ break
+ }
+ off2 := auxIntToInt64(v_0.AuxInt)
+- ptr := v_0.Args[0]
++ base := v_0.Args[0]
+ mem := v_1
+ if !(is32Bit(int64(off1) + off2)) {
+ break
+@@ -4511,7 +4519,7 @@ func rewriteValueRISCV64_OpRISCV64MOVBstorezero(v *Value) bool {
+ v.reset(OpRISCV64MOVBstorezero)
+ v.AuxInt = int32ToAuxInt(off1 + int32(off2))
+ v.Aux = symToAux(sym)
+- v.AddArg2(ptr, mem)
++ v.AddArg2(base, mem)
+ return true
+ }
+ return false
+@@ -4519,8 +4527,10 @@ func rewriteValueRISCV64_OpRISCV64MOVBstorezero(v *Value) bool {
+ func rewriteValueRISCV64_OpRISCV64MOVDload(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
++ b := v.Block
++ config := b.Func.Config
+ // match: (MOVDload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
+- // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
++ // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
+ // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+@@ -4532,7 +4542,7 @@ func rewriteValueRISCV64_OpRISCV64MOVDload(v *Value) bool {
+ sym2 := auxToSym(v_0.Aux)
+ base := v_0.Args[0]
+ mem := v_1
+- if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
++ if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVDload)
+@@ -4599,8 +4609,10 @@ func rewriteValueRISCV64_OpRISCV64MOVDstore(v *Value) bool {
+ v_2 := v.Args[2]
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
++ b := v.Block
++ config := b.Func.Config
+ // match: (MOVDstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem)
+- // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
++ // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
+ // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+@@ -4613,7 +4625,7 @@ func rewriteValueRISCV64_OpRISCV64MOVDstore(v *Value) bool {
+ base := v_0.Args[0]
+ val := v_1
+ mem := v_2
+- if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
++ if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVDstore)
+@@ -4665,9 +4677,11 @@ func rewriteValueRISCV64_OpRISCV64MOVDstore(v *Value) bool {
+ func rewriteValueRISCV64_OpRISCV64MOVDstorezero(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
+- // match: (MOVDstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem)
+- // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+- // result: (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
++ b := v.Block
++ config := b.Func.Config
++ // match: (MOVDstorezero [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
++ // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
++ // result: (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+ sym1 := auxToSym(v.Aux)
+@@ -4676,20 +4690,20 @@ func rewriteValueRISCV64_OpRISCV64MOVDstorezero(v *Value) bool {
+ }
+ off2 := auxIntToInt32(v_0.AuxInt)
+ sym2 := auxToSym(v_0.Aux)
+- ptr := v_0.Args[0]
++ base := v_0.Args[0]
+ mem := v_1
+- if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
++ if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVDstorezero)
+ v.AuxInt = int32ToAuxInt(off1 + off2)
+ v.Aux = symToAux(mergeSym(sym1, sym2))
+- v.AddArg2(ptr, mem)
++ v.AddArg2(base, mem)
+ return true
+ }
+- // match: (MOVDstorezero [off1] {sym} (ADDI [off2] ptr) mem)
++ // match: (MOVDstorezero [off1] {sym} (ADDI [off2] base) mem)
+ // cond: is32Bit(int64(off1)+off2)
+- // result: (MOVDstorezero [off1+int32(off2)] {sym} ptr mem)
++ // result: (MOVDstorezero [off1+int32(off2)] {sym} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+@@ -4697,7 +4711,7 @@ func rewriteValueRISCV64_OpRISCV64MOVDstorezero(v *Value) bool {
+ break
+ }
+ off2 := auxIntToInt64(v_0.AuxInt)
+- ptr := v_0.Args[0]
++ base := v_0.Args[0]
+ mem := v_1
+ if !(is32Bit(int64(off1) + off2)) {
+ break
+@@ -4705,7 +4719,7 @@ func rewriteValueRISCV64_OpRISCV64MOVDstorezero(v *Value) bool {
+ v.reset(OpRISCV64MOVDstorezero)
+ v.AuxInt = int32ToAuxInt(off1 + int32(off2))
+ v.Aux = symToAux(sym)
+- v.AddArg2(ptr, mem)
++ v.AddArg2(base, mem)
+ return true
+ }
+ return false
+@@ -4713,8 +4727,10 @@ func rewriteValueRISCV64_OpRISCV64MOVDstorezero(v *Value) bool {
+ func rewriteValueRISCV64_OpRISCV64MOVHUload(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
++ b := v.Block
++ config := b.Func.Config
+ // match: (MOVHUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
+- // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
++ // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
+ // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+@@ -4726,7 +4742,7 @@ func rewriteValueRISCV64_OpRISCV64MOVHUload(v *Value) bool {
+ sym2 := auxToSym(v_0.Aux)
+ base := v_0.Args[0]
+ mem := v_1
+- if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
++ if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVHUload)
+@@ -4877,8 +4893,10 @@ func rewriteValueRISCV64_OpRISCV64MOVHUreg(v *Value) bool {
+ func rewriteValueRISCV64_OpRISCV64MOVHload(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
++ b := v.Block
++ config := b.Func.Config
+ // match: (MOVHload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
+- // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
++ // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
+ // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+@@ -4890,7 +4908,7 @@ func rewriteValueRISCV64_OpRISCV64MOVHload(v *Value) bool {
+ sym2 := auxToSym(v_0.Aux)
+ base := v_0.Args[0]
+ mem := v_1
+- if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
++ if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVHload)
+@@ -5047,8 +5065,10 @@ func rewriteValueRISCV64_OpRISCV64MOVHstore(v *Value) bool {
+ v_2 := v.Args[2]
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
++ b := v.Block
++ config := b.Func.Config
+ // match: (MOVHstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem)
+- // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
++ // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
+ // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+@@ -5061,7 +5081,7 @@ func rewriteValueRISCV64_OpRISCV64MOVHstore(v *Value) bool {
+ base := v_0.Args[0]
+ val := v_1
+ mem := v_2
+- if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
++ if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVHstore)
+@@ -5181,9 +5201,11 @@ func rewriteValueRISCV64_OpRISCV64MOVHstore(v *Value) bool {
+ func rewriteValueRISCV64_OpRISCV64MOVHstorezero(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
+- // match: (MOVHstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem)
+- // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+- // result: (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
++ b := v.Block
++ config := b.Func.Config
++ // match: (MOVHstorezero [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
++ // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
++ // result: (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+ sym1 := auxToSym(v.Aux)
+@@ -5192,20 +5214,20 @@ func rewriteValueRISCV64_OpRISCV64MOVHstorezero(v *Value) bool {
+ }
+ off2 := auxIntToInt32(v_0.AuxInt)
+ sym2 := auxToSym(v_0.Aux)
+- ptr := v_0.Args[0]
++ base := v_0.Args[0]
+ mem := v_1
+- if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
++ if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVHstorezero)
+ v.AuxInt = int32ToAuxInt(off1 + off2)
+ v.Aux = symToAux(mergeSym(sym1, sym2))
+- v.AddArg2(ptr, mem)
++ v.AddArg2(base, mem)
+ return true
+ }
+- // match: (MOVHstorezero [off1] {sym} (ADDI [off2] ptr) mem)
++ // match: (MOVHstorezero [off1] {sym} (ADDI [off2] base) mem)
+ // cond: is32Bit(int64(off1)+off2)
+- // result: (MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
++ // result: (MOVHstorezero [off1+int32(off2)] {sym} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+@@ -5213,7 +5235,7 @@ func rewriteValueRISCV64_OpRISCV64MOVHstorezero(v *Value) bool {
+ break
+ }
+ off2 := auxIntToInt64(v_0.AuxInt)
+- ptr := v_0.Args[0]
++ base := v_0.Args[0]
+ mem := v_1
+ if !(is32Bit(int64(off1) + off2)) {
+ break
+@@ -5221,7 +5243,7 @@ func rewriteValueRISCV64_OpRISCV64MOVHstorezero(v *Value) bool {
+ v.reset(OpRISCV64MOVHstorezero)
+ v.AuxInt = int32ToAuxInt(off1 + int32(off2))
+ v.Aux = symToAux(sym)
+- v.AddArg2(ptr, mem)
++ v.AddArg2(base, mem)
+ return true
+ }
+ return false
+@@ -5229,8 +5251,10 @@ func rewriteValueRISCV64_OpRISCV64MOVHstorezero(v *Value) bool {
+ func rewriteValueRISCV64_OpRISCV64MOVWUload(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
++ b := v.Block
++ config := b.Func.Config
+ // match: (MOVWUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
+- // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
++ // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
+ // result: (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+@@ -5242,7 +5266,7 @@ func rewriteValueRISCV64_OpRISCV64MOVWUload(v *Value) bool {
+ sym2 := auxToSym(v_0.Aux)
+ base := v_0.Args[0]
+ mem := v_1
+- if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
++ if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVWUload)
+@@ -5417,8 +5441,10 @@ func rewriteValueRISCV64_OpRISCV64MOVWUreg(v *Value) bool {
+ func rewriteValueRISCV64_OpRISCV64MOVWload(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
++ b := v.Block
++ config := b.Func.Config
+ // match: (MOVWload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
+- // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
++ // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
+ // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+@@ -5430,7 +5456,7 @@ func rewriteValueRISCV64_OpRISCV64MOVWload(v *Value) bool {
+ sym2 := auxToSym(v_0.Aux)
+ base := v_0.Args[0]
+ mem := v_1
+- if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
++ if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVWload)
+@@ -5741,8 +5767,10 @@ func rewriteValueRISCV64_OpRISCV64MOVWstore(v *Value) bool {
+ v_2 := v.Args[2]
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
++ b := v.Block
++ config := b.Func.Config
+ // match: (MOVWstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem)
+- // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
++ // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
+ // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+@@ -5755,7 +5783,7 @@ func rewriteValueRISCV64_OpRISCV64MOVWstore(v *Value) bool {
+ base := v_0.Args[0]
+ val := v_1
+ mem := v_2
+- if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
++ if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVWstore)
+@@ -5841,9 +5869,11 @@ func rewriteValueRISCV64_OpRISCV64MOVWstore(v *Value) bool {
+ func rewriteValueRISCV64_OpRISCV64MOVWstorezero(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
+- // match: (MOVWstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem)
+- // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
+- // result: (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
++ b := v.Block
++ config := b.Func.Config
++ // match: (MOVWstorezero [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
++ // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)
++ // result: (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+ sym1 := auxToSym(v.Aux)
+@@ -5852,20 +5882,20 @@ func rewriteValueRISCV64_OpRISCV64MOVWstorezero(v *Value) bool {
+ }
+ off2 := auxIntToInt32(v_0.AuxInt)
+ sym2 := auxToSym(v_0.Aux)
+- ptr := v_0.Args[0]
++ base := v_0.Args[0]
+ mem := v_1
+- if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
++ if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2)) && (base.Op != OpSB || !config.ctxt.Flag_dynlink)) {
+ break
+ }
+ v.reset(OpRISCV64MOVWstorezero)
+ v.AuxInt = int32ToAuxInt(off1 + off2)
+ v.Aux = symToAux(mergeSym(sym1, sym2))
+- v.AddArg2(ptr, mem)
++ v.AddArg2(base, mem)
+ return true
+ }
+- // match: (MOVWstorezero [off1] {sym} (ADDI [off2] ptr) mem)
++ // match: (MOVWstorezero [off1] {sym} (ADDI [off2] base) mem)
+ // cond: is32Bit(int64(off1)+off2)
+- // result: (MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
++ // result: (MOVWstorezero [off1+int32(off2)] {sym} base mem)
+ for {
+ off1 := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+@@ -5873,7 +5903,7 @@ func rewriteValueRISCV64_OpRISCV64MOVWstorezero(v *Value) bool {
+ break
+ }
+ off2 := auxIntToInt64(v_0.AuxInt)
+- ptr := v_0.Args[0]
++ base := v_0.Args[0]
+ mem := v_1
+ if !(is32Bit(int64(off1) + off2)) {
+ break
+@@ -5881,7 +5911,7 @@ func rewriteValueRISCV64_OpRISCV64MOVWstorezero(v *Value) bool {
+ v.reset(OpRISCV64MOVWstorezero)
+ v.AuxInt = int32ToAuxInt(off1 + int32(off2))
+ v.Aux = symToAux(sym)
+- v.AddArg2(ptr, mem)
++ v.AddArg2(base, mem)
+ return true
+ }
+ return false
+--
+2.48.1.windows.1
+
diff --git a/golang.spec b/golang.spec
new file mode 100644
index 0000000..220543b
--- /dev/null
+++ b/golang.spec
@@ -0,0 +1,513 @@
+%global debug_package %{nil}
+%global _binaries_in_noarch_packages_terminate_build 0
+%global golibdir %{_libdir}/golang
+%global goroot /usr/lib/%{name}
+%global go_api 1.23
+%global go_version 1.23
+%global __spec_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot /usr/lib/rpm/brp-compress
+%global __requires_exclude_from ^(%{_datadir}|/usr/lib)/%{name}/(doc|src)/.*$
+%global __strip /bin/true
+%global vendor %{?_vendor:%{_vendor}}%{!?_vendor:openEuler}
+%define _use_internal_dependency_generator 0
+%define __find_requires %{nil}
+
+%bcond_with bootstrap
+%ifarch x86_64 aarch64 riscv64 loongarch64 ppc64le
+%bcond_without ignore_tests
+%else
+%bcond_with ignore_tests
+%endif
+
+%ifarch x86_64 aarch64 riscv64 loongarch64 ppc64le
+%global external_linker 1
+%else
+%global external_linker 0
+%endif
+
+%ifarch x86_64 aarch64 riscv64 loongarch64 ppc64le
+%global cgo_enabled 1
+%else
+%global cgo_enabled 0
+%endif
+
+%if %{with bootstrap}
+%global golang_bootstrap 0
+%else
+%global golang_bootstrap 1
+%endif
+
+%if %{with ignore_tests}
+%global fail_on_tests 0
+%else
+%global fail_on_tests 1
+%endif
+
+%global shared 0
+
+# Pre build std lib with -race enabled
+# Disabled due to 1.20 new cache usage, see 1.20 upstream release notes
+%global race 0
+
+%ifarch x86_64
+%global gohostarch amd64
+%endif
+%ifarch aarch64
+%global gohostarch arm64
+%endif
+%ifarch riscv64
+%global gohostarch riscv64
+%endif
+%ifarch ppc64le
+%global gohostarch ppc64le
+%endif
+%ifarch loongarch64
+%global gohostarch loong64
+%endif
+
+Name: golang
+Version: 1.23.7
+Release: 33
+Summary: The Go Programming Language
+License: BSD and Public Domain
+URL: https://golang.org/
+Source0: https://dl.google.com/go/go%{version}.src.tar.gz
+
+%if !%{golang_bootstrap}
+BuildRequires: gcc-go >= 5
+%else
+BuildRequires: golang >= 1.20.6
+%endif
+BuildRequires: hostname
+# for tests
+BuildRequires: pcre-devel, glibc-static, perl-interpreter, procps-ng
+
+Provides: go = %{version}-%{release}
+Requires: %{name}-devel = %{version}-%{release}
+
+Obsoletes: %{name}-pkg-bin-linux-386 < 1.4.99
+Obsoletes: %{name}-pkg-bin-linux-amd64 < 1.4.99
+Obsoletes: %{name}-pkg-bin-linux-arm < 1.4.99
+Obsoletes: %{name}-pkg-linux-386 < 1.4.99
+Obsoletes: %{name}-pkg-linux-amd64 < 1.4.99
+Obsoletes: %{name}-pkg-linux-arm < 1.4.99
+Obsoletes: %{name}-vet < 0-12.1
+Obsoletes: %{name}-cover < 0-12.1
+
+Requires(post): %{_sbindir}/update-alternatives
+Requires(postun): %{_sbindir}/update-alternatives
+Recommends: glibc gcc git subversion
+
+# Bundled/Vendored provides generated by bundled-deps.sh based on the in tree module data
+# - in version filed substituted with . per versioning guidelines
+Provides: bundled(golang(github.com/google/pprof)) = 0.0.0.20240528025155.186aa0362fba
+Provides: bundled(golang(github.com/ianlancetaylor/demangle)) = 0.0.0.20240312041847.bd984b5ce465
+Provides: bundled(golang(golang.org/x/arch)) = 0.8.0
+Provides: bundled(golang(golang.org/x/build)) = 0.0.0.20240603162849.5dfbda438323
+Provides: bundled(golang(golang.org/x/crypto)) = 0.23.1.0.20240603234054.0b431c7de36a
+Provides: bundled(golang(golang.org/x/mod)) = 0.19.0
+Provides: bundled(golang(golang.org/x/net)) = 0.25.1.0.20240603202750.6249541f2a6c
+Provides: bundled(golang(golang.org/x/sync)) = 0.7.0
+Provides: bundled(golang(golang.org/x/sys)) = 0.22.0
+Provides: bundled(golang(golang.org/x/telemetry)) = 0.0.0.20240828213427.40b6b7fe7147
+Provides: bundled(golang(golang.org/x/term)) = 0.20.0
+Provides: bundled(golang(golang.org/x/text)) = 0.16.0
+Provides: bundled(golang(golang.org/x/tools)) = 0.22.1.0.20240618181713.f2d2ebe43e72
+Provides: bundled(golang(rsc.io/markdown)) = 0.0.0.20240306144322.0bf8f97ee8ef
+
+Provides: %{name}-bin = %{version}-%{release}
+Obsoletes: %{name}-bin
+Obsoletes: %{name}-shared
+Obsoletes: %{name}-docs
+Obsoletes: %{name}-data < 1.1.1-4
+Obsoletes: %{name}-vim < 1.4
+Obsoletes: emacs-%{name} < 1.4
+Requires: %{vendor}-rpm-config
+
+Patch1000: 1000-all-implement-plugin-build-mode-for-riscv64.patch
+Patch1001: 1001-cmd-link-cmd-internal-add-R_GOT_PCREL_ITYPE_RELOC-fo.patch
+Patch1002: 1002-cmd-compile-don-t-merge-symbols-on-riscv64-when-dyna.patch
+
+Patch9001: 0001-fix-asan_test-test-case-failure.patch
+
+ExclusiveArch: %{golang_arches}
+
+%description
+%{summary}.
+
+%package help
+Summary: Golang compiler helps and manual docs
+Requires: %{name} = %{version}-%{release}
+BuildArch: noarch
+Provides: %{name}-docs = %{version}-%{release}
+Obsoletes: %{name}-docs < %{version}-%{release}
+Provides: %{name}-shared = %{version}-%{release}
+Obsoletes: %{name}-shared < %{version}-%{release}
+
+%description help
+%{summary}.
+
+%package devel
+Summary: Golang compiler devel
+BuildArch: noarch
+Requires: %{name} = %{version}-%{release}
+Provides: %{name}-src = %{version}-%{release}
+Obsoletes: %{name}-src < %{version}-%{release}
+Provides: %{name}-tests = %{version}-%{release}
+Obsoletes: %{name}-tests < %{version}-%{release}
+Provides: %{name}-misc = %{version}-%{release}
+Obsoletes: %{name}-misc < %{version}-%{release}
+Obsoletes: %{name}-race = %{version}-%{release}
+
+%description devel
+%{summary}.
+
+# Workaround old RPM bug of symlink-replaced-with-dir failure
+%pretrans -p <lua>
+for _,d in pairs({"api", "doc", "include", "lib", "src"}) do
+ path = "%{goroot}/" .. d
+ if posix.stat(path, "type") == "link" then
+ os.remove(path)
+ posix.mkdir(path)
+ end
+end
+
+%prep
+%autosetup -n go -p1
+
+%build
+uname -a
+cat /proc/cpuinfo
+cat /proc/meminfo
+
+%if !%{golang_bootstrap}
+export GOROOT_BOOTSTRAP=/
+%else
+export GOROOT_BOOTSTRAP=%{goroot}
+%endif
+
+export GOROOT_FINAL=%{goroot}
+export GOHOSTOS=linux
+export GOHOSTARCH=%{gohostarch}
+
+pushd src
+export CFLAGS="$RPM_OPT_FLAGS"
+export LDFLAGS="$RPM_LD_FLAGS"
+export CC="gcc"
+export CC_FOR_TARGET="gcc"
+export GOOS=linux
+export GOARCH=%{gohostarch}
+%if !%{external_linker}
+export GO_LDFLAGS="-linkmode internal"
+%endif
+%if !%{cgo_enabled}
+export CGO_ENABLED=0
+%endif
+
+%ifarch aarch64
+export GO_LDFLAGS="-s -w"
+%endif
+
+./make.bash --no-clean -v
+popd
+
+%if %{shared}
+GOROOT=$(pwd) PATH=$(pwd)/bin:$PATH go install -buildmode=shared -v -x std
+%endif
+
+%if %{race}
+GOROOT=$(pwd) PATH=$(pwd)/bin:$PATH go install -race -v -x std
+%endif
+
+%install
+rm -rf %{buildroot}
+rm -rf pkg/obj/go-build/*
+
+mkdir -p %{buildroot}%{_bindir}
+mkdir -p %{buildroot}%{goroot}
+
+cp -apv api bin doc lib pkg src misc test go.env VERSION \
+ %{buildroot}%{goroot}
+
+# bz1099206
+find %{buildroot}%{goroot}/src -exec touch -r %{buildroot}%{goroot}/VERSION "{}" \;
+# and level out all the built archives
+touch %{buildroot}%{goroot}/pkg
+find %{buildroot}%{goroot}/pkg -exec touch -r %{buildroot}%{goroot}/pkg "{}" \;
+# generate the spec file ownership of this source tree and packages
+cwd=$(pwd)
+src_list=$cwd/go-src.list
+pkg_list=$cwd/go-pkg.list
+shared_list=$cwd/go-shared.list
+race_list=$cwd/go-race.list
+misc_list=$cwd/go-misc.list
+docs_list=$cwd/go-docs.list
+tests_list=$cwd/go-tests.list
+rm -f $src_list $pkg_list $docs_list $misc_list $tests_list $shared_list $race_list
+touch $src_list $pkg_list $docs_list $misc_list $tests_list $shared_list $race_list
+pushd %{buildroot}%{goroot}
+ find src/ -type d -a \( ! -name testdata -a ! -ipath '*/testdata/*' \) -printf '%%%dir %{goroot}/%p\n' >> $src_list
+ find src/ ! -type d -a \( ! -ipath '*/testdata/*' -a ! -name '*_test.go' \) -printf '%{goroot}/%p\n' >> $src_list
+
+ find bin/ pkg/ -type d -a ! -path '*_dynlink/*' -a ! -path '*_race/*' -printf '%%%dir %{goroot}/%p\n' >> $pkg_list
+ find bin/ pkg/ ! -type d -a ! -path '*_dynlink/*' -a ! -path '*_race/*' -printf '%{goroot}/%p\n' >> $pkg_list
+
+ find doc/ -type d -printf '%%%dir %{goroot}/%p\n' >> $docs_list
+ find doc/ ! -type d -printf '%{goroot}/%p\n' >> $docs_list
+
+ find misc/ -type d -printf '%%%dir %{goroot}/%p\n' >> $misc_list
+ find misc/ ! -type d -printf '%{goroot}/%p\n' >> $misc_list
+
+%if %{shared}
+ mkdir -p %{buildroot}/%{_libdir}/
+ mkdir -p %{buildroot}/%{golibdir}/
+ for file in $(find . -iname "*.so" ); do
+ chmod 755 $file
+ mv $file %{buildroot}/%{golibdir}
+ pushd $(dirname $file)
+ ln -fs %{golibdir}/$(basename $file) $(basename $file)
+ popd
+ echo "%%{goroot}/$file" >> $shared_list
+ echo "%%{golibdir}/$(basename $file)" >> $shared_list
+ done
+
+ find pkg/*_dynlink/ -type d -printf '%%%dir %{goroot}/%p\n' >> $shared_list
+ find pkg/*_dynlink/ ! -type d -printf '%{goroot}/%p\n' >> $shared_list
+%endif
+
+%if %{race}
+
+ find pkg/*_race/ -type d -printf '%%%dir %{goroot}/%p\n' >> $race_list
+ find pkg/*_race/ ! -type d -printf '%{goroot}/%p\n' >> $race_list
+
+%endif
+
+ find test/ -type d -printf '%%%dir %{goroot}/%p\n' >> $tests_list
+ find test/ ! -type d -printf '%{goroot}/%p\n' >> $tests_list
+ find src/ -type d -a \( -name testdata -o -ipath '*/testdata/*' \) -printf '%%%dir %{goroot}/%p\n' >> $tests_list
+ find src/ ! -type d -a \( -ipath '*/testdata/*' -o -name '*_test.go' \) -printf '%{goroot}/%p\n' >> $tests_list
+ # this is only the zoneinfo.zip
+ find lib/ -type d -printf '%%%dir %{goroot}/%p\n' >> $tests_list
+ find lib/ ! -type d -printf '%{goroot}/%p\n' >> $tests_list
+popd
+
+rm -rfv %{buildroot}%{goroot}/doc/Makefile
+
+mkdir -p %{buildroot}%{goroot}/bin/linux_%{gohostarch}
+ln -sf %{goroot}/bin/go %{buildroot}%{goroot}/bin/linux_%{gohostarch}/go
+ln -sf %{goroot}/bin/gofmt %{buildroot}%{goroot}/bin/linux_%{gohostarch}/gofmt
+
+mkdir -p %{buildroot}%{gopath}/src/github.com
+mkdir -p %{buildroot}%{gopath}/src/bitbucket.org
+mkdir -p %{buildroot}%{gopath}/src/code.google.com/p
+mkdir -p %{buildroot}%{gopath}/src/golang.org/x
+
+%check
+export GOROOT=$(pwd -P)
+export PATH="$GOROOT"/bin:"$PATH"
+cd src
+
+export CC="gcc"
+export CFLAGS="$RPM_OPT_FLAGS"
+export LDFLAGS="$RPM_LD_FLAGS"
+%if !%{external_linker}
+export GO_LDFLAGS="-linkmode internal"
+%endif
+%if !%{cgo_enabled} || !%{external_linker}
+export CGO_ENABLED=0
+%endif
+
+export GO_TEST_TIMEOUT_SCALE=10
+
+%if %{fail_on_tests}
+echo tests ignored
+%else
+./run.bash --no-rebuild -v -k -run='!(cmd/go|go/build|cmd/internal/testdir|cmd/link|cmd/nm|cmd/cgo/internal/testlife|cmd/cgo/internal/teststdio|cmd/cgo/internal/testerrors|tyepparams|race|flag|cgo_stdio|cgo_life|cgo_errors|test:0_1|api)'
+%endif
+cd ..
+
+%post
+%{_sbindir}/update-alternatives --install %{_bindir}/go \
+ go %{goroot}/bin/go 90 \
+ --slave %{_bindir}/gofmt gofmt %{goroot}/bin/gofmt
+
+%preun
+if [ $1 = 0 ]; then
+ %{_sbindir}/update-alternatives --remove go %{goroot}/bin/go
+fi
+
+%if %{shared}
+%files -f go-pkg.list -f go-shared.list
+%else
+%files -f go-pkg.list
+%endif
+
+%doc LICENSE PATENTS
+%doc %{goroot}/VERSION
+%dir %{goroot}/doc
+%doc %{goroot}/doc/*
+%dir %{goroot}
+%exclude %{goroot}/src/
+%exclude %{goroot}/doc/
+%exclude %{goroot}/misc/
+%exclude %{goroot}/test/
+%exclude %{goroot}/lib/
+%{goroot}/*
+%dir %{gopath}
+%dir %{gopath}/src
+%dir %{gopath}/src/github.com/
+%dir %{gopath}/src/bitbucket.org/
+%dir %{gopath}/src/code.google.com/
+%dir %{gopath}/src/code.google.com/p/
+%dir %{gopath}/src/golang.org
+%dir %{gopath}/src/golang.org/x
+
+%files help -f go-docs.list
+
+%files devel -f go-tests.list -f go-misc.list -f go-src.list
+
+%changelog
+* Mon Apr 07 2025 Suyun <ziyu.oerv@isrc.iscas.ac.cn> - 1.23.7-33
+- Increase GO_TEST_TIMEOUT_SCALE to fix tests on riscv64
+
+* Tue Mar 25 2025 Suyun <ziyu.oerv@isrc.iscas.ac.cn> - 1.23.7-32
+- Update to 1.23.7
+- Backport several patches for riscv64
+
+* Fri Mar 14 2025 changtao <changtao@kylinos.cn> - 1.21.4-32
+- Type:CVE
+- CVE:CVE-2025-22870
+- SUG:NA
+- DESC:fix CVE-2025-22870
+
+* Wed Feb 19 2025 hanchao <hanchao63@huawei.com> - 1.21.4-31
+- Type:CVE
+- CVE:CVE-2024-45336,CVE-2024-45341
+- SUG:NA
+- DESC:fix CVE-2024-45336,CVE-2024-45341
+
+* Sun Jan 26 2025 Vanient <xiadanni1@huawei.com> - 1.21.4-30
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC: allow update of system stack bounds on callback from C thread
+
+* Thu Jan 16 2025 wangshuo <wangshuo@kylinos.cn> - 1.21.4-29
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:crypto/tls: fix Config.Time in tests using expired certificates
+
+* Fri Dec 06 2024 Vanient <xiadanni1@huawei.com> - 1.21.4-28
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:add race annotations in IncNonDefault
+
+* Thu Dec 05 2024 hewenliang <314264452@qq.com> - 1.21.4-27
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:put ReadMemStats debug assertions behind a double-check mode
+
+* Mon Nov 18 2024 Vanient <xiadanni1@huawei.com> - 1.21.4-26
+- runtime: add the disablethp GODEBUG setting
+
+* Tue Nov 5 2024 wangshuo <wangshuo@kylinos.cn> - 1.21.4-25
+- Type:CVE
+- CVE:CVE-2024-34158
+- SUG:NA
+- DESC:fix CVE-2024-34158
+
+* Mon Nov 04 2024 wangshuo <wangshuo@kylinops.cn> - 1.21.4-24
+- Type:CVE
+- CVE:CVE-2024-34156
+- SUG:NA
+- DESC:fix CVE-2024-34156
+- optimize the names of the first two patch files
+
+* Thu Oct 10 2024 EulerOSWander <314264452@qq.com> - 1.21.4-23
+- runtime/pprof: fix generics functions names
+
+*Sat Oct 5 2024 Yu Peng <yupeng@kylinos.cn> - 1.21.4-22
+- fix CVE-2024-34155
+
+* Thu Sep 19 2024 Vanient <xiadanni1@huawei.com> - 1.21.4-21
+- cmd/compile: fix escape analysis of string min/max
+
+* Thu Aug 1 2024 EulerOSWander <314264452@qq.com> - 1.21.4-20
+- cmd/compile: fix findIndVar so it does not match disjointed loop headers
+
+* Thu Aug 1 2024 EulerOSWander <314264452@qq.com> - 1.21.4-19
+- runtime: call enableMetadataHugePages and its callees on the systemstack
+
+* Thu Aug 1 2024 EulerOSWander <314264452@qq.com> - 1.21.4-18
+- internal/poll:add SPLICE_F_NONBLOCK flag for splice to avoid insonsistency with O_NONBLOCK
+
+* Mon Jul 30 2024 jingxiaolu <lujingxiao@huawei.com> - 1.21.4-17
+- cmd/compile: ensure pointer arithmetic happens after the nil check
+
+* Mon Jul 30 2024 jingxiaolu <lujingxiao@huawei.com> - 1.21.4-16
+- cmd/compile: handle constant pointer offsets in dead store elimination
+
+* Mon Jul 29 2024 EulerOSWander <314264452@qq.com> - 1.21.4-15
+- fix send correct lastStreamID in stream-caused GOAWAY
+
+* Wed Jul 03 2024 kywqs <weiqingsong@kylinos.cn.com> - 1.21.4-14
+- fix CVE-2024-24791
+
+* Sun Jun 23 2024 hanchao <hanchao63@huawei.com> - 1.21.4-13
+- Type:CVE
+- CVE:CVE-2023-39326,CVE-2024-24789
+- SUG:NA
+- DESC:fix CVE-2023-39326,CVE-2024-24789
+
+* Fri Jun 21 2024 EulerOSWander <314264452@qq.com> - 1.21.4-12
+- fix CVE-2023-45285
+
+* Thu Jun 13 2024 Zhao Mengmeng <zhaomengmeng@kylinos.cn> - 1.21.4-11
+- fix CVE-2024-24790
+
+* Tue Jun 11 2024 chenguoqi <chenguoqi@loongson.cn> - 1.21.4-10
+- Fix missing go.env file
+
+* Thu May 23 2024 <314264452@qq.com> - 1.21.4-9
+- fix CVE-2024-24787
+
+* Thu Apr 18 2024 Huang Yang <huangyang@loongson.cn> - 1.21.4-8
+- enable external_linker and cgo on loongarch64
+
+* Tue Apr 16 2024 hanchao <hanchao63@huawei.com> - 1.21.4-7
+- fix CVE-2023-45288
+
+* Thu Mar 28 2024 hanchao <hanchao63@huawei.com> - 1.21.4-6
+- fix CVE-2024-24784
+
+* Thu Mar 28 2024 hanchao <hanchao63@huawei.com> - 1.21.4-5
+- enabling the patches
+
+* Tue Mar 26 2024 Wenlong Zhang <zhangwenlong@loongson.cn> - 1.21.4-4
+- fix build error for loongarch64
+
+* Fri Mar 15 2024 hanchao <hanchao63@huawei.com> - 1.21.4-3
+- fix CVE-2024-24783,CVE-2024-24785,CVE-2023-45290,CVE-2023-45289
+
+* Wed Dec 13 2023 jiahua.yu <jiahua.yu@shingroup.cn> - 1.21.4-2
+- init support for arch ppc64le
+
+* Tue Dec 5 2023 hanchao <hanchao63@huawei.com> - 1.21.4-1
+- upgrade to 1.21.4
+
+* Thu Aug 24 2023 wanglimin <wanglimin@xfusion.com> - 1.20.7-2
+- permit invalid host header for docker
+
+* Mon Aug 7 2023 Funda Wang <fundawang@yeah.net> - 1.20.7-1
+- New version 1.20.7
+
+* Sun Jul 30 2023 Funda Wang <fundawang@yeah.net> - 1.20.5-3
+- Use local proxy and sumdb for speed up
+
+* Tue Jul 11 2023 hanchao <sunchendong@xfusion.com> - 1.20.5-2
+- fix CVE-2023-29406
+
+* Wed Jun 21 2023 hanchao <hanchao63@huawei.com> - 1.20.5-1
+- upgrade to 1.20.5
diff --git a/sources b/sources
new file mode 100644
index 0000000..12d0d08
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+3f8422d17739e427e11837389771c974 go1.23.7.src.tar.gz