From 049eee68065de196fbe4aa99c322bd17aa804ec1 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sun, 8 Mar 2015 22:45:13 -0400 Subject: [PATCH] cmd/internal/obj: use map for symbol table Change-Id: I105c1e7730c1e7ccf36297b9cbf96dc0a4868013 Reviewed-on: https://go-review.googlesource.com/7621 Reviewed-by: Rob Pike --- src/cmd/internal/obj/link.go | 12 ++++++------ src/cmd/internal/obj/sym.go | 23 ++++++----------------- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index ea38f54ebb..caa24e02ab 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -115,7 +115,6 @@ type LSym struct { Locals int32 Value int64 Size int64 - Hash *LSym Allsym *LSym Next *LSym Sub *LSym @@ -181,7 +180,7 @@ type Link struct { Goroot string Goroot_final string Enforce_data_order int32 - Hash [LINKHASH]*LSym + Hash map[SymVer]*LSym Allsym *LSym Nsymbol int32 Hist *Hist @@ -226,6 +225,11 @@ type Link struct { Filesyms *LSym } +type SymVer struct { + Name string + Version int +} + type Plist struct { Name *LSym Firstpc *Prog @@ -539,10 +543,6 @@ const ( A_PARAM ) -const ( - LINKHASH = 100003 -) - // Pcdata iterator. // for(pciterinit(ctxt, &it, &pcd); !it.done; pciternext(&it)) { it.value holds in [it.pc, it.nextpc) } diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 1557446457..7d9e469da7 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -126,6 +126,7 @@ func Linknew(arch *LinkArch) *Link { linksetexp() ctxt := new(Link) + ctxt.Hash = make(map[SymVer]*LSym) ctxt.Arch = arch ctxt.Version = HistVersion ctxt.Goroot = Getgoroot() @@ -241,26 +242,14 @@ func linknewsym(ctxt *Link, symb string, v int) *LSym { } func _lookup(ctxt *Link, symb string, v int, creat int) *LSym { - h := uint32(v) - for i := 0; i < len(symb); i++ { - c := int(symb[i]) - h = h + h + h + uint32(c) - } - h &= 0xffffff - h %= LINKHASH - for s := ctxt.Hash[h]; s != nil; s = s.Hash { - if int(s.Version) == v && s.Name == symb { - return s - } - } - if creat == 0 { - return nil + s := ctxt.Hash[SymVer{symb, v}] + if s != nil || creat == 0 { + return s } - s := linknewsym(ctxt, symb, v) + s = linknewsym(ctxt, symb, v) s.Extname = s.Name - s.Hash = ctxt.Hash[h] - ctxt.Hash[h] = s + ctxt.Hash[SymVer{symb, v}] = s return s } -- 2.48.1