This patch updates libgo from the Go1.16.5 release to the Go 1.17rc2 release. As usual with these version updates, the patch itself is too large to attach to this e-mail message. I've attached the changes to files that are specific to gccgo. Bootstraped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
5fe441d33024fe33b9835c3e8d6b9f6cf24715f1 diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 539d886b08f..bcbe1d93018 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -5edbb624b2595d644eb6842c952a292c41f7d6fa +33f65dce43bd01c1fa38cd90a78c9aea6ca6dd59 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 ac842716022..4286d5c5433 100644 --- a/libgo/MERGE +++ b/libgo/MERGE @@ -1,4 +1,4 @@ -7677616a263e8ded606cc8297cb67ddc667a876e +72ab3ff68b1ec894fe5599ec82b8849f3baa9d94 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 dec98756673..92fedcf6eb8 100644 --- a/libgo/Makefile.am +++ b/libgo/Makefile.am @@ -366,6 +366,7 @@ toolexeclibgoregexp_DATA = \ toolexeclibgoruntimedir = $(toolexeclibgodir)/runtime toolexeclibgoruntime_DATA = \ + runtime/cgo.gox \ runtime/debug.gox \ runtime/metrics.gox \ runtime/pprof.gox \ @@ -428,7 +429,9 @@ noinst_DATA = \ internal/testenv.gox \ internal/trace.gox \ net/internal/socktest.gox \ - os/signal/internal/pty.gox + os/signal/internal/pty.gox \ + reflect/internal/example1.gox \ + reflect/internal/example2.gox if LIBGO_IS_RTEMS rtems_task_variable_add_file = runtime/rtems-task-variable-add.c @@ -480,14 +483,10 @@ version.go: s-version; @true s-version: Makefile rm -f version.go.tmp echo "package sys" > version.go.tmp - echo 'func init() { DefaultGoroot = "$(prefix)" }' >> version.go.tmp - echo 'const TheVersion = "'`cat $(srcdir)/VERSION | sed 1q`' '`$(GOC) --version | sed 1q`'"' >> version.go.tmp - echo 'const Goexperiment = ``' >> version.go.tmp echo 'const GOARCH = "'$(GOARCH)'"' >> version.go.tmp echo 'const GOOS = "'$(GOOS)'"' >> version.go.tmp echo 'const GccgoToolDir = "$(libexecsubdir)"' >> version.go.tmp - echo >> version.go.tmp - echo "type ArchFamilyType int" >> version.go.tmp + echo 'const StackGuardMultiplierDefault = 1' >> version.go.tmp echo >> version.go.tmp echo "const (" >> version.go.tmp echo " UNKNOWN ArchFamilyType = iota" >> version.go.tmp @@ -507,13 +506,13 @@ s-version: Makefile done echo >> version.go.tmp echo "const (" >> version.go.tmp - echo " ArchFamily = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) family`" >> version.go.tmp - echo " BigEndian = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) bigendian`" >> version.go.tmp - echo " CacheLineSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) cachelinesize`" >> version.go.tmp - echo " DefaultPhysPageSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) defaultphyspagesize`" >> version.go.tmp - echo " Int64Align = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) int64align`" >> version.go.tmp - echo " MinFrameSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) minframesize`" >> version.go.tmp - echo " PCQuantum = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) pcquantum`" >> version.go.tmp + echo " _ArchFamily = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) family`" >> version.go.tmp + echo " _BigEndian = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) bigendian`" >> version.go.tmp + echo " _DefaultPhysPageSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) defaultphyspagesize`" >> version.go.tmp + echo " _Int64Align = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) int64align`" >> version.go.tmp + echo " _MinFrameSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) minframesize`" >> version.go.tmp + echo " _PCQuantum = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) pcquantum`" >> version.go.tmp + echo " _StackAlign = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) stackalign`" >> version.go.tmp echo ")" >> version.go.tmp echo >> version.go.tmp for a in $(ALLGOOS); do \ @@ -526,7 +525,6 @@ s-version: Makefile fi; \ done echo >> version.go.tmp - echo "type Uintreg uintptr" >> version.go.tmp $(SHELL) $(srcdir)/mvifdiff.sh version.go.tmp version.go $(STAMP) $@ @@ -547,24 +545,31 @@ s-gcpu: Makefile $(SHELL) $(srcdir)/mvifdiff.sh gcpugen.go.tmp gcpugen.go $(STAMP) $@ +buildcfg.go: s-buildcfg; @true +s-buildcfg: Makefile + rm -f buildcfg.go.tmp + echo "package buildcfg" > buildcfg.go.tmp + echo "import \"runtime\"" >> buildcfg.go.tmp + echo 'func defaultGOROOTValue() string { return `$(prefix)` }' >> buildcfg.go.tmp + echo 'const defaultGO386 = `sse2`' >> buildcfg.go.tmp + echo 'const defaultGOARM = `5`' >> buildcfg.go.tmp + echo 'const defaultGOMIPS = `hardfloat`' >> buildcfg.go.tmp + echo 'const defaultGOMIPS64 = `hardfloat`' >> buildcfg.go.tmp + echo 'const defaultGOPPC64 = `power8`' >> buildcfg.go.tmp + echo 'const defaultGOEXPERIMENT = `fieldtrack`' >> buildcfg.go.tmp + echo 'const defaultGO_EXTLINK_ENABLED = ``' >> buildcfg.go.tmp + echo 'const defaultGO_LDSO = ``' >> buildcfg.go.tmp + echo 'const version = `'`cat $(srcdir)/VERSION | sed 1q`' '`$(GOC) --version | sed 1q`'`' >> buildcfg.go.tmp + echo 'const defaultGOOS = runtime.GOOS' >> buildcfg.go.tmp + echo 'const defaultGOARCH = runtime.GOARCH' >> buildcfg.go.tmp + $(SHELL) $(srcdir)/mvifdiff.sh buildcfg.go.tmp buildcfg.go + $(STAMP) $@ + objabi.go: s-objabi; @true s-objabi: Makefile rm -f objabi.go.tmp echo "package objabi" > objabi.go.tmp - echo "import \"runtime\"" >> objabi.go.tmp - echo 'func defaultGOROOTValue() string { return `$(prefix)` }' >> objabi.go.tmp - echo 'const defaultGO386 = `sse2`' >> objabi.go.tmp - echo 'const defaultGOARM = `5`' >> objabi.go.tmp - echo 'const defaultGOMIPS = `hardfloat`' >> objabi.go.tmp - echo 'const defaultGOMIPS64 = `hardfloat`' >> objabi.go.tmp - echo 'const defaultGOPPC64 = `power8`' >> objabi.go.tmp - echo 'const defaultGOOS = runtime.GOOS' >> objabi.go.tmp - echo 'const defaultGOARCH = runtime.GOARCH' >> objabi.go.tmp - echo 'const defaultGO_EXTLINK_ENABLED = ``' >> objabi.go.tmp - echo 'const defaultGO_LDSO = ``' >> objabi.go.tmp - echo 'const version = `'`cat $(srcdir)/VERSION | sed 1q`' '`$(GOC) --version | sed 1q`'`' >> objabi.go.tmp echo 'const stackGuardMultiplierDefault = 1' >> objabi.go.tmp - echo 'const goexperiment = ``' >> objabi.go.tmp $(SHELL) $(srcdir)/mvifdiff.sh objabi.go.tmp objabi.go $(STAMP) $@ @@ -671,7 +676,7 @@ s-zstdpkglist: Makefile libgo-packages.txt echo 'package goroot' > zstdpkglist.go.tmp echo "" >> zstdpkglist.go.tmp echo 'var stdpkg = map[string]bool{' >> zstdpkglist.go.tmp - echo $(libgo_go_objs) 'unsafe.lo' 'runtime/cgo.lo' | sed 's|[a-z0-9_./]*_c\.lo||g' | sed 's|golang\.org/[a-z0-9_./]*\.lo||g' | sed 's|\([a-z0-9_./]*\)\.lo|"\1": true,|g' >> zstdpkglist.go.tmp + echo $(libgo_go_objs) 'unsafe.lo' | sed 's|[a-z0-9_./]*_c\.lo||g' | sed 's|golang\.org/[a-z0-9_./]*\.lo||g' | sed 's|\([a-z0-9_./]*\)\.lo|"\1": true,|g' >> zstdpkglist.go.tmp echo '}' >> zstdpkglist.go.tmp $(SHELL) $(srcdir)/mvifdiff.sh zstdpkglist.go.tmp zstdpkglist.go $(STAMP) $@ @@ -1054,6 +1059,9 @@ internal/cpu.lo.dep: $(extra_go_files_internal_cpu) extra_go_files_golang_org_x_sys_cpu = gcpugen.go golang.org/x/sys/cpu.lo.dep: $(extra_go_files_golang_org_x_sys_cpu) +extra_go_files_internal_buildcfg = buildcfg.go +cmd/internal/buildcfg.lo.dep: $(extra_go_files_internal_buildcfg) + extra_go_files_internal_goroot = zstdpkglist.go internal/goroot.lo.dep: $(extra_go_files_internal_goroot) diff --git a/libgo/VERSION b/libgo/VERSION index e336ec201bf..904eb73bd5c 100644 --- a/libgo/VERSION +++ b/libgo/VERSION @@ -1 +1 @@ -go1.16.5 +go1.17rc2 diff --git a/libgo/check-packages.txt b/libgo/check-packages.txt index 1e549cae4b0..dd8990f10e2 100644 --- a/libgo/check-packages.txt +++ b/libgo/check-packages.txt @@ -43,7 +43,10 @@ crypto/des crypto/dsa crypto/ecdsa crypto/ed25519 +crypto/ed25519/internal/edwards25519 +crypto/ed25519/internal/edwards25519/field crypto/elliptic +crypto/elliptic/internal/fiat crypto/hmac crypto/internal/subtle crypto/md5 @@ -110,6 +113,7 @@ index/suffixarray internal/cpu internal/execabs internal/fmtsort +internal/itoa internal/poll internal/profile internal/reflectlite @@ -139,6 +143,7 @@ net/http/httptest net/http/httptrace net/http/httputil net/http/internal +net/http/internal/ascii net/http/pprof net/internal/socktest net/mail @@ -157,6 +162,7 @@ reflect regexp regexp/syntax runtime +runtime/cgo runtime/debug runtime/internal/atomic runtime/internal/math diff --git a/libgo/configure.ac b/libgo/configure.ac index ebab9d9de3e..1f4f32dae2b 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=19:0:0 +libtool_VERSION=20:0:0 AC_SUBST(libtool_VERSION) AM_ENABLE_MULTILIB(, ..) diff --git a/libgo/go/runtime/os_gccgo.go b/libgo/go/runtime/os_gccgo.go index 65d7aef165a..da12c35d26c 100644 --- a/libgo/go/runtime/os_gccgo.go +++ b/libgo/go/runtime/os_gccgo.go @@ -97,3 +97,11 @@ func setNonblock(fd int32) { fcntlUintptr(uintptr(fd), _F_SETFL, flags|_O_NONBLOCK) } } + +// For gccgo this is in the C code. +func osyield() + +//go:nosplit +func osyield_no_g() { + osyield() +} diff --git a/libgo/go/runtime/testdata/testprogcgo/traceback_gccgo.go b/libgo/go/runtime/testdata/testprogcgo/traceback_gccgo.go index 83357fdd5d9..2d07c2db8a4 100644 --- a/libgo/go/runtime/testdata/testprogcgo/traceback_gccgo.go +++ b/libgo/go/runtime/testdata/testprogcgo/traceback_gccgo.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build gccgo // +build gccgo package main diff --git a/libgo/gotool-packages.txt b/libgo/gotool-packages.txt index f28ad6977aa..15c928ff7fb 100644 --- a/libgo/gotool-packages.txt +++ b/libgo/gotool-packages.txt @@ -27,7 +27,6 @@ cmd/go/internal/modinfo cmd/go/internal/modload cmd/go/internal/mvs cmd/go/internal/par -cmd/go/internal/renameio cmd/go/internal/robustio cmd/go/internal/run cmd/go/internal/search @@ -86,6 +85,7 @@ golang.org/x/tools/go/analysis/passes/nilfunc 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/sigchanyzer golang.org/x/tools/go/analysis/passes/stdmethods golang.org/x/tools/go/analysis/passes/stringintconv golang.org/x/tools/go/analysis/passes/structtag diff --git a/libgo/libgo-packages.txt b/libgo/libgo-packages.txt index 707def56de7..4fc8c843f02 100644 --- a/libgo/libgo-packages.txt +++ b/libgo/libgo-packages.txt @@ -19,7 +19,9 @@ crypto/dsa crypto/ecdsa crypto/ed25519 crypto/ed25519/internal/edwards25519 +crypto/ed25519/internal/edwards25519/field crypto/elliptic +crypto/elliptic/internal/fiat crypto/hmac crypto/internal/randutil crypto/internal/subtle @@ -69,6 +71,7 @@ go/importer go/internal/gccgoimporter go/internal/gcimporter go/internal/srcimporter +go/internal/typeparams go/parser go/printer go/scanner @@ -110,13 +113,16 @@ image/internal/imageutil image/jpeg image/png index/suffixarray +internal/buildcfg internal/bytealg internal/cfg internal/cpu internal/execabs internal/fmtsort +internal/goexperiment internal/goroot internal/goversion +internal/itoa internal/lazyregexp internal/lazytemplate internal/nettrace @@ -157,6 +163,8 @@ net/http/httptest net/http/httptrace net/http/httputil net/http/internal +net/http/internal/ascii +net/http/internal/testcert net/http/pprof net/internal/socktest net/mail @@ -173,9 +181,12 @@ os/user path path/filepath reflect +reflect/internal/example1 +reflect/internal/example2 regexp regexp/syntax runtime +runtime/cgo runtime/debug runtime/internal/atomic runtime/internal/math diff --git a/libgo/match.sh b/libgo/match.sh index cc15a12c674..bf4f141e04a 100755 --- a/libgo/match.sh +++ b/libgo/match.sh @@ -119,6 +119,11 @@ for f in $gofiles; do 386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | ia64 | m68k | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | nios2 | ppc | ppc64 | ppc64le | riscv | riscv64 | s390 | s390x | sh | shbe | sparc | sparc64 | wasm) tag1=nonmatchingtag ;; + *) + # File name like x_amd64_random.go, where tag1=random. + # Don't match based on tag2. + tag2= + ;; esac case "$tag2" in @@ -151,18 +156,18 @@ for f in $gofiles; do fi match=false ;; - $goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | go1.[0-9] | go1.[0-9][0-9]) + $goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | "goexperiment.fieldtrack" | go1.[0-9] | go1.[0-9][0-9]) match=true ;; - "!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!"go1.[0-9] | "!"go1.1[0-6]) + "!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!goexperiment.fieldtrack" | "!"go1.[0-9] | "!"go1.1[0-7]) ;; *,*) cmatch=true for ctag in `echo $tag | sed -e 's/,/ /g'`; do case $ctag in - $goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | go1.[0-9] | go1.[0-9][0-9]) + $goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | "goexperiment.fieldtrack" | go1.[0-9] | go1.[0-9][0-9]) ;; - "!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!"go1.[0-9] | "!"go1.1[0-6]) + "!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!goexperiment.fieldtrack" | "!"go1.[0-9] | "!"go1.1[0-7]) cmatch=false ;; "!"*) diff --git a/libgo/runtime/go-now.c b/libgo/runtime/go-now.c index 1c02e5220e4..e1dcd180860 100644 --- a/libgo/runtime/go-now.c +++ b/libgo/runtime/go-now.c @@ -8,7 +8,7 @@ #include "runtime.h" -// Return current time. This is the implementation of time.walltime1(). +// Return current time. This is the implementation of runtime.walltime(). struct walltime_ret { @@ -16,7 +16,7 @@ struct walltime_ret int32_t nsec; }; -struct walltime_ret now(void) __asm__ (GOSYM_PREFIX "runtime.walltime1") +struct walltime_ret now(void) __asm__ (GOSYM_PREFIX "runtime.walltime") __attribute__ ((no_split_stack)); struct walltime_ret diff --git a/libgo/runtime/runtime_c.c b/libgo/runtime/runtime_c.c index bc920a5d406..f92bdd43bc9 100644 --- a/libgo/runtime/runtime_c.c +++ b/libgo/runtime/runtime_c.c @@ -199,10 +199,13 @@ getEnd() uintptr getText(void) __asm__ (GOSYM_PREFIX "runtime.getText"); +extern void main_main(void*) + __asm__(GOSYM_PREFIX "main.main"); + uintptr getText(void) { - return (uintptr)(const void *)(getText); + return (uintptr)(const void *)(main_main); } // Return the end of the text segment, assumed to come after the @@ -224,6 +227,24 @@ getEtext(void) return (uintptr)(p); } +// Return the start of the BSS section. + +uintptr getBSS(void) + __asm__ (GOSYM_PREFIX "runtime.getBSS"); + +uintptr +getBSS(void) +{ + const void *p; + + p = __edata; + if (p == NULL) + p = _edata; + if (p == NULL) + p = __bss_start; + return (uintptr)(p); +} + // CPU-specific initialization. // Fetch CPUID info on x86. diff --git a/libgo/runtime/stack.c b/libgo/runtime/stack.c index c78f0c4595b..0c0c30e46ac 100644 --- a/libgo/runtime/stack.c +++ b/libgo/runtime/stack.c @@ -23,7 +23,7 @@ bool runtime_usestackmaps; #pragma GCC optimize ("-fno-optimize-sibling-calls") extern void scanstackblock(uintptr addr, uintptr size, void *gcw) - __asm__("runtime.scanstackblock"); + __asm__(GOSYM_PREFIX "runtime.scanstackblock"); static bool doscanstack1(G*, void*) __attribute__ ((noinline)); @@ -125,3 +125,66 @@ static bool doscanstack1(G *gp, void *gcw) { #endif return true; } + +extern bool onCurrentStack(uintptr p) + __asm__(GOSYM_PREFIX "runtime.onCurrentStack"); + +bool onCurrentStack(uintptr p) +{ +#ifdef USING_SPLIT_STACK + + void* sp; + size_t spsize; + void* next_segment; + void* next_sp; + void* initial_sp; + + sp = __splitstack_find(nil, nil, &spsize, &next_segment, &next_sp, + &initial_sp); + while (sp != nil) { + if (p >= (uintptr)(sp) && p < (uintptr)(sp) + spsize) { + return true; + } + sp = __splitstack_find(next_segment, next_sp, &spsize, + &next_segment, &next_sp, &initial_sp); + } + return false; + +#else + + G* gp; + byte* bottom; + byte* top; + byte* temp; + byte* nextsp2; + byte* initialsp2; + + gp = runtime_g(); + bottom = (byte*)(&p); + top = (byte*)(void*)(gp->gcinitialsp) + gp->gcstacksize; + if ((uintptr)(top) < (uintptr)(bottom)) { + temp = top; + top = bottom; + bottom = temp; + } + if (p >= (uintptr)(bottom) && p < (uintptr)(top)) { + return true; + } + + nextsp2 = secondary_stack_pointer(); + if (nextsp2 != nil) { + initialsp2 = (byte*)(void*)(gp->gcinitialsp2); + if (uintptr(initialsp2) < uintptr(nextsp2)) { + temp = initialsp2; + initialsp2 = nextsp2; + nextsp2 = temp; + } + if (p >= (uintptr)(nextsp2) && p < (uintptr)(initialsp2)) { + return true; + } + } + + return false; + +#endif +} diff --git a/libgo/testsuite/gotest b/libgo/testsuite/gotest index 9eda2ccc70d..e0dd16610db 100755 --- a/libgo/testsuite/gotest +++ b/libgo/testsuite/gotest @@ -311,6 +311,11 @@ x) 386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | ia64 | m68k | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | nios2 | ppc | ppc64 | ppc64le | riscv | riscv64 | s390 | s390x | sh | shbe | sparc | sparc64 | wasm) tag1=nonmatchingtag ;; + *) + # File name like x_amd64_random.go, where tag1=random. + # Don't match based on tag2. + tag2= + ;; esac case "$tag2" in @@ -342,18 +347,18 @@ x) fi match=false ;; - $goos | $goarch | cgo | gccgo | go1.[0-9] | go1.[0-9][0-9]) + $goos | $goarch | cgo | gccgo | goexperiment.fieldtrack | go1.[0-9] | go1.[0-9][0-9]) match=true ;; - "!"$goos | "!"$goarch | "!cgo" | "!gccgo" | "!"go1.[0-9] | "!"go1.1[0-6]) + "!"$goos | "!"$goarch | "!cgo" | "!gccgo" | "!goexperiment.fieldtrack" | "!"go1.[0-9] | "!"go1.1[0-7]) ;; *,*) cmatch=true for ctag in `echo $tag | sed -e 's/,/ /g'`; do case $ctag in - $goos | $goarch | cgo | gccgo | go1.[0-9] | go1.[0-9][0-9]) + $goos | $goarch | cgo | gccgo | goexperiment.fieldtrack | go1.[0-9] | go1.[0-9][0-9]) ;; - "!"$goos | "!"$goarch | "!cgo" | "!gccgo" | "!"go1.[0-9] | "!"go1.1[0-6]) + "!"$goos | "!"$goarch | "!cgo" | "!gccgo" | "!goexperiment.fieldtrack" | "!"go1.[0-9] | "!"go1.1[0-7]) cmatch=false ;; "!"*)