]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: disable open-coded defers on riscv64
authorJoel Sing <joel@sing.id.au>
Sun, 26 Jan 2020 22:32:52 +0000 (09:32 +1100)
committerJoel Sing <joel@sing.id.au>
Tue, 28 Jan 2020 02:40:44 +0000 (02:40 +0000)
Open-coded defers are currently broken on riscv64 - disable them for the
time being. All of the standard package tests now pass on linux/riscv64.

Updates issue #27532 and #36786

Change-Id: I20fc25ce91dfad48be32409ba5c64ca9a6acef1d
Reviewed-on: https://go-review.googlesource.com/c/go/+/216517
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Dan Scales <danscales@google.com>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/ssa.go
test/defererrcheck.go

index 43ef33bdfeeda22e3c96edef9cc353a8870597ae..24cb200175c863740b3d7ce6c99fc34cb80f9f59 100644 (file)
@@ -340,12 +340,17 @@ func buildssa(fn *Node, worker int) *ssa.Func {
        s.startmem = s.entryNewValue0(ssa.OpInitMem, types.TypeMem)
 
        s.hasOpenDefers = Debug['N'] == 0 && s.hasdefer && !s.curfn.Func.OpenCodedDeferDisallowed()
-       if s.hasOpenDefers && (Ctxt.Flag_shared || Ctxt.Flag_dynlink) && thearch.LinkArch.Name == "386" {
+       switch {
+       case s.hasOpenDefers && (Ctxt.Flag_shared || Ctxt.Flag_dynlink) && thearch.LinkArch.Name == "386":
                // Don't support open-coded defers for 386 ONLY when using shared
                // libraries, because there is extra code (added by rewriteToUseGot())
                // preceding the deferreturn/ret code that is generated by gencallret()
                // that we don't track correctly.
                s.hasOpenDefers = false
+       case thearch.LinkArch.Name == "riscv64":
+               // The use of open-coded defers is currently broken on riscv64,
+               // hence disable it for now - see issue golang.org/issue/36786
+               s.hasOpenDefers = false
        }
        if s.hasOpenDefers && s.curfn.Func.Exit.Len() > 0 {
                // Skip doing open defers if there is any extra exit code (likely
index 95b91da54db987b5f0746669f4d5db6389022a87..e0b8ab895fa17a78c4bd697bf4cff73f3e4756f1 100644 (file)
@@ -1,4 +1,5 @@
 // errorcheck -0 -l -d=defer
+// +build !riscv64
 
 // Copyright 2019 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
@@ -6,6 +7,9 @@
 
 // check that open-coded defers are used in expected situations
 
+// TODO(jsing): Re-enable on riscv64 once open-coded defers are turned
+// back on - see golang.org/issue/36786
+
 package main
 
 import "fmt"