summaryrefslogtreecommitdiffstats
path: root/src/syscall/mkpost.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/syscall/mkpost.go')
-rw-r--r--src/syscall/mkpost.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/syscall/mkpost.go b/src/syscall/mkpost.go
new file mode 100644
index 0000000..48d3511
--- /dev/null
+++ b/src/syscall/mkpost.go
@@ -0,0 +1,82 @@
+// Copyright 2016 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.
+
+//go:build ignore
+
+// mkpost processes the output of cgo -godefs to
+// modify the generated types. It is used to clean up
+// the syscall API in an architecture specific manner.
+//
+// mkpost is run after cgo -godefs by mkall.sh.
+package main
+
+import (
+ "fmt"
+ "go/format"
+ "io"
+ "log"
+ "os"
+ "regexp"
+ "strings"
+)
+
+func main() {
+ b, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ log.Fatal(err)
+ }
+ s := string(b)
+
+ goarch := os.Getenv("GOARCH")
+ goos := os.Getenv("GOOS")
+ switch {
+ case goarch == "s390x" && goos == "linux":
+ // Export the types of PtraceRegs fields.
+ re := regexp.MustCompile("ptrace(Psw|Fpregs|Per)")
+ s = re.ReplaceAllString(s, "Ptrace$1")
+
+ // Replace padding fields inserted by cgo with blank identifiers.
+ re = regexp.MustCompile("Pad_cgo[A-Za-z0-9_]*")
+ s = re.ReplaceAllString(s, "_")
+
+ // We want to keep the X_ fields that are already consistently exported
+ // for the other linux GOARCH settings.
+ // Hide them and restore later.
+ s = strings.Replace(s, "X__val", "MKPOSTFSIDVAL", 1)
+ s = strings.Replace(s, "X__ifi_pad", "MKPOSTIFIPAD", 1)
+ s = strings.Replace(s, "X_f", "MKPOSTSYSINFOTF", 1)
+
+ // Replace other unwanted fields with blank identifiers.
+ re = regexp.MustCompile("X_[A-Za-z0-9_]*")
+ s = re.ReplaceAllString(s, "_")
+
+ // Restore preserved fields.
+ s = strings.Replace(s, "MKPOSTFSIDVAL", "X__val", 1)
+ s = strings.Replace(s, "MKPOSTIFIPAD", "X__ifi_pad", 1)
+ s = strings.Replace(s, "MKPOSTSYSINFOTF", "X_f", 1)
+
+ // Force the type of RawSockaddr.Data to [14]int8 to match
+ // the existing gccgo API.
+ re = regexp.MustCompile("(Data\\s+\\[14\\])uint8")
+ s = re.ReplaceAllString(s, "${1}int8")
+
+ case goos == "freebsd":
+ // Keep pre-FreeBSD 10 / non-POSIX 2008 names for timespec fields
+ re := regexp.MustCompile("(A|M|C|Birth)tim\\s+Timespec")
+ s = re.ReplaceAllString(s, "${1}timespec Timespec")
+ }
+
+ // gofmt
+ b, err = format.Source([]byte(s))
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Append this command to the header to show where the new file
+ // came from.
+ re := regexp.MustCompile("(cgo -godefs [a-zA-Z0-9_]+\\.go.*)")
+ s = re.ReplaceAllString(string(b), "$1 | go run mkpost.go")
+
+ fmt.Print(s)
+}