Commit edad59cf authored by Matthew Dempsky's avatar Matthew Dempsky

cmd/compile: skip reexporting types in reexportdep

The binary export format embeds type definitions inline as necessary,
so there's no need to add them to exportlist. Also, constants are
embedded directly by value, so they can be omitted too.

Change-Id: Id1879eb97c298a5a52f615cf9883c346c7f7bd69
Reviewed-on: https://go-review.googlesource.com/36170
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent 16dd0624
...@@ -517,13 +517,6 @@ func (p *exporter) obj(sym *Sym) { ...@@ -517,13 +517,6 @@ func (p *exporter) obj(sym *Sym) {
var f *Func var f *Func
if inlineable { if inlineable {
f = sym.Def.Func f = sym.Def.Func
// TODO(gri) re-examine reexportdeplist:
// Because we can trivially export types
// in-place, we don't need to collect types
// inside function bodies in the exportlist.
// With an adjusted reexportdeplist used only
// by the binary exporter, we can also avoid
// the global exportlist.
reexportdeplist(f.Inl) reexportdeplist(f.Inl)
} }
p.funcList = append(p.funcList, f) p.funcList = append(p.funcList, f)
...@@ -714,7 +707,7 @@ func (p *exporter) typ(t *Type) { ...@@ -714,7 +707,7 @@ func (p *exporter) typ(t *Type) {
var f *Func var f *Func
if inlineable { if inlineable {
f = mfn.Func f = mfn.Func
reexportdeplist(mfn.Func.Inl) reexportdeplist(f.Inl)
} }
p.funcList = append(p.funcList, f) p.funcList = append(p.funcList, f)
} }
......
...@@ -108,7 +108,6 @@ func reexportdep(n *Node) { ...@@ -108,7 +108,6 @@ func reexportdep(n *Node) {
return return
} }
//print("reexportdep %+hN\n", n);
switch n.Op { switch n.Op {
case ONAME: case ONAME:
switch n.Class { switch n.Class {
...@@ -133,78 +132,6 @@ func reexportdep(n *Node) { ...@@ -133,78 +132,6 @@ func reexportdep(n *Node) {
exportlist = append(exportlist, n) exportlist = append(exportlist, n)
} }
} }
// Local variables in the bodies need their type.
case ODCL:
t := n.Left.Type
if t != Types[t.Etype] && t != idealbool && t != idealstring {
if t.IsPtr() {
t = t.Elem()
}
if t != nil && t.Sym != nil && t.Sym.Def != nil && !exportedsym(t.Sym) {
if Debug['E'] != 0 {
fmt.Printf("reexport type %v from declaration\n", t.Sym)
}
exportlist = append(exportlist, t.Sym.Def)
}
}
case OLITERAL:
t := n.Type
if t != Types[n.Type.Etype] && t != idealbool && t != idealstring {
if t.IsPtr() {
t = t.Elem()
}
if t != nil && t.Sym != nil && t.Sym.Def != nil && !exportedsym(t.Sym) {
if Debug['E'] != 0 {
fmt.Printf("reexport literal type %v\n", t.Sym)
}
exportlist = append(exportlist, t.Sym.Def)
}
}
fallthrough
case OTYPE:
if n.Sym != nil && n.Sym.Def != nil && !exportedsym(n.Sym) {
if Debug['E'] != 0 {
fmt.Printf("reexport literal/type %v\n", n.Sym)
}
exportlist = append(exportlist, n)
}
// for operations that need a type when rendered, put the type on the export list.
case OCONV,
OCONVIFACE,
OCONVNOP,
ORUNESTR,
OARRAYBYTESTR,
OARRAYRUNESTR,
OSTRARRAYBYTE,
OSTRARRAYRUNE,
ODOTTYPE,
ODOTTYPE2,
OSTRUCTLIT,
OARRAYLIT,
OSLICELIT,
OPTRLIT,
OMAKEMAP,
OMAKESLICE,
OMAKECHAN:
t := n.Type
switch t.Etype {
case TARRAY, TCHAN, TPTR32, TPTR64, TSLICE:
if t.Sym == nil {
t = t.Elem()
}
}
if t != nil && t.Sym != nil && t.Sym.Def != nil && !exportedsym(t.Sym) {
if Debug['E'] != 0 {
fmt.Printf("reexport type for expression %v\n", t.Sym)
}
exportlist = append(exportlist, t.Sym.Def)
}
} }
reexportdep(n.Left) reexportdep(n.Left)
......
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