Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[dev.boringcrypto] all: merge master (5b76343) into dev.boringcrypto
Change-Id: I52c5b317a97c7723a7c077ae3cdfdc756fd3a1cf
- Loading branch information
Showing
778 changed files
with
60,616 additions
and
5,350 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
// UNREVIEWED | ||
// Copyright 2011 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
// This file implements FindExportData. | ||
|
||
package importer | ||
|
||
import ( | ||
"bufio" | ||
"fmt" | ||
"io" | ||
"strconv" | ||
"strings" | ||
) | ||
|
||
func readGopackHeader(r *bufio.Reader) (name string, size int, err error) { | ||
// See $GOROOT/include/ar.h. | ||
hdr := make([]byte, 16+12+6+6+8+10+2) | ||
_, err = io.ReadFull(r, hdr) | ||
if err != nil { | ||
return | ||
} | ||
// leave for debugging | ||
if false { | ||
fmt.Printf("header: %s", hdr) | ||
} | ||
s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10])) | ||
size, err = strconv.Atoi(s) | ||
if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' { | ||
err = fmt.Errorf("invalid archive header") | ||
return | ||
} | ||
name = strings.TrimSpace(string(hdr[:16])) | ||
return | ||
} | ||
|
||
// FindExportData positions the reader r at the beginning of the | ||
// export data section of an underlying GC-created object/archive | ||
// file by reading from it. The reader must be positioned at the | ||
// start of the file before calling this function. The hdr result | ||
// is the string before the export data, either "$$" or "$$B". | ||
// | ||
func FindExportData(r *bufio.Reader) (hdr string, err error) { | ||
// Read first line to make sure this is an object file. | ||
line, err := r.ReadSlice('\n') | ||
if err != nil { | ||
err = fmt.Errorf("can't find export data (%v)", err) | ||
return | ||
} | ||
|
||
if string(line) == "!<arch>\n" { | ||
// Archive file. Scan to __.PKGDEF. | ||
var name string | ||
if name, _, err = readGopackHeader(r); err != nil { | ||
return | ||
} | ||
|
||
// First entry should be __.PKGDEF. | ||
if name != "__.PKGDEF" { | ||
err = fmt.Errorf("go archive is missing __.PKGDEF") | ||
return | ||
} | ||
|
||
// Read first line of __.PKGDEF data, so that line | ||
// is once again the first line of the input. | ||
if line, err = r.ReadSlice('\n'); err != nil { | ||
err = fmt.Errorf("can't find export data (%v)", err) | ||
return | ||
} | ||
} | ||
|
||
// Now at __.PKGDEF in archive or still at beginning of file. | ||
// Either way, line should begin with "go object ". | ||
if !strings.HasPrefix(string(line), "go object ") { | ||
err = fmt.Errorf("not a Go object file") | ||
return | ||
} | ||
|
||
// Skip over object header to export data. | ||
// Begins after first line starting with $$. | ||
for line[0] != '$' { | ||
if line, err = r.ReadSlice('\n'); err != nil { | ||
err = fmt.Errorf("can't find export data (%v)", err) | ||
return | ||
} | ||
} | ||
hdr = string(line) | ||
|
||
return | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,175 @@ | ||
// UNREVIEWED | ||
// Copyright 2011 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
// package importer implements Import for gc-generated object files. | ||
package importer | ||
|
||
import ( | ||
"bufio" | ||
"cmd/compile/internal/types2" | ||
"fmt" | ||
"go/build" | ||
"io" | ||
"io/ioutil" | ||
"os" | ||
"path/filepath" | ||
"strings" | ||
) | ||
|
||
// debugging/development support | ||
const debug = false | ||
|
||
var pkgExts = [...]string{".a", ".o"} | ||
|
||
// FindPkg returns the filename and unique package id for an import | ||
// path based on package information provided by build.Import (using | ||
// the build.Default build.Context). A relative srcDir is interpreted | ||
// relative to the current working directory. | ||
// If no file was found, an empty filename is returned. | ||
// | ||
func FindPkg(path, srcDir string) (filename, id string) { | ||
if path == "" { | ||
return | ||
} | ||
|
||
var noext string | ||
switch { | ||
default: | ||
// "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x" | ||
// Don't require the source files to be present. | ||
if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282 | ||
srcDir = abs | ||
} | ||
bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary) | ||
if bp.PkgObj == "" { | ||
id = path // make sure we have an id to print in error message | ||
return | ||
} | ||
noext = strings.TrimSuffix(bp.PkgObj, ".a") | ||
id = bp.ImportPath | ||
|
||
case build.IsLocalImport(path): | ||
// "./x" -> "/this/directory/x.ext", "/this/directory/x" | ||
noext = filepath.Join(srcDir, path) | ||
id = noext | ||
|
||
case filepath.IsAbs(path): | ||
// for completeness only - go/build.Import | ||
// does not support absolute imports | ||
// "/x" -> "/x.ext", "/x" | ||
noext = path | ||
id = path | ||
} | ||
|
||
if false { // for debugging | ||
if path != id { | ||
fmt.Printf("%s -> %s\n", path, id) | ||
} | ||
} | ||
|
||
// try extensions | ||
for _, ext := range pkgExts { | ||
filename = noext + ext | ||
if f, err := os.Stat(filename); err == nil && !f.IsDir() { | ||
return | ||
} | ||
} | ||
|
||
filename = "" // not found | ||
return | ||
} | ||
|
||
// Import imports a gc-generated package given its import path and srcDir, adds | ||
// the corresponding package object to the packages map, and returns the object. | ||
// The packages map must contain all packages already imported. | ||
// | ||
func Import(packages map[string]*types2.Package, path, srcDir string, lookup func(path string) (io.ReadCloser, error)) (pkg *types2.Package, err error) { | ||
var rc io.ReadCloser | ||
var id string | ||
if lookup != nil { | ||
// With custom lookup specified, assume that caller has | ||
// converted path to a canonical import path for use in the map. | ||
if path == "unsafe" { | ||
return types2.Unsafe, nil | ||
} | ||
id = path | ||
|
||
// No need to re-import if the package was imported completely before. | ||
if pkg = packages[id]; pkg != nil && pkg.Complete() { | ||
return | ||
} | ||
f, err := lookup(path) | ||
if err != nil { | ||
return nil, err | ||
} | ||
rc = f | ||
} else { | ||
var filename string | ||
filename, id = FindPkg(path, srcDir) | ||
if filename == "" { | ||
if path == "unsafe" { | ||
return types2.Unsafe, nil | ||
} | ||
return nil, fmt.Errorf("can't find import: %q", id) | ||
} | ||
|
||
// no need to re-import if the package was imported completely before | ||
if pkg = packages[id]; pkg != nil && pkg.Complete() { | ||
return | ||
} | ||
|
||
// open file | ||
f, err := os.Open(filename) | ||
if err != nil { | ||
return nil, err | ||
} | ||
defer func() { | ||
if err != nil { | ||
// add file name to error | ||
err = fmt.Errorf("%s: %v", filename, err) | ||
} | ||
}() | ||
rc = f | ||
} | ||
defer rc.Close() | ||
|
||
var hdr string | ||
buf := bufio.NewReader(rc) | ||
if hdr, err = FindExportData(buf); err != nil { | ||
return | ||
} | ||
|
||
switch hdr { | ||
case "$$\n": | ||
err = fmt.Errorf("import %q: old textual export format no longer supported (recompile library)", path) | ||
|
||
case "$$B\n": | ||
var data []byte | ||
data, err = ioutil.ReadAll(buf) | ||
if err != nil { | ||
break | ||
} | ||
|
||
// The indexed export format starts with an 'i'; the older | ||
// binary export format starts with a 'c', 'd', or 'v' | ||
// (from "version"). Select appropriate importer. | ||
if len(data) > 0 && data[0] == 'i' { | ||
_, pkg, err = iImportData(packages, data[1:], id) | ||
} else { | ||
err = fmt.Errorf("import %q: old binary export format no longer supported (recompile library)", path) | ||
} | ||
|
||
default: | ||
err = fmt.Errorf("import %q: unknown export data header: %q", path, hdr) | ||
} | ||
|
||
return | ||
} | ||
|
||
type byPath []*types2.Package | ||
|
||
func (a byPath) Len() int { return len(a) } | ||
func (a byPath) Swap(i, j int) { a[i], a[j] = a[j], a[i] } | ||
func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() } |
Oops, something went wrong.