]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't emit autom's into object file
authorThan McIntosh <thanm@google.com>
Thu, 26 Sep 2019 13:53:37 +0000 (09:53 -0400)
committerThan McIntosh <thanm@google.com>
Fri, 27 Sep 2019 13:58:59 +0000 (13:58 +0000)
Don't write Autom records when writing a function to the object file;
we no longer need them in the linker for DWARF processing. So as to
keep the object file format unchanged, write out a zero-length list of
automs to the object, as opposed to removing all references.

Updates #34554.

Change-Id: I42a1d67207ea7114ae4f3a315cf37effba57f190
Reviewed-on: https://go-review.googlesource.com/c/go/+/197499
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/compile/internal/gc/pgen.go
src/cmd/internal/obj/link.go
src/cmd/internal/obj/objfile.go

index 4d6f579928cd0cfaba37933b83fc5542271539c3..b1f9bc9d55adb3e86e052ec96ad8b44d49b82f98 100644 (file)
@@ -384,13 +384,12 @@ func debuginfo(fnsym *obj.LSym, infosym *obj.LSym, curfn interface{}) ([]dwarf.S
                }
        }
 
-       var automDecls []*Node
-       // Populate Automs for fn.
+       var apdecls []*Node
+       // Populate decls for fn.
        for _, n := range fn.Func.Dcl {
                if n.Op != ONAME { // might be OTYPE or OLITERAL
                        continue
                }
-               var name obj.AddrName
                switch n.Class() {
                case PAUTO:
                        if !n.Name.Used() {
@@ -400,24 +399,15 @@ func debuginfo(fnsym *obj.LSym, infosym *obj.LSym, curfn interface{}) ([]dwarf.S
                                }
                                continue
                        }
-                       name = obj.NAME_AUTO
                case PPARAM, PPARAMOUT:
-                       name = obj.NAME_PARAM
                default:
                        continue
                }
-               automDecls = append(automDecls, n)
-               gotype := ngotype(n).Linksym()
-               fnsym.Func.Autom = append(fnsym.Func.Autom, &obj.Auto{
-                       Asym:    Ctxt.Lookup(n.Sym.Name),
-                       Aoffset: int32(n.Xoffset),
-                       Name:    name,
-                       Gotype:  gotype,
-               })
-               fnsym.Func.RecordAutoType(gotype)
+               apdecls = append(apdecls, n)
+               fnsym.Func.RecordAutoType(ngotype(n).Linksym())
        }
 
-       decls, dwarfVars := createDwarfVars(fnsym, fn.Func, automDecls)
+       decls, dwarfVars := createDwarfVars(fnsym, fn.Func, apdecls)
 
        // For each type referenced by the functions auto vars, attach a
        // dummy relocation to the function symbol to insure that the type
@@ -467,11 +457,11 @@ func debuginfo(fnsym *obj.LSym, infosym *obj.LSym, curfn interface{}) ([]dwarf.S
 
 // createSimpleVars creates a DWARF entry for every variable declared in the
 // function, claiming that they are permanently on the stack.
-func createSimpleVars(automDecls []*Node) ([]*Node, []*dwarf.Var, map[*Node]bool) {
+func createSimpleVars(apDecls []*Node) ([]*Node, []*dwarf.Var, map[*Node]bool) {
        var vars []*dwarf.Var
        var decls []*Node
        selected := make(map[*Node]bool)
-       for _, n := range automDecls {
+       for _, n := range apDecls {
                if n.IsAutoTmp() {
                        continue
                }
@@ -559,7 +549,7 @@ func createComplexVars(fn *Func) ([]*Node, []*dwarf.Var, map[*Node]bool) {
 
 // createDwarfVars process fn, returning a list of DWARF variables and the
 // Nodes they represent.
-func createDwarfVars(fnsym *obj.LSym, fn *Func, automDecls []*Node) ([]*Node, []*dwarf.Var) {
+func createDwarfVars(fnsym *obj.LSym, fn *Func, apDecls []*Node) ([]*Node, []*dwarf.Var) {
        // Collect a raw list of DWARF vars.
        var vars []*dwarf.Var
        var decls []*Node
@@ -567,10 +557,10 @@ func createDwarfVars(fnsym *obj.LSym, fn *Func, automDecls []*Node) ([]*Node, []
        if Ctxt.Flag_locationlists && Ctxt.Flag_optimize && fn.DebugInfo != nil {
                decls, vars, selected = createComplexVars(fn)
        } else {
-               decls, vars, selected = createSimpleVars(automDecls)
+               decls, vars, selected = createSimpleVars(apDecls)
        }
 
-       dcl := automDecls
+       dcl := apDecls
        if fnsym.WasInlined() {
                dcl = preInliningDcls(fnsym)
        }
@@ -649,17 +639,8 @@ func createDwarfVars(fnsym *obj.LSym, fn *Func, automDecls []*Node) ([]*Node, []
                        InlIndex:      int32(inlIndex),
                        ChildIndex:    -1,
                })
-               // Append a "deleted auto" entry to the autom list so as to
-               // insure that the type in question is picked up by the linker.
-               // See issue 22941.
-               gotype := ngotype(n).Linksym()
-               fnsym.Func.Autom = append(fnsym.Func.Autom, &obj.Auto{
-                       Asym:    Ctxt.Lookup(n.Sym.Name),
-                       Aoffset: int32(-1),
-                       Name:    obj.NAME_DELETED_AUTO,
-                       Gotype:  gotype,
-               })
-               fnsym.Func.RecordAutoType(gotype)
+               // Record go type of to insure that it gets emitted by the linker.
+               fnsym.Func.RecordAutoType(ngotype(n).Linksym())
        }
 
        return decls, vars
index 4ebfc1d14f6d52d3088e90e86bd66c226d4cb472..1c101bfc27119cc819492884a382b8f1d1f880c8 100644 (file)
@@ -211,9 +211,6 @@ const (
        // A reference to name@GOT(SB) is a reference to the entry in the global offset
        // table for 'name'.
        NAME_GOTREF
-       // Indicates auto that was optimized away, but whose type
-       // we want to preserve in the DWARF debug info.
-       NAME_DELETED_AUTO
        // Indicates that this is a reference to a TOC anchor.
        NAME_TOCREF
 )
@@ -398,7 +395,6 @@ type FuncInfo struct {
        Args     int32
        Locals   int32
        Text     *Prog
-       Autom    []*Auto
        Autot    map[*LSym]struct{}
        Pcln     Pcln
        InlMarks []InlMark
index 165e618d53edcfe0beed5cd7c03af775d9bfa7dd..ab5627c0dd14504bb14c0406fac1125f244a2c0c 100644 (file)
@@ -31,7 +31,6 @@ type objWriter struct {
        nData     int
        nReloc    int
        nPcdata   int
-       nAutom    int
        nFuncdata int
        nFile     int
 
@@ -60,7 +59,6 @@ func (w *objWriter) addLengths(s *LSym) {
        w.nData += data
        w.nPcdata += len(pc.Pcdata)
 
-       w.nAutom += len(s.Func.Autom)
        w.nFuncdata += len(pc.Funcdataoff)
        w.nFile += len(pc.File)
 }
@@ -69,7 +67,7 @@ func (w *objWriter) writeLengths() {
        w.writeInt(int64(w.nData))
        w.writeInt(int64(w.nReloc))
        w.writeInt(int64(w.nPcdata))
-       w.writeInt(int64(w.nAutom))
+       w.writeInt(int64(0)) // TODO: remove at next object file rev
        w.writeInt(int64(w.nFuncdata))
        w.writeInt(int64(w.nFile))
 }
@@ -206,10 +204,6 @@ func (w *objWriter) writeRefs(s *LSym) {
        }
 
        if s.Type == objabi.STEXT {
-               for _, a := range s.Func.Autom {
-                       w.writeRef(a.Asym, false)
-                       w.writeRef(a.Gotype, false)
-               }
                pc := &s.Func.Pcln
                for _, d := range pc.Funcdata {
                        w.writeRef(d, false)
@@ -364,21 +358,7 @@ func (w *objWriter) writeSym(s *LSym) {
                flags |= 1 << 4
        }
        w.writeInt(flags)
-       w.writeInt(int64(len(s.Func.Autom)))
-       for _, a := range s.Func.Autom {
-               w.writeRefIndex(a.Asym)
-               w.writeInt(int64(a.Aoffset))
-               if a.Name == NAME_AUTO {
-                       w.writeInt(objabi.A_AUTO)
-               } else if a.Name == NAME_PARAM {
-                       w.writeInt(objabi.A_PARAM)
-               } else if a.Name == NAME_DELETED_AUTO {
-                       w.writeInt(objabi.A_DELETED_AUTO)
-               } else {
-                       log.Fatalf("%s: invalid local variable type %d", s.Name, a.Name)
-               }
-               w.writeRefIndex(a.Gotype)
-       }
+       w.writeInt(int64(0)) // TODO: remove at next object file rev
 
        pc := &s.Func.Pcln
        w.writeInt(int64(len(pc.Pcsp.P)))