Source file
src/net/netip/inlining_test.go
1
2
3
4
5 package netip
6
7 import (
8 "internal/testenv"
9 "os/exec"
10 "regexp"
11 "runtime"
12 "strings"
13 "testing"
14 )
15
16 func TestInlining(t *testing.T) {
17 testenv.MustHaveGoBuild(t)
18 t.Parallel()
19 out, err := exec.Command(
20 testenv.GoToolPath(t),
21 "build",
22 "--gcflags=-m",
23 "net/netip").CombinedOutput()
24 if err != nil {
25 t.Fatalf("go build: %v, %s", err, out)
26 }
27 got := map[string]bool{}
28 regexp.MustCompile(` can inline (\S+)`).ReplaceAllFunc(out, func(match []byte) []byte {
29 got[strings.TrimPrefix(string(match), " can inline ")] = true
30 return nil
31 })
32 wantInlinable := []string{
33 "(*uint128).halves",
34 "Addr.BitLen",
35 "Addr.hasZone",
36 "Addr.Is4",
37 "Addr.Is4In6",
38 "Addr.Is6",
39 "Addr.IsInterfaceLocalMulticast",
40 "Addr.IsValid",
41 "Addr.IsUnspecified",
42 "Addr.Less",
43 "Addr.Unmap",
44 "Addr.Zone",
45 "Addr.v4",
46 "Addr.v6",
47 "Addr.v6u16",
48 "Addr.withoutZone",
49 "AddrPortFrom",
50 "AddrPort.Addr",
51 "AddrPort.Port",
52 "AddrPort.IsValid",
53 "Prefix.IsSingleIP",
54 "Prefix.Masked",
55 "Prefix.IsValid",
56 "PrefixFrom",
57 "Prefix.Addr",
58 "Prefix.Bits",
59 "AddrFrom4",
60 "IPv6LinkLocalAllNodes",
61 "IPv6Unspecified",
62 "MustParseAddr",
63 "MustParseAddrPort",
64 "MustParsePrefix",
65 "appendDecimal",
66 "appendHex",
67 "uint128.addOne",
68 "uint128.and",
69 "uint128.bitsClearedFrom",
70 "uint128.bitsSetFrom",
71 "uint128.isZero",
72 "uint128.not",
73 "uint128.or",
74 "uint128.subOne",
75 "uint128.xor",
76 }
77 switch runtime.GOARCH {
78 case "amd64", "arm64":
79
80 wantInlinable = append(wantInlinable,
81 "Addr.AsSlice",
82 "Addr.Next",
83 "Addr.Prev",
84 )
85 }
86
87 for _, want := range wantInlinable {
88 if !got[want] {
89 t.Errorf("%q is no longer inlinable", want)
90 continue
91 }
92 delete(got, want)
93 }
94 for sym := range got {
95 if strings.Contains(sym, ".func") {
96 continue
97 }
98 t.Logf("not in expected set, but also inlinable: %q", sym)
99
100 }
101 }
102
View as plain text