From: Joel Sing Date: Sun, 26 Jan 2020 22:32:52 +0000 (+1100) Subject: cmd/compile: disable open-coded defers on riscv64 X-Git-Tag: go1.14rc1~51 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a858d15f11f87b53792a6afb156716b80f9634c7;p=gostls13.git 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 Reviewed-by: Dan Scales Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 43ef33bdfe..24cb200175 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 95b91da54d..e0b8ab895f 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"