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
// 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
// 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"