]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: use string instead of LSym in Pcln
authorJosh Bleecher Snyder <josharian@gmail.com>
Mon, 3 Apr 2017 14:50:56 +0000 (07:50 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Mon, 3 Apr 2017 15:19:47 +0000 (15:19 +0000)
In a concurrent backend, Ctxt.Lookup will need some
form of concurrency protection, which will make it
more expensive.

This CL changes the pcln table builder to track
filenames as strings rather than LSyms.
Those strings are then converted into LSyms
at the last moment, for writing the object file.

This CL removes over 85% of the calls to Ctxt.Lookup
in a run of make.bash.

Passes toolstash-check.

Updates #15756

Change-Id: I3c53deff6f16f2643169f3bdfcc7aca2ca58b0a4
Reviewed-on: https://go-review.googlesource.com/39291
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/internal/obj/line.go
src/cmd/internal/obj/line_test.go
src/cmd/internal/obj/link.go
src/cmd/internal/obj/objfile.go
src/cmd/internal/obj/pcln.go

index a601b00787302a20d59516271a650bdd93e28146..0fb915ba30c797f6afb84c369c5088cd7a9a360d 100644 (file)
@@ -74,11 +74,11 @@ func (ctxt *Link) AddImport(pkg string) {
        ctxt.Imports = append(ctxt.Imports, pkg)
 }
 
-func linkgetlineFromPos(ctxt *Link, xpos src.XPos) (f *LSym, l int32) {
+func linkgetlineFromPos(ctxt *Link, xpos src.XPos) (f string, l int32) {
        pos := ctxt.PosTable.Pos(xpos)
        if !pos.IsKnown() {
                pos = src.Pos{}
        }
        // TODO(gri) Should this use relative or absolute line number?
-       return Linklookup(ctxt, pos.SymFilename(), 0), int32(pos.RelLine())
+       return pos.SymFilename(), int32(pos.RelLine())
 }
index 63cc29587cd68fa14f0fd26b495d1630830c8a15..af595fd6a64cbb1710a2dc49f1300809c1a2e365 100644 (file)
@@ -31,7 +31,7 @@ func TestLinkgetlineFromPos(t *testing.T) {
 
        for _, test := range tests {
                f, l := linkgetlineFromPos(ctxt, ctxt.PosTable.XPos(test.pos))
-               got := fmt.Sprintf("%s:%d", f.Name, l)
+               got := fmt.Sprintf("%s:%d", f, l)
                if got != src.FileSymPrefix+test.want {
                        t.Errorf("linkgetline(%v) = %q, want %q", test.pos, got, test.want)
                }
index de12c1321fe3861ccef68607df9e4ac7577161eb..648c7d98a78d879e13a689dcb2ddb0552d6f8aff 100644 (file)
@@ -401,8 +401,8 @@ type Pcln struct {
        Pcdata      []Pcdata
        Funcdata    []*LSym
        Funcdataoff []int64
-       File        []*LSym
-       Lastfile    *LSym
+       File        []string
+       Lastfile    string
        Lastindex   int
        InlTree     InlTree // per-function inlining tree extracted from the global tree
 }
index 5bef20ad3750b5a485fd994672e9a09493c96021..ccc71efd6c824a8f6ee37018663d1a2df7b7913c 100644 (file)
@@ -299,12 +299,14 @@ func (w *objWriter) writeRefs(s *LSym) {
                        w.writeRef(d, false)
                }
                for _, f := range pc.File {
-                       w.writeRef(f, true)
+                       fsym := Linklookup(w.ctxt, f, 0)
+                       w.writeRef(fsym, true)
                }
                for _, call := range pc.InlTree.nodes {
                        w.writeRef(call.Func, false)
                        f, _ := linkgetlineFromPos(w.ctxt, call.Pos)
-                       w.writeRef(f, true)
+                       fsym := Linklookup(w.ctxt, f, 0)
+                       w.writeRef(fsym, true)
                }
        }
 }
@@ -467,13 +469,15 @@ func (w *objWriter) writeSym(s *LSym) {
        }
        w.writeInt(int64(len(pc.File)))
        for _, f := range pc.File {
-               w.writeRefIndex(f)
+               fsym := Linklookup(ctxt, f, 0)
+               w.writeRefIndex(fsym)
        }
        w.writeInt(int64(len(pc.InlTree.nodes)))
        for _, call := range pc.InlTree.nodes {
                w.writeInt(int64(call.Parent))
                f, l := linkgetlineFromPos(w.ctxt, call.Pos)
-               w.writeRefIndex(f)
+               fsym := Linklookup(ctxt, f, 0)
+               w.writeRefIndex(fsym)
                w.writeInt(int64(l))
                w.writeRefIndex(call.Func)
        }
index ca8d1b74842868489808c87b08b4323b5cbec266..04cef4fe5617fcc1d8866100e15267d1cc03f3d5 100644 (file)
@@ -131,11 +131,6 @@ func pctofileline(ctxt *Link, sym *LSym, oldval int32, p *Prog, phase int32, arg
                return oldval
        }
        f, l := linkgetlineFromPos(ctxt, p.Pos)
-       if f == nil {
-               //      print("getline failed for %s %v\n", ctxt->cursym->name, p);
-               return oldval
-       }
-
        if arg == nil {
                return l
        }