Source file src/net/netip/inlining_test.go

     1  // Copyright 2020 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  
     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  		// These don't inline on 32-bit.
    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