| // Copyright 2020 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. | |
| package netip | |
| import ( | |
| "internal/testenv" | |
| "os/exec" | |
| "regexp" | |
| "runtime" | |
| "strings" | |
| "testing" | |
| ) | |
| func TestInlining(t *testing.T) { | |
| testenv.MustHaveGoBuild(t) | |
| t.Parallel() | |
| out, err := exec.Command( | |
| testenv.GoToolPath(t), | |
| "build", | |
| "--gcflags=-m", | |
| "net/netip").CombinedOutput() | |
| if err != nil { | |
| t.Fatalf("go build: %v, %s", err, out) | |
| } | |
| got := map[string]bool{} | |
| regexp.MustCompile(` can inline (\S+)`).ReplaceAllFunc(out, func(match []byte) []byte { | |
| got[strings.TrimPrefix(string(match), " can inline ")] = true | |
| return nil | |
| }) | |
| wantInlinable := []string{ | |
| "(*uint128).halves", | |
| "Addr.BitLen", | |
| "Addr.hasZone", | |
| "Addr.Is4", | |
| "Addr.Is4In6", | |
| "Addr.Is6", | |
| "Addr.IsInterfaceLocalMulticast", | |
| "Addr.IsValid", | |
| "Addr.IsUnspecified", | |
| "Addr.Less", | |
| "Addr.Unmap", | |
| "Addr.Zone", | |
| "Addr.v4", | |
| "Addr.v6", | |
| "Addr.v6u16", | |
| "Addr.withoutZone", | |
| "AddrPortFrom", | |
| "AddrPort.Addr", | |
| "AddrPort.Port", | |
| "AddrPort.IsValid", | |
| "Prefix.IsSingleIP", | |
| "Prefix.Masked", | |
| "Prefix.IsValid", | |
| "PrefixFrom", | |
| "Prefix.Addr", | |
| "Prefix.Bits", | |
| "AddrFrom4", | |
| "IPv6LinkLocalAllNodes", | |
| "IPv6Unspecified", | |
| "MustParseAddr", | |
| "MustParseAddrPort", | |
| "MustParsePrefix", | |
| "appendDecimal", | |
| "appendHex", | |
| "uint128.addOne", | |
| "uint128.and", | |
| "uint128.bitsClearedFrom", | |
| "uint128.bitsSetFrom", | |
| "uint128.isZero", | |
| "uint128.not", | |
| "uint128.or", | |
| "uint128.subOne", | |
| "uint128.xor", | |
| } | |
| switch runtime.GOARCH { | |
| case "amd64", "arm64", "loong64": | |
| // These don't inline on 32-bit. | |
| wantInlinable = append(wantInlinable, | |
| "Addr.AsSlice", | |
| "Addr.Next", | |
| "Addr.Prev", | |
| ) | |
| } | |
| for _, want := range wantInlinable { | |
| if !got[want] { | |
| t.Errorf("%q is no longer inlinable", want) | |
| continue | |
| } | |
| delete(got, want) | |
| } | |
| for sym := range got { | |
| if strings.Contains(sym, ".func") { | |
| continue | |
| } | |
| t.Logf("not in expected set, but also inlinable: %q", sym) | |
| } | |
| } |