]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: assert that function values reference ABIInternal
authorAustin Clements <austin@google.com>
Wed, 24 Mar 2021 14:32:13 +0000 (10:32 -0400)
committerAustin Clements <austin@google.com>
Mon, 29 Mar 2021 18:46:30 +0000 (18:46 +0000)
Function values must always point to the ABIInternal entry point of a
function. It wasn't entirely obvious to me we were getting this right,
so this CL adds checks for this.

Updates #40724.

Change-Id: Idd854e996d63d9151c28ec5c9251b690453b1024
Reviewed-on: https://go-review.googlesource.com/c/go/+/305272
Trust: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/ssagen/ssa.go
src/cmd/compile/internal/staticdata/data.go

index 18363c12191d9fb192cfc04a88039955c9b0202c..42f7887a009206f0ef47711abacd4486ea84e15f 100644 (file)
@@ -2360,6 +2360,11 @@ func (s *state) expr(n ir.Node) *ssa.Value {
        case ir.OCFUNC:
                n := n.(*ir.UnaryExpr)
                aux := n.X.(*ir.Name).Linksym()
+               // OCFUNC is used to build function values, which must
+               // always reference ABIInternal entry points.
+               if aux.ABI() != obj.ABIInternal {
+                       s.Fatalf("expected ABIInternal: %v", aux.ABI())
+               }
                return s.entryNewValue1A(ssa.OpAddr, n.Type(), aux, s.sb)
        case ir.ONAME:
                n := n.(*ir.Name)
index fca2a63eb4b601720b0a7335ff6de51279833fab..cde4c50026e545cdb493a67c3dbd3c67fff7e801 100644 (file)
@@ -292,7 +292,13 @@ func WriteFuncSyms() {
        for _, nam := range funcsyms {
                s := nam.Sym()
                sf := s.Pkg.Lookup(ir.FuncSymName(s)).Linksym()
-               objw.SymPtr(sf, 0, s.Linksym(), 0)
+               // Function values must always reference ABIInternal
+               // entry points.
+               target := s.Linksym()
+               if target.ABI() != obj.ABIInternal {
+                       base.Fatalf("expected ABIInternal: %v has %v", target, target.ABI())
+               }
+               objw.SymPtr(sf, 0, target, 0)
                objw.Global(sf, int32(types.PtrSize), obj.DUPOK|obj.RODATA)
        }
 }