mirror of
https://github.com/golang/go
synced 2024-11-17 04:44:46 -07:00
cmd/compile/internal/importer: support final unified IR export format
This updates the cmd/compile/internal/importer to natively support the "final" unified IR export format. This is really just for unit tests and symmetry with go/internal/gcimporter though, since cmd/compile/internal/noder has its own types2.Importer. Change-Id: I52fbb6134dbc0a903d62c1b04f95d33bd29e0414 Reviewed-on: https://go-review.googlesource.com/c/go/+/388617 Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Robert Griesemer <gri@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Trust: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
c3fcd01177
commit
9a9bd10290
@ -41,7 +41,9 @@ func readGopackHeader(r *bufio.Reader) (name string, size int, err error) {
|
|||||||
// start of the file before calling this function. The hdr result
|
// start of the file before calling this function. The hdr result
|
||||||
// is the string before the export data, either "$$" or "$$B".
|
// is the string before the export data, either "$$" or "$$B".
|
||||||
//
|
//
|
||||||
func FindExportData(r *bufio.Reader) (hdr string, err error) {
|
// If size is non-negative, it's the number of bytes of export data
|
||||||
|
// still available to read from r.
|
||||||
|
func FindExportData(r *bufio.Reader) (hdr string, size int, err error) {
|
||||||
// Read first line to make sure this is an object file.
|
// Read first line to make sure this is an object file.
|
||||||
line, err := r.ReadSlice('\n')
|
line, err := r.ReadSlice('\n')
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -52,7 +54,7 @@ func FindExportData(r *bufio.Reader) (hdr string, err error) {
|
|||||||
if string(line) == "!<arch>\n" {
|
if string(line) == "!<arch>\n" {
|
||||||
// Archive file. Scan to __.PKGDEF.
|
// Archive file. Scan to __.PKGDEF.
|
||||||
var name string
|
var name string
|
||||||
if name, _, err = readGopackHeader(r); err != nil {
|
if name, size, err = readGopackHeader(r); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,6 +78,7 @@ func FindExportData(r *bufio.Reader) (hdr string, err error) {
|
|||||||
err = fmt.Errorf("not a Go object file")
|
err = fmt.Errorf("not a Go object file")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
size -= len(line)
|
||||||
|
|
||||||
// Skip over object header to export data.
|
// Skip over object header to export data.
|
||||||
// Begins after first line starting with $$.
|
// Begins after first line starting with $$.
|
||||||
@ -84,6 +87,7 @@ func FindExportData(r *bufio.Reader) (hdr string, err error) {
|
|||||||
err = fmt.Errorf("can't find export data (%v)", err)
|
err = fmt.Errorf("can't find export data (%v)", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
size -= len(line)
|
||||||
}
|
}
|
||||||
hdr = string(line)
|
hdr = string(line)
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"cmd/compile/internal/types2"
|
"cmd/compile/internal/types2"
|
||||||
"fmt"
|
"fmt"
|
||||||
"go/build"
|
"go/build"
|
||||||
|
"internal/pkgbits"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
@ -134,9 +135,9 @@ func Import(packages map[string]*types2.Package, path, srcDir string, lookup fun
|
|||||||
}
|
}
|
||||||
defer rc.Close()
|
defer rc.Close()
|
||||||
|
|
||||||
var hdr string
|
|
||||||
buf := bufio.NewReader(rc)
|
buf := bufio.NewReader(rc)
|
||||||
if hdr, err = FindExportData(buf); err != nil {
|
hdr, size, err := FindExportData(buf)
|
||||||
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,17 +147,33 @@ func Import(packages map[string]*types2.Package, path, srcDir string, lookup fun
|
|||||||
|
|
||||||
case "$$B\n":
|
case "$$B\n":
|
||||||
var data []byte
|
var data []byte
|
||||||
data, err = ioutil.ReadAll(buf)
|
var r io.Reader = buf
|
||||||
|
if size >= 0 {
|
||||||
|
r = io.LimitReader(r, int64(size))
|
||||||
|
}
|
||||||
|
data, err = ioutil.ReadAll(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(data) == 0 {
|
||||||
|
err = fmt.Errorf("import %q: missing export data", path)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
exportFormat := data[0]
|
||||||
|
s := string(data[1:])
|
||||||
|
|
||||||
// The indexed export format starts with an 'i'; the older
|
// The indexed export format starts with an 'i'; the older
|
||||||
// binary export format starts with a 'c', 'd', or 'v'
|
// binary export format starts with a 'c', 'd', or 'v'
|
||||||
// (from "version"). Select appropriate importer.
|
// (from "version"). Select appropriate importer.
|
||||||
if len(data) > 0 && data[0] == 'i' {
|
switch exportFormat {
|
||||||
pkg, err = ImportData(packages, string(data[1:]), id)
|
case 'u':
|
||||||
} else {
|
s = s[:strings.Index(s, "\n$$\n")]
|
||||||
|
input := pkgbits.NewPkgDecoder(id, s)
|
||||||
|
pkg = ReadPackage(nil, packages, input)
|
||||||
|
case 'i':
|
||||||
|
pkg, err = ImportData(packages, s, id)
|
||||||
|
default:
|
||||||
err = fmt.Errorf("import %q: old binary export format no longer supported (recompile library)", path)
|
err = fmt.Errorf("import %q: old binary export format no longer supported (recompile library)", path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user