blob: 4f81b81b57e528891f211ebd5aee7ea3b2f23157 [file] [log] [blame]
Dan Willemsen0c157092016-07-08 13:57:52 -07001// Copyright 2016 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Dan Willemsen31b9b842021-08-31 12:51:40 -07005//go:build ignore
Dan Willemsen0c157092016-07-08 13:57:52 -07006
7// mkpost processes the output of cgo -godefs to
8// modify the generated types. It is used to clean up
9// the syscall API in an architecture specific manner.
10//
11// mkpost is run after cgo -godefs by mkall.sh.
12package main
13
14import (
15 "fmt"
16 "go/format"
Colin Cross846c3162021-05-14 11:11:40 -070017 "io"
Dan Willemsen0c157092016-07-08 13:57:52 -070018 "log"
19 "os"
20 "regexp"
Dan Willemsen1d8b74d2017-01-19 15:06:31 -080021 "strings"
Dan Willemsen0c157092016-07-08 13:57:52 -070022)
23
24func main() {
Colin Cross846c3162021-05-14 11:11:40 -070025 b, err := io.ReadAll(os.Stdin)
Dan Willemsen0c157092016-07-08 13:57:52 -070026 if err != nil {
27 log.Fatal(err)
28 }
29 s := string(b)
30
31 goarch := os.Getenv("GOARCH")
32 goos := os.Getenv("GOOS")
Colin Cross1371fe42019-03-19 21:08:48 -070033 switch {
34 case goarch == "s390x" && goos == "linux":
Dan Willemsen0c157092016-07-08 13:57:52 -070035 // Export the types of PtraceRegs fields.
36 re := regexp.MustCompile("ptrace(Psw|Fpregs|Per)")
37 s = re.ReplaceAllString(s, "Ptrace$1")
38
39 // Replace padding fields inserted by cgo with blank identifiers.
40 re = regexp.MustCompile("Pad_cgo[A-Za-z0-9_]*")
41 s = re.ReplaceAllString(s, "_")
42
Dan Willemsen1d8b74d2017-01-19 15:06:31 -080043 // We want to keep X__val in Fsid. Hide it and restore it later.
44 s = strings.Replace(s, "X__val", "MKPOSTFSIDVAL", 1)
45
Dan Willemsen0c157092016-07-08 13:57:52 -070046 // Replace other unwanted fields with blank identifiers.
47 re = regexp.MustCompile("X_[A-Za-z0-9_]*")
48 s = re.ReplaceAllString(s, "_")
49
Dan Willemsen1d8b74d2017-01-19 15:06:31 -080050 // Restore X__val in Fsid.
51 s = strings.Replace(s, "MKPOSTFSIDVAL", "X__val", 1)
52
Dan Willemsen0c157092016-07-08 13:57:52 -070053 // Force the type of RawSockaddr.Data to [14]int8 to match
54 // the existing gccgo API.
55 re = regexp.MustCompile("(Data\\s+\\[14\\])uint8")
56 s = re.ReplaceAllString(s, "${1}int8")
Colin Cross1371fe42019-03-19 21:08:48 -070057
58 case goos == "freebsd":
59 // Keep pre-FreeBSD 10 / non-POSIX 2008 names for timespec fields
60 re := regexp.MustCompile("(A|M|C|Birth)tim\\s+Timespec")
61 s = re.ReplaceAllString(s, "${1}timespec Timespec")
Dan Willemsen0c157092016-07-08 13:57:52 -070062 }
63
64 // gofmt
65 b, err = format.Source([]byte(s))
66 if err != nil {
67 log.Fatal(err)
68 }
69
70 // Append this command to the header to show where the new file
71 // came from.
72 re := regexp.MustCompile("(cgo -godefs [a-zA-Z0-9_]+\\.go.*)")
73 s = re.ReplaceAllString(string(b), "$1 | go run mkpost.go")
74
75 fmt.Print(s)
76}