Index: llgo/trunk/CMakeLists.txt =================================================================== --- llgo/trunk/CMakeLists.txt +++ llgo/trunk/CMakeLists.txt @@ -80,6 +80,7 @@ COMMAND ${CMAKE_BINARY_DIR}/bin/llgo -static-libgo -o ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX} ${LLGO_GO_SOURCES} + ${CMAKE_CURRENT_BINARY_DIR}/libgo/zstdpkglist.go DEPENDS llgo libgo ${LLGO_GO_SOURCES} COMMENT "Building Go executable llgo-go" VERBATIM) Index: llgo/trunk/irgen/version.go =================================================================== --- llgo/trunk/irgen/version.go +++ llgo/trunk/irgen/version.go @@ -14,7 +14,7 @@ package irgen const ( - goVersion = "go1.4" + goVersion = "go1.4.2" ) // GoVersion returns the version of Go that we are targeting. Index: llgo/trunk/third_party/gofrontend/libgo/MERGE =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/MERGE +++ llgo/trunk/third_party/gofrontend/libgo/MERGE @@ -1,4 +1,4 @@ -14854533dcc7 +883bc6ed0ea815293fe6309d66f967ea60630e87 -The first line of this file holds the Mercurial revision number of the +The first line of this file holds the git revision number of the last merge done from the master library sources. Index: llgo/trunk/third_party/gofrontend/libgo/Makefile.am =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/Makefile.am +++ llgo/trunk/third_party/gofrontend/libgo/Makefile.am @@ -971,13 +971,27 @@ rm -f version.go.tmp echo "package runtime" > version.go.tmp echo 'const defaultGoroot = "$(prefix)"' >> version.go.tmp - echo 'const theVersion = "'`$(GOC) --version | sed 1q`'"' >> version.go.tmp + echo 'const theVersion = "'`cat $(srcdir)/VERSION | sed 1q`' '`$(GOC) --version | sed 1q`'"' >> version.go.tmp echo 'const theGoarch = "'$(GOARCH)'"' >> version.go.tmp echo 'const theGoos = "'$(GOOS)'"' >> version.go.tmp echo 'const theGccgoToolDir = "$(libexecsubdir)"' >> version.go.tmp $(SHELL) $(srcdir)/mvifdiff.sh version.go.tmp version.go $(STAMP) $@ +noinst_DATA = zstdpkglist.go + +# Generate the list of go std packages that were included in libgo +zstdpkglist.go: s-zstdpkglist; @true +s-zstdpkglist: Makefile + rm -f zstdpkglist.go.tmp + echo 'package main' > 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/\.lo /\": true,\n/g' | sed 's/\.lo/\": true,/' | sed 's/-go//' | grep -v _c | sed 's/^/\t\"/' | sort | uniq >> zstdpkglist.go.tmp + echo '}' >> zstdpkglist.go.tmp + $(SHELL) $(srcdir)/mvifdiff.sh zstdpkglist.go.tmp zstdpkglist.go + $(STAMP) $@ + go_sort_files = \ go/sort/search.go \ go/sort/sort.go Index: llgo/trunk/third_party/gofrontend/libgo/Makefile.in =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/Makefile.in +++ llgo/trunk/third_party/gofrontend/libgo/Makefile.in @@ -269,23 +269,24 @@ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive -DATA = $(toolexeclibgo_DATA) $(toolexeclibgoarchive_DATA) \ - $(toolexeclibgocompress_DATA) $(toolexeclibgocontainer_DATA) \ - $(toolexeclibgocrypto_DATA) $(toolexeclibgocryptox509_DATA) \ - $(toolexeclibgodatabase_DATA) $(toolexeclibgodatabasesql_DATA) \ - $(toolexeclibgodebug_DATA) $(toolexeclibgoencoding_DATA) \ - $(toolexeclibgoexp_DATA) $(toolexeclibgogo_DATA) \ - $(toolexeclibgohash_DATA) $(toolexeclibgohtml_DATA) \ - $(toolexeclibgoimage_DATA) $(toolexeclibgoimagecolor_DATA) \ - $(toolexeclibgoindex_DATA) $(toolexeclibgoio_DATA) \ - $(toolexeclibgolog_DATA) $(toolexeclibgomath_DATA) \ - $(toolexeclibgomime_DATA) $(toolexeclibgonet_DATA) \ - $(toolexeclibgonethttp_DATA) $(toolexeclibgonetrpc_DATA) \ - $(toolexeclibgoold_DATA) $(toolexeclibgoos_DATA) \ - $(toolexeclibgopath_DATA) $(toolexeclibgoregexp_DATA) \ - $(toolexeclibgoruntime_DATA) $(toolexeclibgosync_DATA) \ - $(toolexeclibgotesting_DATA) $(toolexeclibgotext_DATA) \ - $(toolexeclibgotexttemplate_DATA) $(toolexeclibgounicode_DATA) +DATA = $(noinst_DATA) $(toolexeclibgo_DATA) \ + $(toolexeclibgoarchive_DATA) $(toolexeclibgocompress_DATA) \ + $(toolexeclibgocontainer_DATA) $(toolexeclibgocrypto_DATA) \ + $(toolexeclibgocryptox509_DATA) $(toolexeclibgodatabase_DATA) \ + $(toolexeclibgodatabasesql_DATA) $(toolexeclibgodebug_DATA) \ + $(toolexeclibgoencoding_DATA) $(toolexeclibgoexp_DATA) \ + $(toolexeclibgogo_DATA) $(toolexeclibgohash_DATA) \ + $(toolexeclibgohtml_DATA) $(toolexeclibgoimage_DATA) \ + $(toolexeclibgoimagecolor_DATA) $(toolexeclibgoindex_DATA) \ + $(toolexeclibgoio_DATA) $(toolexeclibgolog_DATA) \ + $(toolexeclibgomath_DATA) $(toolexeclibgomime_DATA) \ + $(toolexeclibgonet_DATA) $(toolexeclibgonethttp_DATA) \ + $(toolexeclibgonetrpc_DATA) $(toolexeclibgoold_DATA) \ + $(toolexeclibgoos_DATA) $(toolexeclibgopath_DATA) \ + $(toolexeclibgoregexp_DATA) $(toolexeclibgoruntime_DATA) \ + $(toolexeclibgosync_DATA) $(toolexeclibgotesting_DATA) \ + $(toolexeclibgotext_DATA) $(toolexeclibgotexttemplate_DATA) \ + $(toolexeclibgounicode_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ @@ -1154,6 +1155,7 @@ go/runtime/softfloat64.go \ version.go +noinst_DATA = zstdpkglist.go go_sort_files = \ go/sort/search.go \ go/sort/sort.go @@ -4385,13 +4387,25 @@ rm -f version.go.tmp echo "package runtime" > version.go.tmp echo 'const defaultGoroot = "$(prefix)"' >> version.go.tmp - echo 'const theVersion = "'`$(GOC) --version | sed 1q`'"' >> version.go.tmp + echo 'const theVersion = "'`cat $(srcdir)/VERSION | sed 1q`' '`$(GOC) --version | sed 1q`'"' >> version.go.tmp echo 'const theGoarch = "'$(GOARCH)'"' >> version.go.tmp echo 'const theGoos = "'$(GOOS)'"' >> version.go.tmp echo 'const theGccgoToolDir = "$(libexecsubdir)"' >> version.go.tmp $(SHELL) $(srcdir)/mvifdiff.sh version.go.tmp version.go $(STAMP) $@ +# Generate the list of go std packages that were included in libgo +zstdpkglist.go: s-zstdpkglist; @true +s-zstdpkglist: Makefile + rm -f zstdpkglist.go.tmp + echo 'package main' > 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/\.lo /\": true,\n/g' | sed 's/\.lo/\": true,/' | sed 's/-go//' | grep -v _c | sed 's/^/\t\"/' | sort | uniq >> zstdpkglist.go.tmp + echo '}' >> zstdpkglist.go.tmp + $(SHELL) $(srcdir)/mvifdiff.sh zstdpkglist.go.tmp zstdpkglist.go + $(STAMP) $@ + libcalls.go: s-libcalls; @true s-libcalls: libcalls-list go/syscall/mksyscall.awk $(go_base_syscall_files) rm -f libcalls.go.tmp Index: llgo/trunk/third_party/gofrontend/libgo/README =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/README +++ llgo/trunk/third_party/gofrontend/libgo/README @@ -3,25 +3,24 @@ This is the runtime support library for the Go programming language. This library is intended for use with the Go frontend. -The library has only been tested on GNU/Linux using glibc. It should -not be difficult to port to other operating systems. - -The library has only been tested on x86/x86_64 systems. It should not -be difficult to port to other architectures. +This library should not be stripped when it is installed. Go code +relies on being able to look up file/line information, which comes +from the debugging info using the libbacktrace library. + +The library has only been tested on GNU/Linux using glibc, and on +Solaris. It should not be difficult to port to other operating +systems. Directories: go - A copy of the Go library from http://golang.org/, with a few - changes for gccgo. Notably, the reflection interface is different. + A copy of the Go library from http://golang.org/, with several + changes for gccgo. runtime Runtime functions, written in C, which are called directly by the compiler or by the library. -syscalls - System call support. - Contributing ============ Index: llgo/trunk/third_party/gofrontend/libgo/VERSION =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/VERSION +++ llgo/trunk/third_party/gofrontend/libgo/VERSION @@ -0,0 +1 @@ +go1.4.2 \ No newline at end of file Index: llgo/trunk/third_party/gofrontend/libgo/go/cmd/cgo/main.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/cmd/cgo/main.go +++ llgo/trunk/third_party/gofrontend/libgo/go/cmd/cgo/main.go @@ -130,21 +130,43 @@ } var ptrSizeMap = map[string]int64{ - "386": 4, - "amd64": 8, - "arm": 4, - "ppc64": 8, + "386": 4, + "alpha": 8, + "amd64": 8, + "arm": 4, + "arm64": 8, + "m68k": 4, + "mipso32": 4, + "mipsn32": 4, + "mipso64": 8, + "mipsn64": 8, + "ppc": 4, + "ppc64": 8, "ppc64le": 8, - "s390x": 8, + "s390": 4, + "s390x": 8, + "sparc": 4, + "sparc64": 8, } var intSizeMap = map[string]int64{ - "386": 4, - "amd64": 8, - "arm": 4, - "ppc64": 8, + "386": 4, + "alpha": 8, + "amd64": 8, + "arm": 4, + "arm64": 8, + "m68k": 4, + "mipso32": 4, + "mipsn32": 4, + "mipso64": 8, + "mipsn64": 8, + "ppc": 4, + "ppc64": 8, "ppc64le": 8, - "s390x": 8, + "s390": 4, + "s390x": 8, + "sparc": 4, + "sparc64": 8, } var cPrefix string Index: llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/build.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/build.go +++ llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/build.go @@ -132,7 +132,8 @@ var buildGccgoflags []string // -gccgoflags flag var buildRace bool // -race flag -var reqPkgSrc bool // req src for Imports +// Require the source for go std packages +var reqStdPkgSrc bool var buildContext = build.Default var buildToolchain toolchain = noToolchain{} @@ -187,9 +188,9 @@ cmd.Flag.BoolVar(&buildRace, "race", false, "") switch build.Default.Compiler { case "gc": - reqPkgSrc = true + reqStdPkgSrc = true case "gccgo": - reqPkgSrc = false + reqStdPkgSrc = false } } @@ -579,7 +580,7 @@ // are writing is not the cgo we need to use. if goos == runtime.GOOS && goarch == runtime.GOARCH && !buildRace { - if reqPkgSrc { + if reqStdPkgSrc { if len(p.CgoFiles) > 0 || p.Standard && p.ImportPath == "runtime/cgo" { var stk importStack p1 := loadPackage("cmd/cgo", &stk) @@ -1920,6 +1921,7 @@ // and all LDFLAGS from cgo dependencies. apackagesSeen := make(map[*Package]bool) afiles := []string{} + xfiles := []string{} ldflags := b.gccArchArgs() cgoldflags := []string{} usesCgo := false @@ -1935,7 +1937,12 @@ if !a.p.Standard { if a.p != nil && !apackagesSeen[a.p] { apackagesSeen[a.p] = true - if a.p.fake { + if a.p.fake && a.p.external { + // external _tests, if present must come before + // internal _tests. Store these on a seperate list + // and place them at the head after this loop. + xfiles = append(xfiles, a.target) + } else if a.p.fake { // move _test files to the top of the link order afiles = append([]string{a.target}, afiles...) } else { @@ -1944,6 +1951,7 @@ } } } + afiles = append(xfiles, afiles...) for _, a := range allactions { if a.p != nil { Index: llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/doc.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/doc.go +++ llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/doc.go @@ -308,6 +308,7 @@ Go generate accepts one specific flag: -run="" + TODO: This flag is unimplemented. if non-empty, specifies a regular expression to select directives whose command matches the expression. Index: llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/generate.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/generate.go +++ llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/generate.go @@ -106,6 +106,7 @@ Go generate accepts one specific flag: -run="" + TODO: This flag is unimplemented. if non-empty, specifies a regular expression to select directives whose command matches the expression. @@ -255,6 +256,10 @@ // Parse line, obeying quoted strings. var words []string line = line[len("//go:generate ") : len(line)-1] // Drop preamble and final newline. + // There may still be a carriage return. + if len(line) > 0 && line[len(line)-1] == '\r' { + line = line[:len(line)-1] + } // One (possibly quoted) word per iteration. Words: for { Index: llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/generate_test.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/generate_test.go +++ llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/generate_test.go @@ -40,9 +40,15 @@ } g.setShorthand([]string{"-command", "yacc", "go", "tool", "yacc"}) for _, test := range splitTests { + // First with newlines. got := g.split("//go:generate " + test.in + "\n") if !reflect.DeepEqual(got, test.out) { t.Errorf("split(%q): got %q expected %q", test.in, got, test.out) } + // Then with CRLFs, thank you Windows. + got = g.split("//go:generate " + test.in + "\r\n") + if !reflect.DeepEqual(got, test.out) { + t.Errorf("split(%q): got %q expected %q", test.in, got, test.out) + } } } Index: llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/get.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/get.go +++ llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/get.go @@ -290,7 +290,7 @@ } } if remote != repo { - return fmt.Errorf("%s is from %s, should be from %s", dir, remote, repo) + return fmt.Errorf("%s is a custom import path for %s, but %s is checked out from %s", rr.root, repo, dir, remote) } } } Index: llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/pkg.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/pkg.go +++ llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/pkg.go @@ -83,6 +83,7 @@ allgofiles []string // gofiles + IgnoredGoFiles, absolute paths target string // installed file for this package (may be executable) fake bool // synthesized package + external bool // synthesized external test package forceBuild bool // this package must be rebuilt forceLibrary bool // this package is a library (even if named "main") cmdline bool // defined by files listed on command line @@ -112,7 +113,11 @@ p.ConflictDir = pp.ConflictDir // TODO? Target p.Goroot = pp.Goroot - p.Standard = p.Goroot && p.ImportPath != "" && !strings.Contains(p.ImportPath, ".") + if buildContext.Compiler == "gccgo" { + p.Standard = stdpkg[p.ImportPath] + } else { + p.Standard = p.Goroot && p.ImportPath != "" && !strings.Contains(p.ImportPath, ".") + } p.GoFiles = pp.GoFiles p.CgoFiles = pp.CgoFiles p.IgnoredGoFiles = pp.IgnoredGoFiles @@ -582,7 +587,7 @@ continue } p1 := loadImport(path, p.Dir, stk, p.build.ImportPos[path]) - if !reqPkgSrc && p1.Root == "" { + if !reqStdPkgSrc && p1.Standard { continue } if p1.local { Index: llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/test.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/test.go +++ llgo/trunk/third_party/gofrontend/libgo/go/cmd/go/test.go @@ -384,17 +384,18 @@ delete(deps, "unsafe") all := []string{} - if reqPkgSrc { - for path := range deps { - if !build.IsLocalImport(path) { - all = append(all, path) - } + for path := range deps { + if !build.IsLocalImport(path) { + all = append(all, path) } } sort.Strings(all) a := &action{} for _, p := range packagesForBuild(all) { + if !reqStdPkgSrc && p.Standard { + continue + } a.deps = append(a.deps, b.action(modeInstall, modeInstall, p)) } b.do(a) @@ -563,7 +564,7 @@ stk.push(p.ImportPath + " (test)") for _, path := range p.TestImports { p1 := loadImport(path, p.Dir, &stk, p.build.TestImportPos[path]) - if !reqPkgSrc && p1.Root == "" { + if !reqStdPkgSrc && p1.Standard { continue } if p1.Error != nil { @@ -591,7 +592,7 @@ continue } p1 := loadImport(path, p.Dir, &stk, p.build.XTestImportPos[path]) - if !reqPkgSrc && p1.Root == "" { + if !reqStdPkgSrc && p1.Standard { continue } if p1.Error != nil { @@ -691,10 +692,11 @@ build: &build.Package{ ImportPos: p.build.XTestImportPos, }, - imports: ximports, - pkgdir: testDir, - fake: true, - Stale: true, + imports: ximports, + pkgdir: testDir, + fake: true, + external: true, + Stale: true, } if pxtestNeedsPtest { pxtest.imports = append(pxtest.imports, ptest) @@ -722,7 +724,7 @@ pmain.imports = append(pmain.imports, ptest) } else { p1 := loadImport(dep, "", &stk, nil) - if !reqPkgSrc && p1.Root == "" { + if !reqStdPkgSrc && p1.Standard { continue } if p1.Error != nil { Index: llgo/trunk/third_party/gofrontend/libgo/go/debug/elf/file.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/debug/elf/file.go +++ llgo/trunk/third_party/gofrontend/libgo/go/debug/elf/file.go @@ -532,6 +532,9 @@ if f.Class == ELFCLASS64 && f.Machine == EM_AARCH64 { return f.applyRelocationsARM64(dst, rels) } + if f.Class == ELFCLASS32 && f.Machine == EM_PPC { + return f.applyRelocationsPPC(dst, rels) + } if f.Class == ELFCLASS64 && f.Machine == EM_PPC64 { return f.applyRelocationsPPC64(dst, rels) } @@ -677,6 +680,46 @@ return nil } +func (f *File) applyRelocationsPPC(dst []byte, rels []byte) error { + // 12 is the size of Rela32. + if len(rels)%12 != 0 { + return errors.New("length of relocation section is not a multiple of 12") + } + + symbols, _, err := f.getSymbols(SHT_SYMTAB) + if err != nil { + return err + } + + b := bytes.NewReader(rels) + var rela Rela32 + + for b.Len() > 0 { + binary.Read(b, f.ByteOrder, &rela) + symNo := rela.Info >> 8 + t := R_PPC(rela.Info & 0xff) + + if symNo == 0 || symNo > uint32(len(symbols)) { + continue + } + sym := &symbols[symNo-1] + if SymType(sym.Info&0xf) != STT_SECTION { + // We don't handle non-section relocations for now. + continue + } + + switch t { + case R_PPC_ADDR32: + if rela.Off+4 >= uint32(len(dst)) || rela.Addend < 0 { + continue + } + f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], uint32(rela.Addend)) + } + } + + return nil +} + func (f *File) applyRelocationsPPC64(dst []byte, rels []byte) error { // 24 is the size of Rela64. if len(rels)%24 != 0 { @@ -785,7 +828,7 @@ // If there's a relocation table for .debug_info, we have to process it // now otherwise the data in .debug_info is invalid for x86-64 objects. rela := f.Section(".rela.debug_info") - if rela != nil && rela.Type == SHT_RELA && (f.Machine == EM_X86_64 || f.Machine == EM_AARCH64 || f.Machine == EM_PPC64 || f.Machine == EM_S390) { + if rela != nil && rela.Type == SHT_RELA && (f.Machine == EM_X86_64 || f.Machine == EM_AARCH64 || f.Machine == EM_PPC || f.Machine == EM_PPC64 || f.Machine == EM_S390) { data, err := rela.Data() if err != nil { return nil, err Index: llgo/trunk/third_party/gofrontend/libgo/go/debug/elf/file_test.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/debug/elf/file_test.go +++ llgo/trunk/third_party/gofrontend/libgo/go/debug/elf/file_test.go @@ -261,6 +261,12 @@ }, }, { + "testdata/go-relocation-test-gcc5-ppc.obj", + []relocationTestEntry{ + {0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{dwarf.Field{Attr: dwarf.AttrProducer, Val: "GNU C11 5.0.0 20150116 (experimental) -Asystem=linux -Asystem=unix -Asystem=posix -g"}, dwarf.Field{Attr: dwarf.AttrLanguage, Val: int64(12)}, dwarf.Field{Attr: dwarf.AttrName, Val: "go-relocation-test-gcc5-ppc.c"}, dwarf.Field{Attr: dwarf.AttrCompDir, Val: "/tmp"}, dwarf.Field{Attr: dwarf.AttrLowpc, Val: uint64(0x0)}, dwarf.Field{Attr: dwarf.AttrHighpc, Val: int64(0x44)}, dwarf.Field{Attr: dwarf.AttrStmtList, Val: int64(0)}}}}, + }, + }, + { "testdata/go-relocation-test-gcc482-ppc64le.obj", []relocationTestEntry{ {0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{dwarf.Field{Attr: dwarf.AttrProducer, Val: "GNU C 4.8.2 -Asystem=linux -Asystem=unix -Asystem=posix -msecure-plt -mtune=power8 -mcpu=power7 -gdwarf-2 -fstack-protector"}, dwarf.Field{Attr: dwarf.AttrLanguage, Val: int64(1)}, dwarf.Field{Attr: dwarf.AttrName, Val: "go-relocation-test-gcc482-ppc64le.c"}, dwarf.Field{Attr: dwarf.AttrCompDir, Val: "/tmp"}, dwarf.Field{Attr: dwarf.AttrLowpc, Val: uint64(0x0)}, dwarf.Field{Attr: dwarf.AttrHighpc, Val: uint64(0x24)}, dwarf.Field{Attr: dwarf.AttrStmtList, Val: int64(0)}}}}, Index: llgo/trunk/third_party/gofrontend/libgo/go/go/build/build.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/build/build.go +++ llgo/trunk/third_party/gofrontend/libgo/go/go/build/build.go @@ -268,6 +268,8 @@ "linux/alpha": true, "linux/amd64": true, "linux/arm": true, + "linux/arm64": true, + "linux/ppc": true, "linux/ppc64": true, "linux/ppc64le": true, "linux/s390": true, Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/builtins.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/builtins.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/builtins.src @@ -1,302 +0,0 @@ -// Copyright 2012 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. - -// builtin calls - -package builtins - -import "unsafe" - -func _append() { - var x int - var s []byte - _0 := append /* ERROR "argument" */ () - _1 := append("foo" /* ERROR "not a typed slice" */) - _2 := append(nil /* ERROR "not a typed slice" */, s) - _3 := append(x /* ERROR "not a typed slice" */, s) - _4 := append(s) - append /* ERROR "not used" */ (s) -} - -func _cap() { - var a [10]bool - var p *[20]int - var s []int - var c chan string - _0 := cap /* ERROR "argument" */ () - _1 := cap /* ERROR "argument" */ (1, 2) - _2 := cap(42 /* ERROR "invalid" */) - const _3 = cap(a) - assert(_3 == 10) - const _4 = cap(p) - assert(_4 == 20) - _5 := cap(c) - cap /* ERROR "not used" */ (c) -} - -func _close() { - var c chan int - var r <-chan int - close /* ERROR "argument" */ () - close /* ERROR "argument" */ (1, 2) - close(42 /* ERROR "not a channel" */) - close(r /* ERROR "receive-only channel" */) - close(c) -} - -func _complex() { - var i32 int32 - var f32 float32 - var f64 float64 - var c64 complex64 - _ = complex /* ERROR "argument" */ () - _ = complex /* ERROR "argument" */ (1) - _ = complex(true /* ERROR "invalid argument" */ , 0) - _ = complex(i32 /* ERROR "invalid argument" */ , 0) - _ = complex("foo" /* ERROR "invalid argument" */ , 0) - _ = complex(c64 /* ERROR "invalid argument" */ , 0) - _ = complex(0, true /* ERROR "invalid argument" */ ) - _ = complex(0, i32 /* ERROR "invalid argument" */ ) - _ = complex(0, "foo" /* ERROR "invalid argument" */ ) - _ = complex(0, c64 /* ERROR "invalid argument" */ ) - _ = complex(f32, f32) - _ = complex(f32, 1) - _ = complex(f32, 1.0) - _ = complex(f32, 'a') - _ = complex(f64, f64) - _ = complex(f64, 1) - _ = complex(f64, 1.0) - _ = complex(f64, 'a') - _ = complex(f32 /* ERROR "mismatched types" */, f64) - _ = complex(f64 /* ERROR "mismatched types" */, f32) - _ = complex(1, 1) - _ = complex(1, 1.1) - _ = complex(1, 'a') - complex /* ERROR "not used" */ (1, 2) -} - -func _copy() { - copy /* ERROR "not enough arguments" */ () - copy /* ERROR "not enough arguments" */ ("foo") - copy([ /* ERROR "copy expects slice arguments" */ ...]int{}, []int{}) - copy([ /* ERROR "copy expects slice arguments" */ ]int{}, [...]int{}) - copy([ /* ERROR "different element types" */ ]int8{}, "foo") - - // spec examples - var a = [...]int{0, 1, 2, 3, 4, 5, 6, 7} - var s = make([]int, 6) - var b = make([]byte, 5) - n1 := copy(s, a[0:]) // n1 == 6, s == []int{0, 1, 2, 3, 4, 5} - n2 := copy(s, s[2:]) // n2 == 4, s == []int{2, 3, 4, 5, 4, 5} - n3 := copy(b, "Hello, World!") // n3 == 5, b == []byte("Hello") -} - -func _delete() { - var m map[string]int - var s string - delete /* ERROR "argument" */ () - delete /* ERROR "argument" */ (1) - delete /* ERROR "argument" */ (1, 2, 3) - delete(m, 0 /* ERROR "not assignable" */) - delete(m, s) -} - -func _imag() { - var f32 float32 - var f64 float64 - var c64 complex64 - var c128 complex128 - _ = imag /* ERROR "argument" */ () - _ = imag /* ERROR "argument" */ (1, 2) - _ = imag(10 /* ERROR "must be a complex number" */) - _ = imag(2.7182818 /* ERROR "must be a complex number" */) - _ = imag("foo" /* ERROR "must be a complex number" */) - const _5 = imag(1 + 2i) - assert(_5 == 2) - f32 = _5 - f64 = _5 - const _6 = imag(0i) - assert(_6 == 0) - f32 = imag(c64) - f64 = imag(c128) - f32 = imag /* ERROR "cannot assign" */ (c128) - f64 = imag /* ERROR "cannot assign" */ (c64) - imag /* ERROR "not used" */ (c64) -} - -func _len() { - const c = "foobar" - var a [10]bool - var p *[20]int - var s []int - var m map[string]complex128 - _ = len /* ERROR "argument" */ () - _ = len /* ERROR "argument" */ (1, 2) - _ = len(42 /* ERROR "invalid" */) - const _3 = len(c) - assert(_3 == 6) - const _4 = len(a) - assert(_4 == 10) - const _5 = len(p) - assert(_5 == 20) - _ = len(m) - len /* ERROR "not used" */ (c) - - // esoteric case - var t string - var hash map[interface{}][]*[10]int - const n = len /* ERROR "not constant" */ (hash[recover()][len(t)]) - assert /* ERROR "failed" */ (n == 10) - var ch <-chan int - const nn = len /* ERROR "not constant" */ (hash[<-ch][len(t)]) - _ = nn // TODO(gri) remove this once unused constants get type-checked -} - -func _make() { - n := 0 - - _ = make /* ERROR "argument" */ () - _ = make(1 /* ERROR "not a type" */) - _ = make(int /* ERROR "cannot make" */) - - // slices - _ = make/* ERROR "arguments" */ ([]int) - _ = make/* ERROR "arguments" */ ([]int, 2, 3, 4) - _ = make([]int, int /* ERROR "not an expression" */) - _ = make([]int, 10, float32 /* ERROR "not an expression" */) - _ = make([]int, "foo" /* ERROR "must be an integer" */) - _ = make([]int, 10, 2.3 /* ERROR "must be an integer" */) - _ = make([]int, 5, 10.0) - _ = make([]int, 0i) - _ = make([]int, - /* ERROR "must not be negative" */ 1, 10) - _ = make([]int, 0, - /* ERROR "must not be negative" */ 1) - _ = make([]int, - /* ERROR "must not be negative" */ 1, - /* ERROR "must not be negative" */ 1) - _ = make([]int, 1<<100, 1<<100) // run-time panic - _ = make([]int, 1 /* ERROR "length and capacity swapped" */ <<100 + 1, 1<<100) - _ = make([]int, 1 /* ERROR "length and capacity swapped" */ <<100, 12345) - - // maps - _ = make /* ERROR "arguments" */ (map[int]string, 10, 20) - _ = make(map[int]float32, int /* ERROR "not an expression" */) - _ = make(map[int]float32, "foo" /* ERROR "must be an integer" */) - _ = make(map[int]float32, 10) - _ = make(map[int]float32, n) - _ = make(map[int]float32, int64(n)) - - // channels - _ = make /* ERROR "arguments" */ (chan int, 10, 20) - _ = make(chan int, int /* ERROR "not an expression" */) - _ = make(chan<- int, "foo" /* ERROR "must be an integer" */) - _ = make(<-chan float64, 10) - _ = make(chan chan int, n) - _ = make(chan string, int64(n)) - - make /* ERROR "not used" */ ([]int, 10) -} - -func _new() { - _ = new /* ERROR "argument" */ () - _ = new /* ERROR "argument" */ (1, 2) - _ = new("foo" /* ERROR "not a type" */) - p := new(float64) - _ = new(struct{ x, y int }) - q := new(*float64) - _ = *p == **q - new /* ERROR "not used" */ (int) -} - -func _real() { - var f32 float32 - var f64 float64 - var c64 complex64 - var c128 complex128 - _ = real /* ERROR "argument" */ () - _ = real /* ERROR "argument" */ (1, 2) - _ = real(10 /* ERROR "must be a complex number" */) - _ = real(2.7182818 /* ERROR "must be a complex number" */) - _ = real("foo" /* ERROR "must be a complex number" */) - const _5 = real(1 + 2i) - assert(_5 == 1) - f32 = _5 - f64 = _5 - const _6 = real(0i) - assert(_6 == 0) - f32 = real(c64) - f64 = real(c128) - f32 = real /* ERROR "cannot assign" */ (c128) - f64 = real /* ERROR "cannot assign" */ (c64) - real /* ERROR "not used" */ (c64) -} - -func _recover() { - _ = recover() - _ = recover /* ERROR "argument" */ (10) - recover() -} - -func _Alignof() { - var x int - _ = unsafe /* ERROR "argument" */ .Alignof() - _ = unsafe /* ERROR "argument" */ .Alignof(1, 2) - _ = unsafe.Alignof(int /* ERROR "not an expression" */) - _ = unsafe.Alignof(42) - _ = unsafe.Alignof(new(struct{})) - unsafe /* ERROR "not used" */ .Alignof(x) -} - -func _Offsetof() { - var x struct{ f int } - _ = unsafe /* ERROR "argument" */ .Offsetof() - _ = unsafe /* ERROR "argument" */ .Offsetof(1, 2) - _ = unsafe.Offsetof(int /* ERROR "not an expression" */) - _ = unsafe.Offsetof(x /* ERROR "not a selector" */) - _ = unsafe.Offsetof(x.f) - _ = unsafe.Offsetof((x.f)) - _ = unsafe.Offsetof((((((((x))).f))))) - unsafe /* ERROR "not used" */ .Offsetof(x.f) -} - -func _Sizeof() { - var x int - _ = unsafe /* ERROR "argument" */ .Sizeof() - _ = unsafe /* ERROR "argument" */ .Sizeof(1, 2) - _ = unsafe.Sizeof(int /* ERROR "not an expression" */) - _ = unsafe.Sizeof(42) - _ = unsafe.Sizeof(new(complex128)) - unsafe /* ERROR "not used" */ .Sizeof(x) - - // basic types have size guarantees - assert(unsafe.Sizeof(byte(0)) == 1) - assert(unsafe.Sizeof(uint8(0)) == 1) - assert(unsafe.Sizeof(int8(0)) == 1) - assert(unsafe.Sizeof(uint16(0)) == 2) - assert(unsafe.Sizeof(int16(0)) == 2) - assert(unsafe.Sizeof(uint32(0)) == 4) - assert(unsafe.Sizeof(int32(0)) == 4) - assert(unsafe.Sizeof(float32(0)) == 4) - assert(unsafe.Sizeof(uint64(0)) == 8) - assert(unsafe.Sizeof(int64(0)) == 8) - assert(unsafe.Sizeof(float64(0)) == 8) - assert(unsafe.Sizeof(complex64(0)) == 8) - assert(unsafe.Sizeof(complex128(0)) == 16) -} - -// self-testing only -func _assert() { - var x int - assert /* ERROR "argument" */ () - assert /* ERROR "argument" */ (1, 2) - assert("foo" /* ERROR "boolean constant" */ ) - assert(x /* ERROR "boolean constant" */) - assert(true) - assert /* ERROR "failed" */ (false) -} - -// self-testing only -func _trace() { - // Uncomment the code below to test trace - will produce console output - // _ = trace /* ERROR "no value" */ () - // _ = trace(1) - // _ = trace(true, 1.2, '\'', "foo", 42i, "foo" <= "bar") -} Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/const0.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/const0.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/const0.src @@ -1,215 +0,0 @@ -// Copyright 2012 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. - -// constant declarations - -package const0 - -// constants declarations must be initialized by constants -var x = 0 -const c0 = x /* ERROR "not constant" */ - -// untyped constants -const ( - // boolean values - ub0 = false - ub1 = true - ub2 = 2 < 1 - ub3 = ui1 == uf1 - ub4 = true /* ERROR "cannot convert" */ == 0 - - // integer values - ui0 = 0 - ui1 = 1 - ui2 = 42 - ui3 = 3141592653589793238462643383279502884197169399375105820974944592307816406286 - ui4 = -10 - - ui5 = ui0 + ui1 - ui6 = ui1 - ui1 - ui7 = ui2 * ui1 - ui8 = ui3 / ui3 - ui9 = ui3 % ui3 - - ui10 = 1 / 0 /* ERROR "division by zero" */ - ui11 = ui1 / 0 /* ERROR "division by zero" */ - ui12 = ui3 / ui0 /* ERROR "division by zero" */ - ui13 = 1 % 0 /* ERROR "division by zero" */ - ui14 = ui1 % 0 /* ERROR "division by zero" */ - ui15 = ui3 % ui0 /* ERROR "division by zero" */ - - ui16 = ui2 & ui3 - ui17 = ui2 | ui3 - ui18 = ui2 ^ ui3 - - // floating point values - uf0 = 0. - uf1 = 1. - uf2 = 4.2e1 - uf3 = 3.141592653589793238462643383279502884197169399375105820974944592307816406286 - uf4 = 1e-1 - - uf5 = uf0 + uf1 - uf6 = uf1 - uf1 - uf7 = uf2 * uf1 - uf8 = uf3 / uf3 - uf9 = uf3 /* ERROR "not defined" */ % uf3 - - uf10 = 1 / 0 /* ERROR "division by zero" */ - uf11 = uf1 / 0 /* ERROR "division by zero" */ - uf12 = uf3 / uf0 /* ERROR "division by zero" */ - - uf16 = uf2 /* ERROR "not defined" */ & uf3 - uf17 = uf2 /* ERROR "not defined" */ | uf3 - uf18 = uf2 /* ERROR "not defined" */ ^ uf3 - - // complex values - uc0 = 0.i - uc1 = 1.i - uc2 = 4.2e1i - uc3 = 3.141592653589793238462643383279502884197169399375105820974944592307816406286i - uc4 = 1e-1i - - uc5 = uc0 + uc1 - uc6 = uc1 - uc1 - uc7 = uc2 * uc1 - uc8 = uc3 / uc3 - uc9 = uc3 /* ERROR "not defined" */ % uc3 - - uc10 = 1 / 0 /* ERROR "division by zero" */ - uc11 = uc1 / 0 /* ERROR "division by zero" */ - uc12 = uc3 / uc0 /* ERROR "division by zero" */ - - uc16 = uc2 /* ERROR "not defined" */ & uc3 - uc17 = uc2 /* ERROR "not defined" */ | uc3 - uc18 = uc2 /* ERROR "not defined" */ ^ uc3 -) - -type ( - mybool bool - myint int - myfloat float64 - mycomplex complex128 -) - -// typed constants -const ( - // boolean values - tb0 bool = false - tb1 bool = true - tb2 mybool = 2 < 1 - tb3 mybool = ti1 /* ERROR "cannot compare" */ == tf1 - - // integer values - ti0 int8 = ui0 - ti1 int32 = ui1 - ti2 int64 = ui2 - ti3 myint = ui3 /* ERROR "overflows" */ - ti4 myint = ui4 - - ti5 = ti0 /* ERROR "mismatched types" */ + ti1 - ti6 = ti1 - ti1 - ti7 = ti2 /* ERROR "mismatched types" */ * ti1 - //ti8 = ti3 / ti3 // TODO(gri) enable this - //ti9 = ti3 % ti3 // TODO(gri) enable this - - ti10 = 1 / 0 /* ERROR "division by zero" */ - ti11 = ti1 / 0 /* ERROR "division by zero" */ - ti12 = ti3 /* ERROR "mismatched types" */ / ti0 - ti13 = 1 % 0 /* ERROR "division by zero" */ - ti14 = ti1 % 0 /* ERROR "division by zero" */ - ti15 = ti3 /* ERROR "mismatched types" */ % ti0 - - ti16 = ti2 /* ERROR "mismatched types" */ & ti3 - ti17 = ti2 /* ERROR "mismatched types" */ | ti4 - ti18 = ti2 ^ ti5 // no mismatched types error because the type of ti5 is unknown - - // floating point values - tf0 float32 = 0. - tf1 float32 = 1. - tf2 float64 = 4.2e1 - tf3 myfloat = 3.141592653589793238462643383279502884197169399375105820974944592307816406286 - tf4 myfloat = 1e-1 - - tf5 = tf0 + tf1 - tf6 = tf1 - tf1 - tf7 = tf2 /* ERROR "mismatched types" */ * tf1 - // tf8 = tf3 / tf3 // TODO(gri) enable this - tf9 = tf3 /* ERROR "not defined" */ % tf3 - - tf10 = 1 / 0 /* ERROR "division by zero" */ - tf11 = tf1 / 0 /* ERROR "division by zero" */ - tf12 = tf3 /* ERROR "mismatched types" */ / tf0 - - tf16 = tf2 /* ERROR "mismatched types" */ & tf3 - tf17 = tf2 /* ERROR "mismatched types" */ | tf3 - tf18 = tf2 /* ERROR "mismatched types" */ ^ tf3 - - // complex values - tc0 = 0.i - tc1 = 1.i - tc2 = 4.2e1i - tc3 = 3.141592653589793238462643383279502884197169399375105820974944592307816406286i - tc4 = 1e-1i - - tc5 = tc0 + tc1 - tc6 = tc1 - tc1 - tc7 = tc2 * tc1 - tc8 = tc3 / tc3 - tc9 = tc3 /* ERROR "not defined" */ % tc3 - - tc10 = 1 / 0 /* ERROR "division by zero" */ - tc11 = tc1 / 0 /* ERROR "division by zero" */ - tc12 = tc3 / tc0 /* ERROR "division by zero" */ - - tc16 = tc2 /* ERROR "not defined" */ & tc3 - tc17 = tc2 /* ERROR "not defined" */ | tc3 - tc18 = tc2 /* ERROR "not defined" */ ^ tc3 -) - -// initialization cycles -const ( - a /* ERROR "cycle" */ = a - b /* ERROR "cycle" */ , c /* ERROR "cycle" */, d, e = e, d, c, b // TODO(gri) should only have one cycle error - f float64 = d -) - -// multiple initialization -const ( - a1, a2, a3 = 7, 3.1415926, "foo" - b1, b2, b3 = b3, b1, 42 - _p0 = assert(a1 == 7) - _p1 = assert(a2 == 3.1415926) - _p2 = assert(a3 == "foo") - _p3 = assert(b1 == 42) - _p4 = assert(b2 == 42) - _p5 = assert(b3 == 42) -) - -// iota -const ( - iota0 = iota - iota1 = iota - iota2 = iota*2 - _a0 = assert(iota0 == 0) - _a1 = assert(iota1 == 1) - _a2 = assert(iota2 == 4) - iota6 = iota*3 - - iota7 - iota8 - _a3 = assert(iota7 == 21) - _a4 = assert(iota8 == 24) -) - -const ( - _b0 = iota - _b1 = assert(iota + iota2 == 5) -) - -// special cases -const ( - _n0 = nil /* ERROR "invalid constant type" */ - _n1 = [ /* ERROR "not constant" */ ]int{} -) \ No newline at end of file Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/conversions.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/conversions.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/conversions.src @@ -1,18 +0,0 @@ -// Copyright 2012 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. - -// conversions - -package conversions - -// argument count -var ( - _v0 = int /* ERROR "one argument" */ () - _v1 = int /* ERROR "one argument" */ (1, 2) -) - -// -var ( - _v2 = int8(0) -) \ No newline at end of file Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls0.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls0.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls0.src @@ -1,177 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// type declarations - -package decls0 - -import ( - "unsafe" - // we can have multiple blank imports (was bug) - _ "math" - _ "net/rpc" -) - -const pi = 3.1415 - -type ( - N undeclared /* ERROR "undeclared" */ - B bool - I int32 - A [10]P - T struct { - x, y P - } - P *T - R (*R) - F func(A) I - Y interface { - f(A) I - } - S [](((P))) - M map[I]F - C chan<- I - - // blank types must be typechecked - _ pi /* ERROR "not a type" */ - _ struct{} - _ struct{ pi /* ERROR "not a type" */ } -) - - -// invalid array types -type ( - iA0 [... /* ERROR "invalid use of '...'" */ ]byte - iA1 [1 /* ERROR "invalid array length" */ <<100]int - iA2 [- /* ERROR "invalid array length" */ 1]complex128 - iA3 ["foo" /* ERROR "invalid array length" */ ]string -) - - -type ( - p1 pi /* ERROR "no single field or method foo" */ .foo - p2 unsafe.Pointer -) - - -type ( - Pi pi /* ERROR "not a type" */ - - a /* ERROR "illegal cycle" */ a - a /* ERROR "redeclared" */ int - - // where the cycle error appears depends on the - // order in which declarations are processed - // (which depends on the order in which a map - // is iterated through) - b /* ERROR "illegal cycle" */ c - c d - d e - e b - - t *t - - U V - V *W - W U - - P1 *S2 - P2 P1 - - S0 struct { - } - S1 struct { - a, b, c int - u, v, a /* ERROR "redeclared" */ float32 - } - S2 struct { - U // anonymous field - // TODO(gri) recognize double-declaration below - // U /* ERROR "redeclared" */ int - } - S3 struct { - x S2 - } - S4/* ERROR "illegal cycle" */ struct { - S4 - } - S5 /* ERROR "illegal cycle" */ struct { - S6 - } - S6 struct { - field S7 - } - S7 struct { - S5 - } - - L1 []L1 - L2 []int - - A1 [10.0]int - A2 /* ERROR "illegal cycle" */ [10]A2 - A3 /* ERROR "illegal cycle" */ [10]struct { - x A4 - } - A4 [10]A3 - - F1 func() - F2 func(x, y, z float32) - F3 func(x, y, x /* ERROR "redeclared" */ float32) - F4 func() (x, y, x /* ERROR "redeclared" */ float32) - F5 func(x int) (x /* ERROR "redeclared" */ float32) - F6 func(x ...int) - - I1 interface{} - I2 interface { - m1() - } - I3 interface { /* ERROR "multiple methods named m1" */ - m1() - m1 /* ERROR "redeclared" */ () - } - I4 interface { - m1(x, y, x /* ERROR "redeclared" */ float32) - m2() (x, y, x /* ERROR "redeclared" */ float32) - m3(x int) (x /* ERROR "redeclared" */ float32) - } - I5 interface { - m1(I5) - } - I6 interface { - S0 /* ERROR "not an interface" */ - } - I7 interface { - I1 - I1 - } - I8 /* ERROR "illegal cycle" */ interface { - I8 - } - // Use I09 (rather than I9) because it appears lexically before - // I10 so that we get the illegal cycle here rather then in the - // declaration of I10. If the implementation sorts by position - // rather than name, the error message will still be here. - I09 /* ERROR "illegal cycle" */ interface { - I10 - } - I10 interface { - I11 - } - I11 interface { - I09 - } - - C1 chan int - C2 <-chan int - C3 chan<- C3 - C4 chan C5 - C5 chan C6 - C6 chan C4 - - M1 map[Last]string - M2 map[string]M2 - - Last int -) Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls1.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls1.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls1.src @@ -1,132 +0,0 @@ -// Copyright 2012 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. - -// variable declarations - -package decls1 - -import ( - "math" -) - -// Global variables without initialization -var ( - a, b bool - c byte - d uint8 - r rune - i int - j, k, l int - x, y float32 - xx, yy float64 - u, v complex64 - uu, vv complex128 - s, t string - array []byte - iface interface{} - - blank _ /* ERROR "cannot use _" */ -) - -// Global variables with initialization -var ( - s1 = i + j - s2 = i /* ERROR "mismatched types" */ + x - s3 = c + d - s4 = s + t - s5 = s /* ERROR "invalid operation" */ / t - s6 = array[t1] - s7 = array[x /* ERROR "index" */] - s8 = &a - s10 = &42 /* ERROR "cannot take address" */ - s11 = &v - s12 = -(u + *t11) / *&v - s13 = a /* ERROR "shifted operand" */ << d - s14 = i << j /* ERROR "must be unsigned" */ - s18 = math.Pi * 10.0 - s19 = s1 /* ERROR "cannot call" */ () - s20 = f0 /* ERROR "no value" */ () - s21 = f6(1, s1, i) - s22 = f6(1, s1, uu /* ERROR "cannot assign" */ ) - - t1 int = i + j - t2 int = i /* ERROR "mismatched types" */ + x - t3 int = c /* ERROR "cannot assign" */ + d - t4 string = s + t - t5 string = s /* ERROR "invalid operation" */ / t - t6 byte = array[t1] - t7 byte = array[x /* ERROR "index" */] - t8 *int = & /* ERROR "cannot assign" */ a - t10 *int = &42 /* ERROR "cannot take address" */ - t11 *complex64 = &v - t12 complex64 = -(u + *t11) / *&v - t13 int = a /* ERROR "shifted operand" */ << d - t14 int = i << j /* ERROR "must be unsigned" */ - t15 math /* ERROR "not in selector" */ - t16 math.xxx /* ERROR "unexported" */ - t17 math /* ERROR "not a type" */ .Pi - t18 float64 = math.Pi * 10.0 - t19 int = t1 /* ERROR "cannot call" */ () - t20 int = f0 /* ERROR "no value" */ () -) - -// Various more complex expressions -var ( - u1 = x /* ERROR "not an interface" */ .(int) - u2 = iface.([]int) - u3 = iface.(a /* ERROR "not a type" */ ) - u4, ok = iface.(int) - u5 /* ERROR "assignment count mismatch" */ , ok2, ok3 = iface.(int) -) - -// Constant expression initializations -var ( - v1 = 1 /* ERROR "cannot convert" */ + "foo" - v2 = c + 255 - v3 = c + 256 /* ERROR "overflows" */ - v4 = r + 2147483647 - v5 = r + 2147483648 /* ERROR "overflows" */ - v6 = 42 - v7 = v6 + 2147483647 - v8 = v6 + 2147483648 /* ERROR "overflows" */ - v9 = i + 1 << 10 - v10 byte = 1024 /* ERROR "overflows" */ - v11 = xx/yy*yy - xx - v12 = true && false - v13 = nil /* ERROR "use of untyped nil" */ -) - -// Multiple assignment expressions -var ( - m1a, m1b = 1, 2 - m2a /* ERROR "assignment count mismatch" */ , m2b, m2c = 1, 2 - m3a /* ERROR "assignment count mismatch" */ , m3b = 1, 2, 3 -) - -// Declaration of parameters and results -func f0() {} -func f1(a /* ERROR "not a type" */) {} -func f2(a, b, c d /* ERROR "not a type" */) {} - -func f3() int {} -func f4() a /* ERROR "not a type" */ {} -func f5() (a, b, c d /* ERROR "not a type" */) {} - -func f6(a, b, c int) complex128 { return 0 } - -// Declaration of receivers -type T struct{} - -func (T) m0() {} -func (*T) m1() {} -func (x T) m2() {} -func (x *T) m3() {} - - -// Initialization functions -func init() {} -func /* ERROR "no arguments and no return values" */ init(int) {} -func /* ERROR "no arguments and no return values" */ init() int { return 0 } -func /* ERROR "no arguments and no return values" */ init(int) int {} -func (T) init(int) int { return 0 } Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls2a.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls2a.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls2a.src @@ -1,67 +0,0 @@ -// Copyright 2012 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. - -// method declarations - -package decls2 - -import "time" - -// T1 declared before its methods. -type T1 struct{ - f int -} - -func (T1) m() {} -func (T1) m /* ERROR "redeclared" */ () {} -func (x *T1) f /* ERROR "field and method" */ () {} - -// T2's method declared before the type. -func (*T2) f /* ERROR "field and method" */ () {} - -type T2 struct { - f int -} - -// Methods declared without a declared type. -func (undeclared /* ERROR "undeclared" */) m() {} -func (x *undeclared /* ERROR "undeclared" */) m() {} - -// TODO(gri) try to get rid of double error reporting here -func (pi /* ERROR "not a type" */) m1() {} -func (x pi /* ERROR "not a type" */) m2() {} -func (x *pi /* ERROR "not a type" */ ) m3() {} // TODO(gri) not closing the last /* comment crashes the system - -// Blank types. -type _ struct { m int } -type _ struct { m int } - -// TODO(gri) blank idents not fully checked - disabled for now -// func (_ /* ERROR "cannot use _" */) m() {} -// func (_ /* ERROR "cannot use _" */) m() {} - -// Methods with receiver base type declared in another file. -func (T3) m1() {} -func (*T3) m2() {} -func (x T3) m3() {} -func (x *T3) f /* ERROR "field and method" */ () {} - -// Methods of non-struct type. -type T4 func() - -func (self T4) m() func() { return self } - -// Methods associated with an interface. -type T5 interface { - m() int -} - -func (T5 /* ERROR "invalid receiver" */) m1() {} -func (T5 /* ERROR "invalid receiver" */) m2() {} - -// Methods associated with non-local or unnamed types. -func (int /* ERROR "non-local type" */ ) m() {} -func ([ /* ERROR "expected" */ ]int) m() {} -func (time /* ERROR "expected" */ .Time) m() {} -func (x interface /* ERROR "expected" */ {}) m() {} Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls2b.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls2b.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls2b.src @@ -1,28 +0,0 @@ -// Copyright 2012 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. - -// method declarations - -package decls2 - -const pi = 3.1415 - -func (T1) m /* ERROR "redeclared" */ () {} - -type T3 struct { - f *T3 -} - -type T6 struct { - x int -} - -func (t *T6) m1() int { - return t.x -} - -func f() { - var t *T6 - t.m1() -} \ No newline at end of file Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls3.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls3.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/decls3.src @@ -1,231 +0,0 @@ -// Copyright 2012 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. - -// embedded types - -package decls3 - -// fields with the same name at the same level cancel each other out - -func _() { - type ( - T1 struct { X int } - T2 struct { X int } - T3 struct { T1; T2 } // X is embedded twice at the same level via T1->X, T2->X - ) - - var t T3 - _ = t /* ERROR "no single field or method" */ .X -} - -func _() { - type ( - T1 struct { X int } - T2 struct { T1 } - T3 struct { T1 } - T4 struct { T2; T3 } // X is embedded twice at the same level via T2->T1->X, T3->T1->X - ) - - var t T4 - _ = t /* ERROR "no single field or method" */ .X -} - -func issue4355() { - type ( - T1 struct {X int} - T2 struct {T1} - T3 struct {T2} - T4 struct {T2} - T5 struct {T3; T4} // X is embedded twice at the same level via T3->T2->T1->X, T4->T2->T1->X - ) - - var t T5 - _ = t /* ERROR "no single field or method" */ .X -} - -// Borrowed from the FieldByName test cases in reflect/all_test.go. - -type D1 struct { - d int -} -type D2 struct { - d int -} - -type S0 struct { - A, B, C int - D1 - D2 -} - -type S1 struct { - B int - S0 -} - -type S2 struct { - A int - *S1 -} - -type S1x struct { - S1 -} - -type S1y struct { - S1 -} - -type S3 struct { - S1x - S2 - D, E int - *S1y -} - -type S4 struct { - *S4 - A int -} - -// The X in S6 and S7 annihilate, but they also block the X in S8.S9. -type S5 struct { - S6 - S7 - S8 -} - -type S6 struct { - X int -} - -type S7 S6 - -type S8 struct { - S9 -} - -type S9 struct { - X int - Y int -} - -// The X in S11.S6 and S12.S6 annihilate, but they also block the X in S13.S8.S9. -type S10 struct { - S11 - S12 - S13 -} - -type S11 struct { - S6 -} - -type S12 struct { - S6 -} - -type S13 struct { - S8 -} - -func _() { - _ = struct /* ERROR "no single field or method" */ {}{}.Foo - _ = S0{}.A - _ = S0 /* ERROR "no single field or method" */ {}.D - _ = S1{}.A - _ = S1{}.B - _ = S1{}.S0 - _ = S1{}.C - _ = S2{}.A - _ = S2{}.S1 - _ = S2{}.B - _ = S2{}.C - _ = S2 /* ERROR "no single field or method" */ {}.D - _ = S3 /* ERROR "no single field or method" */ {}.S1 - _ = S3{}.A - _ = S3 /* ERROR "no single field or method" */ {}.B - _ = S3{}.D - _ = S3{}.E - _ = S4{}.A - _ = S4 /* ERROR "no single field or method" */ {}.B - _ = S5 /* ERROR "no single field or method" */ {}.X - _ = S5{}.Y - _ = S10 /* ERROR "no single field or method" */ {}.X - _ = S10{}.Y -} - -// Borrowed from the FieldByName benchmark in reflect/all_test.go. - -type R0 struct { - *R1 - *R2 - *R3 - *R4 -} - -type R1 struct { - *R5 - *R6 - *R7 - *R8 -} - -type R2 R1 -type R3 R1 -type R4 R1 - -type R5 struct { - *R9 - *R10 - *R11 - *R12 -} - -type R6 R5 -type R7 R5 -type R8 R5 - -type R9 struct { - *R13 - *R14 - *R15 - *R16 -} - -type R10 R9 -type R11 R9 -type R12 R9 - -type R13 struct { - *R17 - *R18 - *R19 - *R20 -} - -type R14 R13 -type R15 R13 -type R16 R13 - -type R17 struct { - *R21 - *R22 - *R23 - *R24 -} - -type R18 R17 -type R19 R17 -type R20 R17 - -type R21 struct { - X int -} - -type R22 R21 -type R23 R21 -type R24 R21 - -var _ = R0 /* ERROR "no single field or method" */ {}.X \ No newline at end of file Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr0.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr0.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr0.src @@ -1,151 +0,0 @@ -// Copyright 2012 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. - -// unary expressions - -package expr0 - -var ( - // bool - b0 = true - b1 bool = b0 - b2 = !true - b3 = !b1 - b4 bool = !true - b5 bool = !b4 - b6 = +b0 /* ERROR "not defined" */ - b7 = -b0 /* ERROR "not defined" */ - b8 = ^b0 /* ERROR "not defined" */ - b9 = *b0 /* ERROR "cannot indirect" */ - b10 = &true /* ERROR "cannot take address" */ - b11 = &b0 - b12 = <-b0 /* ERROR "cannot receive" */ - - // int - i0 = 1 - i1 int = i0 - i2 = +1 - i3 = +i0 - i4 int = +1 - i5 int = +i4 - i6 = -1 - i7 = -i0 - i8 int = -1 - i9 int = -i4 - i10 = !i0 /* ERROR "not defined" */ - i11 = ^1 - i12 = ^i0 - i13 int = ^1 - i14 int = ^i4 - i15 = *i0 /* ERROR "cannot indirect" */ - i16 = &i0 - i17 = *i16 - i18 = <-i16 /* ERROR "cannot receive" */ - - // uint - u0 = uint(1) - u1 uint = u0 - u2 = +1 - u3 = +u0 - u4 uint = +1 - u5 uint = +u4 - u6 = -1 - u7 = -u0 - u8 uint = - /* ERROR "overflows" */ 1 - u9 uint = -u4 - u10 = !u0 /* ERROR "not defined" */ - u11 = ^1 - u12 = ^i0 - u13 uint = ^ /* ERROR "overflows" */ 1 - u14 uint = ^u4 - u15 = *u0 /* ERROR "cannot indirect" */ - u16 = &u0 - u17 = *u16 - u18 = <-u16 /* ERROR "cannot receive" */ - u19 = ^uint(0) - - // float64 - f0 = float64(1) - f1 float64 = f0 - f2 = +1 - f3 = +f0 - f4 float64 = +1 - f5 float64 = +f4 /* ERROR not defined */ - f6 = -1 - f7 = -f0 - f8 float64 = -1 - f9 float64 = -f4 - f10 = !f0 /* ERROR "not defined" */ - f11 = ^1 - f12 = ^i0 - f13 float64 = ^1 - f14 float64 = ^f4 /* ERROR "not defined" */ - f15 = *f0 /* ERROR "cannot indirect" */ - f16 = &f0 - f17 = *u16 - f18 = <-u16 /* ERROR "cannot receive" */ - - // complex128 - c0 = complex128(1) - c1 complex128 = c0 - c2 = +1 - c3 = +c0 - c4 complex128 = +1 - c5 complex128 = +c4 /* ERROR not defined */ - c6 = -1 - c7 = -c0 - c8 complex128 = -1 - c9 complex128 = -c4 - c10 = !c0 /* ERROR "not defined" */ - c11 = ^1 - c12 = ^i0 - c13 complex128 = ^1 - c14 complex128 = ^c4 /* ERROR "not defined" */ - c15 = *c0 /* ERROR "cannot indirect" */ - c16 = &c0 - c17 = *u16 - c18 = <-u16 /* ERROR "cannot receive" */ - - // string - s0 = "foo" - s1 = +"foo" /* ERROR "not defined" */ - s2 = -s0 /* ERROR "not defined" */ - s3 = !s0 /* ERROR "not defined" */ - s4 = ^s0 /* ERROR "not defined" */ - s5 = *s4 /* ERROR "cannot indirect" */ - s6 = &s4 - s7 = *s6 - s8 = <-s7 /* ERROR "cannot receive" */ - - // channel - ch chan int - rc <-chan float64 - sc chan <- string - ch0 = +ch /* ERROR "not defined" */ - ch1 = -ch /* ERROR "not defined" */ - ch2 = !ch /* ERROR "not defined" */ - ch3 = ^ch /* ERROR "not defined" */ - ch4 = *ch /* ERROR "cannot indirect" */ - ch5 = &ch - ch6 = *ch5 - ch7 = <-ch - ch8 = <-rc - ch9 = <-sc /* ERROR "cannot receive" */ -) - -// address of composite literals -type T struct{x, y int} - -func f() T { return T{} } - -var ( - _ = &T{1, 2} - _ = &[...]int{} - _ = &[]int{} - _ = &[]int{} - _ = &map[string]T{} - _ = &(T{1, 2}) - _ = &((((T{1, 2})))) - _ = &f /* ERROR "cannot take address" */ () -) Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr1.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr1.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr1.src @@ -1,7 +0,0 @@ -// Copyright 2012 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. - -// binary expressions - -package expr1 Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr2.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr2.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr2.src @@ -1,23 +0,0 @@ -// Copyright 2012 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. - -// comparisons - -package expr2 - -func _bool() { - const t = true == true - const f = true == false - _ = t /* ERROR "cannot compare" */ < f - _ = 0 /* ERROR "cannot convert" */ == t - var b bool - var x, y float32 - b = x < y - _ = struct{b bool}{x < y} -} - -// corner cases -var ( - v0 = nil /* ERROR "cannot compare" */ == nil -) \ No newline at end of file Index: llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr3.src =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr3.src +++ llgo/trunk/third_party/gofrontend/libgo/go/go/types/testdata/expr3.src @@ -1,367 +0,0 @@ -// Copyright 2012 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. - -// various expressions - -package expr3 - -func shifts1() { - var ( - i0 int - u0 uint - ) - - var ( - v0 = 1<<0 - v1 = 1< +#include +#include + +volatile int32_t spinlock; + +static void *thread1(void *p) { + (void)p; + while (spinlock == 0) + ; + pthread_kill(pthread_self(), SIGPROF); + spinlock = 0; + return NULL; +} +__attribute__((constructor)) void issue9456() { + pthread_t tid; + pthread_create(&tid, 0, thread1, NULL); +} +*/ +import "C" + +import ( + "runtime" + "sync/atomic" + "unsafe" +) + +func main() { + // This test intends to test that sending SIGPROF to foreign threads + // before we make any cgo call will not abort the whole process, so + // we cannot make any cgo call here. See http://golang.org/issue/9456. + atomic.StoreInt32((*int32)(unsafe.Pointer(&C.spinlock)), 1) + for atomic.LoadInt32((*int32)(unsafe.Pointer(&C.spinlock))) == 1 { + runtime.Gosched() + } + println("OK") +} +` Index: llgo/trunk/third_party/gofrontend/libgo/go/runtime/extern.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/runtime/extern.go +++ llgo/trunk/third_party/gofrontend/libgo/go/runtime/extern.go @@ -39,6 +39,10 @@ gcdead: setting gcdead=1 causes the garbage collector to clobber all stack slots that it thinks are dead. + memprofilerate: setting memprofilerate=X changes the setting for + runtime.MemProfileRate. Refer to the description of this variable for how + it is used and its default value. + scheddetail: setting schedtrace=X and scheddetail=1 causes the scheduler to emit detailed multiline info every X milliseconds, describing state of the scheduler, processors, threads and goroutines. Index: llgo/trunk/third_party/gofrontend/libgo/go/runtime/hashmap.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/runtime/hashmap.go +++ llgo/trunk/third_party/gofrontend/libgo/go/runtime/hashmap.go @@ -117,12 +117,12 @@ // A bucket for a Go map. type bmap struct { - tophash [bucketCnt]uint8 - overflow *bmap + tophash [bucketCnt]uint8 // Followed by bucketCnt keys and then bucketCnt values. // NOTE: packing all the keys together and then all the values together makes the // code a bit more complicated than alternating key/value/key/value/... but it allows // us to eliminate padding which would be needed for, e.g., map[int64]int8. + // Followed by an overflow pointer. } // A hash iteration structure. @@ -149,6 +149,13 @@ return h > empty && h < minTopHash } +func (b *bmap) overflow(t *maptype) *bmap { + return *(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-regSize)) +} +func (b *bmap) setoverflow(t *maptype, ovf *bmap) { + *(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-regSize)) = ovf +} + func makemap(t *maptype, hint int64) *hmap { if sz := unsafe.Sizeof(hmap{}); sz > 48 || sz != uintptr(t.hmap.size) { gothrow("bad hmap size") @@ -275,7 +282,7 @@ return v } } - b = b.overflow + b = b.overflow(t) if b == nil { return unsafe.Pointer(t.elem.zero) } @@ -323,7 +330,7 @@ return v, true } } - b = b.overflow + b = b.overflow(t) if b == nil { return unsafe.Pointer(t.elem.zero), false } @@ -366,7 +373,7 @@ return k, v } } - b = b.overflow + b = b.overflow(t) if b == nil { return nil, nil } @@ -437,10 +444,11 @@ memmove(v2, val, uintptr(t.elem.size)) return } - if b.overflow == nil { + ovf := b.overflow(t) + if ovf == nil { break } - b = b.overflow + b = ovf } // did not find mapping for key. Allocate new cell & add entry. @@ -455,7 +463,7 @@ memstats.next_gc = memstats.heap_alloc } newb := (*bmap)(newobject(t.bucket)) - b.overflow = newb + b.setoverflow(t, newb) inserti = &newb.tophash[0] insertk = add(unsafe.Pointer(newb), dataOffset) insertv = add(insertk, bucketCnt*uintptr(t.keysize)) @@ -525,7 +533,7 @@ h.count-- return } - b = b.overflow + b = b.overflow(t) if b == nil { return } @@ -720,7 +728,7 @@ return } } - b = b.overflow + b = b.overflow(t) i = 0 goto next } @@ -778,7 +786,7 @@ yk := add(unsafe.Pointer(y), dataOffset) xv := add(xk, bucketCnt*uintptr(t.keysize)) yv := add(yk, bucketCnt*uintptr(t.keysize)) - for ; b != nil; b = b.overflow { + for ; b != nil; b = b.overflow(t) { k := add(unsafe.Pointer(b), dataOffset) v := add(k, bucketCnt*uintptr(t.keysize)) for i := 0; i < bucketCnt; i, k, v = i+1, add(k, uintptr(t.keysize)), add(v, uintptr(t.valuesize)) { @@ -828,7 +836,7 @@ memstats.next_gc = memstats.heap_alloc } newx := (*bmap)(newobject(t.bucket)) - x.overflow = newx + x.setoverflow(t, newx) x = newx xi = 0 xk = add(unsafe.Pointer(x), dataOffset) @@ -855,7 +863,7 @@ memstats.next_gc = memstats.heap_alloc } newy := (*bmap)(newobject(t.bucket)) - y.overflow = newy + y.setoverflow(t, newy) y = newy yi = 0 yk = add(unsafe.Pointer(y), dataOffset) @@ -881,7 +889,6 @@ // Unlink the overflow buckets & clear key/value to help GC. if h.flags&oldIterator == 0 { b = (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.bucketsize))) - b.overflow = nil memclr(add(unsafe.Pointer(b), dataOffset), uintptr(t.bucketsize)-dataOffset) } } Index: llgo/trunk/third_party/gofrontend/libgo/go/runtime/hashmap_fast.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/runtime/hashmap_fast.go +++ llgo/trunk/third_party/gofrontend/libgo/go/runtime/hashmap_fast.go @@ -43,7 +43,7 @@ } return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.valuesize)) } - b = b.overflow + b = b.overflow(t) if b == nil { return unsafe.Pointer(t.elem.zero) } @@ -85,7 +85,7 @@ } return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.valuesize)), true } - b = b.overflow + b = b.overflow(t) if b == nil { return unsafe.Pointer(t.elem.zero), false } @@ -127,7 +127,7 @@ } return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.valuesize)) } - b = b.overflow + b = b.overflow(t) if b == nil { return unsafe.Pointer(t.elem.zero) } @@ -169,7 +169,7 @@ } return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.valuesize)), true } - b = b.overflow + b = b.overflow(t) if b == nil { return unsafe.Pointer(t.elem.zero), false } @@ -271,7 +271,7 @@ return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+i*uintptr(t.valuesize)) } } - b = b.overflow + b = b.overflow(t) if b == nil { return unsafe.Pointer(t.elem.zero) } @@ -371,7 +371,7 @@ return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+i*uintptr(t.valuesize)), true } } - b = b.overflow + b = b.overflow(t) if b == nil { return unsafe.Pointer(t.elem.zero), false } Index: llgo/trunk/third_party/gofrontend/libgo/go/runtime/map_test.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/runtime/map_test.go +++ llgo/trunk/third_party/gofrontend/libgo/go/runtime/map_test.go @@ -243,7 +243,12 @@ func testConcurrentReadsAfterGrowth(t *testing.T, useReflect bool) { if runtime.GOMAXPROCS(-1) == 1 { - defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(16)) + if runtime.GOARCH == "s390" { + // Test uses too much address space on 31-bit S390. + defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(8)) + } else { + defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(16)) + } } numLoop := 10 numGrowStep := 250 Index: llgo/trunk/third_party/gofrontend/libgo/go/runtime/mfinal_test.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/runtime/mfinal_test.go +++ llgo/trunk/third_party/gofrontend/libgo/go/runtime/mfinal_test.go @@ -24,6 +24,9 @@ if runtime.GOARCH != "amd64" { t.Skipf("Skipping on non-amd64 machine") } + if runtime.Compiler == "gccgo" { + t.Skip("skipping for gccgo") + } ch := make(chan bool, 10) finalize := func(x *int) { @@ -81,6 +84,9 @@ if runtime.GOARCH != "amd64" { t.Skipf("Skipping on non-amd64 machine") } + if runtime.Compiler == "gccgo" { + t.Skip("skipping for gccgo") + } ch := make(chan bool) done := make(chan bool, 1) go func() { @@ -175,6 +181,9 @@ if true { // disable until bug 7564 is fixed. return } + if runtime.Compiler == "gccgo" { + t.Skip("skipping for gccgo") + } x, y := adjChunks() // the pointer inside xs points to y. Index: llgo/trunk/third_party/gofrontend/libgo/go/runtime/mprof.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/runtime/mprof.go +++ llgo/trunk/third_party/gofrontend/libgo/go/runtime/mprof.go @@ -575,20 +575,16 @@ // If all is true, Stack formats stack traces of all other goroutines // into buf after the trace for the current goroutine. func Stack(buf []byte, all bool) int { - mp := acquirem() - gp := mp.curg if all { semacquire(&worldsema, false) - mp.gcing = 1 - releasem(mp) + gp := getg() + gp.m.gcing = 1 onM(stoptheworld) - if mp != acquirem() { - gothrow("Stack: rescheduled") - } } n := 0 if len(buf) > 0 { + gp := getg() sp := getcallersp(unsafe.Pointer(&buf)) pc := getcallerpc(unsafe.Pointer(&buf)) onM(func() { @@ -605,11 +601,11 @@ } if all { - mp.gcing = 0 + gp := getg() + gp.m.gcing = 0 semrelease(&worldsema) onM(starttheworld) } - releasem(mp) return n } Index: llgo/trunk/third_party/gofrontend/libgo/go/runtime/os_plan9.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/runtime/os_plan9.go +++ llgo/trunk/third_party/gofrontend/libgo/go/runtime/os_plan9.go @@ -6,6 +6,8 @@ import "unsafe" +const _SIGPROF = 0 // dummy value for badsignal + func pread(fd int32, buf unsafe.Pointer, nbytes int32, offset int64) int32 func pwrite(fd int32, buf unsafe.Pointer, nbytes int32, offset int64) int32 func seek(fd int32, offset int64, whence int32) int64 Index: llgo/trunk/third_party/gofrontend/libgo/go/runtime/pprof/mprof_test.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/runtime/pprof/mprof_test.go +++ llgo/trunk/third_party/gofrontend/libgo/go/runtime/pprof/mprof_test.go @@ -85,10 +85,12 @@ # 0x[0-9,a-f]+ runtime_pprof_test\.TestMemoryProfiler\+0x[0-9,a-f]+ .*/mprof_test.go:64 `, (1<<10)*memoryProfilerRun, (1<<20)*memoryProfilerRun), - fmt.Sprintf(`0: 0 \[%v: %v\] @ 0x[0-9,a-f x]+ + // This should start with "0: 0" but gccgo's imprecise + // GC means that sometimes the value is not collected. + fmt.Sprintf(`(0|%v): (0|%v) \[%v: %v\] @ 0x[0-9,a-f x]+ # 0x[0-9,a-f]+ pprof_test\.allocateTransient2M\+0x[0-9,a-f]+ .*/mprof_test.go:30 # 0x[0-9,a-f]+ runtime_pprof_test\.TestMemoryProfiler\+0x[0-9,a-f]+ .*/mprof_test.go:65 -`, memoryProfilerRun, (2<<20)*memoryProfilerRun), +`, memoryProfilerRun, (2<<20)*memoryProfilerRun, memoryProfilerRun, (2<<20)*memoryProfilerRun), } for _, test := range tests { Index: llgo/trunk/third_party/gofrontend/libgo/go/runtime/sigqueue.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/runtime/sigqueue.go +++ llgo/trunk/third_party/gofrontend/libgo/go/runtime/sigqueue.go @@ -154,6 +154,15 @@ // This runs on a foreign stack, without an m or a g. No stack split. //go:nosplit func badsignal(sig uintptr) { + // Some external libraries, for example, OpenBLAS, create worker threads in + // a global constructor. If we're doing cpu profiling, and the SIGPROF signal + // comes to one of the foreign threads before we make our first cgo call, the + // call to cgocallback below will bring down the whole process. + // It's better to miss a few SIGPROF signals than to abort in this case. + // See http://golang.org/issue/9456. + if _SIGPROF != 0 && sig == _SIGPROF && needextram != 0 { + return + } cgocallback(unsafe.Pointer(funcPC(sigsend)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)) } Index: llgo/trunk/third_party/gofrontend/libgo/go/runtime/syscall_windows.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/runtime/syscall_windows.go +++ llgo/trunk/third_party/gofrontend/libgo/go/runtime/syscall_windows.go @@ -8,6 +8,8 @@ "unsafe" ) +const _SIGPROF = 0 // dummy value for badsignal + type callbacks struct { lock mutex ctxt [cb_max]*wincallbackcontext @@ -52,11 +54,13 @@ panic("compilecallback: output parameter size is wrong") } argsize := uintptr(0) - for _, t := range (*[1024](*_type))(unsafe.Pointer(&ft.in[0]))[:len(ft.in)] { - if (*t).size > uintptrSize { - panic("compilecallback: input parameter size is wrong") + if len(ft.in) > 0 { + for _, t := range (*[1024](*_type))(unsafe.Pointer(&ft.in[0]))[:len(ft.in)] { + if (*t).size > uintptrSize { + panic("compilecallback: input parameter size is wrong") + } + argsize += uintptrSize } - argsize += uintptrSize } lock(&cbs.lock) Index: llgo/trunk/third_party/gofrontend/libgo/go/syscall/exec_unix.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/syscall/exec_unix.go +++ llgo/trunk/third_party/gofrontend/libgo/go/syscall/exec_unix.go @@ -226,6 +226,7 @@ // Kick off child. pid, err1 = forkAndExecInChild(argv0p, argvp, envvp, chroot, dir, attr, sys, p[1]) if err1 != 0 { + err = Errno(err1) goto error } ForkLock.Unlock() Index: llgo/trunk/third_party/gofrontend/libgo/go/syscall/route_openbsd.go =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/go/syscall/route_openbsd.go +++ llgo/trunk/third_party/gofrontend/libgo/go/syscall/route_openbsd.go @@ -12,16 +12,16 @@ switch any.Type { case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE: p := (*RouteMessage)(unsafe.Pointer(any)) - return &RouteMessage{Header: p.Header, Data: b[SizeofRtMsghdr:any.Msglen]} + return &RouteMessage{Header: p.Header, Data: b[p.Header.Hdrlen:any.Msglen]} case RTM_IFINFO: p := (*InterfaceMessage)(unsafe.Pointer(any)) - return &InterfaceMessage{Header: p.Header, Data: b[SizeofIfMsghdr:any.Msglen]} + return &InterfaceMessage{Header: p.Header, Data: b[p.Header.Hdrlen:any.Msglen]} case RTM_IFANNOUNCE: p := (*InterfaceAnnounceMessage)(unsafe.Pointer(any)) return &InterfaceAnnounceMessage{Header: p.Header} case RTM_NEWADDR, RTM_DELADDR: p := (*InterfaceAddrMessage)(unsafe.Pointer(any)) - return &InterfaceAddrMessage{Header: p.Header, Data: b[SizeofIfaMsghdr:any.Msglen]} + return &InterfaceAddrMessage{Header: p.Header, Data: b[p.Header.Hdrlen:any.Msglen]} } return nil } Index: llgo/trunk/third_party/gofrontend/libgo/merge.sh =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/merge.sh +++ llgo/trunk/third_party/gofrontend/libgo/merge.sh @@ -40,12 +40,14 @@ old_rev=`sed 1q MERGE` rm -rf ${OLDDIR} -hg clone -r ${old_rev} ${repository} ${OLDDIR} +git clone ${repository} ${OLDDIR} +(cd ${OLDDIR} && git checkout ${old_rev}) rm -rf ${NEWDIR} -hg clone -u ${rev} ${repository} ${NEWDIR} +git clone ${repository} ${NEWDIR} +(cd ${NEWDIR} && git checkout ${rev}) -new_rev=`cd ${NEWDIR} && hg log -r ${rev} | sed 1q | sed -e 's/.*://'` +new_rev=`cd ${NEWDIR} && git log | sed 1q | sed -e 's/commit //'` merge() { name=$1 @@ -69,7 +71,7 @@ elif test -f ${old}; then # The file exists in the old version. if ! test -f ${libgo}; then - echo "merge.sh: $name: skipping: exists in old and new hg, but not in libgo" + echo "merge.sh: $name: skipping: exists in old and new git, but not in libgo" continue fi if cmp -s ${old} ${libgo}; then @@ -136,6 +138,16 @@ fi } +if test -f VERSION; then + if ! cmp -s ${NEWDIR}/VERSION VERSION; then + cp ${NEWDIR}/VERSION . + fi +else + if test -f ${NEWDIR}/VERSION; then + cp ${NEWDIR}/VERSION . + fi +fi + (cd ${NEWDIR}/src && find . -name '*.go' -print) | while read f; do oldfile=${OLDDIR}/src/$f newfile=${NEWDIR}/src/$f @@ -150,11 +162,10 @@ if ! test -d ${oldtd}; then continue fi - (cd ${oldtd} && hg status -A .) | while read f; do - if test "`basename $f`" = ".hgignore"; then + (cd ${oldtd} && git ls-files .) | while read f; do + if test "`basename $f`" = ".gitignore"; then continue fi - f=`echo $f | sed -e 's/^..//'` name=$d/$f oldfile=${oldtd}/$f newfile=${newtd}/$f @@ -179,11 +190,10 @@ if ! test -d ${oldtd}; then continue fi - (cd ${oldtd} && hg status -A .) | while read f; do - if test "`basename $f`" = ".hgignore"; then + (cd ${oldtd} && git ls-files .) | while read f; do + if test "`basename $f`" = ".gitignore"; then continue fi - f=`echo $f | sed -e 's/^..//'` name=$d/$f oldfile=${oldtd}/$f newfile=${newtd}/$f Index: llgo/trunk/third_party/gofrontend/libgo/mksysinfo.sh =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/mksysinfo.sh +++ llgo/trunk/third_party/gofrontend/libgo/mksysinfo.sh @@ -1240,11 +1240,6 @@ grep '^const _CLONE_' gen-sysinfo.go | \ sed -e 's/^\(const \)_\(CLONE_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} -# The Solaris 11 Update 1 _zone_net_addr_t struct. -grep '^type _zone_net_addr_t ' gen-sysinfo.go | \ - sed -e 's/_in6_addr/[16]byte/' \ - >> ${OUT} - # Struct sizes. set cmsghdr Cmsghdr ip_mreq IPMreq ip_mreqn IPMreqn ipv6_mreq IPv6Mreq \ ifaddrmsg IfAddrmsg ifinfomsg IfInfomsg in_pktinfo Inet4Pktinfo \ Index: llgo/trunk/third_party/gofrontend/libgo/runtime/go-caller.c =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/runtime/go-caller.c +++ llgo/trunk/third_party/gofrontend/libgo/runtime/go-caller.c @@ -37,36 +37,12 @@ { struct caller *c = (struct caller *) data; - if (function == NULL) - { - c->fn.str = NULL; - c->fn.len = 0; - } - else - { - byte *s; - - c->fn.len = __builtin_strlen (function); - s = runtime_malloc (c->fn.len); - __builtin_memcpy (s, function, c->fn.len); - c->fn.str = s; - } - - if (filename == NULL) - { - c->file.str = NULL; - c->file.len = 0; - } - else - { - byte *s; - - c->file.len = __builtin_strlen (filename); - s = runtime_malloc (c->file.len); - __builtin_memcpy (s, filename, c->file.len); - c->file.str = s; - } - + /* The libbacktrace library says that these strings might disappear, + but with the current implementation they won't. We can't easily + allocate memory here, so for now assume that we can save a + pointer to the strings. */ + c->fn = runtime_gostringnocopy ((const byte *) function); + c->file = runtime_gostringnocopy ((const byte *) filename); c->line = lineno; return 0; Index: llgo/trunk/third_party/gofrontend/libgo/runtime/go-callers.c =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/runtime/go-callers.c +++ llgo/trunk/third_party/gofrontend/libgo/runtime/go-callers.c @@ -129,6 +129,11 @@ error_callback (void *data __attribute__ ((unused)), const char *msg, int errnum) { + if (errnum == -1) + { + /* No debug info available. Carry on as best we can. */ + return; + } if (errnum != 0) runtime_printf ("%s errno %d\n", msg, errnum); runtime_throw (msg); Index: llgo/trunk/third_party/gofrontend/libgo/runtime/go-map-index.c =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/runtime/go-map-index.c +++ llgo/trunk/third_party/gofrontend/libgo/runtime/go-map-index.c @@ -8,6 +8,7 @@ #include #include "runtime.h" +#include "malloc.h" #include "go-alloc.h" #include "go-assert.h" #include "map.h" @@ -63,7 +64,8 @@ } } - __go_free (old_buckets); + if (old_bucket_count * sizeof (void *) >= TinySize) + __go_free (old_buckets); map->__bucket_count = new_bucket_count; map->__buckets = new_buckets; Index: llgo/trunk/third_party/gofrontend/libgo/runtime/runtime.c =================================================================== --- llgo/trunk/third_party/gofrontend/libgo/runtime/runtime.c +++ llgo/trunk/third_party/gofrontend/libgo/runtime/runtime.c @@ -22,6 +22,10 @@ // gotraceback value. static uint32 traceback_cache = ~(uint32)0; +extern volatile intgo runtime_MemProfileRate + __asm__ (GOSYM_PREFIX "runtime.MemProfileRate"); + + // The GOTRACEBACK environment variable controls the // behavior of a Go program that is crashing and exiting. // GOTRACEBACK=0 suppress all tracebacks @@ -315,6 +319,11 @@ DebugVars runtime_debug; +// Holds variables parsed from GODEBUG env var, +// except for "memprofilerate" since there is an +// existing var for that value which is int +// instead of in32 and might have an +// initial value. static struct { const char* name; int32* value; @@ -349,7 +358,12 @@ for(;;) { for(i=0; i<(intgo)nelem(dbgvar); i++) { n = runtime_findnull((const byte*)dbgvar[i].name); - if(runtime_mcmp(p, dbgvar[i].name, n) == 0 && p[n] == '=') + if(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); } p = (const byte *)runtime_strstr((const char *)p, ","); Index: llgo/trunk/update_third_party.sh =================================================================== --- llgo/trunk/update_third_party.sh +++ llgo/trunk/update_third_party.sh @@ -1,7 +1,7 @@ #!/bin/sh -e gofrontendrepo=https://code.google.com/p/gofrontend -gofrontendrev=07baa07598ea +gofrontendrev=15a24202fa42 gccrepo=svn://gcc.gnu.org/svn/gcc/trunk gccrev=219477