Commit d5fe165c authored by Dave Cheney's avatar Dave Cheney

cmd/compile: convert externdecl to []*Node

This one of a set of changes to make the transition away from NodeList
easier by removing cases in which NodeList doesn't act semi-trivially like a
[]*Node.

This CL was originally prepared by Josh Bleecher Snyder <josharian@gmail.com>.

This change passes go build -toolexec 'toolstash -cmp' -a std.

Change-Id: Ifd73501e06e8ea5efd028b6d473b3e5d1b07a5ac
Reviewed-on: https://go-review.googlesource.com/14570Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 1fd78e1f
...@@ -182,7 +182,7 @@ func declare(n *Node, ctxt uint8) { ...@@ -182,7 +182,7 @@ func declare(n *Node, ctxt uint8) {
gen := 0 gen := 0
if ctxt == PEXTERN { if ctxt == PEXTERN {
externdcl = list(externdcl, n) externdcl = append(externdcl, n)
if dflag() { if dflag() {
fmt.Printf("\t%v global decl %v %p\n", Ctxt.Line(int(lineno)), s, n) fmt.Printf("\t%v global decl %v %p\n", Ctxt.Line(int(lineno)), s, n)
} }
......
...@@ -584,7 +584,7 @@ var maxfltval [NTYPE]*Mpflt ...@@ -584,7 +584,7 @@ var maxfltval [NTYPE]*Mpflt
var xtop *NodeList var xtop *NodeList
var externdcl *NodeList var externdcl []*Node
var exportlist []*Node var exportlist []*Node
......
...@@ -464,9 +464,9 @@ func Main() { ...@@ -464,9 +464,9 @@ func Main() {
} }
// Phase 9: Check external declarations. // Phase 9: Check external declarations.
for l := externdcl; l != nil; l = l.Next { for i, n := range externdcl {
if l.N.Op == ONAME { if n.Op == ONAME {
typecheck(&l.N, Erv) typecheck(&externdcl[i], Erv)
} }
} }
......
...@@ -72,10 +72,7 @@ func dumpobj() { ...@@ -72,10 +72,7 @@ func dumpobj() {
fmt.Fprintf(bout, "\n!\n") fmt.Fprintf(bout, "\n!\n")
var externs *NodeList externs := len(externdcl)
if externdcl != nil {
externs = externdcl.End
}
dumpglobls() dumpglobls()
dumptypestructs() dumptypestructs()
...@@ -83,8 +80,8 @@ func dumpobj() { ...@@ -83,8 +80,8 @@ func dumpobj() {
// Dump extra globals. // Dump extra globals.
tmp := externdcl tmp := externdcl
if externs != nil { if externdcl != nil {
externdcl = externs.Next externdcl = externdcl[externs:]
} }
dumpglobls() dumpglobls()
externdcl = tmp externdcl = tmp
...@@ -110,8 +107,7 @@ func dumpglobls() { ...@@ -110,8 +107,7 @@ func dumpglobls() {
var n *Node var n *Node
// add globals // add globals
for l := externdcl; l != nil; l = l.Next { for _, n := range externdcl {
n = l.N
if n.Op != ONAME { if n.Op != ONAME {
continue continue
} }
...@@ -126,7 +122,6 @@ func dumpglobls() { ...@@ -126,7 +122,6 @@ func dumpglobls() {
continue continue
} }
dowidth(n.Type) dowidth(n.Type)
ggloblnod(n) ggloblnod(n)
} }
......
...@@ -1317,8 +1317,7 @@ func dumptypestructs() { ...@@ -1317,8 +1317,7 @@ func dumptypestructs() {
var n *Node var n *Node
// copy types from externdcl list to signatlist // copy types from externdcl list to signatlist
for l := externdcl; l != nil; l = l.Next { for _, n := range externdcl {
n = l.N
if n.Op != OTYPE { if n.Op != OTYPE {
continue continue
} }
......
...@@ -1584,33 +1584,32 @@ func Ptrto(t *Type) *Type { ...@@ -1584,33 +1584,32 @@ func Ptrto(t *Type) *Type {
} }
func frame(context int) { func frame(context int) {
var l *NodeList
if context != 0 { if context != 0 {
fmt.Printf("--- external frame ---\n") fmt.Printf("--- external frame ---\n")
l = externdcl for _, n := range externdcl {
} else if Curfn != nil { printframenode(n)
fmt.Printf("--- %v frame ---\n", Curfn.Func.Nname.Sym) }
l = Curfn.Func.Dcl
} else {
return return
} }
var n *Node if Curfn != nil {
var w int64 fmt.Printf("--- %v frame ---\n", Curfn.Func.Nname.Sym)
for ; l != nil; l = l.Next { for l := Curfn.Func.Dcl; l != nil; l = l.Next {
n = l.N printframenode(l.N)
w = -1
if n.Type != nil {
w = n.Type.Width
} }
switch n.Op { }
case ONAME: }
fmt.Printf("%v %v G%d %v width=%d\n", Oconv(int(n.Op), 0), n.Sym, n.Name.Vargen, n.Type, w)
case OTYPE: func printframenode(n *Node) {
fmt.Printf("%v %v width=%d\n", Oconv(int(n.Op), 0), n.Type, w) w := int64(-1)
} if n.Type != nil {
w = n.Type.Width
}
switch n.Op {
case ONAME:
fmt.Printf("%v %v G%d %v width=%d\n", Oconv(int(n.Op), 0), n.Sym, n.Name.Vargen, n.Type, w)
case OTYPE:
fmt.Printf("%v %v width=%d\n", Oconv(int(n.Op), 0), n.Type, w)
} }
} }
......
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