mirror of
https://github.com/golang/go
synced 2024-10-05 01:31:22 -06:00
af74dca497
On s390x char is unsigned. We cannot force it to be signed using -fsigned-char (see arm64) because the s390x gccgo API is already public and we need to stick as closely as possible to it to avoid breaking existing projects. In order to match the gccgo API we also force the RawSockaddr.Data and RawSockaddrUnix.Path fields to be signed. This CL adds a post-processing pass (mkpost.go) to mkall.sh in order to export the types of fields in PtraceRegs on s390x without affecting the API on other platforms. The types of these fields match their counterparts in gccgo. mkpost.go also cleans up the Pad_cgo* fields and X_* fields (these fields are not exported by gccgo currently). It could be extended to add build tags on platforms that need them. Change-Id: I66bdf5b86ec98af70baf666989027bb354df9e3e Reviewed-on: https://go-review.googlesource.com/20961 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
64 lines
1.6 KiB
Go
64 lines
1.6 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 syscall 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, "_")
|
|
|
|
// 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")
|
|
}
|
|
|
|
// 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)
|
|
}
|