]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj, runtime: use register map to mark unsafe points
authorCherry Zhang <cherryyz@google.com>
Thu, 14 Nov 2019 22:03:44 +0000 (17:03 -0500)
committerCherry Zhang <cherryyz@google.com>
Wed, 27 Nov 2019 01:29:00 +0000 (01:29 +0000)
Currently we use stack map index -2 to mark unsafe points, i.e.
PC ranges that is not safe for async preemption. This has a
problem: it cannot mark CALL instructions, because for stack scan
a valid stack map index is needed.

This CL switches to use register map index for marking unsafe
points instead, which does not conflict with stack scan and can
be applied on CALL instructions. This is necessary as next CL
will mark call to morestack nonpreemptible.

For #35470.

Change-Id: I357bf26c996e1fee1e7eebe4e6bb07d62930d3f7
Reviewed-on: https://go-review.googlesource.com/c/go/+/207349
Reviewed-by: David Chase <drchase@google.com>
src/cmd/internal/obj/plist.go
src/runtime/preempt.go

index fb592011e16b59ee66367bbb73d906deccc24395..8c9b803632e937c23e65d01eedee620a9fb54f55 100644 (file)
@@ -215,12 +215,10 @@ func (ctxt *Link) StartUnsafePoint(p *Prog, newprog ProgAlloc) *Prog {
        pcdata := Appendp(p, newprog)
        pcdata.As = APCDATA
        pcdata.From.Type = TYPE_CONST
-       pcdata.From.Offset = objabi.PCDATA_StackMapIndex
+       pcdata.From.Offset = objabi.PCDATA_RegMapIndex
        pcdata.To.Type = TYPE_CONST
        pcdata.To.Offset = -2 // pcdata -2 marks unsafe point
 
-       // TODO: register map?
-
        return pcdata
 }
 
@@ -232,7 +230,7 @@ func (ctxt *Link) EndUnsafePoint(p *Prog, newprog ProgAlloc, oldval int64) *Prog
        pcdata := Appendp(p, newprog)
        pcdata.As = APCDATA
        pcdata.From.Type = TYPE_CONST
-       pcdata.From.Offset = objabi.PCDATA_StackMapIndex
+       pcdata.From.Offset = objabi.PCDATA_RegMapIndex
        pcdata.To.Type = TYPE_CONST
        pcdata.To.Offset = oldval
 
@@ -248,7 +246,7 @@ func MarkUnsafePoints(ctxt *Link, p0 *Prog, newprog ProgAlloc, isUnsafePoint fun
        prev := p0
        oldval := int64(-1) // entry pcdata
        for p := prev.Link; p != nil; p, prev = p.Link, p {
-               if p.As == APCDATA && p.From.Offset == objabi.PCDATA_StackMapIndex {
+               if p.As == APCDATA && p.From.Offset == objabi.PCDATA_RegMapIndex {
                        oldval = p.To.Offset
                        continue
                }
index 60e1bcef5fa2a94ab0b3163e90dc13586bc2afe7..2c38ac02f51304d6e8637a9c5c782a416d07f533 100644 (file)
@@ -393,7 +393,7 @@ func isAsyncSafePoint(gp *g, pc, sp, lr uintptr) bool {
                // use the LR for unwinding, which will be bad.
                return false
        }
-       smi := pcdatavalue(f, _PCDATA_StackMapIndex, pc, nil)
+       smi := pcdatavalue(f, _PCDATA_RegMapIndex, pc, nil)
        if smi == -2 {
                // Unsafe-point marked by compiler. This includes
                // atomic sequences (e.g., write barrier) and nosplit