Commit a38a917a authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

all: remove the nacl port (part 1)

You were a useful port and you've served your purpose.
Thanks for all the play.

A subsequent CL will remove amd64p32 (including assembly files and
toolchain bits) and remaining bits. The amd64p32 removal will be
separated into its own CL in case we want to support the Linux x32 ABI
in the future and want our old amd64p32 support as a starting point.

Updates #30439

Change-Id: Ia3a0c7d49804adc87bf52a4dea7e3d3007f2b1cd
Reviewed-on: https://go-review.googlesource.com/c/go/+/199499
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 2197321d
Native Client
=============
This document outlines the basics of building and developing the Go runtime and
programs in the Native Client (NaCl) environment.
Go 1.3 supports three architectures
* nacl/386 which is standard 386.
* nacl/amd64p32 which is a 64 bit architecture, where the address space is
limited to a 4gb window.
* nacl/arm which is 32-bit ARMv7A architecture with 1GB address space.
For background it is recommended that you read https://golang.org/s/go13nacl.
Prerequisites
-------------
Native Client programs are executed inside a sandbox, the NaCl runtime. This
runtime must be installed before you can use NaCl programs.
The NaCl distribution comes with an installer which ensures you have access to
the latest version of the runtime. The version tracks the Chrome numbering
scheme.
# Download NaCl
Download nacl_sdk.zip file from
https://developer.chrome.com/native-client/sdk/download
and unpack it. I chose /opt/nacl_sdk.
# Update
The zip file contains a small skeleton that can be used to download the correct
sdk. These are released every 6-8 weeks, in line with Chrome releases.
% cd /opt/nacl_sdk
% ./naclsdk update
At this time pepper_49 is the stable version. The NaCl port needs at least pepper_39
to work. If naclsdk downloads a later version, please adjust accordingly.
The cmd/go helper scripts expect that the loaders sel_ldr_{x86_{32,64},arm} and
nacl_helper_bootstrap_arm are in your path. I find it easiest to make a symlink
from the NaCl distribution to my $GOPATH/bin directory.
% ln -nfs /opt/nacl_sdk/pepper_39/tools/sel_ldr_x86_32 $GOPATH/bin/sel_ldr_x86_32
% ln -nfs /opt/nacl_sdk/pepper_39/tools/sel_ldr_x86_64 $GOPATH/bin/sel_ldr_x86_64
% ln -nfs /opt/nacl_sdk/pepper_39/tools/sel_ldr_arm $GOPATH/bin/sel_ldr_arm
Additionally, for NaCl/ARM only:
% ln -nfs /opt/nacl_sdk/pepper_39/tools/nacl_helper_bootstrap_arm $GOPATH/bin/nacl_helper_bootstrap_arm
Support scripts
---------------
Symlink the two scripts in this directory into your $PATH, just as you did with
NaCl sdk above.
% ln -nfs $GOROOT/misc/nacl/go_nacl_amd64p32_exec $GOPATH/bin/go_nacl_amd64p32_exec
% ln -nfs $GOROOT/misc/nacl/go_nacl_386_exec $GOPATH/bin/go_nacl_386_exec
% ln -nfs $GOROOT/misc/nacl/go_nacl_arm_exec $GOPATH/bin/go_nacl_arm_exec
Building and testing
--------------------
Building for NaCl is similar to cross compiling for other platforms. However,
as it is not possible to ever build in a `native` NaCl environment, the cmd/go
tool has been enhanced to allow the full build, all.bash, to be executed,
rather than just the compile stage, make.bash.
The cmd/go tool knows that if GOOS is set to `nacl` it should not try to
execute any binaries itself. Instead it passes their execution to a support
script which sets up a Native Client environment and invokes the NaCl sandbox.
The script's name has a special format, go_$GOOS_$GOARCH_exec, so cmd/go can
find it.
In short, if the support scripts are in place, the cmd/go tool can be used as
per normal.
# Build and test Go for NaCl
NaCl does not permit direct file system access. Instead, package syscall
provides a simulated file system served by in-memory data. The script
nacltest.bash is the NaCl equivalent of all.bash. It builds NaCl with an
in-memory file system containing files needed for tests, and then it runs the
tests.
% cd go/src
% env GOARCH=amd64p32 ./nacltest.bash
Debugging
---------
Assuming that you have built nacl/amd64p32 binary ./mybin and can run as:
% sel_ldr_x86_64 -l /dev/null -S -e ./mybin
Create the nacl manifest file mybin.manifest with the following contents:
{ "program": { "x86-64": { "url": "mybin" } } }
url is the path to the binary relative to the manifest file.
Then, run the program as:
% sel_ldr_x86_64 -g -l /dev/null -S -e ./mybin
The -g flag instructs the loader to stop at startup. Then, in another console:
% /opt/nacl_sdk/pepper_39/toolchain/linux_x86_glibc/bin/x86_64-nacl-gdb
% nacl-manifest mybin.manifest
% target remote :4014
If you see that the program is stopped in _rt0_amd64p32_nacl, then symbols are
loaded successfully and you can type 'c' to start the program.
Next time you can automate it as:
% /opt/nacl_sdk/pepper_39/toolchain/linux_x86_glibc/bin/x86_64-nacl-gdb \
-ex 'nacl-manifest mybin.manifest' -ex 'target remote :4014'
#!/bin/bash
eval $(go env)
export NACLENV_GOARCH=$GOARCH
export NACLENV_GOOS=$GOOS
export NACLENV_GOROOT=/go
export NACLENV_NACLPWD=$(pwd | sed "s;$GOROOT;/go;")
exec sel_ldr_x86_32 -l /dev/null -S -e "$@"
#!/bin/bash
eval $(go env)
export NACLENV_GOARCH=$GOARCH
export NACLENV_GOOS=$GOOS
export NACLENV_GOROOT=/go
export NACLENV_NACLPWD=$(pwd | sed "s;$GOROOT;/go;")
exec sel_ldr_x86_64 -l /dev/null -S -e "$@"
#!/bin/bash
eval $(go env)
export NACLENV_GOARCH=$GOARCH
export NACLENV_GOOS=$GOOS
export NACLENV_GOROOT=/go
export NACLENV_NACLPWD=$(pwd | sed "s;$GOROOT;/go;")
exec nacl_helper_bootstrap_arm $(which sel_ldr_arm) --reserved_at_zero=0xXXXXXXXXXXXXXXXX -l /dev/null -S -e "$@"
// Copyright 2014 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.
// Mkzip creates a zip file from a 'proto' file describing the contents.
//
// The proto file is inspired by the Plan 9 mkfs prototype file format.
// It describes a file tree, one directory per line, with leading tab
// indentation marking the tree structure. Each line contains a leading
// name field giving the name of the file to copy into the zip file,
// and then a sequence of optional key=value attributes to control
// the copy. The only known attribute is src=foo, meaning copy the
// actual data for the file (or directory) from an alternate location.
package main
import (
"archive/zip"
"bufio"
"flag"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
"strings"
)
func usage() {
fmt.Fprintf(os.Stderr, "usage: mkzip [-r root] src.proto out.zip\n")
os.Exit(2)
}
func sysfatal(format string, args ...interface{}) {
fmt.Fprintf(os.Stderr, "mkzip: %s\n", fmt.Sprintf(format, args...))
os.Exit(2)
}
var (
root = flag.String("r", ".", "interpret source paths relative to this directory")
gopackage = flag.String("p", "", "write Go source file in this package")
)
type stack struct {
name string
src string
depth int
}
func main() {
log.SetFlags(0)
flag.Usage = usage
flag.Parse()
args := flag.Args()
if len(args) != 2 {
usage()
}
rf, err := os.Open(args[0])
if err != nil {
sysfatal("%v", err)
}
r := bufio.NewScanner(rf)
zf, err := os.Create(args[1])
if err != nil {
sysfatal("%v", err)
}
var w io.Writer = zf
if *gopackage != "" {
fmt.Fprintf(zf, `package %s
import "sync"
func init() {
var once sync.Once
fsinit = func() {
once.Do(func() {
unzip("`, *gopackage)
gw := &goWriter{b: bufio.NewWriter(w)}
defer func() {
if err := gw.Close(); err != nil {
sysfatal("finishing Go output: %v", err)
}
}()
w = gw
}
z := zip.NewWriter(w)
lineno := 0
addfile := func(info os.FileInfo, dst string, src string) {
zh, err := zip.FileInfoHeader(info)
if err != nil {
sysfatal("%s:%d: %s: %v", args[0], lineno, src, err)
}
zh.Name = dst
zh.Method = zip.Deflate
if info.IsDir() && !strings.HasSuffix(dst, "/") {
zh.Name += "/"
}
w, err := z.CreateHeader(zh)
if err != nil {
sysfatal("%s:%d: %s: %v", args[0], lineno, src, err)
}
if info.IsDir() {
return
}
r, err := os.Open(src)
if err != nil {
sysfatal("%s:%d: %s: %v", args[0], lineno, src, err)
}
defer r.Close()
if _, err := io.Copy(w, r); err != nil {
sysfatal("%s:%d: %s: %v", args[0], lineno, src, err)
}
}
var stk []stack
for r.Scan() {
line := r.Text()
lineno++
s := strings.TrimLeft(line, "\t")
prefix, line := line[:len(line)-len(s)], s
if i := strings.Index(line, "#"); i >= 0 {
line = line[:i]
}
f := strings.Fields(line)
if len(f) == 0 {
continue
}
if strings.HasPrefix(line, " ") {
sysfatal("%s:%d: must use tabs for indentation", args[0], lineno)
}
depth := len(prefix)
for len(stk) > 0 && depth <= stk[len(stk)-1].depth {
stk = stk[:len(stk)-1]
}
parent := ""
psrc := *root
if len(stk) > 0 {
parent = stk[len(stk)-1].name
psrc = stk[len(stk)-1].src
}
if strings.Contains(f[0], "/") {
sysfatal("%s:%d: destination name cannot contain slash", args[0], lineno)
}
name := path.Join(parent, f[0])
src := filepath.Join(psrc, f[0])
for _, attr := range f[1:] {
i := strings.Index(attr, "=")
if i < 0 {
sysfatal("%s:%d: malformed attribute %q", args[0], lineno, attr)
}
key, val := attr[:i], attr[i+1:]
switch key {
case "src":
src = val
default:
sysfatal("%s:%d: unknown attribute %q", args[0], lineno, attr)
}
}
stk = append(stk, stack{name: name, src: src, depth: depth})
if f[0] == "*" || f[0] == "+" {
if f[0] == "*" {
dir, err := ioutil.ReadDir(psrc)
if err != nil {
sysfatal("%s:%d: %v", args[0], lineno, err)
}
for _, d := range dir {
addfile(d, path.Join(parent, d.Name()), filepath.Join(psrc, d.Name()))
}
} else {
err := filepath.Walk(psrc, func(src string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if src == psrc {
return nil
}
if psrc == "." {
psrc = ""
}
name := path.Join(parent, filepath.ToSlash(src[len(psrc):]))
addfile(info, name, src)
return nil
})
if err != nil {
sysfatal("%s:%d: %v", args[0], lineno, err)
}
}
continue
}
fi, err := os.Stat(src)
if err != nil {
sysfatal("%s:%d: %v", args[0], lineno, err)
}
addfile(fi, name, src)
}
if err := z.Close(); err != nil {
sysfatal("finishing zip file: %v", err)
}
}
type goWriter struct {
b *bufio.Writer
}
func (w *goWriter) Write(b []byte) (int, error) {
for _, c := range b {
fmt.Fprintf(w.b, "\\x%02x", c)
}
return len(b), nil
}
func (w *goWriter) Close() error {
fmt.Fprintf(w.b, "\")\n\t\t})\n\t}\n}")
w.b.Flush()
return nil
}
nobody:*:-2:
nogroup:*:-1:
wheel:*:0:root
daemon:*:1:root
kmem:*:2:root
sys:*:3:root
tty:*:4:root
operator:*:5:root
This diff is collapsed.
etc src=/etc
mime.types src=../misc/nacl/testdata/mime.types
resolv.conf src=../misc/nacl/testdata/empty
group src=../misc/nacl/testdata/group
passwd src=../misc/nacl/testdata/empty
hosts src=../misc/nacl/testdata/hosts
services
usr src=../misc/nacl/testdata
bin
go src=..
src
cmd
api
testdata
+
asm
internal
asm
testdata
+
compile
internal
syntax
parser.go
cover
testdata
+
doc
main.go
pkg.go
doc_test.go
testdata
+
internal
objfile
objfile.go
buildid
testdata
+
gofmt
gofmt.go
gofmt_test.go
testdata
+
vendor
github.com
google
pprof
internal
binutils
+
driver
+
graph
+
report
+
profile
+
ianlancetaylor
demangle
+
golang.org
x
arch
arm
armasm
+
arm64
arm64asm
+
x86
x86asm
+
ppc64
ppc64asm
+
archive
tar
testdata
+
zip
testdata
+
compress
bzip2
testdata
+
flate
testdata
+
gzip
testdata
+
lzw
testdata
+
zlib
crypto
ed25519
testdata
+
rsa
testdata
+
tls
testdata
+
debug
dwarf
testdata
+
elf
testdata
+
macho
testdata
+
pe
testdata
+
plan9obj
testdata
+
go
build
+
doc
testdata
+
format
+
parser
+
printer
+
image
testdata
+
draw
gif
jpeg
png
testdata
+
internal
trace
testdata
+
xcoff
testdata
+
io
+
mime
testdata
+
multipart
testdata
+
net
http
+
testdata
+
os
+
path
filepath
+
regexp
testdata
+
runtime
textflag.h
strconv
testdata
+
testdata
+
text
template
testdata
+
lib
time
zoneinfo.zip
test
+
...@@ -45,17 +45,17 @@ selectedtargets() { ...@@ -45,17 +45,17 @@ selectedtargets() {
gettargets | egrep -v 'android-arm|darwin-arm' | egrep "$pattern" gettargets | egrep -v 'android-arm|darwin-arm' | egrep "$pattern"
} }
# put linux, nacl first in the target list to get all the architectures up front. # put linux first in the target list to get all the architectures up front.
linux_nacl_targets() { linux_targets() {
selectedtargets | egrep 'linux|nacl' | sort selectedtargets | grep 'linux' | sort
} }
non_linux_nacl_targets() { non_linux_targets() {
selectedtargets | egrep -v 'linux|nacl' | sort selectedtargets | grep -v 'linux' | sort
} }
# Note words in $targets are separated by both newlines and spaces. # Note words in $targets are separated by both newlines and spaces.
targets="$(linux_nacl_targets) $(non_linux_nacl_targets)" targets="$(linux_targets) $(non_linux_targets)"
failed=false failed=false
for target in $targets for target in $targets
......
...@@ -174,7 +174,7 @@ func TestIntendedInlining(t *testing.T) { ...@@ -174,7 +174,7 @@ func TestIntendedInlining(t *testing.T) {
} }
switch runtime.GOARCH { switch runtime.GOARCH {
case "nacl", "386", "wasm", "arm": case "386", "wasm", "arm":
default: default:
// TODO(mvdan): As explained in /test/inline_sync.go, some // TODO(mvdan): As explained in /test/inline_sync.go, some
// architectures don't have atomic intrinsics, so these go over // architectures don't have atomic intrinsics, so these go over
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !nacl
package gc package gc
import ( import (
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !nacl
package ssa package ssa
import ( import (
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !nacl
package types package types
import ( import (
......
...@@ -86,7 +86,6 @@ var okgoos = []string{ ...@@ -86,7 +86,6 @@ var okgoos = []string{
"android", "android",
"solaris", "solaris",
"freebsd", "freebsd",
"nacl",
"netbsd", "netbsd",
"openbsd", "openbsd",
"plan9", "plan9",
...@@ -1505,9 +1504,6 @@ var cgoEnabled = map[string]bool{ ...@@ -1505,9 +1504,6 @@ var cgoEnabled = map[string]bool{
"android/arm": true, "android/arm": true,
"android/arm64": true, "android/arm64": true,
"js/wasm": false, "js/wasm": false,
"nacl/386": false,
"nacl/amd64p32": false,
"nacl/arm": false,
"netbsd/386": true, "netbsd/386": true,
"netbsd/amd64": true, "netbsd/amd64": true,
"netbsd/arm": true, "netbsd/arm": true,
......
...@@ -703,7 +703,7 @@ func (t *tester) registerTests() { ...@@ -703,7 +703,7 @@ func (t *tester) registerTests() {
// Doc tests only run on builders. // Doc tests only run on builders.
// They find problems approximately never. // They find problems approximately never.
if t.hasBash() && goos != "nacl" && goos != "js" && goos != "android" && !t.iOS() && os.Getenv("GO_BUILDER_NAME") != "" { if t.hasBash() && goos != "js" && goos != "android" && !t.iOS() && os.Getenv("GO_BUILDER_NAME") != "" {
t.registerTest("doc_progs", "../doc/progs", "time", "go", "run", "run.go") t.registerTest("doc_progs", "../doc/progs", "time", "go", "run", "run.go")
t.registerTest("wiki", "../doc/articles/wiki", "./test.bash") t.registerTest("wiki", "../doc/articles/wiki", "./test.bash")
t.registerTest("codewalk", "../doc/codewalk", "time", "./run") t.registerTest("codewalk", "../doc/codewalk", "time", "./run")
...@@ -735,7 +735,7 @@ func (t *tester) registerTests() { ...@@ -735,7 +735,7 @@ func (t *tester) registerTests() {
}) })
} }
} }
if goos != "nacl" && goos != "android" && !t.iOS() && goos != "js" { if goos != "android" && !t.iOS() && goos != "js" {
t.tests = append(t.tests, distTest{ t.tests = append(t.tests, distTest{
name: "api", name: "api",
heading: "API check", heading: "API check",
......
...@@ -383,10 +383,6 @@ func xsamefile(f1, f2 string) bool { ...@@ -383,10 +383,6 @@ func xsamefile(f1, f2 string) bool {
} }
func xgetgoarm() string { func xgetgoarm() string {
if goos == "nacl" {
// NaCl guarantees VFPv3 and is always cross-compiled.
return "7"
}
if goos == "darwin" || goos == "android" { if goos == "darwin" || goos == "android" {
// Assume all darwin/arm and android devices have VFPv3. // Assume all darwin/arm and android devices have VFPv3.
// These ports are also mostly cross-compiled, so it makes little // These ports are also mostly cross-compiled, so it makes little
......
...@@ -33,9 +33,6 @@ func TestMain(m *testing.M) { ...@@ -33,9 +33,6 @@ func TestMain(m *testing.M) {
} }
func maybeSkip(t *testing.T) { func maybeSkip(t *testing.T) {
if strings.HasPrefix(runtime.GOOS, "nacl") {
t.Skip("nacl does not have a full file tree")
}
if runtime.GOOS == "darwin" && strings.HasPrefix(runtime.GOARCH, "arm") { if runtime.GOOS == "darwin" && strings.HasPrefix(runtime.GOARCH, "arm") {
t.Skip("darwin/arm does not have a full file tree") t.Skip("darwin/arm does not have a full file tree")
} }
......
...@@ -1238,7 +1238,7 @@ ...@@ -1238,7 +1238,7 @@
// If the -exec flag is not given, GOOS or GOARCH is different from the system // If the -exec flag is not given, GOOS or GOARCH is different from the system
// default, and a program named go_$GOOS_$GOARCH_exec can be found // default, and a program named go_$GOOS_$GOARCH_exec can be found
// on the current search path, 'go run' invokes the binary using that program, // on the current search path, 'go run' invokes the binary using that program,
// for example 'go_nacl_386_exec a.out arguments...'. This allows execution of // for example 'go_js_wasm_exec a.out arguments...'. This allows execution of
// cross-compiled programs when a simulator or other execution method is // cross-compiled programs when a simulator or other execution method is
// available. // available.
// //
......
...@@ -56,7 +56,7 @@ func tooSlow(t *testing.T) { ...@@ -56,7 +56,7 @@ func tooSlow(t *testing.T) {
func init() { func init() {
switch runtime.GOOS { switch runtime.GOOS {
case "android", "js", "nacl": case "android", "js":
canRun = false canRun = false
case "darwin": case "darwin":
switch runtime.GOARCH { switch runtime.GOARCH {
...@@ -5604,7 +5604,7 @@ func TestTestCacheInputs(t *testing.T) { ...@@ -5604,7 +5604,7 @@ func TestTestCacheInputs(t *testing.T) {
tg.grepStdout(`\(cached\)`, "did not cache") tg.grepStdout(`\(cached\)`, "did not cache")
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9", "windows": case "plan9", "windows":
// no shell scripts // no shell scripts
default: default:
tg.run("test", "testcache", "-run=Exec") tg.run("test", "testcache", "-run=Exec")
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !nacl
package main_test package main_test
import ( import (
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js linux nacl netbsd openbsd solaris // +build aix darwin dragonfly freebsd js linux netbsd openbsd solaris
package base package base
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !js,!nacl,!plan9 // +build !js,!plan9
package filelock_test package filelock_test
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// js and nacl do not support inter-process file locking. // js and nacl do not support inter-process file locking.
// +build !js,!nacl // +build !js
package lockedfile_test package lockedfile_test
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !nacl,!plan9,!windows,!js // +build !plan9,!windows,!js
package renameio package renameio
......
...@@ -33,7 +33,7 @@ If the -exec flag is given, 'go run' invokes the binary using xprog: ...@@ -33,7 +33,7 @@ If the -exec flag is given, 'go run' invokes the binary using xprog:
If the -exec flag is not given, GOOS or GOARCH is different from the system If the -exec flag is not given, GOOS or GOARCH is different from the system
default, and a program named go_$GOOS_$GOARCH_exec can be found default, and a program named go_$GOOS_$GOARCH_exec can be found
on the current search path, 'go run' invokes the binary using that program, on the current search path, 'go run' invokes the binary using that program,
for example 'go_nacl_386_exec a.out arguments...'. This allows execution of for example 'go_js_wasm_exec a.out arguments...'. This allows execution of
cross-compiled programs when a simulator or other execution method is cross-compiled programs when a simulator or other execution method is
available. available.
......
...@@ -221,8 +221,6 @@ func pkgImportPath(pkgpath string) *load.Package { ...@@ -221,8 +221,6 @@ func pkgImportPath(pkgpath string) *load.Package {
// See https://golang.org/issue/18878. // See https://golang.org/issue/18878.
func TestRespectSetgidDir(t *testing.T) { func TestRespectSetgidDir(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl":
t.Skip("can't set SetGID bit with chmod on nacl")
case "darwin": case "darwin":
if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" { if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" {
t.Skip("can't set SetGID bit with chmod on iOS") t.Skip("can't set SetGID bit with chmod on iOS")
......
...@@ -72,7 +72,7 @@ func TestDirList(t *testing.T) { ...@@ -72,7 +72,7 @@ func TestDirList(t *testing.T) {
} }
func TestExec(t *testing.T) { func TestExec(t *testing.T) {
if runtime.GOOS == "plan9" || runtime.GOOS == "windows" || runtime.GOOS == "nacl" { if runtime.GOOS == "plan9" || runtime.GOOS == "windows" {
t.Skip("non-unix") t.Skip("non-unix")
} }
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !nacl
package obj package obj
import ( import (
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !nacl
package sym package sym
import ( import (
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
package rand package rand
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd plan9 solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd plan9 solaris
// Unix cryptographically secure pseudorandom number // Unix cryptographically secure pseudorandom number
// generator. // generator.
......
// Copyright 2015 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 x509
// Possible certificate files; stop after finding one.
var certFiles = []string{}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris // +build aix dragonfly freebsd js,wasm linux netbsd openbsd solaris
package x509 package x509
......
...@@ -784,7 +784,7 @@ func TestCompressedSection(t *testing.T) { ...@@ -784,7 +784,7 @@ func TestCompressedSection(t *testing.T) {
func TestNoSectionOverlaps(t *testing.T) { func TestNoSectionOverlaps(t *testing.T) {
// Ensure cmd/link outputs sections without overlaps. // Ensure cmd/link outputs sections without overlaps.
switch runtime.GOOS { switch runtime.GOOS {
case "aix", "android", "darwin", "js", "nacl", "plan9", "windows": case "aix", "android", "darwin", "js", "plan9", "windows":
t.Skipf("cmd/link doesn't produce ELF binaries on %s", runtime.GOOS) t.Skipf("cmd/link doesn't produce ELF binaries on %s", runtime.GOOS)
} }
_ = net.ResolveIPAddr // force dynamic linkage _ = net.ResolveIPAddr // force dynamic linkage
......
...@@ -514,7 +514,7 @@ func listStdPkgs(goroot string) ([]string, error) { ...@@ -514,7 +514,7 @@ func listStdPkgs(goroot string) ([]string, error) {
func TestDependencies(t *testing.T) { func TestDependencies(t *testing.T) {
iOS := runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") iOS := runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64")
if runtime.GOOS == "nacl" || iOS { if iOS {
// Tests run in a limited file system and we do not // Tests run in a limited file system and we do not
// provide access to every source file. // provide access to every source file.
t.Skipf("skipping on %s/%s, missing full GOROOT", runtime.GOOS, runtime.GOARCH) t.Skipf("skipping on %s/%s, missing full GOROOT", runtime.GOOS, runtime.GOARCH)
......
...@@ -100,7 +100,7 @@ var importerTests = [...]importerTest{ ...@@ -100,7 +100,7 @@ var importerTests = [...]importerTest{
} }
func TestGoxImporter(t *testing.T) { func TestGoxImporter(t *testing.T) {
testenv.MustHaveExec(t) // this is to skip nacl, js testenv.MustHaveExec(t)
initmap := make(map[*types.Package]InitData) initmap := make(map[*types.Package]InitData)
imp := GetImporter([]string{"testdata"}, initmap) imp := GetImporter([]string{"testdata"}, initmap)
......
...@@ -26,10 +26,7 @@ import ( ...@@ -26,10 +26,7 @@ import (
// import. // import.
func skipSpecialPlatforms(t *testing.T) { func skipSpecialPlatforms(t *testing.T) {
switch platform := runtime.GOOS + "-" + runtime.GOARCH; platform { switch platform := runtime.GOOS + "-" + runtime.GOARCH; platform {
case "nacl-amd64p32", case "darwin-arm",
"nacl-386",
"nacl-arm",
"darwin-arm",
"darwin-arm64": "darwin-arm64":
t.Skipf("no compiled packages available for import on %s", platform) t.Skipf("no compiled packages available for import on %s", platform)
} }
...@@ -140,7 +137,7 @@ func TestImportTestdata(t *testing.T) { ...@@ -140,7 +137,7 @@ func TestImportTestdata(t *testing.T) {
} }
func TestVersionHandling(t *testing.T) { func TestVersionHandling(t *testing.T) {
skipSpecialPlatforms(t) // we really only need to exclude nacl platforms, but this is fine skipSpecialPlatforms(t)
// This package only handles gc export data. // This package only handles gc export data.
if runtime.Compiler != "gc" { if runtime.Compiler != "gc" {
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
// Only run where builders (build.golang.org) have // Only run where builders (build.golang.org) have
// access to compiled packages for import. // access to compiled packages for import.
// //
// +build !arm,!arm64,!nacl // +build !arm,!arm64
package types_test package types_test
......
...@@ -19,14 +19,8 @@ TEXT ·cpuid(SB), NOSPLIT, $0-24 ...@@ -19,14 +19,8 @@ TEXT ·cpuid(SB), NOSPLIT, $0-24
// func xgetbv() (eax, edx uint32) // func xgetbv() (eax, edx uint32)
TEXT ·xgetbv(SB),NOSPLIT,$0-8 TEXT ·xgetbv(SB),NOSPLIT,$0-8
#ifdef GOOS_nacl
// nacl does not support XGETBV.
MOVL $0, eax+0(FP)
MOVL $0, edx+4(FP)
#else
MOVL $0, CX MOVL $0, CX
XGETBV XGETBV
MOVL AX, eax+0(FP) MOVL AX, eax+0(FP)
MOVL DX, edx+4(FP) MOVL DX, edx+4(FP)
#endif
RET RET
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows
// Export guts for testing on posix. // Export guts for testing on posix.
// Since testing imports os and os imports internal/poll, // Since testing imports os and os imports internal/poll,
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris // +build aix dragonfly freebsd js,wasm linux netbsd openbsd solaris
package poll package poll
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build nacl js,wasm // +build js,wasm
package poll package poll
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris windows // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris windows
package poll package poll
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows
package poll_test package poll_test
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris
package poll package poll
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris
package poll package poll
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
// This file implements sysSocket and accept for platforms that do not // This file implements sysSocket and accept for platforms that do not
// provide a fast path for setting SetNonblock and CloseOnExec. // provide a fast path for setting SetNonblock and CloseOnExec.
// +build aix darwin js,wasm nacl solaris // +build aix darwin js,wasm solaris
package poll package poll
......
// Copyright 2018 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 unix
func IsNonblock(fd int) (nonblocking bool, err error) {
return false, nil
}
...@@ -43,7 +43,7 @@ func HasGoBuild() bool { ...@@ -43,7 +43,7 @@ func HasGoBuild() bool {
return false return false
} }
switch runtime.GOOS { switch runtime.GOOS {
case "android", "nacl", "js": case "android", "js":
return false return false
case "darwin": case "darwin":
if strings.HasPrefix(runtime.GOARCH, "arm") { if strings.HasPrefix(runtime.GOARCH, "arm") {
...@@ -122,7 +122,7 @@ func GoTool() (string, error) { ...@@ -122,7 +122,7 @@ func GoTool() (string, error) {
// using os.StartProcess or (more commonly) exec.Command. // using os.StartProcess or (more commonly) exec.Command.
func HasExec() bool { func HasExec() bool {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "js": case "js":
return false return false
case "darwin": case "darwin":
if strings.HasPrefix(runtime.GOARCH, "arm") { if strings.HasPrefix(runtime.GOARCH, "arm") {
...@@ -135,8 +135,6 @@ func HasExec() bool { ...@@ -135,8 +135,6 @@ func HasExec() bool {
// HasSrc reports whether the entire source tree is available under GOROOT. // HasSrc reports whether the entire source tree is available under GOROOT.
func HasSrc() bool { func HasSrc() bool {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl":
return false
case "darwin": case "darwin":
if strings.HasPrefix(runtime.GOARCH, "arm") { if strings.HasPrefix(runtime.GOARCH, "arm") {
return false return false
...@@ -175,14 +173,14 @@ func MustHaveExecPath(t testing.TB, path string) { ...@@ -175,14 +173,14 @@ func MustHaveExecPath(t testing.TB, path string) {
// HasExternalNetwork reports whether the current system can use // HasExternalNetwork reports whether the current system can use
// external (non-localhost) networks. // external (non-localhost) networks.
func HasExternalNetwork() bool { func HasExternalNetwork() bool {
return !testing.Short() && runtime.GOOS != "nacl" && runtime.GOOS != "js" return !testing.Short() && runtime.GOOS != "js"
} }
// MustHaveExternalNetwork checks that the current system can use // MustHaveExternalNetwork checks that the current system can use
// external (non-localhost) networks. // external (non-localhost) networks.
// If not, MustHaveExternalNetwork calls t.Skip with an explanation. // If not, MustHaveExternalNetwork calls t.Skip with an explanation.
func MustHaveExternalNetwork(t testing.TB) { func MustHaveExternalNetwork(t testing.TB) {
if runtime.GOOS == "nacl" || runtime.GOOS == "js" { if runtime.GOOS == "js" {
t.Skipf("skipping test: no external network on %s", runtime.GOOS) t.Skipf("skipping test: no external network on %s", runtime.GOOS)
} }
if testing.Short() { if testing.Short() {
......
...@@ -12,7 +12,7 @@ import ( ...@@ -12,7 +12,7 @@ import (
func hasSymlink() (ok bool, reason string) { func hasSymlink() (ok bool, reason string) {
switch runtime.GOOS { switch runtime.GOOS {
case "android", "nacl", "plan9": case "android", "plan9":
return false, "" return false, ""
} }
......
...@@ -22,5 +22,3 @@ package syslog ...@@ -22,5 +22,3 @@ package syslog
// see https://golang.org/issue/1108. // see https://golang.org/issue/1108.
// BUG(akumar): This package is not implemented on Plan 9. // BUG(akumar): This package is not implemented on Plan 9.
// BUG(minux): This package is not implemented on NaCl (Native Client).
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !windows,!nacl,!plan9 // +build !windows,!plan9
package syslog_test package syslog_test
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !windows,!nacl,!plan9 // +build !windows,!plan9
package syslog package syslog
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !windows,!nacl,!plan9,!js // +build !windows,!plan9,!js
package syslog package syslog
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !windows,!nacl,!plan9 // +build !windows,!plan9
package syslog package syslog
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris
package mime package mime
......
#!/usr/bin/env bash
# Copyright 2016 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.
# naclmake.bash builds runs make.bash for nacl, but not does run any
# tests. This is used by the continuous build.
# Assumes that sel_ldr binaries and go_nacl_$GOARCH_exec scripts are in $PATH;
# see ../misc/nacl/README.
set -e
ulimit -c 0
# guess GOARCH if not set
naclGOARCH=$GOARCH
if [ -z "$naclGOARCH" ]; then
case "$(uname -m)" in
x86_64)
naclGOARCH=amd64p32
;;
armv7l) # NativeClient on ARM only supports ARMv7A.
naclGOARCH=arm
;;
i?86)
naclGOARCH=386
;;
esac
fi
unset GOOS GOARCH
if [ ! -f make.bash ]; then
echo 'nacltest.bash must be run from $GOROOT/src' 1>&2
exit 1
fi
# the builder might have set GOROOT_FINAL.
export GOROOT=$(pwd)/..
# Build zip file embedded in package syscall.
echo "##### Building fake file system zip for nacl"
rm -f syscall/fstest_nacl.go
GOROOT_BOOTSTRAP=${GOROOT_BOOTSTRAP:-$HOME/go1.4}
gobin=$GOROOT_BOOTSTRAP/bin
GOROOT=$GOROOT_BOOTSTRAP $gobin/go run ../misc/nacl/mkzip.go -p syscall -r .. ../misc/nacl/testzip.proto syscall/fstest_nacl.go
# Run standard build and tests.
GOOS=nacl GOARCH=$naclGOARCH ./make.bash "$@"
#!/usr/bin/env bash
# Copyright 2014 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.
# For testing Native Client on builders or locally.
# Builds a test file system and embeds it into package syscall
# in every generated binary.
#
# Assumes that sel_ldr binaries and go_nacl_$GOARCH_exec scripts are in $PATH;
# see ../misc/nacl/README.
set -e
ulimit -c 0
. ./naclmake.bash "$@"
# Check GOARCH.
case "$naclGOARCH" in
amd64p32)
if ! which sel_ldr_x86_64 >/dev/null; then
echo 'cannot find sel_ldr_x86_64' 1>&2
exit 1
fi
;;
386)
if ! which sel_ldr_x86_32 >/dev/null; then
echo 'cannot find sel_ldr_x86_32' 1>&2
exit 1
fi
;;
arm)
if ! which sel_ldr_arm >/dev/null; then
echo 'cannot find sel_ldr_arm' 1>&2
exit 1
fi
;;
*)
echo 'unsupported $GOARCH for nacl: '"$naclGOARCH" 1>&2
exit 1
esac
if ! which go_nacl_${naclGOARCH}_exec >/dev/null; then
echo "cannot find go_nacl_${naclGOARCH}_exec, see ../misc/nacl/README." 1>&2
exit 1
fi
export PATH=$(pwd)/../bin:$(pwd)/../misc/nacl:$PATH
GOROOT=$(../bin/go env GOROOT)
GOOS=nacl GOARCH=$naclGOARCH go tool dist test --no-rebuild
rm -f syscall/fstest_nacl.go
...@@ -763,11 +763,6 @@ func TestDialCancel(t *testing.T) { ...@@ -763,11 +763,6 @@ func TestDialCancel(t *testing.T) {
} }
mustHaveExternalNetwork(t) mustHaveExternalNetwork(t)
if runtime.GOOS == "nacl" {
// nacl doesn't have external network access.
t.Skipf("skipping on %s", runtime.GOOS)
}
blackholeIPPort := JoinHostPort(slowDst4, "1234") blackholeIPPort := JoinHostPort(slowDst4, "1234")
if !supportsIPv4() { if !supportsIPv4() {
blackholeIPPort = JoinHostPort(slowDst6, "1234") blackholeIPPort = JoinHostPort(slowDst6, "1234")
...@@ -923,7 +918,7 @@ func TestDialListenerAddr(t *testing.T) { ...@@ -923,7 +918,7 @@ func TestDialListenerAddr(t *testing.T) {
func TestDialerControl(t *testing.T) { func TestDialerControl(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9": case "plan9":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
......
// Copyright 2018 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 net
func isConnError(err error) bool {
return false
}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris windows // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris windows
package net package net
......
...@@ -185,7 +185,7 @@ func TestDialError(t *testing.T) { ...@@ -185,7 +185,7 @@ func TestDialError(t *testing.T) {
func TestProtocolDialError(t *testing.T) { func TestProtocolDialError(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "solaris", "illumos": case "solaris", "illumos":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
...@@ -214,7 +214,7 @@ func TestProtocolDialError(t *testing.T) { ...@@ -214,7 +214,7 @@ func TestProtocolDialError(t *testing.T) {
func TestDialAddrError(t *testing.T) { func TestDialAddrError(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9": case "plan9":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
if !supportsIPv4() || !supportsIPv6() { if !supportsIPv4() || !supportsIPv6() {
...@@ -376,7 +376,7 @@ func TestListenPacketError(t *testing.T) { ...@@ -376,7 +376,7 @@ func TestListenPacketError(t *testing.T) {
func TestProtocolListenError(t *testing.T) { func TestProtocolListenError(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9": case "plan9":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
package net package net
......
...@@ -6,7 +6,7 @@ package net ...@@ -6,7 +6,7 @@ package net
import "os" import "os"
// BUG(mikio): On JS, NaCl and Windows, the FileConn, FileListener and // BUG(mikio): On JS and Windows, the FileConn, FileListener and
// FilePacketConn functions are not implemented. // FilePacketConn functions are not implemented.
type fileAddr string type fileAddr string
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build nacl js,wasm // +build js,wasm
package net package net
......
...@@ -31,7 +31,7 @@ var fileConnTests = []struct { ...@@ -31,7 +31,7 @@ var fileConnTests = []struct {
func TestFileConn(t *testing.T) { func TestFileConn(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9", "windows": case "plan9", "windows":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
...@@ -138,7 +138,7 @@ var fileListenerTests = []struct { ...@@ -138,7 +138,7 @@ var fileListenerTests = []struct {
func TestFileListener(t *testing.T) { func TestFileListener(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9", "windows": case "plan9", "windows":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
...@@ -230,7 +230,7 @@ var filePacketConnTests = []struct { ...@@ -230,7 +230,7 @@ var filePacketConnTests = []struct {
func TestFilePacketConn(t *testing.T) { func TestFilePacketConn(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9", "windows": case "plan9", "windows":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
...@@ -297,7 +297,7 @@ func TestFilePacketConn(t *testing.T) { ...@@ -297,7 +297,7 @@ func TestFilePacketConn(t *testing.T) {
// Issue 24483. // Issue 24483.
func TestFileCloseRace(t *testing.T) { func TestFileCloseRace(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9", "windows": case "plan9", "windows":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
if !testableNetwork("tcp") { if !testableNetwork("tcp") {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris
package net package net
......
...@@ -10,7 +10,7 @@ import ( ...@@ -10,7 +10,7 @@ import (
"time" "time"
) )
// BUG(mikio): On JS and NaCl, methods and functions related to // BUG(mikio): On JS, methods and functions related to
// Interface are not implemented. // Interface are not implemented.
// BUG(mikio): On AIX, DragonFly BSD, NetBSD, OpenBSD, Plan 9 and // BUG(mikio): On AIX, DragonFly BSD, NetBSD, OpenBSD, Plan 9 and
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build nacl js,wasm // +build js,wasm
package net package net
......
...@@ -290,7 +290,7 @@ func checkUnicastStats(ifStats *ifStats, uniStats *routeStats) error { ...@@ -290,7 +290,7 @@ func checkUnicastStats(ifStats *ifStats, uniStats *routeStats) error {
func checkMulticastStats(ifStats *ifStats, uniStats, multiStats *routeStats) error { func checkMulticastStats(ifStats *ifStats, uniStats, multiStats *routeStats) error {
switch runtime.GOOS { switch runtime.GOOS {
case "aix", "dragonfly", "nacl", "netbsd", "openbsd", "plan9", "solaris", "illumos": case "aix", "dragonfly", "netbsd", "openbsd", "plan9", "solaris", "illumos":
default: default:
// Test the existence of connected multicast route // Test the existence of connected multicast route
// clones for IPv4. Unlike IPv6, IPv4 multicast // clones for IPv4. Unlike IPv6, IPv4 multicast
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris
package socktest package socktest
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris
package socktest package socktest
......
...@@ -21,7 +21,7 @@ import ( ...@@ -21,7 +21,7 @@ import (
// change the behavior of these methods; use Read or ReadMsgIP // change the behavior of these methods; use Read or ReadMsgIP
// instead. // instead.
// BUG(mikio): On JS, NaCl and Plan 9, methods and functions related // BUG(mikio): On JS and Plan 9, methods and functions related
// to IPConn are not implemented. // to IPConn are not implemented.
// BUG(mikio): On Windows, the File method of IPConn is not // BUG(mikio): On Windows, the File method of IPConn is not
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris windows // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris windows
package net package net
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris windows // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris windows
package net package net
...@@ -134,7 +134,7 @@ func favoriteAddrFamily(network string, laddr, raddr sockaddr, mode string) (fam ...@@ -134,7 +134,7 @@ func favoriteAddrFamily(network string, laddr, raddr sockaddr, mode string) (fam
} }
func internetSocket(ctx context.Context, net string, laddr, raddr sockaddr, sotype, proto int, mode string, ctrlFn func(string, string, syscall.RawConn) error) (fd *netFD, err error) { func internetSocket(ctx context.Context, net string, laddr, raddr sockaddr, sotype, proto int, mode string, ctrlFn func(string, string, syscall.RawConn) error) (fd *netFD, err error) {
if (runtime.GOOS == "aix" || runtime.GOOS == "windows" || runtime.GOOS == "openbsd" || runtime.GOOS == "nacl") && mode == "dial" && raddr.isWildcard() { if (runtime.GOOS == "aix" || runtime.GOOS == "windows" || runtime.GOOS == "openbsd") && mode == "dial" && raddr.isWildcard() {
raddr = raddr.toLocal(net) raddr = raddr.toLocal(net)
} }
family, ipv6only := favoriteAddrFamily(net, laddr, raddr, mode) family, ipv6only := favoriteAddrFamily(net, laddr, raddr, mode)
......
...@@ -224,7 +224,7 @@ var dualStackTCPListenerTests = []struct { ...@@ -224,7 +224,7 @@ var dualStackTCPListenerTests = []struct {
// to be greater than or equal to 4.4. // to be greater than or equal to 4.4.
func TestDualStackTCPListener(t *testing.T) { func TestDualStackTCPListener(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9": case "plan9":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
if !supportsIPv4() || !supportsIPv6() { if !supportsIPv4() || !supportsIPv6() {
...@@ -314,7 +314,7 @@ var dualStackUDPListenerTests = []struct { ...@@ -314,7 +314,7 @@ var dualStackUDPListenerTests = []struct {
// to be greater than or equal to 4.4. // to be greater than or equal to 4.4.
func TestDualStackUDPListener(t *testing.T) { func TestDualStackUDPListener(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9": case "plan9":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
if !supportsIPv4() || !supportsIPv6() { if !supportsIPv4() || !supportsIPv6() {
...@@ -532,7 +532,7 @@ func TestIPv4MulticastListener(t *testing.T) { ...@@ -532,7 +532,7 @@ func TestIPv4MulticastListener(t *testing.T) {
testenv.MustHaveExternalNetwork(t) testenv.MustHaveExternalNetwork(t)
switch runtime.GOOS { switch runtime.GOOS {
case "android", "nacl", "plan9": case "android", "plan9":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
case "solaris", "illumos": case "solaris", "illumos":
t.Skipf("not supported on solaris or illumos, see golang.org/issue/7399") t.Skipf("not supported on solaris or illumos, see golang.org/issue/7399")
...@@ -733,7 +733,7 @@ func TestClosingListener(t *testing.T) { ...@@ -733,7 +733,7 @@ func TestClosingListener(t *testing.T) {
func TestListenConfigControl(t *testing.T) { func TestListenConfigControl(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9": case "plan9":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
......
...@@ -27,8 +27,7 @@ var protocols = map[string]int{ ...@@ -27,8 +27,7 @@ var protocols = map[string]int{
} }
// services contains minimal mappings between services names and port // services contains minimal mappings between services names and port
// numbers for platforms that don't have a complete list of port numbers // numbers for platforms that don't have a complete list of port numbers.
// (some Solaris distros, nacl, etc).
// //
// See https://www.iana.org/assignments/service-names-port-numbers // See https://www.iana.org/assignments/service-names-port-numbers
// //
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build nacl js,wasm // +build js,wasm
package net package net
......
...@@ -858,10 +858,6 @@ func TestLookupProtocol_Minimal(t *testing.T) { ...@@ -858,10 +858,6 @@ func TestLookupProtocol_Minimal(t *testing.T) {
} }
func TestLookupNonLDH(t *testing.T) { func TestLookupNonLDH(t *testing.T) {
if runtime.GOOS == "nacl" {
t.Skip("skip on nacl")
}
defer dnsWaitGroup.Wait() defer dnsWaitGroup.Wait()
if fixup := forceGoDNS(); fixup != nil { if fixup := forceGoDNS(); fixup != nil {
...@@ -886,10 +882,6 @@ func TestLookupNonLDH(t *testing.T) { ...@@ -886,10 +882,6 @@ func TestLookupNonLDH(t *testing.T) {
func TestLookupContextCancel(t *testing.T) { func TestLookupContextCancel(t *testing.T) {
mustHaveExternalNetwork(t) mustHaveExternalNetwork(t)
if runtime.GOOS == "nacl" {
t.Skip("skip on nacl")
}
defer dnsWaitGroup.Wait() defer dnsWaitGroup.Wait()
ctx, ctxCancel := context.WithCancel(context.Background()) ctx, ctxCancel := context.WithCancel(context.Background())
...@@ -911,9 +903,6 @@ func TestLookupContextCancel(t *testing.T) { ...@@ -911,9 +903,6 @@ func TestLookupContextCancel(t *testing.T) {
// crashes if nil is used. // crashes if nil is used.
func TestNilResolverLookup(t *testing.T) { func TestNilResolverLookup(t *testing.T) {
mustHaveExternalNetwork(t) mustHaveExternalNetwork(t)
if runtime.GOOS == "nacl" {
t.Skip("skip on nacl")
}
var r *Resolver = nil var r *Resolver = nil
ctx := context.Background() ctx := context.Background()
...@@ -933,10 +922,6 @@ func TestNilResolverLookup(t *testing.T) { ...@@ -933,10 +922,6 @@ func TestNilResolverLookup(t *testing.T) {
// canceled lookups (see golang.org/issue/24178 for details). // canceled lookups (see golang.org/issue/24178 for details).
func TestLookupHostCancel(t *testing.T) { func TestLookupHostCancel(t *testing.T) {
mustHaveExternalNetwork(t) mustHaveExternalNetwork(t)
if runtime.GOOS == "nacl" {
t.Skip("skip on nacl")
}
const ( const (
google = "www.google.com" google = "www.google.com"
invalidDomain = "invalid.invalid" // RFC 2606 reserves .invalid invalidDomain = "invalid.invalid" // RFC 2606 reserves .invalid
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !js,!nacl,!plan9,!windows // +build !js,!plan9,!windows
package net package net
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build js,wasm nacl plan9 windows // +build js,wasm plan9 windows
package net package net
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
package net package net
......
...@@ -72,7 +72,7 @@ func TestCloseRead(t *testing.T) { ...@@ -72,7 +72,7 @@ func TestCloseRead(t *testing.T) {
func TestCloseWrite(t *testing.T) { func TestCloseWrite(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9": case "plan9":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
...@@ -285,7 +285,6 @@ func TestPacketConnClose(t *testing.T) { ...@@ -285,7 +285,6 @@ func TestPacketConnClose(t *testing.T) {
} }
} }
// nacl was previous failing to reuse an address.
func TestListenCloseListen(t *testing.T) { func TestListenCloseListen(t *testing.T) {
const maxTries = 10 const maxTries = 10
for tries := 0; tries < maxTries; tries++ { for tries := 0; tries < maxTries; tries++ {
...@@ -302,7 +301,7 @@ func TestListenCloseListen(t *testing.T) { ...@@ -302,7 +301,7 @@ func TestListenCloseListen(t *testing.T) {
} }
ln, err = Listen("tcp", addr) ln, err = Listen("tcp", addr)
if err == nil { if err == nil {
// Success. nacl couldn't do this before. // Success. (This test didn't always make it here earlier.)
ln.Close() ln.Close()
return return
} }
...@@ -541,7 +540,7 @@ func TestNotTemporaryRead(t *testing.T) { ...@@ -541,7 +540,7 @@ func TestNotTemporaryRead(t *testing.T) {
if err == nil { if err == nil {
return errors.New("Read succeeded unexpectedly") return errors.New("Read succeeded unexpectedly")
} else if err == io.EOF { } else if err == io.EOF {
// This happens on NaCl and Plan 9. // This happens on Plan 9.
return nil return nil
} else if ne, ok := err.(Error); !ok { } else if ne, ok := err.(Error); !ok {
return fmt.Errorf("unexpected error %v", err) return fmt.Errorf("unexpected error %v", err)
......
...@@ -37,13 +37,9 @@ func testableNetwork(network string) bool { ...@@ -37,13 +37,9 @@ func testableNetwork(network string) bool {
ss := strings.Split(network, ":") ss := strings.Split(network, ":")
switch ss[0] { switch ss[0] {
case "ip+nopriv": case "ip+nopriv":
switch runtime.GOOS {
case "nacl":
return false
}
case "ip", "ip4", "ip6": case "ip", "ip4", "ip6":
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9": case "plan9":
return false return false
default: default:
if os.Getuid() != 0 { if os.Getuid() != 0 {
...@@ -52,7 +48,7 @@ func testableNetwork(network string) bool { ...@@ -52,7 +48,7 @@ func testableNetwork(network string) bool {
} }
case "unix", "unixgram": case "unix", "unixgram":
switch runtime.GOOS { switch runtime.GOOS {
case "android", "nacl", "plan9", "windows": case "android", "plan9", "windows":
return false return false
case "aix": case "aix":
return unixEnabledOnAIX return unixEnabledOnAIX
...@@ -63,7 +59,7 @@ func testableNetwork(network string) bool { ...@@ -63,7 +59,7 @@ func testableNetwork(network string) bool {
} }
case "unixpacket": case "unixpacket":
switch runtime.GOOS { switch runtime.GOOS {
case "aix", "android", "darwin", "nacl", "plan9", "windows": case "aix", "android", "darwin", "plan9", "windows":
return false return false
case "netbsd": case "netbsd":
// It passes on amd64 at least. 386 fails (Issue 22927). arm is unknown. // It passes on amd64 at least. 386 fails (Issue 22927). arm is unknown.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris nacl // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris
// Read system port mappings from /etc/services // Read system port mappings from /etc/services
......
...@@ -15,7 +15,7 @@ import ( ...@@ -15,7 +15,7 @@ import (
// deadlines. If the user-provided callback returns false, the Write // deadlines. If the user-provided callback returns false, the Write
// method will fail immediately. // method will fail immediately.
// BUG(mikio): On JS, NaCl and Plan 9, the Control, Read and Write // BUG(mikio): On JS and Plan 9, the Control, Read and Write
// methods of syscall.RawConn are not implemented. // methods of syscall.RawConn are not implemented.
type rawConn struct { type rawConn struct {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build js,wasm nacl plan9 // +build js,wasm plan9
package net package net
......
...@@ -15,7 +15,7 @@ import ( ...@@ -15,7 +15,7 @@ import (
func TestRawConnReadWrite(t *testing.T) { func TestRawConnReadWrite(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9": case "plan9":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
...@@ -175,7 +175,7 @@ func TestRawConnReadWrite(t *testing.T) { ...@@ -175,7 +175,7 @@ func TestRawConnReadWrite(t *testing.T) {
func TestRawConnControl(t *testing.T) { func TestRawConnControl(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9": case "plan9":
t.Skipf("not supported on %s", runtime.GOOS) t.Skipf("not supported on %s", runtime.GOOS)
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin js,wasm nacl netbsd openbsd // +build aix darwin js,wasm netbsd openbsd
package net package net
......
...@@ -218,7 +218,7 @@ func TestSendfileSeeked(t *testing.T) { ...@@ -218,7 +218,7 @@ func TestSendfileSeeked(t *testing.T) {
// Test that sendfile doesn't put a pipe into blocking mode. // Test that sendfile doesn't put a pipe into blocking mode.
func TestSendfilePipe(t *testing.T) { func TestSendfilePipe(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "nacl", "plan9", "windows": case "plan9", "windows":
// These systems don't support deadlines on pipes. // These systems don't support deadlines on pipes.
t.Skipf("skipping on %s", runtime.GOOS) t.Skipf("skipping on %s", runtime.GOOS)
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows
package net package net
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix nacl js,wasm solaris // +build aix js,wasm solaris
package net package net
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris windows // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris windows
package net package net
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build nacl js,wasm // +build js,wasm
package net package net
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build nacl js,wasm // +build js,wasm
package net package net
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
// This file implements sysSocket and accept for platforms that do not // This file implements sysSocket and accept for platforms that do not
// provide a fast path for setting SetNonblock and CloseOnExec. // provide a fast path for setting SetNonblock and CloseOnExec.
// +build aix darwin nacl solaris // +build aix darwin solaris
package net package net
......
...@@ -12,7 +12,7 @@ import ( ...@@ -12,7 +12,7 @@ import (
"time" "time"
) )
// BUG(mikio): On JS, NaCl and Windows, the File method of TCPConn and // BUG(mikio): On JS and Windows, the File method of TCPConn and
// TCPListener is not implemented. // TCPListener is not implemented.
// TCPAddr represents the address of a TCP end point. // TCPAddr represents the address of a TCP end point.
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment