Matthew Dempsky 62f88b6dc8 cmd/compile: add types.RecalcSize
This is the only case where Align is assigned outside of package
types. Rather than adding a SetAlign method, adding a RecalcSize
function is a bit more descriptive.

Change-Id: I1b3c01ebd0e41183665baa63c926592865bbbd0b
Reviewed-on: https://go-review.googlesource.com/c/go/+/345479
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
2021-08-27 00:36:54 +00:00

74 lines
1.9 KiB
Go

// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package noder
import (
"cmd/compile/internal/base"
"cmd/compile/internal/ir"
"cmd/compile/internal/syntax"
"cmd/compile/internal/typecheck"
"cmd/compile/internal/types"
"cmd/internal/src"
)
func (g *irgen) funcBody(fn *ir.Func, recv *syntax.Field, sig *syntax.FuncType, block *syntax.BlockStmt) {
typecheck.Func(fn)
// TODO(mdempsky): Remove uses of ir.CurFunc and
// typecheck.DeclContext after we stop relying on typecheck
// for desugaring.
outerfn, outerctxt := ir.CurFunc, typecheck.DeclContext
ir.CurFunc = fn
typ := fn.Type()
if param := typ.Recv(); param != nil {
g.defParam(param, recv, ir.PPARAM)
}
for i, param := range typ.Params().FieldSlice() {
g.defParam(param, sig.ParamList[i], ir.PPARAM)
}
for i, result := range typ.Results().FieldSlice() {
g.defParam(result, sig.ResultList[i], ir.PPARAMOUT)
}
// We may have type-checked a call to this function already and
// calculated its size, including parameter offsets. Now that we've
// created the parameter Names, force a recalculation to ensure
// their offsets are correct.
types.RecalcSize(typ)
if block != nil {
typecheck.DeclContext = ir.PAUTO
fn.Body = g.stmts(block.List)
if fn.Body == nil {
fn.Body = []ir.Node{ir.NewBlockStmt(src.NoXPos, nil)}
}
fn.Endlineno = g.makeXPos(block.Rbrace)
if base.Flag.Dwarf {
g.recordScopes(fn, sig)
}
}
ir.CurFunc, typecheck.DeclContext = outerfn, outerctxt
}
func (g *irgen) defParam(param *types.Field, decl *syntax.Field, class ir.Class) {
typecheck.DeclContext = class
var name *ir.Name
if decl.Name != nil {
name, _ = g.def(decl.Name)
} else if class == ir.PPARAMOUT {
name = g.obj(g.info.Implicits[decl])
}
if name != nil {
param.Nname = name
param.Sym = name.Sym() // in case it was renamed
}
}