mirror of
https://github.com/golang/sys.git
synced 2026-02-09 04:06:04 +03:00
This commit adds linux/s390x support to the unix package. It is based on the changes made to the syscall package in https://golang.org/cl/20961/. It also adds mkpost.go which is used to cleanup the API generated by cgo -godefs. The biggest departure that is made with the syscall package is the use of the -fsigned-char flag to force signed chars. We couldn't do this in the syscall package because of the need to maintain compatibility with the gccgo implementation of the syscall package (gccgo has supported s390x for a longer time than the Go toolchain). The unix package does not have this constraint. Using the -fsigned-char flag makes the API look more like the one generated on amd64 and arm64 and also more consistent with itself (the syscall package represents chars using both int8 and uint8 types, the sys package will only ever use int8). Unfortunately it also means that applications transitioning from the syscall package to the unix package will see a different API on s390x which might be confusing. I think the tradeoff is worth it though. Change-Id: I40b90c18ed787e74ba7a2ebd004bd6bd1ba6279a Reviewed-on: https://go-review.googlesource.com/23045 Reviewed-by: Ian Lance Taylor <iant@golang.org>
63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
// 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.
|
|
|
|
// +build ignore
|
|
|
|
// mkpost processes the output of cgo -godefs to
|
|
// modify the generated types. It is used to clean up
|
|
// the sys API in an architecture specific manner.
|
|
//
|
|
// mkpost is run after cgo -godefs by mkall.sh.
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"go/format"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"regexp"
|
|
)
|
|
|
|
func main() {
|
|
b, err := ioutil.ReadAll(os.Stdin)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
s := string(b)
|
|
|
|
goarch := os.Getenv("GOARCH")
|
|
goos := os.Getenv("GOOS")
|
|
if 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, "_")
|
|
|
|
// Replace other unwanted fields with blank identifiers.
|
|
re = regexp.MustCompile("X_[A-Za-z0-9_]*")
|
|
s = re.ReplaceAllString(s, "_")
|
|
|
|
// Replace the control_regs union with a blank identifier for now.
|
|
re = regexp.MustCompile("(Control_regs)\\s+\\[0\\]uint64")
|
|
s = re.ReplaceAllString(s, "_ [0]uint64")
|
|
}
|
|
|
|
// 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.*)")
|
|
b = re.ReplaceAll(b, []byte("$1 | go run mkpost.go"))
|
|
|
|
fmt.Printf("%s", b)
|
|
}
|