mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/internal/gc: more Node cleanups
More cleanups to gc.Node
- make Node.Local a boolean
- make Type.Local a boolean
- reduce the size of Node.Esc to a uint8
Reducing the size of Node.Esc shaves ~45mb off the RSS compiling cmd/internal/gc on amd64
before:
Maximum resident set size (kbytes): 659496
after:
Maximum resident set size (kbytes): 612196
- declare gc.Funcdepth as int32
- declare Node.Funcdepth as int32
In both cases, these were previously machine specific int types. This doesn't result in
any memory saving at the moment due to struct padding.
Change-Id: Iabef8da15e962fe8b79d7fd3d402fb26ce7ec31c
Reviewed-on: https://go-review.googlesource.com/7261
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Dave Cheney <dave@cheney.net>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
b353a69509
commit
e498181942
9 changed files with 29 additions and 29 deletions
|
|
@ -763,9 +763,9 @@ func typedcl0(s *Sym) *Node {
|
||||||
* is being declared to have uncompiled type t.
|
* is being declared to have uncompiled type t.
|
||||||
* return the ODCLTYPE node to use.
|
* return the ODCLTYPE node to use.
|
||||||
*/
|
*/
|
||||||
func typedcl1(n *Node, t *Node, local int) *Node {
|
func typedcl1(n *Node, t *Node, local bool) *Node {
|
||||||
n.Ntype = t
|
n.Ntype = t
|
||||||
n.Local = uint8(local)
|
n.Local = local
|
||||||
return Nod(ODCLTYPE, n, nil)
|
return Nod(ODCLTYPE, n, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1404,7 +1404,7 @@ func addmethod(sf *Sym, t *Type, local bool, nointerface bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if local && pa.Local == 0 {
|
if local && !pa.Local {
|
||||||
// defining method on non-local type.
|
// defining method on non-local type.
|
||||||
Yyerror("cannot define new methods on non-local type %v", Tconv(pa, 0))
|
Yyerror("cannot define new methods on non-local type %v", Tconv(pa, 0))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -140,7 +140,7 @@ type Type struct {
|
||||||
Siggen uint8
|
Siggen uint8
|
||||||
Funarg uint8 // on TSTRUCT and TFIELD
|
Funarg uint8 // on TSTRUCT and TFIELD
|
||||||
Copyany uint8
|
Copyany uint8
|
||||||
Local uint8 // created in this file
|
Local bool // created in this file
|
||||||
Deferwidth uint8
|
Deferwidth uint8
|
||||||
Broke uint8 // broken type definition.
|
Broke uint8 // broken type definition.
|
||||||
Isddd bool // TFIELD is ... argument
|
Isddd bool // TFIELD is ... argument
|
||||||
|
|
@ -661,7 +661,7 @@ var nhunk int32
|
||||||
|
|
||||||
var thunk int32
|
var thunk int32
|
||||||
|
|
||||||
var Funcdepth int
|
var Funcdepth int32
|
||||||
|
|
||||||
var typecheckok int
|
var typecheckok int
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -404,7 +404,7 @@ typedclname:
|
||||||
typedcl:
|
typedcl:
|
||||||
typedclname ntype
|
typedclname ntype
|
||||||
{
|
{
|
||||||
$$ = typedcl1($1, $2, 1);
|
$$ = typedcl1($1, $2, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
simple_stmt:
|
simple_stmt:
|
||||||
|
|
|
||||||
|
|
@ -1000,7 +1000,7 @@ func dtypesym(t *Type) *Sym {
|
||||||
}
|
}
|
||||||
|
|
||||||
// named types from other files are defined only by those files
|
// named types from other files are defined only by those files
|
||||||
if tbase.Sym != nil && tbase.Local == 0 {
|
if tbase.Sym != nil && !tbase.Local {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
if isforw[tbase.Etype] {
|
if isforw[tbase.Etype] {
|
||||||
|
|
|
||||||
|
|
@ -340,7 +340,7 @@ func selecttype(size int32) *Type {
|
||||||
sudog.List = list(sudog.List, Nod(ODCLFIELD, newname(Lookup("waitlink")), typenod(Ptrto(Types[TUINT8]))))
|
sudog.List = list(sudog.List, Nod(ODCLFIELD, newname(Lookup("waitlink")), typenod(Ptrto(Types[TUINT8]))))
|
||||||
typecheck(&sudog, Etype)
|
typecheck(&sudog, Etype)
|
||||||
sudog.Type.Noalg = 1
|
sudog.Type.Noalg = 1
|
||||||
sudog.Type.Local = 1
|
sudog.Type.Local = true
|
||||||
|
|
||||||
scase := Nod(OTSTRUCT, nil, nil)
|
scase := Nod(OTSTRUCT, nil, nil)
|
||||||
scase.List = list(scase.List, Nod(ODCLFIELD, newname(Lookup("elem")), typenod(Ptrto(Types[TUINT8]))))
|
scase.List = list(scase.List, Nod(ODCLFIELD, newname(Lookup("elem")), typenod(Ptrto(Types[TUINT8]))))
|
||||||
|
|
@ -352,7 +352,7 @@ func selecttype(size int32) *Type {
|
||||||
scase.List = list(scase.List, Nod(ODCLFIELD, newname(Lookup("releasetime")), typenod(Types[TUINT64])))
|
scase.List = list(scase.List, Nod(ODCLFIELD, newname(Lookup("releasetime")), typenod(Types[TUINT64])))
|
||||||
typecheck(&scase, Etype)
|
typecheck(&scase, Etype)
|
||||||
scase.Type.Noalg = 1
|
scase.Type.Noalg = 1
|
||||||
scase.Type.Local = 1
|
scase.Type.Local = true
|
||||||
|
|
||||||
sel := Nod(OTSTRUCT, nil, nil)
|
sel := Nod(OTSTRUCT, nil, nil)
|
||||||
sel.List = list(sel.List, Nod(ODCLFIELD, newname(Lookup("tcase")), typenod(Types[TUINT16])))
|
sel.List = list(sel.List, Nod(ODCLFIELD, newname(Lookup("tcase")), typenod(Types[TUINT16])))
|
||||||
|
|
@ -367,7 +367,7 @@ func selecttype(size int32) *Type {
|
||||||
sel.List = list(sel.List, Nod(ODCLFIELD, newname(Lookup("pollorderarr")), arr))
|
sel.List = list(sel.List, Nod(ODCLFIELD, newname(Lookup("pollorderarr")), arr))
|
||||||
typecheck(&sel, Etype)
|
typecheck(&sel, Etype)
|
||||||
sel.Type.Noalg = 1
|
sel.Type.Noalg = 1
|
||||||
sel.Type.Local = 1
|
sel.Type.Local = true
|
||||||
|
|
||||||
return sel.Type
|
return sel.Type
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2503,7 +2503,7 @@ func genwrapper(rcvr *Type, method *Type, newnam *Sym, iface int) {
|
||||||
|
|
||||||
// Set inl_nonlocal to whether we are calling a method on a
|
// Set inl_nonlocal to whether we are calling a method on a
|
||||||
// type defined in a different package. Checked in inlvar.
|
// type defined in a different package. Checked in inlvar.
|
||||||
if methodrcvr.Local == 0 {
|
if !methodrcvr.Local {
|
||||||
inl_nonlocal = 1
|
inl_nonlocal = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,26 +40,26 @@ type Node struct {
|
||||||
Nowritebarrier bool // emit compiler error instead of write barrier
|
Nowritebarrier bool // emit compiler error instead of write barrier
|
||||||
Walkdef uint8
|
Walkdef uint8
|
||||||
Typecheck uint8
|
Typecheck uint8
|
||||||
Local uint8
|
Local bool
|
||||||
Dodata uint8
|
Dodata uint8
|
||||||
Initorder uint8
|
Initorder uint8
|
||||||
Used bool
|
Used bool
|
||||||
Isddd bool // is the argument variadic
|
Isddd bool // is the argument variadic
|
||||||
Readonly bool
|
Readonly bool
|
||||||
Implicit bool
|
Implicit bool
|
||||||
Addrtaken bool // address taken, even if not moved to heap
|
Addrtaken bool // address taken, even if not moved to heap
|
||||||
Assigned bool // is the variable ever assigned to
|
Assigned bool // is the variable ever assigned to
|
||||||
Captured bool // is the variable captured by a closure
|
Captured bool // is the variable captured by a closure
|
||||||
Byval bool // is the variable captured by value or by reference
|
Byval bool // is the variable captured by value or by reference
|
||||||
Dupok bool // duplicate definitions ok (for func)
|
Dupok bool // duplicate definitions ok (for func)
|
||||||
Wrapper bool // is method wrapper (for func)
|
Wrapper bool // is method wrapper (for func)
|
||||||
Reslice bool // this is a reslice x = x[0:y] or x = append(x, ...)
|
Reslice bool // this is a reslice x = x[0:y] or x = append(x, ...)
|
||||||
Likely int8 // likeliness of if statement
|
Likely int8 // likeliness of if statement
|
||||||
Hasbreak bool // has break statement
|
Hasbreak bool // has break statement
|
||||||
Needzero bool // if it contains pointers, needs to be zeroed on function entry
|
Needzero bool // if it contains pointers, needs to be zeroed on function entry
|
||||||
Needctxt bool // function uses context register (has closure variables)
|
Needctxt bool // function uses context register (has closure variables)
|
||||||
Esc uint // EscXXX
|
Esc uint8 // EscXXX
|
||||||
Funcdepth int
|
Funcdepth int32
|
||||||
|
|
||||||
// most nodes
|
// most nodes
|
||||||
Type *Type
|
Type *Type
|
||||||
|
|
|
||||||
|
|
@ -1757,9 +1757,9 @@ func ascompatet(op int, nl *NodeList, nr **Type, fp int, init **NodeList) *NodeL
|
||||||
* package all the arguments that match a ... T parameter into a []T.
|
* package all the arguments that match a ... T parameter into a []T.
|
||||||
*/
|
*/
|
||||||
func mkdotargslice(lr0 *NodeList, nn *NodeList, l *Type, fp int, init **NodeList, ddd *Node) *NodeList {
|
func mkdotargslice(lr0 *NodeList, nn *NodeList, l *Type, fp int, init **NodeList, ddd *Node) *NodeList {
|
||||||
esc := EscUnknown
|
esc := uint8(EscUnknown)
|
||||||
if ddd != nil {
|
if ddd != nil {
|
||||||
esc = int(ddd.Esc)
|
esc = ddd.Esc
|
||||||
}
|
}
|
||||||
|
|
||||||
tslice := typ(TARRAY)
|
tslice := typ(TARRAY)
|
||||||
|
|
@ -1776,7 +1776,7 @@ func mkdotargslice(lr0 *NodeList, nn *NodeList, l *Type, fp int, init **NodeList
|
||||||
n.Alloc = ddd.Alloc // temporary to use
|
n.Alloc = ddd.Alloc // temporary to use
|
||||||
}
|
}
|
||||||
n.List = lr0
|
n.List = lr0
|
||||||
n.Esc = uint(esc)
|
n.Esc = esc
|
||||||
typecheck(&n, Erv)
|
typecheck(&n, Erv)
|
||||||
if n.Type == nil {
|
if n.Type == nil {
|
||||||
Fatal("mkdotargslice: typecheck failed")
|
Fatal("mkdotargslice: typecheck failed")
|
||||||
|
|
|
||||||
|
|
@ -1416,7 +1416,7 @@ yydefault:
|
||||||
yyDollar = yyS[yypt-2 : yypt+1]
|
yyDollar = yyS[yypt-2 : yypt+1]
|
||||||
//line go.y:406
|
//line go.y:406
|
||||||
{
|
{
|
||||||
yyVAL.node = typedcl1(yyDollar[1].node, yyDollar[2].node, 1)
|
yyVAL.node = typedcl1(yyDollar[1].node, yyDollar[2].node, true)
|
||||||
}
|
}
|
||||||
case 49:
|
case 49:
|
||||||
yyDollar = yyS[yypt-1 : yypt+1]
|
yyDollar = yyS[yypt-1 : yypt+1]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue