mirror of
https://github.com/golang/go
synced 2024-11-17 02:04:48 -07:00
internal/pkgbits: add fingerprints to unified IR export format
So far unified IR has been relying on the backwards-compat iexport data to supply package fingerprints for imports. To be able to drop the iexport data and natively use unified IR everywhere. This CL applies basically the same idea that iexport used: simply hash all of the export data as it's being written out, and then tack on an 8-byte hash at the end. Change-Id: Iaca5fbfd7443088bc7f422a1c58be3e762c29014 Reviewed-on: https://go-review.googlesource.com/c/go/+/396196 Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com>
This commit is contained in:
parent
1a9972ec87
commit
42ca44494c
@ -310,11 +310,6 @@ var depsRules = `
|
||||
go/build/constraint, go/doc, go/parser, internal/buildcfg, internal/goroot, internal/goversion
|
||||
< go/build;
|
||||
|
||||
DEBUG, go/build, go/types, text/scanner
|
||||
< internal/pkgbits
|
||||
< go/internal/gcimporter, go/internal/gccgoimporter, go/internal/srcimporter
|
||||
< go/importer;
|
||||
|
||||
# databases
|
||||
FMT
|
||||
< database/sql/internal
|
||||
@ -449,6 +444,11 @@ var depsRules = `
|
||||
|
||||
# crypto-aware packages
|
||||
|
||||
CRYPTO, DEBUG, go/build, go/types, text/scanner
|
||||
< internal/pkgbits
|
||||
< go/internal/gcimporter, go/internal/gccgoimporter, go/internal/srcimporter
|
||||
< go/importer;
|
||||
|
||||
NET, crypto/rand, mime/quotedprintable
|
||||
< mime/multipart;
|
||||
|
||||
|
@ -22,7 +22,7 @@ type PkgDecoder struct {
|
||||
|
||||
elemEndsEnds [numRelocs]uint32
|
||||
elemEnds []uint32
|
||||
elemData string
|
||||
elemData string // last 8 bytes are fingerprint
|
||||
}
|
||||
|
||||
func (pr *PkgDecoder) PkgPath() string { return pr.pkgPath }
|
||||
@ -50,7 +50,7 @@ func NewPkgDecoder(pkgPath, input string) PkgDecoder {
|
||||
assert(err == nil)
|
||||
|
||||
pr.elemData = input[pos:]
|
||||
assert(len(pr.elemData) == int(pr.elemEnds[len(pr.elemEnds)-1]))
|
||||
assert(len(pr.elemData)-8 == int(pr.elemEnds[len(pr.elemEnds)-1]))
|
||||
|
||||
return pr
|
||||
}
|
||||
@ -67,6 +67,12 @@ func (pr *PkgDecoder) TotalElems() int {
|
||||
return len(pr.elemEnds)
|
||||
}
|
||||
|
||||
func (pr *PkgDecoder) Fingerprint() [8]byte {
|
||||
var fp [8]byte
|
||||
copy(fp[:], pr.elemData[len(pr.elemData)-8:])
|
||||
return fp
|
||||
}
|
||||
|
||||
func (pr *PkgDecoder) AbsIdx(k RelocKind, idx int) int {
|
||||
absIdx := idx
|
||||
if k > 0 {
|
||||
|
@ -8,6 +8,7 @@ package pkgbits
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/md5"
|
||||
"encoding/binary"
|
||||
"go/constant"
|
||||
"io"
|
||||
@ -30,7 +31,10 @@ func NewPkgEncoder(syncFrames int) PkgEncoder {
|
||||
}
|
||||
}
|
||||
|
||||
func (pw *PkgEncoder) DumpTo(out io.Writer) {
|
||||
func (pw *PkgEncoder) DumpTo(out0 io.Writer) (fingerprint [8]byte) {
|
||||
h := md5.New()
|
||||
out := io.MultiWriter(out0, h)
|
||||
|
||||
writeUint32 := func(x uint32) {
|
||||
assert(binary.Write(out, binary.LittleEndian, x) == nil)
|
||||
}
|
||||
@ -57,6 +61,12 @@ func (pw *PkgEncoder) DumpTo(out io.Writer) {
|
||||
assert(err == nil)
|
||||
}
|
||||
}
|
||||
|
||||
copy(fingerprint[:], h.Sum(nil))
|
||||
_, err := out0.Write(fingerprint[:])
|
||||
assert(err == nil)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (pw *PkgEncoder) StringIdx(s string) int {
|
||||
|
Loading…
Reference in New Issue
Block a user