aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2021-10-01 16:25:32 -0700
committerJosh Bleecher Snyder <josharian@gmail.com>2021-10-04 22:45:17 +0000
commitc2483a5c034152fcdfbb2e6dbcf48b0103d8db6a (patch)
tree1130f6445995ef8a7915c252cd88fb392cb4be9e /src/cmd/internal
parenta8d78fae95d5a8a09e248ce4d26f04b38791a7b6 (diff)
downloadgo-c2483a5c034152fcdfbb2e6dbcf48b0103d8db6a.tar.gz
go-c2483a5c034152fcdfbb2e6dbcf48b0103d8db6a.zip
cmd, runtime: eliminate runtime.no_pointers_stackmap
runtime.no_pointers_stackmap is an odd beast. It is defined in a Go file, populated by assembly, used by the GC, and its address is magic used by async pre-emption to ascertain whether a routine was implemented in assembly. A subsequent change will force all GC data into the go.func.* linker symbol. runtime.no_pointers_stackmap is GC data, so it must go there. Yet it also needs to go into rodata, for the runtime address trick. This change eliminates it entirely. Replace the runtime address check with the newly introduced asm funcflag. Handle the assembly macro as magic, similarly to our handling of go_args_stackmap. This allows the no_pointers_stackmap to be identical in all ways to other gclocals stackmaps, including content-addressability. Change-Id: Id2f20a262cfab0719beb88e6342984ec4b196268 Reviewed-on: https://go-review.googlesource.com/c/go/+/353672 Trust: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Cherry Mui <cherryyz@google.com>
Diffstat (limited to 'src/cmd/internal')
-rw-r--r--src/cmd/internal/obj/plist.go19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go
index 348a16356e..e5bbdd51a7 100644
--- a/src/cmd/internal/obj/plist.go
+++ b/src/cmd/internal/obj/plist.go
@@ -54,11 +54,28 @@ func Flushplist(ctxt *Link, plist *Plist, newprog ProgAlloc, myimportpath string
if curtext == nil { // func _() {}
continue
}
- if p.To.Sym.Name == "go_args_stackmap" {
+ switch p.To.Sym.Name {
+ case "go_args_stackmap":
if p.From.Type != TYPE_CONST || p.From.Offset != objabi.FUNCDATA_ArgsPointerMaps {
ctxt.Diag("FUNCDATA use of go_args_stackmap(SB) without FUNCDATA_ArgsPointerMaps")
}
p.To.Sym = ctxt.LookupDerived(curtext, curtext.Name+".args_stackmap")
+ case "no_pointers_stackmap":
+ if p.From.Type != TYPE_CONST || p.From.Offset != objabi.FUNCDATA_LocalsPointerMaps {
+ ctxt.Diag("FUNCDATA use of no_pointers_stackmap(SB) without FUNCDATA_LocalsPointerMaps")
+ }
+ // funcdata for functions with no local variables in frame.
+ // Define two zero-length bitmaps, because the same index is used
+ // for the local variables as for the argument frame, and assembly
+ // frames have two argument bitmaps, one without results and one with results.
+ // Write []uint32{2, 0}.
+ b := make([]byte, 8)
+ ctxt.Arch.ByteOrder.PutUint32(b, 2)
+ s := ctxt.GCLocalsSym(b)
+ if !s.OnList() {
+ ctxt.Globl(s, int64(len(s.P)), int(RODATA|DUPOK))
+ }
+ p.To.Sym = s
}
}