Go: cmd/compile: R12 can be clobbered for write barrier call on PPC64

Created on 18 Aug 2020  路  10Comments  路  Source: golang/go

Most Go function calls potentially clobber all registers, except a small set of special ones, including the write barrier call. Currently, on PPC64, the write barrier call is marked as preserving R0, R3-R15 (except R13), and R20, R11. In external linking mode, for large binaries, the external linker may insert a trampoline for the write barrier call, which looks like

0000000005a98cc8 <__long_branch_runtime.gcWriteBarrier>:
 5a98cc8:       86 01 82 3d     addis   r12,r2,390
 5a98ccc:       d8 bd 8c e9     ld      r12,-16936(r12)
 5a98cd0:       a6 03 89 7d     mtctr   r12
 5a98cd4:       20 04 80 4e     bctr

It clobbers R12 (and CTR, which is never live across a call).

As at compile time we don't know whether the binary is big and what link mode will be used, I think we need to mark R12 as clobbered for write barrier call. I'll send a CL.

(Internal linking mode is okay, as the trampoline emitted by Go linker uses R31, the dedicated temp register, instead of R12.)

It has been like that several releases ago. I think we may want to back port, as there could cause runtime crash or data corruption without workaround.

NeedsFix arch-ppc64x

All 10 comments

Change https://golang.org/cl/248917 mentions this issue: cmd/compile, runtime: mark R12 clobbered for write barrier call on PPC64

@ianlancetaylor pointed out that for future-proof, the external linker could clobber any caller-saved register that cannot be used for function arguments, that also includes R11. We could consider marking R11 as clobbered as well.

@gopherbot please consider backporting this to Go 1.15. Thanks.

Backport issue(s) opened: #40868 (for 1.15).

Remember to create the cherry-pick CL(s) as soon as the patch is submitted to master, according to https://golang.org/wiki/MinorReleases.

Change https://golang.org/cl/249019 mentions this issue: [release-branch.go1.15] cmd/compile, runtime: mark R12 clobbered for write barrier call on PPC64

@cherrymui , does this also need a 1.14 backport? I'm pretty sure it does.

Yeah, I think it also has this problem in Go 1.14.

@gopherbot please consider backporting this to Go 1.14. Thanks.

GopherBot is lazy (#25574), so I'm afraid you'll have to open the 1.14 backport issue by hand.

Change https://golang.org/cl/249697 mentions this issue: [release-branch.go1.14] cmd/compile, runtime: mark R12 clobbered for write barrier call on PPC64

Was this page helpful?
0 / 5 - 0 ratings