mirror of
https://github.com/golang/go.git
synced 2025-10-22 12:33:19 +00:00

Now that we have all the getters and setters defined, use them and unexport all the actual Node fields. This is the next step toward replacing Node with an interface. [git-generate] cd src/cmd/compile/internal/gc rf ' ex . ../ir ../ssa { import "cmd/compile/internal/ir" import "cmd/compile/internal/types" import "cmd/internal/src" var n, x *ir.Node var op ir.Op var t *types.Type var f *ir.Func var m *ir.Name var s *types.Sym var p src.XPos var i int64 var e uint16 var nodes ir.Nodes n.Op = op -> n.SetOp(op) n.Left = x -> n.SetLeft(x) n.Right = x -> n.SetRight(x) n.Orig = x -> n.SetOrig(x) n.Type = t -> n.SetType(t) n.Func = f -> n.SetFunc(f) n.Name = m -> n.SetName(m) n.Sym = s -> n.SetSym(s) n.Pos = p -> n.SetPos(p) n.Xoffset = i -> n.SetXoffset(i) n.Esc = e -> n.SetEsc(e) n.Ninit.Append -> n.PtrNinit().Append n.Ninit.AppendNodes -> n.PtrNinit().AppendNodes n.Ninit.MoveNodes -> n.PtrNinit().MoveNodes n.Ninit.Prepend -> n.PtrNinit().Prepend n.Ninit.Set -> n.PtrNinit().Set n.Ninit.Set1 -> n.PtrNinit().Set1 n.Ninit.Set2 -> n.PtrNinit().Set2 n.Ninit.Set3 -> n.PtrNinit().Set3 &n.Ninit -> n.PtrNinit() n.Ninit = nodes -> n.SetNinit(nodes) n.Nbody.Append -> n.PtrNbody().Append n.Nbody.AppendNodes -> n.PtrNbody().AppendNodes n.Nbody.MoveNodes -> n.PtrNbody().MoveNodes n.Nbody.Prepend -> n.PtrNbody().Prepend n.Nbody.Set -> n.PtrNbody().Set n.Nbody.Set1 -> n.PtrNbody().Set1 n.Nbody.Set2 -> n.PtrNbody().Set2 n.Nbody.Set3 -> n.PtrNbody().Set3 &n.Nbody -> n.PtrNbody() n.Nbody = nodes -> n.SetNbody(nodes) n.List.Append -> n.PtrList().Append n.List.AppendNodes -> n.PtrList().AppendNodes n.List.MoveNodes -> n.PtrList().MoveNodes n.List.Prepend -> n.PtrList().Prepend n.List.Set -> n.PtrList().Set n.List.Set1 -> n.PtrList().Set1 n.List.Set2 -> n.PtrList().Set2 n.List.Set3 -> n.PtrList().Set3 &n.List -> n.PtrList() n.List = nodes -> n.SetList(nodes) n.Rlist.Append -> n.PtrRlist().Append n.Rlist.AppendNodes -> n.PtrRlist().AppendNodes n.Rlist.MoveNodes -> n.PtrRlist().MoveNodes n.Rlist.Prepend -> n.PtrRlist().Prepend n.Rlist.Set -> n.PtrRlist().Set n.Rlist.Set1 -> n.PtrRlist().Set1 n.Rlist.Set2 -> n.PtrRlist().Set2 n.Rlist.Set3 -> n.PtrRlist().Set3 &n.Rlist -> n.PtrRlist() n.Rlist = nodes -> n.SetRlist(nodes) } ex . ../ir ../ssa { import "cmd/compile/internal/ir" var n *ir.Node n.Op -> n.GetOp() n.Left -> n.GetLeft() n.Right -> n.GetRight() n.Orig -> n.GetOrig() n.Type -> n.GetType() n.Func -> n.GetFunc() n.Name -> n.GetName() n.Sym -> n.GetSym() n.Pos -> n.GetPos() n.Xoffset -> n.GetXoffset() n.Esc -> n.GetEsc() avoid (*ir.Node).PtrNinit avoid (*ir.Node).PtrNbody avoid (*ir.Node).PtrList avoid (*ir.Node).PtrRlist n.Ninit -> n.GetNinit() n.Nbody -> n.GetNbody() n.List -> n.GetList() n.Rlist -> n.GetRlist() } ' cd ../ir rf ' mv Node.Op Node.op mv Node.GetOp Node.Op mv Node.Left Node.left mv Node.GetLeft Node.Left mv Node.Right Node.right mv Node.GetRight Node.Right mv Node.Orig Node.orig mv Node.GetOrig Node.Orig mv Node.Type Node.typ mv Node.GetType Node.Type mv Node.Func Node.fn mv Node.GetFunc Node.Func mv Node.Name Node.name mv Node.GetName Node.Name # All uses are in other Node methods already. mv Node.E Node.e mv Node.Sym Node.sym mv Node.GetSym Node.Sym mv Node.Pos Node.pos mv Node.GetPos Node.Pos mv Node.Esc Node.esc mv Node.GetEsc Node.Esc # While we are here, rename Xoffset to more idiomatic Offset. mv Node.Xoffset Node.offset mv Node.GetXoffset Node.Offset mv Node.SetXoffset Node.SetOffset # While we are here, rename Ninit, Nbody to more idiomatic Init, Body. mv Node.Ninit Node.init mv Node.GetNinit Node.Init mv Node.PtrNinit Node.PtrInit mv Node.SetNinit Node.SetInit mv Node.Nbody Node.body mv Node.GetNbody Node.Body mv Node.PtrNbody Node.PtrBody mv Node.SetNbody Node.SetBody mv Node.List Node.list mv Node.GetList Node.List mv Node.Rlist Node.rlist mv Node.GetRlist Node.Rlist # Unexport these mv Node.SetHasOpt Node.setHasOpt mv Node.SetHasVal Node.setHasVal ' Change-Id: I9894f633375c5237a29b6d6d7b89ba181b56ca3a Reviewed-on: https://go-review.googlesource.com/c/go/+/273009 Trust: Russ Cox <rsc@golang.org> Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
112 lines
3.3 KiB
Go
112 lines
3.3 KiB
Go
// Copyright 2009 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 gc
|
|
|
|
import (
|
|
"cmd/compile/internal/base"
|
|
"cmd/compile/internal/ir"
|
|
"cmd/compile/internal/types"
|
|
"cmd/internal/obj"
|
|
)
|
|
|
|
// A function named init is a special case.
|
|
// It is called by the initialization before main is run.
|
|
// To make it unique within a package and also uncallable,
|
|
// the name, normally "pkg.init", is altered to "pkg.init.0".
|
|
var renameinitgen int
|
|
|
|
// Function collecting autotmps generated during typechecking,
|
|
// to be included in the package-level init function.
|
|
var initTodo = ir.Nod(ir.ODCLFUNC, nil, nil)
|
|
|
|
func renameinit() *types.Sym {
|
|
s := lookupN("init.", renameinitgen)
|
|
renameinitgen++
|
|
return s
|
|
}
|
|
|
|
// fninit makes an initialization record for the package.
|
|
// See runtime/proc.go:initTask for its layout.
|
|
// The 3 tasks for initialization are:
|
|
// 1) Initialize all of the packages the current package depends on.
|
|
// 2) Initialize all the variables that have initializers.
|
|
// 3) Run any init functions.
|
|
func fninit(n []*ir.Node) {
|
|
nf := initOrder(n)
|
|
|
|
var deps []*obj.LSym // initTask records for packages the current package depends on
|
|
var fns []*obj.LSym // functions to call for package initialization
|
|
|
|
// Find imported packages with init tasks.
|
|
for _, s := range types.InitSyms {
|
|
deps = append(deps, s.Linksym())
|
|
}
|
|
|
|
// Make a function that contains all the initialization statements.
|
|
if len(nf) > 0 {
|
|
base.Pos = nf[0].Pos() // prolog/epilog gets line number of first init stmt
|
|
initializers := lookup("init")
|
|
fn := dclfunc(initializers, ir.Nod(ir.OTFUNC, nil, nil))
|
|
for _, dcl := range initTodo.Func().Dcl {
|
|
dcl.Name().Curfn = fn
|
|
}
|
|
fn.Func().Dcl = append(fn.Func().Dcl, initTodo.Func().Dcl...)
|
|
initTodo.Func().Dcl = nil
|
|
|
|
fn.PtrBody().Set(nf)
|
|
funcbody()
|
|
|
|
fn = typecheck(fn, ctxStmt)
|
|
Curfn = fn
|
|
typecheckslice(nf, ctxStmt)
|
|
Curfn = nil
|
|
xtop = append(xtop, fn)
|
|
fns = append(fns, initializers.Linksym())
|
|
}
|
|
if initTodo.Func().Dcl != nil {
|
|
// We only generate temps using initTodo if there
|
|
// are package-scope initialization statements, so
|
|
// something's weird if we get here.
|
|
base.Fatalf("initTodo still has declarations")
|
|
}
|
|
initTodo = nil
|
|
|
|
// Record user init functions.
|
|
for i := 0; i < renameinitgen; i++ {
|
|
s := lookupN("init.", i)
|
|
fn := ir.AsNode(s.Def).Name().Defn
|
|
// Skip init functions with empty bodies.
|
|
if fn.Body().Len() == 1 && fn.Body().First().Op() == ir.OEMPTY {
|
|
continue
|
|
}
|
|
fns = append(fns, s.Linksym())
|
|
}
|
|
|
|
if len(deps) == 0 && len(fns) == 0 && ir.LocalPkg.Name != "main" && ir.LocalPkg.Name != "runtime" {
|
|
return // nothing to initialize
|
|
}
|
|
|
|
// Make an .inittask structure.
|
|
sym := lookup(".inittask")
|
|
nn := NewName(sym)
|
|
nn.SetType(types.Types[types.TUINT8]) // fake type
|
|
nn.SetClass(ir.PEXTERN)
|
|
sym.Def = ir.AsTypesNode(nn)
|
|
exportsym(nn)
|
|
lsym := sym.Linksym()
|
|
ot := 0
|
|
ot = duintptr(lsym, ot, 0) // state: not initialized yet
|
|
ot = duintptr(lsym, ot, uint64(len(deps)))
|
|
ot = duintptr(lsym, ot, uint64(len(fns)))
|
|
for _, d := range deps {
|
|
ot = dsymptr(lsym, ot, d, 0)
|
|
}
|
|
for _, f := range fns {
|
|
ot = dsymptr(lsym, ot, f, 0)
|
|
}
|
|
// An initTask has pointers, but none into the Go heap.
|
|
// It's not quite read only, the state field must be modifiable.
|
|
ggloblsym(lsym, int32(ot), obj.NOPTR)
|
|
}
|