Skip to content
Browse files

cmd/compile,cmd/link: fix and re-enable open-coded defers on riscv64

The R_CALLRISCV relocation marker is on the JALR instruction, however the actual
relocation is currently two instructions previous for the AUIPC+ADDI sequence.
Adjust the platform dependent offset accordingly and re-enable open-coded defers.

Fixes #36786.

Change-Id: I71597c193c447930fbe94ce44b7355e89ae877bb
Run-TryBot: Joel Sing <>
TryBot-Result: Gobot Gobot <>
Reviewed-by: Cherry Zhang <>
  • Loading branch information
4a6f656c committed Jan 29, 2020
1 parent 1319bb9 commit 2e4f490b31272a2df73d4ba23aad7f5a8ca49a2f
Showing with 7 additions and 10 deletions.
  1. +0 −4 src/cmd/compile/internal/gc/ssa.go
  2. +6 −1 src/cmd/link/internal/ld/pcln.go
  3. +1 −5 test/live.go
@@ -347,10 +347,6 @@ func buildssa(fn *Node, worker int) *ssa.Func {
// 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
s.hasOpenDefers = false
if s.hasOpenDefers && s.curfn.Func.Exit.Len() > 0 {
// Skip doing open defers if there is any extra exit code (likely
@@ -266,8 +266,13 @@ func (ctxt *Link) pclntab() {
switch ctxt.Arch.Family {
case sys.AMD64, sys.I386:
case sys.PPC64, sys.ARM, sys.ARM64, sys.MIPS, sys.MIPS64, sys.RISCV64:
case sys.PPC64, sys.ARM, sys.ARM64, sys.MIPS, sys.MIPS64:
// no change
case sys.RISCV64:
// TODO(jsing): The JALR instruction is marked with
// R_CALLRISCV, whereas the actual reloc is currently
// two instructions earlier for the AUIPC+AADI sequence.
deferreturn -= 8
case sys.S390X:
deferreturn -= 2
@@ -1,13 +1,9 @@
// errorcheckwithauto -0 -l -live -wb=0 -d=ssa/insert_resched_checks/off
// +build !ppc64,!ppc64le,!riscv64
// +build !ppc64,!ppc64le

// ppc64 needs a better tighten pass to make f18 pass
// rescheduling checks need to be turned off because there are some live variables across the inserted check call

// TODO(jsing): these tests assume that open-coded defers are enabled,
// which is not currently the case on riscv64. Re-enable this test once
// open-coded defers are available -

// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

0 comments on commit 2e4f490

Please sign in to comment.
You can’t perform that action at this time.