diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 43ef33bdfee..24cb200175c 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -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 diff --git a/test/defererrcheck.go b/test/defererrcheck.go index 95b91da54db..e0b8ab895fa 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"