diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index 1c485179551..7009a3ab90a 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -361,25 +361,19 @@ func gdata(nam *Node, nr *Node, wid int) { if nam.Sym == nil { Fatalf("gdata nil nam sym") } + s := Linksym(nam.Sym) switch nr.Op { case OLITERAL: switch u := nr.Val().U.(type) { - case *Mpcplx: - gdatacomplex(nam, u) - - case string: - gdatastring(nam, u) - case bool: i := int64(obj.Bool2int(u)) - Linksym(nam.Sym).WriteInt(Ctxt, nam.Xoffset, wid, i) + s.WriteInt(Ctxt, nam.Xoffset, wid, i) case *Mpint: - Linksym(nam.Sym).WriteInt(Ctxt, nam.Xoffset, wid, u.Int64()) + s.WriteInt(Ctxt, nam.Xoffset, wid, u.Int64()) case *Mpflt: - s := Linksym(nam.Sym) f := u.Float64() switch nam.Type.Etype { case TFLOAT32: @@ -388,6 +382,23 @@ func gdata(nam *Node, nr *Node, wid int) { s.WriteFloat64(Ctxt, nam.Xoffset, f) } + case *Mpcplx: + r := u.Real.Float64() + i := u.Imag.Float64() + switch nam.Type.Etype { + case TCOMPLEX64: + s.WriteFloat32(Ctxt, nam.Xoffset, float32(r)) + s.WriteFloat32(Ctxt, nam.Xoffset+4, float32(i)) + case TCOMPLEX128: + s.WriteFloat64(Ctxt, nam.Xoffset, r) + s.WriteFloat64(Ctxt, nam.Xoffset+8, i) + } + + case string: + symdata := stringsym(u) + s.WriteAddr(Ctxt, nam.Xoffset, Widthptr, symdata, 0) + s.WriteInt(Ctxt, nam.Xoffset+int64(Widthptr), Widthint, int64(len(u))) + default: Fatalf("gdata unhandled OLITERAL %v", nr) } @@ -397,38 +408,15 @@ func gdata(nam *Node, nr *Node, wid int) { Fatalf("gdata ADDR left op %v", nr.Left.Op) } to := nr.Left - Linksym(nam.Sym).WriteAddr(Ctxt, nam.Xoffset, wid, Linksym(to.Sym), to.Xoffset) + s.WriteAddr(Ctxt, nam.Xoffset, wid, Linksym(to.Sym), to.Xoffset) case ONAME: if nr.Class != PFUNC { Fatalf("gdata NAME not PFUNC %d", nr.Class) } - Linksym(nam.Sym).WriteAddr(Ctxt, nam.Xoffset, wid, Linksym(funcsym(nr.Sym)), nr.Xoffset) + s.WriteAddr(Ctxt, nam.Xoffset, wid, Linksym(funcsym(nr.Sym)), nr.Xoffset) default: Fatalf("gdata unhandled op %v %v\n", nr, nr.Op) } } - -func gdatacomplex(nam *Node, cval *Mpcplx) { - t := Types[cplxsubtype(nam.Type.Etype)] - r := cval.Real.Float64() - i := cval.Imag.Float64() - s := Linksym(nam.Sym) - - switch t.Etype { - case TFLOAT32: - s.WriteFloat32(Ctxt, nam.Xoffset, float32(r)) - s.WriteFloat32(Ctxt, nam.Xoffset+4, float32(i)) - case TFLOAT64: - s.WriteFloat64(Ctxt, nam.Xoffset, r) - s.WriteFloat64(Ctxt, nam.Xoffset+8, i) - } -} - -func gdatastring(nam *Node, sval string) { - s := Linksym(nam.Sym) - symdata := stringsym(sval) - s.WriteAddr(Ctxt, nam.Xoffset, Widthptr, symdata, 0) - s.WriteInt(Ctxt, nam.Xoffset+int64(Widthptr), Widthint, int64(len(sval))) -} diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index b843eaa4de2..d758f35e579 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -1409,32 +1409,11 @@ func genAsInitNoCheck(n *Node, reportOnly bool) bool { return true case OLITERAL: - break - } - - switch nr.Type.Etype { - default: - return false - - case TBOOL, TINT8, TUINT8, TINT16, TUINT16, - TINT32, TUINT32, TINT64, TUINT64, - TINT, TUINT, TUINTPTR, TUNSAFEPTR, - TPTR32, TPTR64, - TFLOAT32, TFLOAT64: if !reportOnly { gdata(&nam, nr, int(nr.Type.Width)) } - - case TCOMPLEX64, TCOMPLEX128: - if !reportOnly { - gdatacomplex(&nam, nr.Val().U.(*Mpcplx)) - } - - case TSTRING: - if !reportOnly { - gdatastring(&nam, nr.Val().U.(string)) - } + return true } - return true + return false }