package staticdata
import (
+ "encoding/base64"
"fmt"
"go/constant"
"io"
const (
stringSymPrefix = "go.string."
- stringSymPattern = ".gostring.%d.%x"
+ stringSymPattern = ".gostring.%d.%s"
)
+// shortHashString converts the hash to a string for use with stringSymPattern.
+// We cut it to 16 bytes and then base64-encode to make it even smaller.
+func shortHashString(hash []byte) string {
+ return base64.StdEncoding.EncodeToString(hash[:16])
+}
+
// StringSym returns a symbol containing the string s.
// The symbol contains the string data, not a string header.
func StringSym(pos src.XPos, s string) (data *obj.LSym) {
// Same pattern is known to fileStringSym below.
h := notsha256.New()
io.WriteString(h, s)
- symname = fmt.Sprintf(stringSymPattern, len(s), h.Sum(nil))
+ symname = fmt.Sprintf(stringSymPattern, len(s), shortHashString(h.Sum(nil)))
} else {
// Small strings get named directly by their contents.
symname = strconv.Quote(s)
var symdata *obj.LSym
if readonly {
- symname := fmt.Sprintf(stringSymPattern, size, sum)
+ symname := fmt.Sprintf(stringSymPattern, size, shortHashString(sum))
symdata = base.Ctxt.Lookup(stringSymPrefix + symname)
if !symdata.OnList() {
info := symdata.NewFileInfo()
"cmd/internal/goobj"
"cmd/internal/notsha256"
"cmd/internal/objabi"
+ "encoding/base64"
"fmt"
"internal/buildcfg"
"log"
// GCLocalsSym generates a content-addressable sym containing data.
func (ctxt *Link) GCLocalsSym(data []byte) *LSym {
- return ctxt.LookupInit(fmt.Sprintf("gclocals·%x", notsha256.Sum256(data)), func(lsym *LSym) {
+ sum := notsha256.Sum256(data)
+ str := base64.StdEncoding.EncodeToString(sum[:16])
+ return ctxt.LookupInit(fmt.Sprintf("gclocals·%s", str), func(lsym *LSym) {
lsym.P = data
lsym.Set(AttrContentAddressable, true)
})