mirror of
https://github.com/golang/go
synced 2024-11-18 15:44:41 -07:00
cmd/internal/obj: avoid duplicate file name symbols
The meaning of Version=1 was overloaded: it was reserved for file name symbols (to avoid conflicts with non-file name symbols), but was also used to mean "give me a fresh version number for this symbol." With the new inlining tree, the same file name symbol can appear in multiple entries, but each one would become a distinct symbol with its own version number. Now, we avoid duplicating symbols by using Version=0 for file name symbols and we avoid conflicts with other symbols by prefixing the symbol name with "gofile..". Change-Id: I8d0374053b8cdb6a9ca7fb71871b69b4dd369a9c Reviewed-on: https://go-review.googlesource.com/37234 Run-TryBot: David Lazar <lazard@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com> Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
781fd3998e
commit
301149b9e4
@ -74,14 +74,16 @@ func (ctxt *Link) AddImport(pkg string) {
|
|||||||
ctxt.Imports = append(ctxt.Imports, pkg)
|
ctxt.Imports = append(ctxt.Imports, pkg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FileSymPrefix = "gofile.."
|
||||||
|
|
||||||
func linkgetlineFromPos(ctxt *Link, xpos src.XPos) (f *LSym, l int32) {
|
func linkgetlineFromPos(ctxt *Link, xpos src.XPos) (f *LSym, l int32) {
|
||||||
pos := ctxt.PosTable.Pos(xpos)
|
pos := ctxt.PosTable.Pos(xpos)
|
||||||
filename := pos.AbsFilename()
|
filename := pos.AbsFilename()
|
||||||
if !pos.IsKnown() || filename == "" {
|
if !pos.IsKnown() || filename == "" {
|
||||||
return Linklookup(ctxt, "??", HistVersion), 0
|
return Linklookup(ctxt, FileSymPrefix+"??", 0), 0
|
||||||
}
|
}
|
||||||
// TODO(gri) Should this use relative or absolute line number?
|
// TODO(gri) Should this use relative or absolute line number?
|
||||||
return Linklookup(ctxt, filename, HistVersion), int32(pos.RelLine())
|
return Linklookup(ctxt, FileSymPrefix+filename, 0), int32(pos.RelLine())
|
||||||
}
|
}
|
||||||
|
|
||||||
func fieldtrack(ctxt *Link, cursym *LSym) {
|
func fieldtrack(ctxt *Link, cursym *LSym) {
|
||||||
|
@ -32,7 +32,7 @@ func TestLinkgetlineFromPos(t *testing.T) {
|
|||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
f, l := linkgetlineFromPos(ctxt, ctxt.PosTable.XPos(test.pos))
|
f, l := linkgetlineFromPos(ctxt, ctxt.PosTable.XPos(test.pos))
|
||||||
got := fmt.Sprintf("%s:%d", f.Name, l)
|
got := fmt.Sprintf("%s:%d", f.Name, l)
|
||||||
if got != test.want {
|
if got != FileSymPrefix+test.want {
|
||||||
t.Errorf("linkgetline(%v) = %q, want %q", test.pos, got, test.want)
|
t.Errorf("linkgetline(%v) = %q, want %q", test.pos, got, test.want)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -708,12 +708,6 @@ type Pcdata struct {
|
|||||||
P []byte
|
P []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// symbol version, incremented each time a file is loaded.
|
|
||||||
// version==1 is reserved for savehist.
|
|
||||||
const (
|
|
||||||
HistVersion = 1
|
|
||||||
)
|
|
||||||
|
|
||||||
// Link holds the context for writing object code from a compiler
|
// Link holds the context for writing object code from a compiler
|
||||||
// to be linker input or for reading that input into the linker.
|
// to be linker input or for reading that input into the linker.
|
||||||
type Link struct {
|
type Link struct {
|
||||||
|
@ -53,7 +53,7 @@ func Linknew(arch *LinkArch) *Link {
|
|||||||
ctxt := new(Link)
|
ctxt := new(Link)
|
||||||
ctxt.Hash = make(map[SymVer]*LSym)
|
ctxt.Hash = make(map[SymVer]*LSym)
|
||||||
ctxt.Arch = arch
|
ctxt.Arch = arch
|
||||||
ctxt.Version = HistVersion
|
ctxt.Version = 0
|
||||||
ctxt.Pathname = WorkingDir()
|
ctxt.Pathname = WorkingDir()
|
||||||
|
|
||||||
ctxt.Headtype.Set(GOOS)
|
ctxt.Headtype.Set(GOOS)
|
||||||
|
@ -114,7 +114,8 @@ func numberfile(ctxt *Link, file *Symbol) {
|
|||||||
ctxt.Filesyms = append(ctxt.Filesyms, file)
|
ctxt.Filesyms = append(ctxt.Filesyms, file)
|
||||||
file.Value = int64(len(ctxt.Filesyms))
|
file.Value = int64(len(ctxt.Filesyms))
|
||||||
file.Type = obj.SFILEPATH
|
file.Type = obj.SFILEPATH
|
||||||
file.Name = expandGoroot(file.Name)
|
path := file.Name[len(obj.FileSymPrefix):]
|
||||||
|
file.Name = expandGoroot(path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user