f75af8c1464e948b5e166cf5ab09ebf0d82fc253 diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 64a655e911e..89d1f3c7623 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -63bc2430187efe5ff47e9c7b9cd6d40b350ee7d7 +2c390ba951e83b547f6387cc9e19436c085b3775 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/MERGE b/libgo/MERGE index 4f8589371d3..ad43e2924c6 100644 --- a/libgo/MERGE +++ b/libgo/MERGE @@ -1,4 +1,4 @@ -edfd6f28486017dcb136cd3f3ec252706d4b326e +3e8f6b0791a670e52d25d76813d669daa68acfb4 The first line of this file holds the git revision number of the last merge done from the master library sources. diff --git a/libgo/Makefile.am b/libgo/Makefile.am index 52a8330ed2a..88ea2728bc3 100644 --- a/libgo/Makefile.am +++ b/libgo/Makefile.am @@ -391,6 +391,11 @@ toolexeclibgotexttemplatedir = $(toolexeclibgotextdir)/template toolexeclibgotexttemplate_DATA = \ text/template/parse.gox +toolexeclibgotimedir = $(toolexeclibgodir)/time + +toolexeclibgotime_DATA = \ + time/tzdata.gox + toolexeclibgounicodedir = $(toolexeclibgodir)/unicode toolexeclibgounicode_DATA = \ @@ -400,7 +405,8 @@ toolexeclibgounicode_DATA = \ # Some internal packages are needed to bootstrap the gc toolchain. toolexeclibgointernaldir = $(toolexeclibgodir)/internal toolexeclibgointernal_DATA = \ - internal/reflectlite.gox + internal/reflectlite.gox \ + internal/unsafeheader.gox # Some packages are only needed for tests, so unlike the other # internal packages nothing will explicitly depend on them. @@ -409,11 +415,11 @@ noinst_DATA = \ golang.org/x/net/nettest.gox \ internal/cfg.gox \ internal/obscuretestdata.gox \ + internal/profile.gox \ internal/testenv.gox \ internal/trace.gox \ net/internal/socktest.gox \ - os/signal/internal/pty.gox \ - runtime/pprof/internal/profile.gox + os/signal/internal/pty.gox if LIBGO_IS_RTEMS rtems_task_variable_add_file = runtime/rtems-task-variable-add.c @@ -706,9 +712,9 @@ syscall_lib_clone_lo = endif if LIBGO_IS_X86 -golangorg_x_sys_cpu_gccgo_lo = golang.org/x/sys/cpu_gccgo.lo +golangorg_x_sys_cpu_gccgo_x86_lo = golang.org/x/sys/cpu_gccgo_x86.lo else -golangorg_x_sys_cpu_gccgo_lo = +golangorg_x_sys_cpu_gccgo_x86_lo = endif PACKAGES = $(shell cat $(srcdir)/libgo-packages.txt) @@ -728,7 +734,7 @@ libgo_go_objs = \ runtime/internal/atomic_c.lo \ sync/atomic_c.lo \ internal/cpu/cpu_gccgo.lo \ - $(golangorg_x_sys_cpu_gccgo_lo) + $(golangorg_x_sys_cpu_gccgo_x86_lo) libgo_ldflags = \ -version-info $(libtool_VERSION) $(PTHREAD_CFLAGS) $(AM_LDFLAGS) @@ -1008,6 +1014,7 @@ extra_check_libs_cmd_go_internal_modload = $(abs_builddir)/libgotool.a extra_check_libs_cmd_go_internal_module = $(abs_builddir)/libgotool.a extra_check_libs_cmd_go_internal_mvs = $(abs_builddir)/libgotool.a extra_check_libs_cmd_go_internal_search = $(abs_builddir)/libgotool.a +extra_check_libs_cmd_go_internal_test = $(abs_builddir)/libgotool.a extra_check_libs_cmd_go_internal_web2 = $(abs_builddir)/libgotool.a extra_check_libs_cmd_go_internal_work = $(abs_builddir)/libgotool.a @@ -1060,9 +1067,9 @@ internal/cpu/cpu_gccgo.lo: go/internal/cpu/cpu_gccgo.c runtime.inc $(LTCOMPILE) -c -o $@ $(srcdir)/go/internal/cpu/cpu_gccgo.c # Similarly, golang.org/x/sys/cpu needs some C code. -golang.org/x/sys/cpu_gccgo.lo: go/golang.org/x/sys/cpu/cpu_gccgo.c runtime.inc +golang.org/x/sys/cpu_gccgo_x86.lo: go/golang.org/x/sys/cpu/cpu_gccgo_x86.c runtime.inc @$(MKDIR_P) golang.org/x/sys - $(LTCOMPILE) -c -o $@ $(srcdir)/go/golang.org/x/sys/cpu/cpu_gccgo.c + $(LTCOMPILE) -c -o $@ $(srcdir)/go/golang.org/x/sys/cpu/cpu_gccgo_x86.c # Solaris 11.4 changed the type of fields in struct stat. # Use a build tag, based on a configure check, to cope. @@ -1238,7 +1245,7 @@ all-local: $(ALL_LOCAL_DEPS) MAJOR=$(firstword $(subst :, ,$(libtool_VERSION))) add-aix-fat-library: all-multi - @if test "$(MULTIBUILDTOP)" = ""; then \ - ${AR} -X$(AIX_DEFAULT_ARCH) rc .libs/$(PACKAGE).a ../ppc$(AIX_DEFAULT_ARCH)/$(PACKAGE)/.libs/$(PACKAGE).so.$(MAJOR); \ - ${AR} -X$(AIX_DEFAULT_ARCH) rc ../pthread/$(PACKAGE)/.libs/$(PACKAGE).a ../pthread/ppc$(AIX_DEFAULT_ARCH)/$(PACKAGE)/.libs/$(PACKAGE).so.$(MAJOR); \ - fi + @if test "$(MULTIBUILDTOP)" = ""; then \ + ${AR} -X$(AIX_DEFAULT_ARCH) rc .libs/$(PACKAGE).a ../ppc$(AIX_DEFAULT_ARCH)/$(PACKAGE)/.libs/$(PACKAGE).so.$(MAJOR); \ + ${AR} -X$(AIX_DEFAULT_ARCH) rc ../pthread/$(PACKAGE)/.libs/$(PACKAGE).a ../pthread/ppc$(AIX_DEFAULT_ARCH)/$(PACKAGE)/.libs/$(PACKAGE).so.$(MAJOR); \ + fi diff --git a/libgo/VERSION b/libgo/VERSION index 398d25321fb..0bcf07d0280 100644 --- a/libgo/VERSION +++ b/libgo/VERSION @@ -1 +1 @@ -go1.14.6 +go1.15rc1 diff --git a/libgo/check-packages.txt b/libgo/check-packages.txt index 48c4dfdbc91..efa7d191180 100644 --- a/libgo/check-packages.txt +++ b/libgo/check-packages.txt @@ -16,6 +16,7 @@ cmd/go/internal/modload cmd/go/internal/mvs cmd/go/internal/par cmd/go/internal/search +cmd/go/internal/test cmd/go/internal/txtar cmd/go/internal/work cmd/internal/buildid @@ -104,9 +105,11 @@ index/suffixarray internal/cpu internal/fmtsort internal/poll +internal/profile internal/reflectlite internal/singleflight internal/trace +internal/unsafeheader internal/xcoff io io/ioutil @@ -152,7 +155,6 @@ runtime/internal/atomic runtime/internal/math runtime/internal/sys runtime/pprof -runtime/pprof/internal/profile runtime/trace sort strconv diff --git a/libgo/configure.ac b/libgo/configure.ac index 841cba1768e..db5848e36ad 100644 --- a/libgo/configure.ac +++ b/libgo/configure.ac @@ -10,7 +10,7 @@ AC_INIT(package-unused, version-unused,, libgo) AC_CONFIG_SRCDIR(Makefile.am) AC_CONFIG_HEADER(config.h) -libtool_VERSION=16:0:0 +libtool_VERSION=17:0:0 AC_SUBST(libtool_VERSION) AM_ENABLE_MULTILIB(, ..) diff --git a/libgo/go/internal/bytealg/bytealg.go b/libgo/go/internal/bytealg/bytealg.go index e46ee7c4fba..abdba5fb580 100644 --- a/libgo/go/internal/bytealg/bytealg.go +++ b/libgo/go/internal/bytealg/bytealg.go @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build ignore_for_gccgo - package bytealg import ( @@ -22,4 +20,130 @@ const ( ) // MaxLen is the maximum length of the string to be searched for (argument b) in Index. +// If MaxLen is not 0, make sure MaxLen >= 4. var MaxLen int = 32 + +// FIXME: the logic of HashStrBytes, HashStrRevBytes, IndexRabinKarpBytes and HashStr, HashStrRev, +// IndexRabinKarp are exactly the same, except that the types are different. Can we eliminate +// three of them without causing allocation? + +// PrimeRK is the prime base used in Rabin-Karp algorithm. +const PrimeRK = 16777619 + +// HashStrBytes returns the hash and the appropriate multiplicative +// factor for use in Rabin-Karp algorithm. +func HashStrBytes(sep []byte) (uint32, uint32) { + hash := uint32(0) + for i := 0; i < len(sep); i++ { + hash = hash*PrimeRK + uint32(sep[i]) + } + var pow, sq uint32 = 1, PrimeRK + for i := len(sep); i > 0; i >>= 1 { + if i&1 != 0 { + pow *= sq + } + sq *= sq + } + return hash, pow +} + +// HashStr returns the hash and the appropriate multiplicative +// factor for use in Rabin-Karp algorithm. +func HashStr(sep string) (uint32, uint32) { + hash := uint32(0) + for i := 0; i < len(sep); i++ { + hash = hash*PrimeRK + uint32(sep[i]) + } + var pow, sq uint32 = 1, PrimeRK + for i := len(sep); i > 0; i >>= 1 { + if i&1 != 0 { + pow *= sq + } + sq *= sq + } + return hash, pow +} + +// HashStrRevBytes returns the hash of the reverse of sep and the +// appropriate multiplicative factor for use in Rabin-Karp algorithm. +func HashStrRevBytes(sep []byte) (uint32, uint32) { + hash := uint32(0) + for i := len(sep) - 1; i >= 0; i-- { + hash = hash*PrimeRK + uint32(sep[i]) + } + var pow, sq uint32 = 1, PrimeRK + for i := len(sep); i > 0; i >>= 1 { + if i&1 != 0 { + pow *= sq + } + sq *= sq + } + return hash, pow +} + +// HashStrRev returns the hash of the reverse of sep and the +// appropriate multiplicative factor for use in Rabin-Karp algorithm. +func HashStrRev(sep string) (uint32, uint32) { + hash := uint32(0) + for i := len(sep) - 1; i >= 0; i-- { + hash = hash*PrimeRK + uint32(sep[i]) + } + var pow, sq uint32 = 1, PrimeRK + for i := len(sep); i > 0; i >>= 1 { + if i&1 != 0 { + pow *= sq + } + sq *= sq + } + return hash, pow +} + +// IndexRabinKarpBytes uses the Rabin-Karp search algorithm to return the index of the +// first occurence of substr in s, or -1 if not present. +func IndexRabinKarpBytes(s, sep []byte) int { + // Rabin-Karp search + hashsep, pow := HashStrBytes(sep) + n := len(sep) + var h uint32 + for i := 0; i < n; i++ { + h = h*PrimeRK + uint32(s[i]) + } + if h == hashsep && Equal(s[:n], sep) { + return 0 + } + for i := n; i < len(s); { + h *= PrimeRK + h += uint32(s[i]) + h -= pow * uint32(s[i-n]) + i++ + if h == hashsep && Equal(s[i-n:i], sep) { + return i - n + } + } + return -1 +} + +// IndexRabinKarp uses the Rabin-Karp search algorithm to return the index of the +// first occurence of substr in s, or -1 if not present. +func IndexRabinKarp(s, substr string) int { + // Rabin-Karp search + hashss, pow := HashStr(substr) + n := len(substr) + var h uint32 + for i := 0; i < n; i++ { + h = h*PrimeRK + uint32(s[i]) + } + if h == hashss && s[:n] == substr { + return 0 + } + for i := n; i < len(s); { + h *= PrimeRK + h += uint32(s[i]) + h -= pow * uint32(s[i-n]) + i++ + if h == hashss && s[i-n:i] == substr { + return i - n + } + } + return -1 +} diff --git a/libgo/go/internal/bytealg/gccgo.go b/libgo/go/internal/bytealg/gccgo.go index 8c78b631dee..05b39e3e2ca 100644 --- a/libgo/go/internal/bytealg/gccgo.go +++ b/libgo/go/internal/bytealg/gccgo.go @@ -6,7 +6,4 @@ package bytealg -// MaxLen is the maximum length of the string to be searched for (argument b) in Index. -var MaxLen int = 32 - const MaxBruteForce = 64 diff --git a/libgo/go/internal/bytealg/index_generic.go b/libgo/go/internal/bytealg/index_generic.go index c595c231cf0..3dc1c6b2232 100644 --- a/libgo/go/internal/bytealg/index_generic.go +++ b/libgo/go/internal/bytealg/index_generic.go @@ -17,8 +17,42 @@ func Index(a, b []byte) int { // IndexString returns the index of the first instance of b in a, or -1 if b is not present in a. // Requires 2 <= len(b) <= MaxLen. -func IndexString(a, b string) int { - panic("unimplemented") +func IndexString(s, substr string) int { + // This is a partial copy of strings.Index, here because bytes.IndexAny and bytes.LastIndexAny + // call bytealg.IndexString. Some platforms have an optimized assembly version of this function. + // This implementation is used for those that do not. Although the pure Go implementation here + // works for the case of len(b) > MaxLen, we do not require that its assembly implementation also + // supports the case of len(b) > MaxLen. And we do not guarantee that this function supports the + // case of len(b) > MaxLen. + n := len(substr) + c0 := substr[0] + c1 := substr[1] + i := 0 + t := len(s) - n + 1 + fails := 0 + for i < t { + if s[i] != c0 { + o := IndexByteString(s[i:t], c0) + if o < 0 { + return -1 + } + i += o + } + if s[i+1] == c1 && s[i:i+n] == substr { + return i + } + i++ + fails++ + if fails >= 4+i>>4 && i < t { + // See comment in src/bytes/bytes.go. + j := IndexRabinKarp(s[i:], substr) + if j < 0 { + return -1 + } + return i + j + } + } + return -1 } // Cutover reports the number of failures of IndexByte we should tolerate diff --git a/libgo/gotool-packages.txt b/libgo/gotool-packages.txt index 90521ae0b50..745c34cd2e6 100644 --- a/libgo/gotool-packages.txt +++ b/libgo/gotool-packages.txt @@ -70,6 +70,7 @@ golang.org/x/tools/go/analysis/passes/copylock golang.org/x/tools/go/analysis/passes/ctrlflow golang.org/x/tools/go/analysis/passes/errorsas golang.org/x/tools/go/analysis/passes/httpresponse +golang.org/x/tools/go/analysis/passes/ifaceassert golang.org/x/tools/go/analysis/passes/inspect golang.org/x/tools/go/analysis/passes/internal/analysisutil golang.org/x/tools/go/analysis/passes/loopclosure @@ -79,6 +80,7 @@ golang.org/x/tools/go/analysis/passes/pkgfact golang.org/x/tools/go/analysis/passes/printf golang.org/x/tools/go/analysis/passes/shift golang.org/x/tools/go/analysis/passes/stdmethods +golang.org/x/tools/go/analysis/passes/stringintconv golang.org/x/tools/go/analysis/passes/structtag golang.org/x/tools/go/analysis/passes/tests golang.org/x/tools/go/analysis/passes/unmarshal @@ -91,5 +93,6 @@ golang.org/x/tools/go/ast/inspector golang.org/x/tools/go/cfg golang.org/x/tools/go/types/objectpath golang.org/x/tools/go/types/typeutil +golang.org/x/tools/internal/analysisinternal golang.org/x/xerrors golang.org/x/xerrors/internal diff --git a/libgo/libgo-packages.txt b/libgo/libgo-packages.txt index a3bdb948499..0b02988d11d 100644 --- a/libgo/libgo-packages.txt +++ b/libgo/libgo-packages.txt @@ -120,6 +120,7 @@ internal/nettrace internal/obscuretestdata internal/oserror internal/poll +internal/profile internal/race internal/reflectlite internal/singleflight @@ -128,6 +129,7 @@ internal/syscall/unix internal/testenv internal/testlog internal/trace +internal/unsafeheader internal/xcoff io io/ioutil @@ -174,7 +176,6 @@ runtime/internal/atomic runtime/internal/math runtime/internal/sys runtime/pprof -runtime/pprof/internal/profile runtime/trace sort strconv @@ -191,6 +192,7 @@ text/tabwriter text/template text/template/parse time +time/tzdata unicode unicode/utf16 unicode/utf8