runtime, os: fix the build on Solaris
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 26 Sep 2018 03:29:07 +0000 (03:29 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 26 Sep 2018 03:29:07 +0000 (03:29 +0000)
    Reviewed-on: https://go-review.googlesource.com/137535

From-SVN: r264593

gcc/go/gofrontend/MERGE
libgo/go/os/executable_solaris.go
libgo/go/runtime/os3_solaris.go [new file with mode: 0644]
libgo/go/runtime/stubs3.go

index 485906f78b5270c2923d084dd4b83f43b5774b2a..c306628e34b670bf082b085638f7bdebcb759568 100644 (file)
@@ -1,4 +1,4 @@
-652fbfb7acfd81ceffe28e20984464aa7bb6024d
+e7b98cf0a380eb45791cd5c52897224a686dcdec
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index b145980c5656b625cd47388eaa4ff0e32d5dedf0..a2ad62a891386a201be91b5f0f6d9e8e2ab199e0 100644 (file)
@@ -4,14 +4,18 @@
 
 package os
 
-import "syscall"
+import (
+       "syscall"
+       _ "unsafe" // for go:linkname
+)
 
-var executablePath string // set by sysauxv in ../runtime/os3_solaris.go
+// solarisExecutablePath is defined in the runtime package.
+func solarisExecutablePath() string
 
 var initCwd, initCwdErr = Getwd()
 
 func executable() (string, error) {
-       path := executablePath
+       path := solarisExecutablePath()
        if len(path) == 0 {
                path, err := syscall.Getexecname()
                if err != nil {
diff --git a/libgo/go/runtime/os3_solaris.go b/libgo/go/runtime/os3_solaris.go
new file mode 100644 (file)
index 0000000..c19f797
--- /dev/null
@@ -0,0 +1,54 @@
+// 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.
+
+package runtime
+
+import (
+       "runtime/internal/sys"
+       "unsafe"
+)
+
+var executablePath string
+
+func sysargs(argc int32, argv **byte) {
+       n := argc + 1
+
+       // skip over argv, envp to get to auxv
+       for argv_index(argv, n) != nil {
+               n++
+       }
+
+       // skip NULL separator
+       n++
+
+       // now argv+n is auxv
+       auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*sys.PtrSize))
+       sysauxv(auxv[:])
+}
+
+const (
+       _AT_NULL         = 0    // Terminates the vector
+       _AT_PAGESZ       = 6    // Page size in bytes
+       _AT_SUN_EXECNAME = 2014 // exec() path name
+)
+
+func sysauxv(auxv []uintptr) {
+       for i := 0; auxv[i] != _AT_NULL; i += 2 {
+               tag, val := auxv[i], auxv[i+1]
+               switch tag {
+               case _AT_PAGESZ:
+                       physPageSize = val
+               case _AT_SUN_EXECNAME:
+                       executablePath = gostringnocopy((*byte)(unsafe.Pointer(val)))
+               }
+       }
+}
+
+//go:linkname solarisExecutablePath os.solarisExecutablePath
+
+// solarisExecutablePath is called from the os package to fetch the
+// saved executable path.
+func solarisExecutablePath() string {
+       return executablePath
+}
index 5c0786e411a24ba9dd7777fedd4b4ea43d073758..1af693be2e66852e5703eef68ecada00b43bf479 100644 (file)
@@ -3,7 +3,6 @@
 // license that can be found in the LICENSE file.
 
 // +build !plan9
-// +build !solaris
 // +build !windows
 // +build !nacl
 // +build !freebsd