summaryrefslogtreecommitdiffstats
path: root/debian/patches/0003-cmd-go-cmd-cgo-pass-mfp32-and-mhard-soft-float-to-MI.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/0003-cmd-go-cmd-cgo-pass-mfp32-and-mhard-soft-float-to-MI.patch')
-rw-r--r--debian/patches/0003-cmd-go-cmd-cgo-pass-mfp32-and-mhard-soft-float-to-MI.patch100
1 files changed, 100 insertions, 0 deletions
diff --git a/debian/patches/0003-cmd-go-cmd-cgo-pass-mfp32-and-mhard-soft-float-to-MI.patch b/debian/patches/0003-cmd-go-cmd-cgo-pass-mfp32-and-mhard-soft-float-to-MI.patch
new file mode 100644
index 0000000..ba0e33c
--- /dev/null
+++ b/debian/patches/0003-cmd-go-cmd-cgo-pass-mfp32-and-mhard-soft-float-to-MI.patch
@@ -0,0 +1,100 @@
+From: YunQiang Su <wzssyqa@gmail.com>
+Date: Tue, 9 Jun 2020 04:09:58 +0000
+Subject: cmd/go, cmd/cgo: pass -mfp32 and -mhard/soft-float to MIPS GCC
+
+For mips32 currently, we are using FP32, while the gcc may be FPXX,
+which may generate .MIPS.abiflags and .gnu.attributes section with
+value as FPXX. So the kernel will treat the exe as FPXX, and may
+choose to use FR=1 FPU mode for it.
+Currently, in Go, we use 2 lwc1 to load both half of a double value
+to a pair of even-odd FPR. This behavior can only work with FR=0 mode.
+
+In FR=1 mode, all of 32 FPR are 64bit. If we lwc1 the high-half of a double
+value to an odd FPR, and try to use the previous even FPR to compute, the
+real high-half of even FPR will be unpredicatable.
+We set -mfp32 to force the gcc generate FP32 code and section value.
+
+More details about FP32/FPXX/FP64 are explained in:
+https://web.archive.org/web/20180828210612/https://dmz-portal.mips.com/wiki/MIPS_O32_ABI_-_FR0_and_FR1_Interlinking
+
+When GOMIPS/GOMIPS64 is set as softfloat, we should also pass
+ -msoft-float to gcc.
+
+Here we also add -mno-odd-spreg option, since Loongson's CPU cannot use
+odd-number FR in FR=0 mode.
+
+Fixes #39435
+
+Change-Id: I54026ad416a815fe43a9261ebf6d02e5519c3930
+---
+ src/cmd/cgo/gcc.go | 12 ++++++++++--
+ src/cmd/cgo/main.go | 4 +++-
+ src/cmd/go/internal/work/exec.go | 14 ++++++++++++--
+ 3 files changed, 25 insertions(+), 5 deletions(-)
+
+--- a/src/cmd/cgo/gcc.go
++++ b/src/cmd/cgo/gcc.go
+@@ -1566,9 +1566,17 @@
+ case "s390x":
+ return []string{"-m64"}
+ case "mips64", "mips64le":
+- return []string{"-mabi=64"}
++ if gomips64 == "hardfloat" {
++ return []string{"-mabi=64", "-mhard-float"}
++ } else if gomips64 == "softfloat" {
++ return []string{"-mabi=64", "-msoft-float"}
++ }
+ case "mips", "mipsle":
+- return []string{"-mabi=32"}
++ if gomips == "hardfloat" {
++ return []string{"-mabi=32", "-mfp32", "-mhard-float", "-mno-odd-spreg"}
++ } else if gomips == "softfloat" {
++ return []string{"-mabi=32", "-msoft-float"}
++ }
+ }
+ return nil
+ }
+--- a/src/cmd/cgo/main.go
++++ b/src/cmd/cgo/main.go
+@@ -245,7 +245,7 @@
+ var importSyscall = flag.Bool("import_syscall", true, "import syscall in generated code")
+ var trimpath = flag.String("trimpath", "", "applies supplied rewrites or trims prefixes to recorded source file paths")
+
+-var goarch, goos string
++var goarch, goos, gomips, gomips64 string
+
+ func main() {
+ objabi.AddVersionFlag() // -V
+@@ -405,6 +405,8 @@
+ if s := os.Getenv("GOOS"); s != "" {
+ goos = s
+ }
++ gomips = objabi.GOMIPS
++ gomips64 = objabi.GOMIPS64
+ ptrSize := ptrSizeMap[goarch]
+ if ptrSize == 0 {
+ fatalf("unknown ptrSize for $GOARCH %q", goarch)
+--- a/src/cmd/go/internal/work/exec.go
++++ b/src/cmd/go/internal/work/exec.go
+@@ -2598,9 +2598,19 @@
+ case "s390x":
+ return []string{"-m64", "-march=z196"}
+ case "mips64", "mips64le":
+- return []string{"-mabi=64"}
++ args := []string{"-mabi=64"}
++ if cfg.GOMIPS64 == "hardfloat" {
++ return append(args, "-mhard-float")
++ } else if cfg.GOMIPS64 == "softfloat" {
++ return append(args, "-msoft-float")
++ }
+ case "mips", "mipsle":
+- return []string{"-mabi=32", "-march=mips32"}
++ args := []string{"-mabi=32", "-march=mips32"}
++ if cfg.GOMIPS == "hardfloat" {
++ return append(args, "-mhard-float", "-mfp32", "-mno-odd-spreg")
++ } else if cfg.GOMIPS == "softfloat" {
++ return append(args, "-msoft-float")
++ }
+ case "ppc64":
+ if cfg.Goos == "aix" {
+ return []string{"-maix64"}