cmd/compile: disable open-coded defers on riscv64

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>
diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go
index 43ef33b..24cb200 100644
--- a/src/cmd/compile/internal/gc/ssa.go
+++ b/src/cmd/compile/internal/gc/ssa.go
@@ -340,12 +340,17 @@
 	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
diff --git a/test/defererrcheck.go b/test/defererrcheck.go
index 95b91da..e0b8ab8 100644
--- a/test/defererrcheck.go
+++ b/test/defererrcheck.go
@@ -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"