Commit e4981819 authored by Dave Cheney's avatar Dave Cheney

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/7261Reviewed-by: default avatarKeith Randall <khr@golang.org>
Run-TryBot: Dave Cheney <dave@cheney.net>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent b353a695
...@@ -763,9 +763,9 @@ func typedcl0(s *Sym) *Node { ...@@ -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) { ...@@ -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 { ...@@ -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 ...@@ -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: ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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) { ...@@ -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 { ...@@ -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 ...@@ -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 ...@@ -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: ...@@ -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]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment