From 1e8fff0f7b4577dcb7192928e2db4af7a11e9c0e Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 24 Mar 2021 10:32:13 -0400 Subject: [PATCH] cmd/compile: assert that function values reference ABIInternal 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 Run-TryBot: Austin Clements TryBot-Result: Go Bot Reviewed-by: Matthew Dempsky Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/ssagen/ssa.go | 5 +++++ src/cmd/compile/internal/staticdata/data.go | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/ssagen/ssa.go b/src/cmd/compile/internal/ssagen/ssa.go index 18363c1219..42f7887a00 100644 --- a/src/cmd/compile/internal/ssagen/ssa.go +++ b/src/cmd/compile/internal/ssagen/ssa.go @@ -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) diff --git a/src/cmd/compile/internal/staticdata/data.go b/src/cmd/compile/internal/staticdata/data.go index fca2a63eb4..cde4c50026 100644 --- a/src/cmd/compile/internal/staticdata/data.go +++ b/src/cmd/compile/internal/staticdata/data.go @@ -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) } }