libgo patch committed: Update to Go 1.5 release

Ian Lance Taylor iant@golang.org
Sat Oct 31 03:35:00 GMT 2015


I have committed a patch to libgo to update it to the Go 1.5 release.

As usual for libgo updates, the actual patch is too large to attach to
this e-mail message.  I've attached the changes to the gccgo-specific
files.

Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu.  Committed
to mainline.

This may cause trouble on non-GNU/Linux operating systems.  Please let
me know about any problems you encounter.

Ian
-------------- next part --------------
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 229612)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@
-16f69a4007a1903da4055a496882b514e05f45f3
+4b6b496579225cdd897130f6d6fd18ecb100bf99
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: libgo/MERGE
===================================================================
--- libgo/MERGE	(revision 228306)
+++ libgo/MERGE	(working copy)
@@ -1,4 +1,4 @@
-883bc6ed0ea815293fe6309d66f967ea60630e87
+bb03defe933c89fee44be675d7aa0fbd893ced30
 
 The first line of this file holds the git revision number of the
 last merge done from the master library sources.
Index: libgo/Makefile.am
===================================================================
--- libgo/Makefile.am	(revision 228306)
+++ libgo/Makefile.am	(working copy)
@@ -233,12 +233,15 @@ toolexeclibgogodir = $(toolexeclibgodir)
 toolexeclibgogo_DATA = \
 	go/ast.gox \
 	go/build.gox \
+	go/constant.gox \
 	go/doc.gox \
 	go/format.gox \
+	go/importer.gox \
 	go/parser.gox \
 	go/printer.gox \
 	go/scanner.gox \
-	go/token.gox
+	go/token.gox \
+	go/types.gox
 
 toolexeclibgohashdir = $(toolexeclibgodir)/hash
 
@@ -292,7 +295,8 @@ toolexeclibgomath_DATA = \
 toolexeclibgomimedir = $(toolexeclibgodir)/mime
 
 toolexeclibgomime_DATA = \
-	mime/multipart.gox
+	mime/multipart.gox \
+	mime/quotedprintable.gox
 
 toolexeclibgonetdir = $(toolexeclibgodir)/net
 
@@ -676,46 +680,74 @@ go_math_files = \
 	go/math/tanh.go \
 	go/math/unsafe.go
 
+if LIBGO_IS_OPENBSD
+go_mime_type_file = go/mime/type_openbsd.go
+else
+if LIBGO_IS_FREEBSD
+go_mime_type_file = go/mime/type_freebsd.go
+else
+if LIBGO_IS_DRAGONFLY
+go_mime_type_file = go/mime/type_dragonfly.go
+else
+go_mime_type_file =
+endif
+endif
+endif
+
 go_mime_files = \
+	go/mime/encodedword.go \
 	go/mime/grammar.go \
 	go/mime/mediatype.go \
 	go/mime/type.go \
-	go/mime/type_unix.go
+	go/mime/type_unix.go \
+	$(go_mime_type_file)
 
 if LIBGO_IS_LINUX
 go_net_cgo_file = go/net/cgo_linux.go
 go_net_sock_file = go/net/sock_linux.go
 go_net_sockopt_file = go/net/sockopt_linux.go
 go_net_sockoptip_file = go/net/sockoptip_linux.go go/net/sockoptip_posix.go
+go_net_cgo_sock_file = go/net/cgo_socknew.go
+go_net_cgo_res_file = go/net/cgo_resnew.go
 else
 if LIBGO_IS_IRIX
 go_net_cgo_file = go/net/cgo_linux.go
 go_net_sock_file = go/net/sock_linux.go
 go_net_sockopt_file = go/net/sockopt_linux.go
 go_net_sockoptip_file = go/net/sockoptip_linux.go go/net/sockoptip_posix.go
+go_net_cgo_sock_file = go/net/cgo_socknew.go
+go_net_cgo_res_file = go/net/cgo_resnew.go
 else
 if LIBGO_IS_SOLARIS
-go_net_cgo_file = go/net/cgo_linux.go
+go_net_cgo_file = go/net/cgo_solaris.go
 go_net_sock_file = go/net/sock_stub.go
 go_net_sockopt_file = go/net/sockopt_solaris.go
 go_net_sockoptip_file = go/net/sockoptip_stub.go
+go_net_cgo_sock_file = go/net/cgo_socknew.go
+go_net_cgo_res_file = go/net/cgo_resnew.go
 else
 if LIBGO_IS_FREEBSD
 go_net_cgo_file = go/net/cgo_bsd.go
 go_net_sock_file = go/net/sock_bsd.go
 go_net_sockopt_file = go/net/sockopt_bsd.go
 go_net_sockoptip_file = go/net/sockoptip_bsd.go go/net/sockoptip_posix.go
+go_net_cgo_sock_file = go/net/cgo_sockold.go
+go_net_cgo_res_file = go/net/cgo_resold.go
 else
 if LIBGO_IS_NETBSD
 go_net_cgo_file = go/net/cgo_netbsd.go
 go_net_sock_file = go/net/sock_bsd.go
 go_net_sockopt_file = go/net/sockopt_bsd.go
 go_net_sockoptip_file = go/net/sockoptip_bsd.go go/net/sockoptip_posix.go
+go_net_cgo_sock_file = go/net/cgo_sockold.go
+go_net_cgo_res_file = go/net/cgo_resnew.go
 else
 go_net_cgo_file = go/net/cgo_bsd.go
 go_net_sock_file = go/net/sock_bsd.go
 go_net_sockopt_file = go/net/sockopt_bsd.go
 go_net_sockoptip_file = go/net/sockoptip_bsd.go go/net/sockoptip_posix.go
+go_net_cgo_sock_file = go/net/cgo_sockold.go
+go_net_cgo_res_file = go/net/cgo_resold.go
 endif
 endif
 endif
@@ -731,10 +763,14 @@ else
 if LIBGO_IS_DRAGONFLY
 go_net_sendfile_file = go/net/sendfile_dragonfly.go
 else
+if LIBGO_IS_SOLARIS
+go_net_sendfile_file = go/net/sendfile_solaris.go
+else
 go_net_sendfile_file = go/net/sendfile_stub.go
 endif
 endif
 endif
+endif
 
 if LIBGO_IS_LINUX
 go_net_interface_file = go/net/interface_linux.go
@@ -775,15 +811,22 @@ endif
 endif
 
 go_net_common_files = \
+	go/net/addrselect.go \
 	$(go_net_cloexec_file) \
+	go/net/conf.go \
 	go/net/dial.go \
 	go/net/dnsclient.go \
 	go/net/dnsclient_unix.go \
 	go/net/dnsconfig_unix.go \
 	go/net/dnsmsg.go \
 	go/net/fd_mutex.go \
+	go/net/fd_posix.go \
 	go/net/fd_unix.go \
+	go/net/file.go \
 	go/net/file_unix.go \
+	go/net/hook.go \
+	go/net/hook_cloexec.go \
+	go/net/hook_unix.go \
 	go/net/hosts.go \
 	go/net/interface.go \
 	$(go_net_interface_file) \
@@ -796,6 +839,7 @@ go_net_common_files = \
 	go/net/lookup_unix.go \
 	go/net/mac.go \
 	go/net/net.go \
+	go/net/nss.go \
 	go/net/parse.go \
 	go/net/pipe.go \
 	go/net/fd_poll_runtime.go \
@@ -803,7 +847,6 @@ go_net_common_files = \
 	go/net/port_unix.go \
 	go/net/race0.go \
 	$(go_net_sendfile_file) \
-	go/net/singleflight.go \
 	go/net/sock_posix.go \
 	$(go_net_sock_file) \
 	go/net/sockopt_posix.go \
@@ -821,6 +864,8 @@ go_net_common_files = \
 go_net_files = \
 	go/net/cgo_unix.go \
 	$(go_net_cgo_file) \
+	$(go_net_cgo_res_file) \
+	$(go_net_cgo_sock_file) \
 	$(go_net_common_files)
 
 go_netgo_files = \
@@ -919,6 +964,32 @@ else
 go_os_pipe_file = go/os/pipe_bsd.go
 endif
 
+if LIBGO_IS_DARWIN
+go_os_sticky_file = go/os/sticky_bsd.go
+else
+if LIBGO_IS_DRAGONFLY
+go_os_sticky_file = go/os/sticky_bsd.go
+else
+if LIBGO_IS_FREEBSD
+go_os_sticky_file = go/os/sticky_bsd.go
+else
+if LIBGO_IS_NETBSD
+go_os_sticky_file = go/os/sticky_bsd.go
+else
+if LIBGO_IS_OPENBSD
+go_os_sticky_file = go/os/sticky_bsd.go
+else
+if LIBGO_IS_SOLARIS
+go_os_sticky_file = go/os/sticky_bsd.go
+else
+go_os_sticky_file = go/os/sticky_notbsd.go
+endif
+endif
+endif
+endif
+endif
+endif
+
 go_os_files = \
 	$(go_os_dir_file) \
 	go/os/dir.go \
@@ -939,6 +1010,7 @@ go_os_files = \
 	$(go_os_pipe_file) \
 	go/os/proc.go \
 	$(go_os_stat_file) \
+	$(go_os_sticky_file) \
 	go/os/str.go \
 	$(go_os_sys_file) \
 	$(go_os_cloexec_file) \
@@ -959,6 +1031,7 @@ go_reflect_makefunc_c_file = \
 	go/reflect/makefunc_ffi_c.c
 
 go_regexp_files = \
+	go/regexp/backtrack.go \
 	go/regexp/exec.go \
 	go/regexp/onepass.go \
 	go/regexp/regexp.go
@@ -974,7 +1047,6 @@ go_runtime_files = \
 	go/runtime/error.go \
 	go/runtime/extern.go \
 	go/runtime/mem.go \
-	go/runtime/softfloat64.go \
 	version.go
 
 version.go: s-version; @true
@@ -1012,6 +1084,7 @@ go_strconv_files = \
 	go/strconv/atof.go \
 	go/strconv/atoi.go \
 	go/strconv/decimal.go \
+	go/strconv/doc.go \
 	go/strconv/extfloat.go \
 	go/strconv/ftoa.go \
 	go/strconv/isprint.go \
@@ -1019,6 +1092,7 @@ go_strconv_files = \
 	go/strconv/quote.go
 
 go_strings_files = \
+	go/strings/compare.go \
 	go/strings/reader.go \
 	go/strings/replace.go \
 	go/strings/search.go \
@@ -1048,6 +1122,7 @@ endif
 endif
 
 go_log_syslog_files = \
+	go/log/syslog/doc.go \
 	go/log/syslog/syslog.go \
 	$(go_syslog_file)
 go_syslog_c_files = \
@@ -1186,6 +1261,7 @@ crypto_rand_file =
 endif
 
 go_crypto_rand_files = \
+	go/crypto/rand/eagain.go \
 	go/crypto/rand/rand.go \
 	go/crypto/rand/rand_unix.go \
 	$(crypto_rand_file) \
@@ -1222,6 +1298,37 @@ go_crypto_tls_files = \
 	go/crypto/tls/prf.go \
 	go/crypto/tls/ticket.go \
 	go/crypto/tls/tls.go
+
+if LIBGO_IS_LINUX
+go_crypto_x509_root_file = go/crypto/x509/root_linux.go
+else
+if LIBGO_IS_SOLARIS
+go_crypto_x509_root_file = go/crypto/x509/root_solaris.go
+else
+if LIBGO_IS_DRAGONFLY
+go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
+else
+if LIBGO_IS_FREEBSD
+go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
+else
+if LIBGO_IS_NETBSD
+go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
+else
+if LIBGO_IS_OPENBSD
+go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
+else
+if LIBGO_IS_DARWIN
+go_crypto_x509_root_file = go/crypto/x509/root_darwin.go
+else
+go_crypto_x509_root_file =
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
 go_crypto_x509_files = \
 	go/crypto/x509/cert_pool.go \
 	go/crypto/x509/pem_decrypt.go \
@@ -1229,6 +1336,7 @@ go_crypto_x509_files = \
 	go/crypto/x509/pkcs8.go \
 	go/crypto/x509/root.go \
 	go/crypto/x509/root_unix.go \
+	$(go_crypto_x509_root_file) \
 	go/crypto/x509/sec1.go \
 	go/crypto/x509/verify.go \
 	go/crypto/x509/x509.go
@@ -1246,6 +1354,7 @@ go_database_sql_driver_files = \
 
 go_debug_dwarf_files = \
 	go/debug/dwarf/buf.go \
+	go/debug/dwarf/class_string.go \
 	go/debug/dwarf/const.go \
 	go/debug/dwarf/entry.go \
 	go/debug/dwarf/line.go \
@@ -1337,6 +1446,9 @@ go_go_build_files = \
 	go/go/build/doc.go \
 	go/go/build/read.go \
 	go/go/build/syslist.go
+go_go_constant_files = \
+	go/go/constant/go14.go \
+	go/go/constant/value.go
 go_go_doc_files = \
 	go/go/doc/comment.go \
 	go/go/doc/doc.go \
@@ -1347,6 +1459,8 @@ go_go_doc_files = \
 	go/go/doc/synopsis.go
 go_go_format_files = \
 	go/go/format/format.go
+go_go_importer_files = \
+	go/go/importer/importer.go
 go_go_parser_files = \
 	go/go/parser/interface.go \
 	go/go/parser/parser.go
@@ -1360,6 +1474,47 @@ go_go_token_files = \
 	go/go/token/position.go \
 	go/go/token/serialize.go \
 	go/go/token/token.go
+go_go_types_files = \
+	go/go/types/api.go \
+	go/go/types/assignments.go \
+	go/go/types/builtins.go \
+	go/go/types/call.go \
+	go/go/types/check.go \
+	go/go/types/conversions.go \
+	go/go/types/decl.go \
+	go/go/types/errors.go \
+	go/go/types/eval.go \
+	go/go/types/expr.go \
+	go/go/types/exprstring.go \
+	go/go/types/go12.go \
+	go/go/types/initorder.go \
+	go/go/types/labels.go \
+	go/go/types/lookup.go \
+	go/go/types/methodset.go \
+	go/go/types/object.go \
+	go/go/types/objset.go \
+	go/go/types/operand.go \
+	go/go/types/ordering.go \
+	go/go/types/package.go \
+	go/go/types/predicates.go \
+	go/go/types/resolver.go \
+	go/go/types/return.go \
+	go/go/types/scope.go \
+	go/go/types/selection.go \
+	go/go/types/stmt.go \
+	go/go/types/sizes.go \
+	go/go/types/type.go \
+	go/go/types/typestring.go \
+	go/go/types/typexpr.go \
+	go/go/types/universe.go
+
+go_go_internal_gcimporter_files = \
+	go/go/internal/gcimporter/exportdata.go \
+	go/go/internal/gcimporter/gcimporter.go
+go_go_internal_gccgoimporter_files = \
+	go/go/internal/gccgoimporter/gccgoinstallation.go \
+	go/go/internal/gccgoimporter/importer.go \
+	go/go/internal/gccgoimporter/parser.go
 
 go_hash_adler32_files = \
 	go/hash/adler32/adler32.go
@@ -1399,6 +1554,10 @@ go_image_gif_files = \
 	go/image/gif/reader.go \
 	go/image/gif/writer.go
 
+go_image_internal_imageutil_files = \
+	go/image/internal/imageutil/imageutil.go \
+	go/image/internal/imageutil/impl.go
+
 go_image_jpeg_files = \
 	go/image/jpeg/fdct.go \
 	go/image/jpeg/huffman.go \
@@ -1416,15 +1575,46 @@ go_index_suffixarray_files = \
 	go/index/suffixarray/qsufsort.go \
 	go/index/suffixarray/suffixarray.go
 
+go_internal_format_files = \
+	go/internal/format/format.go
+go_internal_singleflight_files = \
+	go/internal/singleflight/singleflight.go
+
+if LIBGO_IS_LINUX
+internal_syscall_unix_getrandom_file = go/internal/syscall/unix/getrandom_linux.go
+else
+internal_syscall_unix_getrandom_file =
+endif
+
+go_internal_syscall_unix_files = \
+	go/internal/syscall/unix/dummy.go \
+	$(internal_syscall_unix_getrandom_file)
+
+go_internal_testenv_files = \
+	go/internal/testenv/testenv.go
+go_internal_trace_files = \
+	go/internal/trace/goroutines.go \
+	go/internal/trace/parser.go
+
 go_io_ioutil_files = \
 	go/io/ioutil/ioutil.go \
 	go/io/ioutil/tempfile.go
 
 go_math_big_files = \
+	go/math/big/accuracy_string.go \
 	go/math/big/arith.go \
+	go/math/big/arith_decl_pure.go \
+	go/math/big/decimal.go \
+	go/math/big/float.go \
+	go/math/big/floatconv.go \
+	go/math/big/ftoa.go \
 	go/math/big/int.go \
+	go/math/big/intconv.go \
 	go/math/big/nat.go \
-	go/math/big/rat.go
+	go/math/big/natconv.go \
+	go/math/big/rat.go \
+	go/math/big/ratconv.go \
+	go/math/big/roundingmode_string.go
 go_math_cmplx_files = \
 	go/math/cmplx/abs.go \
 	go/math/cmplx/asin.go \
@@ -1450,9 +1640,12 @@ go_math_rand_files = \
 go_mime_multipart_files = \
 	go/mime/multipart/formdata.go \
 	go/mime/multipart/multipart.go \
-	go/mime/multipart/quotedprintable.go \
 	go/mime/multipart/writer.go
 
+go_mime_quotedprintable_files = \
+	go/mime/quotedprintable/reader.go \
+	go/mime/quotedprintable/writer.go
+
 go_net_http_files = \
 	go/net/http/client.go \
 	go/net/http/cookie.go \
@@ -1504,6 +1697,23 @@ go_net_http_httputil_files = \
 go_net_http_internal_files = \
 	go/net/http/internal/chunked.go
 
+if LIBGO_IS_LINUX
+go_net_internal_socktest_sys = go/net/internal/socktest/sys_cloexec.go
+else
+if LIBGO_IS_FREEBSD
+go_net_internal_socktest_sys = go/net/internal/socktest/sys_cloexec.go
+else
+go_net_internal_socktest_sys =
+endif
+endif
+
+go_net_internal_socktest_files = \
+	go/net/internal/socktest/switch.go \
+	go/net/internal/socktest/switch_posix.go \
+	go/net/internal/socktest/switch_unix.go \
+	go/net/internal/socktest/sys_unix.go \
+	$(go_net_internal_socktest_sys)
+
 go_old_regexp_files = \
 	go/old/regexp/regexp.go
 go_old_template_files = \
@@ -1514,6 +1724,7 @@ go_old_template_files = \
 
 go_os_exec_files = \
 	go/os/exec/exec.go \
+	go/os/exec/exec_posix.go \
 	go/os/exec/lp_unix.go
 
 go_os_signal_files = \
@@ -1565,6 +1776,7 @@ go_text_template_files = \
 	go/text/template/exec.go \
 	go/text/template/funcs.go \
 	go/text/template/helper.go \
+	go/text/template/option.go \
 	go/text/template/template.go
 go_text_template_parse_files = \
 	go/text/template/parse/lex.go \
@@ -1767,6 +1979,12 @@ else
 syscall_creds_test_file =
 endif
 
+if LIBGO_IS_LINUX
+syscall_exec_test_file = go/syscall/exec_linux_test.go go/syscall/syscall_linux_test.go
+else
+syscall_exec_test_file =
+endif
+
 go_base_syscall_files = \
 	go/syscall/env_unix.go \
 	go/syscall/syscall_errno.go \
@@ -1810,21 +2028,14 @@ go_syscall_c_files = \
 
 go_syscall_test_files = \
 	$(syscall_creds_test_file) \
+	$(syscall_exec_test_file) \
+	go/syscall/exec_unix_test.go \
 	go/syscall/export_test.go \
+	go/syscall/export_unix_test.go \
 	go/syscall/mmap_unix_test.go \
 	go/syscall/syscall_test.go \
 	go/syscall/syscall_unix_test.go
 
-if LIBGO_IS_LINUX
-internal_syscall_getrandom_file = go/internal/syscall/getrandom_linux.go
-else
-internal_syscall_getrandom_file =
-endif
-
-go_internal_syscall_files = \
-	go/internal/syscall/dummy.go \
-	$(internal_syscall_getrandom_file)
-
 libcalls.go: s-libcalls; @true
 s-libcalls: libcalls-list go/syscall/mksyscall.awk $(go_base_syscall_files)
 	rm -f libcalls.go.tmp
@@ -1978,12 +2189,17 @@ libgo_go_objs = \
 	html/template.lo \
 	go/ast.lo \
 	go/build.lo \
+	go/constant.lo \
 	go/doc.lo \
 	go/format.lo \
+	go/importer.lo \
+	go/internal/gcimporter.lo \
+	go/internal/gccgoimporter.lo \
 	go/parser.lo \
 	go/printer.lo \
 	go/scanner.lo \
 	go/token.lo \
+	go/types.lo \
 	hash/adler32.lo \
 	hash/crc32.lo \
 	hash/crc64.lo \
@@ -1999,10 +2215,15 @@ libgo_go_objs = \
 	image/color/palette.lo \
 	image/draw.lo \
 	image/gif.lo \
+	image/internal/imageutil.lo \
 	image/jpeg.lo \
 	image/png.lo \
 	index/suffixarray.lo \
-	internal/syscall.lo \
+	internal/format.lo \
+	internal/singleflight.lo \
+	internal/syscall/unix.lo \
+	internal/testenv.lo \
+	internal/trace.lo \
 	io/ioutil.lo \
 	log/syslog.lo \
 	log/syslog/syslog_c.lo \
@@ -2010,7 +2231,9 @@ libgo_go_objs = \
 	math/cmplx.lo \
 	math/rand.lo \
 	mime/multipart.lo \
+	mime/quotedprintable.lo \
 	net/http.lo \
+	net/internal/socktest.lo \
 	net/mail.lo \
 	net/rpc.lo \
 	net/smtp.lo \
@@ -2121,11 +2344,11 @@ CHECK = \
 	$(MKDIR_P) $(@D); \
 	rm -f $@-testsum $@-testlog; \
 	if test "$(USE_DEJAGNU)" = "yes"; then \
-	  $(SHELL) $(srcdir)/testsuite/gotest --dejagnu=yes --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --testname="$(@D)" --goarch="$(GOARCH)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files); \
+	  $(SHELL) $(srcdir)/testsuite/gotest --goarch=$(GOARCH) --goos=$(GOOS) --dejagnu=yes --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --testname="$(@D)" --goarch="$(GOARCH)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files); \
 	elif test "$(GOBENCH)" != ""; then \
-	  $(SHELL) $(srcdir)/testsuite/gotest --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --goarch="$(GOARCH)" --bench="$(GOBENCH)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files); \
+	  $(SHELL) $(srcdir)/testsuite/gotest --goarch=$(GOARCH) --goos=$(GOOS) --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --goarch="$(GOARCH)" --bench="$(GOBENCH)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files); \
 	else \
-	  if $(SHELL) $(srcdir)/testsuite/gotest --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --goarch="$(GOARCH)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files) >>$@-testlog 2>&1; then \
+	  if $(SHELL) $(srcdir)/testsuite/gotest --goarch=$(GOARCH) --goos=$(GOOS) --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --goarch="$(GOARCH)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files) >>$@-testlog 2>&1; then \
 	    echo "PASS: $(@D)" >> $@-testlog; \
 	    echo "PASS: $(@D)"; \
 	    echo "PASS: $(@D)" > $@-testsum; \
@@ -2910,6 +3133,15 @@ go/build/check: $(CHECK_DEPS)
 	@$(CHECK)
 .PHONY: go/build/check
 
+@go_include@ go/constant.lo.dep
+go/constant.lo.dep: $(go_go_constant_files)
+	$(BUILDDEPS)
+go/constant.lo: $(go_go_constant_files)
+	$(BUILDPACKAGE)
+go/constant/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: go/constant/check
+
 @go_include@ go/doc.lo.dep
 go/doc.lo.dep: $(go_go_doc_files)
 	$(BUILDDEPS)
@@ -2928,6 +3160,15 @@ go/format/check: $(CHECK_DEPS)
 	@$(CHECK)
 .PHONY: go/format/check
 
+@go_include@ go/importer.lo.dep
+go/importer.lo.dep: $(go_go_importer_files)
+	$(BUILDDEPS)
+go/importer.lo: $(go_go_importer_files)
+	$(BUILDPACKAGE)
+go/importer/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: go/importer/check
+
 @go_include@ go/parser.lo.dep
 go/parser.lo.dep: $(go_go_parser_files)
 	$(BUILDDEPS)
@@ -2964,6 +3205,33 @@ go/token/check: $(CHECK_DEPS)
 	@$(CHECK)
 .PHONY: go/token/check
 
+@go_include@ go/types.lo.dep
+go/types.lo.dep: $(go_go_types_files)
+	$(BUILDDEPS)
+go/types.lo: $(go_go_types_files)
+	$(BUILDPACKAGE)
+go/types/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: go/types/check
+
+@go_include@ go/internal/gcimporter.lo.dep
+go/internal/gcimporter.lo.dep: $(go_go_internal_gcimporter_files)
+	$(BUILDDEPS)
+go/internal/gcimporter.lo: $(go_go_internal_gcimporter_files)
+	$(BUILDPACKAGE)
+go/internal/gcimporter/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: go/internal/gcimporter/check
+
+@go_include@ go/internal/gccgoimporter.lo.dep
+go/internal/gccgoimporter.lo.dep: $(go_go_internal_gccgoimporter_files)
+	$(BUILDDEPS)
+go/internal/gccgoimporter.lo: $(go_go_internal_gccgoimporter_files)
+	$(BUILDPACKAGE)
+go/internal/gccgoimporter/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: go/internal/gccgoimporter/check
+
 @go_include@ hash/adler32.lo.dep
 hash/adler32.lo.dep: $(go_hash_adler32_files)
 	$(BUILDDEPS)
@@ -3036,6 +3304,15 @@ image/gif/check: $(CHECK_DEPS)
 	@$(CHECK)
 .PHONY: image/gif/check
 
+@go_include@ image/internal/imageutil.lo.dep
+image/internal/imageutil.lo.dep: $(go_image_internal_imageutil_files)
+	$(BUILDDEPS)
+image/internal/imageutil.lo: $(go_image_internal_imageutil_files)
+	$(BUILDPACKAGE)
+image/internal/imageutil/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: image/internal/imageutil/check
+
 @go_include@ image/jpeg.lo.dep
 image/jpeg.lo.dep: $(go_image_jpeg_files)
 	$(BUILDDEPS)
@@ -3063,6 +3340,51 @@ index/suffixarray/check: $(CHECK_DEPS)
 	@$(CHECK)
 .PHONY: index/suffixarray/check
 
+@go_include@ internal/format.lo.dep
+internal/format.lo.dep: $(go_internal_format_files)
+	$(BUILDDEPS)
+internal/format.lo: $(go_internal_format_files)
+	$(BUILDPACKAGE)
+internal/format/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: internal/format/check
+
+@go_include@ internal/singleflight.lo.dep
+internal/singleflight.lo.dep: $(go_internal_singleflight_files)
+	$(BUILDDEPS)
+internal/singleflight.lo: $(go_internal_singleflight_files)
+	$(BUILDPACKAGE)
+internal/singleflight/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: internal/singleflight/check
+
+@go_include@ internal/syscall/unix.lo.dep
+internal/syscall/unix.lo.dep: $(go_internal_syscall_unix_files)
+	$(BUILDDEPS)
+internal/syscall/unix.lo: $(go_internal_syscall_unix_files)
+	$(BUILDPACKAGE)
+internal/syscall/unix/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: internal/syscall/unix/check
+
+@go_include@ internal/testenv.lo.dep
+internal/testenv.lo.dep: $(go_internal_testenv_files)
+	$(BUILDDEPS)
+internal/testenv.lo: $(go_internal_testenv_files)
+	$(BUILDPACKAGE)
+internal/testenv/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: internal/testenv/check
+
+@go_include@ internal/trace.lo.dep
+internal/trace.lo.dep: $(go_internal_trace_files)
+	$(BUILDDEPS)
+internal/trace.lo: $(go_internal_trace_files)
+	$(BUILDPACKAGE)
+internal/trace/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: internal/trace/check
+
 @go_include@ io/ioutil.lo.dep
 io/ioutil.lo.dep: $(go_io_ioutil_files)
 	$(BUILDDEPS)
@@ -3120,6 +3442,15 @@ mime/multipart/check: $(CHECK_DEPS)
 	@$(CHECK)
 .PHONY: mime/multipart/check
 
+@go_include@ mime/quotedprintable.lo.dep
+mime/quotedprintable.lo.dep: $(go_mime_quotedprintable_files)
+	$(BUILDDEPS)
+mime/quotedprintable.lo: $(go_mime_quotedprintable_files)
+	$(BUILDPACKAGE)
+mime/quotedprintable/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: mime/quotedprintable/check
+
 @go_include@ net/http.lo.dep
 net/http.lo.dep: $(go_net_http_files)
 	$(BUILDDEPS)
@@ -3237,6 +3568,15 @@ net/http/pprof/check: $(CHECK_DEPS)
 	@$(CHECK)
 .PHONY: net/http/pprof/check
 
+@go_include@ net/internal/socktest.lo.dep
+net/internal/socktest.lo.dep: $(go_net_internal_socktest_files)
+	$(BUILDDEPS)
+net/internal/socktest.lo: $(go_net_internal_socktest_files)
+	$(BUILDPACKAGE)
+net/internal/socktest/check: $(CHECK_DEPS)
+	@$(CHECK)
+.PHONY: net/internal/socktest/check
+
 @go_include@ net/rpc/jsonrpc.lo.dep
 net/rpc/jsonrpc.lo.dep: $(go_net_rpc_jsonrpc_files)
 	$(BUILDDEPS)
@@ -3432,15 +3772,6 @@ syscall/check: $(CHECK_DEPS)
 	@$(CHECK)
 .PHONY: syscall/check
 
-@go_include@ internal/syscall.lo.dep
-internal/syscall.lo.dep: $(go_internal_syscall_files)
-	$(BUILDDEPS)
-internal/syscall.lo: $(go_internal_syscall_files)
-	$(BUILDPACKAGE)
-internal/syscall/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: internal/syscall/check
-
 # How to build a .gox file from a .lo file.
 BUILDGOX = \
 	f=`echo $< | sed -e 's/.lo$$/.o/'`; \
@@ -3620,10 +3951,14 @@ go/ast.gox: go/ast.lo
 	$(BUILDGOX)
 go/build.gox: go/build.lo
 	$(BUILDGOX)
+go/constant.gox: go/constant.lo
+	$(BUILDGOX)
 go/doc.gox: go/doc.lo
 	$(BUILDGOX)
 go/format.gox: go/format.lo
 	$(BUILDGOX)
+go/importer.gox: go/importer.lo
+	$(BUILDGOX)
 go/parser.gox: go/parser.lo
 	$(BUILDGOX)
 go/printer.gox: go/printer.lo
@@ -3632,6 +3967,13 @@ go/scanner.gox: go/scanner.lo
 	$(BUILDGOX)
 go/token.gox: go/token.lo
 	$(BUILDGOX)
+go/types.gox: go/types.lo
+	$(BUILDGOX)
+
+go/internal/gcimporter.gox: go/internal/gcimporter.lo
+	$(BUILDGOX)
+go/internal/gccgoimporter.gox: go/internal/gccgoimporter.lo
+	$(BUILDGOX)
 
 hash/adler32.gox: hash/adler32.lo
 	$(BUILDGOX)
@@ -3648,6 +3990,8 @@ image/draw.gox: image/draw.lo
 	$(BUILDGOX)
 image/gif.gox: image/gif.lo
 	$(BUILDGOX)
+image/internal/imageutil.gox: image/internal/imageutil.lo
+	$(BUILDGOX)
 image/jpeg.gox: image/jpeg.lo
 	$(BUILDGOX)
 image/png.gox: image/png.lo
@@ -3659,6 +4003,17 @@ image/color/palette.gox: image/color/pal
 index/suffixarray.gox: index/suffixarray.lo
 	$(BUILDGOX)
 
+internal/format.gox: internal/format.lo
+	$(BUILDGOX)
+internal/singleflight.gox: internal/singleflight.lo
+	$(BUILDGOX)
+internal/syscall/unix.gox: internal/syscall/unix.lo
+	$(BUILDGOX)
+internal/testenv.gox: internal/testenv.lo
+	$(BUILDGOX)
+internal/trace.gox: internal/trace.lo
+	$(BUILDGOX)
+
 io/ioutil.gox: io/ioutil.lo
 	$(BUILDGOX)
 
@@ -3674,6 +4029,8 @@ math/rand.gox: math/rand.lo
 
 mime/multipart.gox: mime/multipart.lo
 	$(BUILDGOX)
+mime/quotedprintable.gox: mime/quotedprintable.lo
+	$(BUILDGOX)
 
 net/http.gox: net/http.lo
 	$(BUILDGOX)
@@ -3704,6 +4061,9 @@ net/http/pprof.gox: net/http/pprof.lo
 net/http/internal.gox: net/http/internal.lo
 	$(BUILDGOX)
 
+net/internal/socktest.gox: net/internal/socktest.lo
+	$(BUILDGOX)
+
 net/rpc/jsonrpc.gox: net/rpc/jsonrpc.lo
 	$(BUILDGOX)
 
@@ -3733,9 +4093,6 @@ runtime/pprof.gox: runtime/pprof.lo
 sync/atomic.gox: sync/atomic.lo
 	$(BUILDGOX)
 
-internal/syscall.gox: internal/syscall.lo
-	$(BUILDGOX)
-
 text/scanner.gox: text/scanner.lo
 	$(BUILDGOX)
 text/tabwriter.gox: text/tabwriter.lo
@@ -3830,13 +4187,17 @@ TEST_PACKAGES = \
 	exp/terminal/check \
 	html/template/check \
 	go/ast/check \
-	$(go_build_check_omitted_since_it_calls_6g) \
+	go/build/check \
+	go/constant/check \
 	go/doc/check \
 	go/format/check \
+	go/internal/gcimporter/check \
+	go/internal/gccgoimporter/check \
 	go/parser/check \
 	go/printer/check \
 	go/scanner/check \
 	go/token/check \
+	go/types/check \
 	hash/adler32/check \
 	hash/crc32/check \
 	hash/crc64/check \
@@ -3846,12 +4207,15 @@ TEST_PACKAGES = \
 	image/jpeg/check \
 	image/png/check \
 	index/suffixarray/check \
+	internal/singleflight/check \
+	internal/trace/check \
 	io/ioutil/check \
 	log/syslog/check \
 	math/big/check \
 	math/cmplx/check \
 	math/rand/check \
 	mime/multipart/check \
+	mime/quotedprintable/check \
 	net/http/check \
 	net/http/cgi/check \
 	net/http/cookiejar/check \
@@ -3859,6 +4223,7 @@ TEST_PACKAGES = \
 	net/http/httptest/check \
 	net/http/httputil/check \
 	net/http/internal/check \
+	net/internal/socktest/check \
 	net/mail/check \
 	net/rpc/check \
 	net/smtp/check \
Index: libgo/VERSION
===================================================================
--- libgo/VERSION	(revision 228306)
+++ libgo/VERSION	(working copy)
@@ -1 +1 @@
-go1.4.2
\ No newline at end of file
+go1.5
\ No newline at end of file
Index: libgo/merge.sh
===================================================================
--- libgo/merge.sh	(revision 228306)
+++ libgo/merge.sh	(working copy)
@@ -8,7 +8,7 @@
 # into the libgo library.  This does the easy stuff; the hard stuff is
 # left to the user.
 
-# The file MERGE should hold the Mercurial revision number of the last
+# The file MERGE should hold the Git revision number of the last
 # revision which was merged into these sources.  Given that, and given
 # the current sources, we can run the usual diff3 algorithm to merge
 # all changes into our sources.
@@ -30,7 +30,7 @@ case $# in
 1) ;;
 2) rev=$2 ;;
 *)
-  echo 1>&2 "merge.sh: Usage: merge.sh mercurial-repository [revision]"
+  echo 1>&2 "merge.sh: Usage: merge.sh git-repository [revision]"
   exit 1
   ;;
 esac
@@ -66,7 +66,7 @@ merge() {
     else
       echo "merge.sh: ${name}: REMOVED"
       rm -f ${libgo}
-      hg rm ${libgo}
+      git rm ${libgo}
     fi
   elif test -f ${old}; then
     # The file exists in the old version.
@@ -97,7 +97,6 @@ merge() {
       1)
         echo "merge.sh: $name: CONFLICTS"
         mv ${libgo}.tmp ${libgo}
-        hg resolve -u ${libgo}
         ;;
       *)
         echo 1>&2 "merge.sh: $name: diff3 failure"
@@ -118,7 +117,7 @@ merge() {
         mkdir -p ${dir}
       fi
       cp ${new} ${libgo}
-      hg add ${libgo}
+      git add ${libgo}
     fi
   fi
 }
@@ -174,35 +173,6 @@ done
   done
 done
 
-cmdlist="cgo go gofmt"
-for c in $cmdlist; do
-  (cd ${NEWDIR}/src/cmd/$c && find . -name '*.go' -print) | while read f; do
-    oldfile=${OLDDIR}/src/cmd/$c/$f
-    newfile=${NEWDIR}/src/cmd/$c/$f
-    libgofile=go/cmd/$c/$f
-    merge $f ${oldfile} ${newfile} ${libgofile}
-  done
-
-  (cd ${NEWDIR}/src/cmd/$c && find . -name testdata -print) | while read d; do
-    oldtd=${OLDDIR}/src/cmd/$c/$d
-    newtd=${NEWDIR}/src/cmd/$c/$d
-    libgotd=go/cmd/$c/$d
-    if ! test -d ${oldtd}; then
-      continue
-    fi
-    (cd ${oldtd} && git ls-files .) | while read f; do
-      if test "`basename $f`" = ".gitignore"; then
-        continue
-      fi
-      name=$d/$f
-      oldfile=${oldtd}/$f
-      newfile=${newtd}/$f
-      libgofile=${libgotd}/$f
-      merge ${name} ${oldfile} ${newfile} ${libgofile}
-    done
-  done
-done
-
 runtime="chan.goc chan.h cpuprof.goc env_posix.c heapdump.c lock_futex.c lfstack.goc lock_sema.c mcache.c mcentral.c mfixalloc.c mgc0.c mgc0.h mheap.c msize.c netpoll.goc netpoll_epoll.c netpoll_kqueue.c netpoll_stub.c panic.c print.c proc.c race.h rdebug.goc runtime.c runtime.h signal_unix.c signal_unix.h malloc.h malloc.goc mprof.goc parfor.c runtime1.goc sema.goc sigqueue.goc string.goc time.goc"
 for f in $runtime; do
   # merge_c $f $f
@@ -224,7 +194,7 @@ done
   fi
   echo "merge.sh: ${libgofile}: REMOVED"
   rm -f ${libgofile}
-  hg rm ${libgofile}
+  git rm ${libgofile}
 done
 
 (echo ${new_rev}; sed -ne '2,$p' MERGE) > MERGE.tmp
Index: libgo/mksysinfo.sh
===================================================================
--- libgo/mksysinfo.sh	(revision 228306)
+++ libgo/mksysinfo.sh	(working copy)
@@ -875,11 +875,13 @@ grep '^type _addrinfo ' gen-sysinfo.go |
       -e 's/ ai_/ Ai_/g' \
     >> ${OUT}
 
-# The addrinfo flags and errors.
+# The addrinfo and nameinfo flags and errors.
 grep '^const _AI_' gen-sysinfo.go | \
   sed -e 's/^\(const \)_\(AI_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
 grep '^const _EAI_' gen-sysinfo.go | \
   sed -e 's/^\(const \)_\(EAI_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
+grep '^const _NI_' gen-sysinfo.go | \
+  sed -e 's/^\(const \)_\(NI_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
 
 # The passwd struct.
 grep '^type _passwd ' gen-sysinfo.go | \
Index: libgo/testsuite/gotest
===================================================================
--- libgo/testsuite/gotest	(revision 228306)
+++ libgo/testsuite/gotest	(working copy)
@@ -26,7 +26,9 @@ NM=${NM:-nm}
 # gofiles are the test files.  pkgfiles are the source files.
 srcdir=.
 basedir=.
+goarch=""
 gofiles=""
+goos=""
 pkgfiles=""
 loop=true
 keep=false
@@ -58,6 +60,24 @@ while $loop; do
 		basedir=`echo $1 | sed -e 's/^--basedir=//'`
 		shift
 		;;
+	x--goarch)
+		goarch=$2
+		shift
+		shift
+		;;
+	x--goarch=*)
+		goarch=`echo $1 | sed -e 's/^--goarch=//'`
+		shift
+		;;
+	x--goos)
+		goos=$2
+		shift
+		shift
+		;;
+	x--goos=*)
+		goos=`echo $1 | sed -e 's/^--goos=//'`
+		shift
+		;;
 	x--pkgpath)
 		pkgpath=$2
 		shift
@@ -268,7 +288,96 @@ mkdir _test
 
 case "x$gofiles" in
 x)
-	gofiles=`ls *_test.go 2>/dev/null`
+	for f in `ls *_test.go`; do
+	    tag1=`echo $f | sed -e 's/^.*_\([^_]*\)_test.go$/\1/'`
+	    tag2=`echo $f | sed -e 's/^.*_\([^_]*\)_[^_]*_test.go$/\1/'`
+	    if test x$tag1 = x$f; then
+		tag1=
+	    fi
+	    if test x$tag2 = x$f; then
+		tag2=
+	    fi
+
+	    case "$tag1" in
+	    "") ;;
+	    $goarch) ;;
+	    $goos) ;;
+	    android | darwin | dragonfly | freebsd | linux | nacl | netbsd | openbsd | plan9 | solaris | windows)
+		tag1=nonmatchingtag
+		;;
+	    386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | m68k | ppc64 | ppc64le | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | mipso32 | mipsn32 | mipsn64 | mipso64 | ppc | s390 | s390x | sparc | sparc64)
+		tag1=nonmatchingtag
+		;;
+	    esac
+
+	    case "$tag2" in
+	    "") ;;
+	    $goarch) ;;
+	    $goos) ;;
+	    android | darwin | dragonfly | freebsd | linux | nacl | netbsd | openbsd | plan9 | solaris | windows)
+		tag2=nonmatchingtag
+		;;
+	    386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | m68k | ppc64 | ppc64le | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | mipso32 | mipsn32 | mipsn64 | mipso64 | ppc | s390 | s390x | sparc | sparc64)
+		tag2=nonmatchingtag
+		;;
+	    esac
+
+	    if test x$tag1 != xnonmatchingtag -a x$tag2 != xnonmatchingtag; then
+		taglines=`sed '/^package /q' < $f | fgrep '// +build '`
+		if test "$taglines" = ""; then
+		    omatch=true
+		else
+		    omatch=false
+		fi
+		for tags in $taglines; do
+		    match=false
+		    for tag in $tags; do
+			reverse=false
+			case $tag in
+			"!"*)
+			    reverse=true
+			    tag=`echo $tag | sed -e 's/^!//'`
+			    ;;
+			esac
+
+			case $tag in
+			"//" | "+build")
+			    ;;
+			$goos | $goarch | cgo)
+			    match=true
+			    ;;
+			*,*)
+			    match=true
+			    for ctag in `echo $tag | sed -e 's/,/ /g'`; do
+				case $ctag in
+				$goos | $goarch | cgo)
+				    ;;
+				*)
+				    match=false
+				    ;;
+				esac
+			    done
+			    ;;
+			esac
+
+			if test "$reverse" = true; then
+			    if test "$match" = true; then
+				match=false
+			    else
+				match=true
+			    fi
+			fi
+		    done
+		    if test "$match" = "true"; then
+			omatch=true
+		    fi
+		done
+
+		if test "$omatch" = "true"; then
+		    gofiles="$gofiles $f"
+		fi
+	    fi
+	done
 	;;
 *)
 	xgofiles=$gofiles
Index: libgo/runtime/env_posix.c
===================================================================
--- libgo/runtime/env_posix.c	(revision 228306)
+++ libgo/runtime/env_posix.c	(working copy)
@@ -11,7 +11,7 @@
 
 extern Slice envs;
 
-const byte*
+String
 runtime_getenv(const char *s)
 {
 	int32 i, j;
@@ -19,6 +19,7 @@ runtime_getenv(const char *s)
 	const byte *v, *bs;
 	String* envv;
 	int32 envc;
+	String ret;
 
 	bs = (const byte*)s;
 	len = runtime_findnull(bs);
@@ -33,8 +34,12 @@ runtime_getenv(const char *s)
 				goto nomatch;
 		if(v[len] != '=')
 			goto nomatch;
-		return v+len+1;
+		ret.str = v+len+1;
+		ret.len = envv[i].len-len-1;
+		return ret;
 	nomatch:;
 	}
-	return nil;
+	ret.str = nil;
+	ret.len = 0;
+	return ret;
 }
Index: libgo/runtime/go-varargs.c
===================================================================
--- libgo/runtime/go-varargs.c	(revision 228576)
+++ libgo/runtime/go-varargs.c	(working copy)
@@ -10,6 +10,7 @@
 #include <stdint.h>
 #include <sys/types.h>
 #include <fcntl.h>
+#include <sys/ioctl.h>
 
 /* The syscall package calls C functions.  The Go compiler can not
    represent a C varargs functions.  On some systems it's important
@@ -56,6 +57,18 @@ __go_fcntl_uintptr (uintptr_t fd, uintpt
   return ret;
 }
 
+int
+__go_ioctl (int d, int request, int arg)
+{
+  return ioctl (d, request, arg);
+}
+
+int
+__go_ioctl_ptr (int d, int request, void *arg)
+{
+  return ioctl (d, request, arg);
+}
+
 #ifdef HAVE_OPEN64
 
 int
Index: libgo/runtime/malloc.h
===================================================================
--- libgo/runtime/malloc.h	(revision 228306)
+++ libgo/runtime/malloc.h	(working copy)
@@ -263,7 +263,9 @@ struct MStats
 	uint64  last_gc;	// last GC (in absolute time)
 	uint64	pause_total_ns;
 	uint64	pause_ns[256];
+	uint64	pause_end[256];
 	uint32	numgc;
+	float64	gc_cpu_fraction;
 	bool	enablegc;
 	bool	debuggc;
 
Index: libgo/runtime/mgc0.c
===================================================================
--- libgo/runtime/mgc0.c	(revision 228306)
+++ libgo/runtime/mgc0.c	(working copy)
@@ -1368,6 +1368,8 @@ markroot(ParFor *desc, uint32 i)
 		scanblock(wbuf, false);
 }
 
+static const FuncVal markroot_funcval = { (void *) markroot };
+
 // Get an empty work buffer off the work.empty list,
 // allocating new buffers as needed.
 static Workbuf*
@@ -2102,14 +2104,16 @@ static void mgc(G *gp);
 static int32
 readgogc(void)
 {
+	String s;
 	const byte *p;
 
-	p = runtime_getenv("GOGC");
-	if(p == nil || p[0] == '\0')
+	s = runtime_getenv("GOGC");
+	if(s.len == 0)
 		return 100;
-	if(runtime_strcmp((const char *)p, "off") == 0)
+	p = s.str;
+	if(s.len == 3 && runtime_strcmp((const char *)p, "off") == 0)
 		return -1;
-	return runtime_atoi(p);
+	return runtime_atoi(p, s.len);
 }
 
 // force = 1 - do GC regardless of current heap usage
@@ -2252,7 +2256,7 @@ gc(struct gc_args *args)
 	work.nwait = 0;
 	work.ndone = 0;
 	work.nproc = runtime_gcprocs();
-	runtime_parforsetup(work.markfor, work.nproc, RootCount + runtime_allglen, nil, false, markroot);
+	runtime_parforsetup(work.markfor, work.nproc, RootCount + runtime_allglen, false, &markroot_funcval);
 	if(work.nproc > 1) {
 		runtime_noteclear(&work.alldone);
 		runtime_helpgc(work.nproc);
@@ -2285,6 +2289,7 @@ gc(struct gc_args *args)
 	t4 = runtime_nanotime();
 	mstats.last_gc = runtime_unixnanotime();  // must be Unix time to make sense to user
 	mstats.pause_ns[mstats.numgc%nelem(mstats.pause_ns)] = t4 - t0;
+	mstats.pause_end[mstats.numgc%nelem(mstats.pause_end)] = mstats.last_gc;
 	mstats.pause_total_ns += t4 - t0;
 	mstats.numgc++;
 	if(mstats.debuggc)
@@ -2749,3 +2754,38 @@ runtime_MHeap_MapBits(MHeap *h)
 	runtime_SysMap(h->arena_start - n, n - h->bitmap_mapped, h->arena_reserved, &mstats.gc_sys);
 	h->bitmap_mapped = n;
 }
+
+// typedmemmove copies a value of type t to dst from src.
+
+extern void typedmemmove(const Type* td, void *dst, const void *src)
+  __asm__ (GOSYM_PREFIX "reflect.typedmemmove");
+
+void
+typedmemmove(const Type* td, void *dst, const void *src)
+{
+	runtime_memmove(dst, src, td->__size);
+}
+
+// typedslicecopy copies a slice of elemType values from src to dst,
+// returning the number of elements copied.
+
+extern intgo typedslicecopy(const Type* elem, Slice dst, Slice src)
+  __asm__ (GOSYM_PREFIX "reflect.typedslicecopy");
+
+intgo
+typedslicecopy(const Type* elem, Slice dst, Slice src)
+{
+	intgo n;
+	void *dstp;
+	void *srcp;
+
+	n = dst.__count;
+	if (n > src.__count)
+		n = src.__count;
+	if (n == 0)
+		return 0;
+	dstp = dst.__values;
+	srcp = src.__values;
+	memmove(dstp, srcp, (uintptr_t)n * elem->__size);
+	return n;
+}
Index: libgo/runtime/parfor.c
===================================================================
--- libgo/runtime/parfor.c	(revision 228306)
+++ libgo/runtime/parfor.c	(working copy)
@@ -34,7 +34,7 @@ runtime_parforalloc(uint32 nthrmax)
 }
 
 void
-runtime_parforsetup(ParFor *desc, uint32 nthr, uint32 n, void *ctx, bool wait, void (*body)(ParFor*, uint32))
+runtime_parforsetup(ParFor *desc, uint32 nthr, uint32 n, bool wait, const FuncVal *body)
 {
 	uint32 i, begin, end;
 	uint64 *pos;
@@ -49,7 +49,6 @@ runtime_parforsetup(ParFor *desc, uint32
 	desc->nthr = nthr;
 	desc->thrseq = 0;
 	desc->cnt = n;
-	desc->ctx = ctx;
 	desc->wait = wait;
 	desc->nsteal = 0;
 	desc->nstealcnt = 0;
@@ -72,7 +71,8 @@ runtime_parfordo(ParFor *desc)
 	ParForThread *me;
 	uint32 tid, begin, end, begin2, try, victim, i;
 	uint64 *mypos, *victimpos, pos, newpos;
-	void (*body)(ParFor*, uint32);
+	const FuncVal *body;
+	void (*bodyfn)(ParFor*, uint32);
 	bool idle;
 
 	// Obtain 0-based thread index.
@@ -82,14 +82,16 @@ runtime_parfordo(ParFor *desc)
 		runtime_throw("parfor: invalid tid");
 	}
 
+	body = desc->body;
+	bodyfn = (void (*)(ParFor*, uint32))(void*)body->fn;
+
 	// If single-threaded, just execute the for serially.
 	if(desc->nthr==1) {
 		for(i=0; i<desc->cnt; i++)
-			desc->body(desc, i);
+		  __builtin_call_with_static_chain (bodyfn(desc, i), body);
 		return;
 	}
 
-	body = desc->body;
 	me = &desc->thr[tid];
 	mypos = &me->pos;
 	for(;;) {
@@ -100,7 +102,7 @@ runtime_parfordo(ParFor *desc)
 			begin = (uint32)pos-1;
 			end = (uint32)(pos>>32);
 			if(begin < end) {
-				body(desc, begin);
+				__builtin_call_with_static_chain(bodyfn(desc, begin), body);
 				continue;
 			}
 			break;
Index: libgo/runtime/proc.c
===================================================================
--- libgo/runtime/proc.c	(revision 229546)
+++ libgo/runtime/proc.c	(working copy)
@@ -443,6 +443,7 @@ void
 runtime_schedinit(void)
 {
 	int32 n, procs;
+	String s;
 	const byte *p;
 	Eface i;
 
@@ -477,8 +478,9 @@ runtime_schedinit(void)
 
 	runtime_sched.lastpoll = runtime_nanotime();
 	procs = 1;
-	p = runtime_getenv("GOMAXPROCS");
-	if(p != nil && (n = runtime_atoi(p)) > 0) {
+	s = runtime_getenv("GOMAXPROCS");
+	p = s.str;
+	if(p != nil && (n = runtime_atoi(p, s.len)) > 0) {
 		if(n > MaxGomaxprocs)
 			n = MaxGomaxprocs;
 		procs = n;
@@ -2268,19 +2270,19 @@ runtime_malg(int32 stacksize, byte** ret
 // are available sequentially after &fn; they would not be
 // copied if a stack split occurred.  It's OK for this to call
 // functions that split the stack.
-void runtime_testing_entersyscall(void)
+void runtime_testing_entersyscall(int32)
   __asm__ (GOSYM_PREFIX "runtime.entersyscall");
 void
-runtime_testing_entersyscall()
+runtime_testing_entersyscall(int32 dummy __attribute__ ((unused)))
 {
 	runtime_entersyscall();
 }
 
-void runtime_testing_exitsyscall(void)
+void runtime_testing_exitsyscall(int32)
   __asm__ (GOSYM_PREFIX "runtime.exitsyscall");
 
 void
-runtime_testing_exitsyscall()
+runtime_testing_exitsyscall(int32 dummy __attribute__ ((unused)))
 {
 	runtime_exitsyscall();
 }
@@ -3429,3 +3431,54 @@ runtime_gcwaiting(void)
 {
 	return runtime_sched.gcwaiting;
 }
+
+// os_beforeExit is called from os.Exit(0).
+//go:linkname os_beforeExit os.runtime_beforeExit
+
+extern void os_beforeExit() __asm__ (GOSYM_PREFIX "os.runtime_beforeExit");
+
+void
+os_beforeExit()
+{
+}
+
+// Active spinning for sync.Mutex.
+//go:linkname sync_runtime_canSpin sync.runtime_canSpin
+
+enum
+{
+	ACTIVE_SPIN = 4,
+	ACTIVE_SPIN_CNT = 30,
+};
+
+extern _Bool sync_runtime_canSpin(intgo i)
+  __asm__ (GOSYM_PREFIX "sync.runtime_canSpin");
+
+_Bool
+sync_runtime_canSpin(intgo i)
+{
+	P *p;
+
+	// sync.Mutex is cooperative, so we are conservative with spinning.
+	// Spin only few times and only if running on a multicore machine and
+	// GOMAXPROCS>1 and there is at least one other running P and local runq is empty.
+	// As opposed to runtime mutex we don't do passive spinning here,
+	// because there can be work on global runq on on other Ps.
+	if (i >= ACTIVE_SPIN || runtime_ncpu <= 1 || runtime_gomaxprocs <= (int32)(runtime_sched.npidle+runtime_sched.nmspinning)+1) {
+		return false;
+	}
+	p = m->p;
+	return p != nil && p->runqhead == p->runqtail;
+}
+
+//go:linkname sync_runtime_doSpin sync.runtime_doSpin
+//go:nosplit
+
+extern void sync_runtime_doSpin(void)
+  __asm__ (GOSYM_PREFIX "sync.runtime_doSpin");
+
+void
+sync_runtime_doSpin()
+{
+	runtime_procyield(ACTIVE_SPIN_CNT);
+}
Index: libgo/runtime/runtime.c
===================================================================
--- libgo/runtime/runtime.c	(revision 228306)
+++ libgo/runtime/runtime.c	(working copy)
@@ -35,6 +35,7 @@ extern volatile intgo runtime_MemProfile
 int32
 runtime_gotraceback(bool *crash)
 {
+	String s;
 	const byte *p;
 	uint32 x;
 
@@ -44,15 +45,14 @@ runtime_gotraceback(bool *crash)
 		return runtime_m()->traceback;
 	x = runtime_atomicload(&traceback_cache);
 	if(x == ~(uint32)0) {
-		p = runtime_getenv("GOTRACEBACK");
-		if(p == nil)
-			p = (const byte*)"";
-		if(p[0] == '\0')
+		s = runtime_getenv("GOTRACEBACK");
+		p = s.str;
+		if(s.len == 0)
 			x = 1<<1;
-		else if(runtime_strcmp((const char *)p, "crash") == 0)
+		else if(s.len == 5 && runtime_strcmp((const char *)p, "crash") == 0)
 			x = (2<<1) | 1;
 		else
-			x = runtime_atoi(p)<<1;	
+			x = runtime_atoi(p, s.len)<<1;	
 		runtime_atomicstore(&traceback_cache, x);
 	}
 	if(crash != nil)
@@ -136,13 +136,15 @@ os_runtime_args()
 }
 
 int32
-runtime_atoi(const byte *p)
+runtime_atoi(const byte *p, intgo len)
 {
 	int32 n;
 
 	n = 0;
-	while('0' <= *p && *p <= '9')
+	while(len > 0 && '0' <= *p && *p <= '9') {
 		n = n*10 + *p++ - '0';
+		len--;
+	}
 	return n;
 }
 
@@ -339,7 +341,9 @@ static struct {
 void
 runtime_parsedebugvars(void)
 {
-	const byte *p;
+	String s;
+	const byte *p, *pn;
+	intgo len;
 	intgo i, n;
 	bool tmp;
 	
@@ -352,24 +356,27 @@ runtime_parsedebugvars(void)
 	traceback_cache = ~(uint32)0;
 	runtime_gotraceback(&tmp);
 
-	p = runtime_getenv("GODEBUG");
-	if(p == nil)
+	s = runtime_getenv("GODEBUG");
+	if(s.len == 0)
 		return;
+	p = s.str;
+	len = s.len;
 	for(;;) {
 		for(i=0; i<(intgo)nelem(dbgvar); i++) {
 			n = runtime_findnull((const byte*)dbgvar[i].name);
-			if(runtime_mcmp(p, "memprofilerate", n) == 0 && p[n] == '=')
+			if(len > n && runtime_mcmp(p, "memprofilerate", n) == 0 && p[n] == '=')
 				// Set the MemProfileRate directly since it
 				// is an int, not int32, and should only lbe
 				// set here if specified by GODEBUG
-				runtime_MemProfileRate = runtime_atoi(p+n+1);
-			else if(runtime_mcmp(p, dbgvar[i].name, n) == 0 && p[n] == '=')
-				*dbgvar[i].value = runtime_atoi(p+n+1);
+				runtime_MemProfileRate = runtime_atoi(p+n+1, len-(n+1));
+			else if(len > n && runtime_mcmp(p, dbgvar[i].name, n) == 0 && p[n] == '=')
+				*dbgvar[i].value = runtime_atoi(p+n+1, len-(n+1));
 		}
-		p = (const byte *)runtime_strstr((const char *)p, ",");
-		if(p == nil)
+		pn = (const byte *)runtime_strstr((const char *)p, ",");
+		if(pn == nil || pn - p >= len)
 			break;
-		p++;
+		len -= (pn - p) - 1;
+		p = pn + 1;
 	}
 }
 
Index: libgo/runtime/runtime.h
===================================================================
--- libgo/runtime/runtime.h	(revision 228306)
+++ libgo/runtime/runtime.h	(working copy)
@@ -421,17 +421,15 @@ struct LFNode
 // Parallel for descriptor.
 struct ParFor
 {
-	void (*body)(ParFor*, uint32);	// executed for each element
+	const FuncVal *body;		// executed for each element
 	uint32 done;			// number of idle threads
 	uint32 nthr;			// total number of threads
 	uint32 nthrmax;			// maximum number of threads
 	uint32 thrseq;			// thread id sequencer
 	uint32 cnt;			// iteration space [0, cnt)
-	void *ctx;			// arbitrary user context
 	bool wait;			// if true, wait while all threads finish processing,
 					// otherwise parfor may return while other threads are still working
 	ParForThread *thr;		// array of thread descriptors
-	uint32 pad;			// to align ParForThread.pos for 64-bit atomic operations
 	// stats
 	uint64 nsteal;
 	uint64 nstealcnt;
@@ -544,6 +542,7 @@ void	runtime_schedinit(void);
 void	runtime_initsig(void);
 void	runtime_sigenable(uint32 sig);
 void	runtime_sigdisable(uint32 sig);
+void	runtime_sigignore(uint32 sig);
 int32	runtime_gotraceback(bool *crash);
 void	runtime_goroutineheader(G*);
 void	runtime_printtrace(Location*, int32, bool);
@@ -552,8 +551,8 @@ void	runtime_printtrace(Location*, int32
 #define runtime_write(d, v, n) write((d), (v), (n))
 #define runtime_close(d) close(d)
 void	runtime_ready(G*);
-const byte*	runtime_getenv(const char*);
-int32	runtime_atoi(const byte*);
+String	runtime_getenv(const char*);
+int32	runtime_atoi(const byte*, intgo);
 void*	runtime_mstart(void*);
 G*	runtime_malg(int32, byte**, size_t*);
 void	runtime_mpreinit(M*);
@@ -713,12 +712,11 @@ LFNode*	runtime_lfstackpop(uint64 *head)
  * Parallel for over [0, n).
  * body() is executed for each iteration.
  * nthr - total number of worker threads.
- * ctx - arbitrary user context.
  * if wait=true, threads return from parfor() when all work is done;
  * otherwise, threads can return while other threads are still finishing processing.
  */
 ParFor*	runtime_parforalloc(uint32 nthrmax);
-void	runtime_parforsetup(ParFor *desc, uint32 nthr, uint32 n, void *ctx, bool wait, void (*body)(ParFor*, uint32));
+void	runtime_parforsetup(ParFor *desc, uint32 nthr, uint32 n, bool wait, const FuncVal *body);
 void	runtime_parfordo(ParFor *desc);
 void	runtime_parforiters(ParFor*, uintptr, uintptr*, uintptr*);
 
Index: libgo/runtime/runtime1.goc
===================================================================
--- libgo/runtime/runtime1.goc	(revision 228306)
+++ libgo/runtime/runtime1.goc	(working copy)
@@ -27,8 +27,8 @@ func newParFor(nthrmax uint32) (desc *Pa
 	desc = runtime_parforalloc(nthrmax);
 }
 
-func parForSetup(desc *ParFor, nthr uint32, n uint32, ctx *byte, wait bool, body *byte) {
-	runtime_parforsetup(desc, nthr, n, ctx, wait, *(void(**)(ParFor*, uint32))body);
+func parForSetup(desc *ParFor, nthr uint32, n uint32, wait bool, body *byte) {
+	runtime_parforsetup(desc, nthr, n, wait, (const FuncVal*) body);
 }
 
 func parForDo(desc *ParFor) {
@@ -52,10 +52,7 @@ func NumGoroutine() (ret int) {
 }
 
 func getgoroot() (out String) {
-	const byte *p;
-
-	p = runtime_getenv("GOROOT");
-	out = runtime_gostringnocopy(p);
+	out = runtime_getenv("GOROOT");
 }
 
 func runtime_pprof.runtime_cyclesPerSecond() (res int64) {
@@ -87,3 +84,13 @@ func sync_atomic.runtime_procPin() (p in
 func sync_atomic.runtime_procUnpin() {
 	runtime_m()->locks--;
 }
+
+extern Slice envs;
+
+func envs() (s Slice) {
+	s = envs;
+}
+
+func setenvs(e Slice) {
+	envs = e;
+}
Index: libgo/runtime/signal_unix.c
===================================================================
--- libgo/runtime/signal_unix.c	(revision 228306)
+++ libgo/runtime/signal_unix.c	(working copy)
@@ -93,6 +93,29 @@ runtime_sigdisable(uint32 sig)
 }
 
 void
+runtime_sigignore(uint32 sig)
+{
+	int32 i;
+	SigTab *t;
+
+	t = nil;
+	for(i = 0; runtime_sigtab[i].sig != -1; i++) {
+		if(runtime_sigtab[i].sig == (int32)sig) {
+			t = &runtime_sigtab[i];
+			break;
+		}
+	}
+
+	if(t == nil)
+		return;
+
+	if((t->flags & SigNotify) != 0) {
+		t->flags &= ~SigHandling;
+		runtime_setsig(i, GO_SIG_IGN, true);
+	}
+}
+
+void
 runtime_resetcpuprofiler(int32 hz)
 {
 	struct itimerval it;
Index: libgo/runtime/sigqueue.goc
===================================================================
--- libgo/runtime/sigqueue.goc	(revision 228306)
+++ libgo/runtime/sigqueue.goc	(working copy)
@@ -156,6 +156,14 @@ func signal_disable(s uint32) {
 	runtime_sigdisable(s);
 }
 
+// Must only be called from a single goroutine at a time.
+func signal_ignore(s uint32) {
+	if (s >= nelem(sig.wanted)*32)
+		return;
+	sig.wanted[s/32] &= ~(1U<<(s&31));
+	runtime_sigignore(s);
+}
+
 // This runs on a foreign stack, without an m or a g.  No stack split.
 void
 runtime_badsignal(int sig)


More information about the Gcc-patches mailing list