1. 17 Apr, 2017 1 commit
  2. 16 Apr, 2017 3 commits
    • Takuto Ikuta's avatar
      regexp: Use []bool instead of map[uint32]bool in makeOnePass · a306a851
      Takuto Ikuta authored
      Variable m is accessed like variable onePassRunes.
      So, we can use array instead of map for variable m.
      
      Onepass compile performance is improved 10~20%.
      
      name                                      old time/op    new time/op    delta
      CompileOnepass/^(?:(?:(?:.(?:$))?))...-4    4.60µs ± 1%    4.10µs ± 1%  -10.98%  (p=0.008 n=5+5)
      CompileOnepass/^abcd$-4                     3.76µs ± 2%    3.33µs ± 1%  -11.43%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:a{0,})*?)$-4          4.47µs ± 1%    4.14µs ± 1%   -7.49%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:a+)*)$-4              4.07µs ± 1%    3.81µs ± 2%   -6.60%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:a|(?:aa)))$-4         5.21µs ± 1%    4.80µs ± 2%   -7.90%  (p=0.008 n=5+5)
      CompileOnepass/^(?:[^\s\S])$-4              3.26µs ± 1%    3.06µs ± 1%   -6.15%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:(?:a*)+))$-4          4.33µs ± 0%    4.04µs ± 3%   -6.78%  (p=0.008 n=5+5)
      CompileOnepass/^[a-c]+$-4                   3.33µs ± 1%    3.06µs ± 4%   -8.24%  (p=0.008 n=5+5)
      CompileOnepass/^[a-c]*$-4                   3.69µs ± 1%    3.39µs ± 4%   -8.26%  (p=0.008 n=5+5)
      CompileOnepass/^(?:a*)$-4                   3.78µs ± 2%    3.36µs ± 0%  -11.09%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:aa)|a)$-4             5.11µs ± 1%    4.60µs ± 1%   -9.85%  (p=0.008 n=5+5)
      CompileOnepass/^...$-4                      3.51µs ± 1%    3.25µs ± 1%   -7.37%  (p=0.008 n=5+5)
      CompileOnepass/^(?:a|(?:aa))$-4             5.05µs ± 1%    4.59µs ± 1%   -9.13%  (p=0.008 n=5+5)
      CompileOnepass/^a((b))c$-4                  5.24µs ± 1%    4.66µs ± 1%  -11.16%  (p=0.008 n=5+5)
      CompileOnepass/^a.[l-nA-Cg-j]?e$-4          5.94µs ± 7%    5.02µs ± 1%  -15.62%  (p=0.008 n=5+5)
      CompileOnepass/^a((b))$-4                   5.34µs ± 7%    4.21µs ± 2%  -21.05%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:(b)|(c))c$-4            7.25µs ± 7%    5.86µs ± 1%  -19.17%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:b|c)$-4                 4.13µs ± 9%    3.35µs ± 1%  -18.99%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:b?|c)$-4                6.48µs ± 4%    5.05µs ± 1%  -22.16%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:b?|c+)$-4               7.05µs ± 7%    5.48µs ± 1%  -22.21%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:bc)+$-4                 4.71µs ± 4%    3.85µs ± 0%  -18.14%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:[bcd])+$-4              4.10µs ± 2%    3.69µs ± 1%   -9.98%  (p=0.008 n=5+5)
      CompileOnepass/^a((?:[bcd])+)$-4            5.20µs ± 1%    4.59µs ± 0%  -11.72%  (p=0.008 n=5+5)
      CompileOnepass/^a(:?b|c)*d$-4               9.29µs ± 2%    8.23µs ± 1%  -11.43%  (p=0.008 n=5+5)
      CompileOnepass/^.bc(d|e)*$-4                6.33µs ± 3%    5.51µs ± 5%  -12.95%  (p=0.008 n=5+5)
      CompileOnepass/^loooooooooooooooooo...-4     162µs ± 0%     138µs ± 2%  -14.70%  (p=0.008 n=5+5)
      
      name                                      old alloc/op   new alloc/op   delta
      CompileOnepass/^(?:(?:(?:.(?:$))?))...-4    3.38kB ± 0%    3.27kB ± 0%   -3.08%  (p=0.008 n=5+5)
      CompileOnepass/^abcd$-4                     2.74kB ± 0%    2.59kB ± 0%   -5.54%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:a{0,})*?)$-4          3.34kB ± 0%    3.23kB ± 0%   -3.12%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:a+)*)$-4              2.95kB ± 0%    2.85kB ± 0%   -3.52%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:a|(?:aa)))$-4         3.74kB ± 0%    3.58kB ± 0%   -4.07%  (p=0.008 n=5+5)
      CompileOnepass/^(?:[^\s\S])$-4              2.45kB ± 0%    2.35kB ± 0%   -4.20%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:(?:a*)+))$-4          3.13kB ± 0%    3.02kB ± 0%   -3.32%  (p=0.008 n=5+5)
      CompileOnepass/^[a-c]+$-4                   2.48kB ± 0%    2.38kB ± 0%   -4.19%  (p=0.008 n=5+5)
      CompileOnepass/^[a-c]*$-4                   2.52kB ± 0%    2.42kB ± 0%   -4.13%  (p=0.008 n=5+5)
      CompileOnepass/^(?:a*)$-4                   2.63kB ± 0%    2.53kB ± 0%   -3.95%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:aa)|a)$-4             3.62kB ± 0%    3.47kB ± 0%   -4.19%  (p=0.008 n=5+5)
      CompileOnepass/^...$-4                      2.87kB ± 0%    2.78kB ± 0%   -3.34%  (p=0.008 n=5+5)
      CompileOnepass/^(?:a|(?:aa))$-4             3.62kB ± 0%    3.47kB ± 0%   -4.19%  (p=0.008 n=5+5)
      CompileOnepass/^a((b))c$-4                  4.38kB ± 0%    4.23kB ± 0%   -3.33%  (p=0.008 n=5+5)
      CompileOnepass/^a.[l-nA-Cg-j]?e$-4          4.30kB ± 0%    4.15kB ± 0%   -3.35%  (p=0.008 n=5+5)
      CompileOnepass/^a((b))$-4                   4.05kB ± 0%    3.90kB ± 0%   -3.56%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:(b)|(c))c$-4            5.30kB ± 0%    5.05kB ± 0%   -4.83%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:b|c)$-4                 2.87kB ± 0%    2.77kB ± 0%   -3.62%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:b?|c)$-4                4.35kB ± 0%    4.21kB ± 0%   -3.31%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:b?|c+)$-4               4.58kB ± 0%    4.44kB ± 0%   -3.14%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:bc)+$-4                 3.15kB ± 0%    3.00kB ± 0%   -4.82%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:[bcd])+$-4              2.94kB ± 0%    2.84kB ± 0%   -3.53%  (p=0.008 n=5+5)
      CompileOnepass/^a((?:[bcd])+)$-4            4.08kB ± 0%    3.94kB ± 0%   -3.53%  (p=0.008 n=5+5)
      CompileOnepass/^a(:?b|c)*d$-4               6.10kB ± 0%    5.85kB ± 0%   -4.19%  (p=0.008 n=5+5)
      CompileOnepass/^.bc(d|e)*$-4                4.46kB ± 0%    4.31kB ± 0%   -3.28%  (p=0.008 n=5+5)
      CompileOnepass/^loooooooooooooooooo...-4     135kB ± 0%     127kB ± 0%   -5.88%  (p=0.008 n=5+5)
      
      name                                      old allocs/op  new allocs/op  delta
      CompileOnepass/^(?:(?:(?:.(?:$))?))...-4      47.0 ± 0%      46.0 ± 0%   -2.13%  (p=0.008 n=5+5)
      CompileOnepass/^abcd$-4                       41.0 ± 0%      40.0 ± 0%   -2.44%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:a{0,})*?)$-4            49.0 ± 0%      48.0 ± 0%   -2.04%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:a+)*)$-4                44.0 ± 0%      43.0 ± 0%   -2.27%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:a|(?:aa)))$-4           54.0 ± 0%      53.0 ± 0%   -1.85%  (p=0.008 n=5+5)
      CompileOnepass/^(?:[^\s\S])$-4                33.0 ± 0%      32.0 ± 0%   -3.03%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:(?:a*)+))$-4            46.0 ± 0%      45.0 ± 0%   -2.17%  (p=0.008 n=5+5)
      CompileOnepass/^[a-c]+$-4                     36.0 ± 0%      35.0 ± 0%   -2.78%  (p=0.008 n=5+5)
      CompileOnepass/^[a-c]*$-4                     41.0 ± 0%      40.0 ± 0%   -2.44%  (p=0.008 n=5+5)
      CompileOnepass/^(?:a*)$-4                     42.0 ± 0%      41.0 ± 0%   -2.38%  (p=0.008 n=5+5)
      CompileOnepass/^(?:(?:aa)|a)$-4               53.0 ± 0%      52.0 ± 0%   -1.89%  (p=0.008 n=5+5)
      CompileOnepass/^...$-4                        39.0 ± 0%      38.0 ± 0%   -2.56%  (p=0.008 n=5+5)
      CompileOnepass/^(?:a|(?:aa))$-4               53.0 ± 0%      52.0 ± 0%   -1.89%  (p=0.008 n=5+5)
      CompileOnepass/^a((b))c$-4                    53.0 ± 0%      52.0 ± 0%   -1.89%  (p=0.008 n=5+5)
      CompileOnepass/^a.[l-nA-Cg-j]?e$-4            56.0 ± 0%      55.0 ± 0%   -1.79%  (p=0.008 n=5+5)
      CompileOnepass/^a((b))$-4                     47.0 ± 0%      46.0 ± 0%   -2.13%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:(b)|(c))c$-4              65.0 ± 0%      64.0 ± 0%   -1.54%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:b|c)$-4                   40.0 ± 0%      39.0 ± 0%   -2.50%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:b?|c)$-4                  57.0 ± 0%      56.0 ± 0%   -1.75%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:b?|c+)$-4                 63.0 ± 0%      62.0 ± 0%   -1.59%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:bc)+$-4                   46.0 ± 0%      45.0 ± 0%   -2.17%  (p=0.008 n=5+5)
      CompileOnepass/^a(?:[bcd])+$-4                43.0 ± 0%      42.0 ± 0%   -2.33%  (p=0.008 n=5+5)
      CompileOnepass/^a((?:[bcd])+)$-4              49.0 ± 0%      48.0 ± 0%   -2.04%  (p=0.008 n=5+5)
      CompileOnepass/^a(:?b|c)*d$-4                  101 ± 0%       100 ± 0%   -0.99%  (p=0.008 n=5+5)
      CompileOnepass/^.bc(d|e)*$-4                  60.0 ± 0%      59.0 ± 0%   -1.67%  (p=0.008 n=5+5)
      CompileOnepass/^loooooooooooooooooo...-4     1.09k ± 0%     1.08k ± 0%   -0.74%  (p=0.008 n=5+5)
      
      Fixes #19984
      
      Change-Id: I2268b28d068926a057c62751528de15b6de61a7b
      Reviewed-on: https://go-review.googlesource.com/40890Reviewed-by: default avatarRalph Corderoy <ralph@inputplus.co.uk>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      a306a851
    • Andreas Auernhammer's avatar
      vendor: update golang_org/x/net/route package · d71863ad
      Andreas Auernhammer authored
      Update the route package to git rev 6b27048a.
      
      Introduce the following changes:
       - 6b27048 route: drop support for go1.5
       - b7fd658 route: fix typo
       - 41bba8d route: add support for the manipulation of routing informaion
      
      Updates #19967
      
      Change-Id: Id2bb93df97a45254a2df2b048db0143e3e52bbdf
      Reviewed-on: https://go-review.googlesource.com/40830
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      d71863ad
    • Josh Bleecher Snyder's avatar
      cmd/compile: remove flag_largemodel · 0e4824aa
      Josh Bleecher Snyder authored
      It was added in 2013 in CL 7064048.
      All uses of it in the compiler disappeared with
      (or possibly before) the SSA backend.
      Several releases have gone by without it,
      from which I conclude that it is now not needed.
      
      Change-Id: I2095f4ac05d4d7ab998168993a7fd5d954aeee88
      Reviewed-on: https://go-review.googlesource.com/40856
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      0e4824aa
  3. 15 Apr, 2017 4 commits
  4. 14 Apr, 2017 8 commits
    • Caleb Spare's avatar
      testing: add TB.Helper to better support test helpers · bc293137
      Caleb Spare authored
      This CL implements the proposal at
      https://github.com/golang/proposal/blob/master/design/4899-testing-helper.md.
      
      It's based on Josh's CL 79890043 from a few years ago:
      https://codereview.appspot.com/79890043 but makes several changes,
      most notably by using the new CallersFrames API so that it works with
      mid-stack inlining.
      
      Another detail came up while I was working on this: I didn't want the
      user to be able to call t.Helper from inside their TestXxx function
      directly (which would mean we'd print a file:line from inside the
      testing package itself), so I explicitly prevented this from working.
      
      Fixes #4899.
      
      Change-Id: I37493edcfb63307f950442bbaf993d1589515310
      Reviewed-on: https://go-review.googlesource.com/38796
      Run-TryBot: Caleb Spare <cespare@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      bc293137
    • Alberto Donizetti's avatar
      cmd/compile: add test for Issue 12536 · 6266b0f0
      Alberto Donizetti authored
      The fixedbugs/issue12536.go file was erroneously deleted just before
      committing the patch that fixed the issue (CL 14400).
      
      That's an easy test and there's a small reproducer in the issue, add
      it back.
      
      Updates #12536
      
      Change-Id: Ib7b0cd245588299e9a5469e1d75805fd0261ce1a
      Reviewed-on: https://go-review.googlesource.com/40712Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      6266b0f0
    • Andreas Auernhammer's avatar
      vendor: update golang_org/x/crypto packages · 3b6ecdf9
      Andreas Auernhammer authored
      Update the poly1305 and curve25519 packages to the current state of /x/crypto.
      
      Updates #19967
      
      Change-Id: Ib71534f78040f31bfd5debb06f3c4a54a77955b3
      Reviewed-on: https://go-review.googlesource.com/40711Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      Run-TryBot: Ian Lance Taylor <iant@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      3b6ecdf9
    • David Lazar's avatar
      runtime/trace: iterate over frames instead of PCs · 3249cb0a
      David Lazar authored
      Now the runtime/trace tests pass with -l=4.
      
      This also gets rid of the frames cache for multiple reasons:
      
      1) The frames cache was used to avoid repeated calls to funcname and
      funcline. Now these calls happen inside the CallersFrames iterator.
      
      2) Maintaining a frames cache is harder: map[uintptr]traceFrame
      doesn't work since each PC can map to multiple traceFrames.
      
      3) It's not clear that the cache is important.
      
      Change-Id: I2914ac0b3ba08e39b60149d99a98f9f532b35bbb
      Reviewed-on: https://go-review.googlesource.com/40591
      Run-TryBot: David Lazar <lazard@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarAustin Clements <austin@google.com>
      3249cb0a
    • David Lazar's avatar
      runtime/trace: better output when test fails · a7276742
      David Lazar authored
      Change-Id: I108d15eb4cd25904bb76de4ed7548c039c69d1a3
      Reviewed-on: https://go-review.googlesource.com/40590
      Run-TryBot: David Lazar <lazard@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarAustin Clements <austin@google.com>
      a7276742
    • Mikio Hara's avatar
      net: validate network in Dial{,IP} and Listen{Packet,IP} for IP networks · 7337181d
      Mikio Hara authored
      The argument of the first parameter for connection setup functions on
      IP networks must contain a protocol name or number. This change adds
      validation for arguments of IP networks to connection setup functions.
      
      Fixes #18185.
      
      Change-Id: I6aaedd7806e3ed1043d4b1c834024f350b99361d
      Reviewed-on: https://go-review.googlesource.com/40512
      Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      7337181d
    • Mikio Hara's avatar
      net: don't enclose non-literal IPv6 addresses in square brackets · dc74f51c
      Mikio Hara authored
      The net package uses various textual representations for network
      identifiers and locators on the Internet protocol suite as API.
      In fact, the representations are the composition of subset of multple
      RFCs: RFC 3986, RFC 4007, RFC 4632, RFC 4291 and RFC 5952.
      
      RFC 4007 describes guidelines for the use of textual representation of
      IPv6 addressing/routing scope zone and doesn't prohibit the format for
      implementation dependent purposes, as in, specifying a literal IPv6
      address and its connected region of routing topology as application
      user interface. However, a non-literal IPv6 address, for example, a
      host name, with a zone enclosed in square brackets confuses us because
      a zone is basically for non-global IPv6 addresses and a pair of square
      brackets is used as a set of delimiters between a literal IPv6 address
      and a service name or transport port number.
      
      To mitigate such confusion, this change makes JoinHostPort not enclose
      non-literal IPv6 addresses in square brackets and SplitHostPort accept
      the form "host%zone:port" to recommend that anything enclosed in
      square brackets should be a literal IPv6 address.
      
      Before this change:
      	JoinHostPort("name%zone", "80") = "[name%zone]:80"
      	JoinHostPort("[::1%zone]", "80") = "[::1%zone]:80"
      	SplitHostPort("name%zone:80") = "", "", "address name%zone:80: missing brackets in address"
      	SplitHostPort("[name%zone]:80") = "name%zone", "80", nil
      	SplitHostPort("[::1%zone]:80") = "::1%zone", "80", nil
      
      After this change:
      	JoinHostPort("name%zone", "80") = "name%zone:80"
      	JoinHostPort("[::1%zone]", "80") = "[::1%zone]:80"
      	SplitHostPort("name%zone:80") = "name%zone", "80", nil
      	SplitHostPort("[name%zone]:80") = "name%zone", "80", nil // for backwards compatibility
      	SplitHostPort("[::1%zone]:80") = "::1%zone", "80", nil
      
      Also updates docs and test cases on SplitHostPort and JoinHostPort for
      clarification.
      
      Fixes #18059.
      Fixes #18060.
      
      Change-Id: I5c3ccce4fa0fbdd58f698fc280635ea4a14d2a37
      Reviewed-on: https://go-review.googlesource.com/40510
      Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      dc74f51c
    • Wei Xiao's avatar
      cmd/dist: fix incorrect platform string shared by all tests · 1cf6d474
      Wei Xiao authored
      all tests currently share the same platform string and fail to
      vet expected platforms
      
      Fixes #19958
      
      Change-Id: I2801e1e84958e31975769581e27ea5ca6a0edf5b
      Reviewed-on: https://go-review.googlesource.com/40511
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      1cf6d474
  5. 13 Apr, 2017 24 commits
    • Jess Frazelle's avatar
      syscall: fix TestGroupCleanup{UserNamespace} on Alpine · 75176947
      Jess Frazelle authored
      This updates TestGroupCleanup and TestGroupCleanupUserNamespace to pass in the
      Alpine builder.
      
      Updates #19938
      
      Change-Id: Iacbfd73782eccd57f872f9e85726c6024529c277
      Reviewed-on: https://go-review.googlesource.com/40692Reviewed-by: default avatarDaniel Martí <mvdan@mvdan.cc>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      75176947
    • Michael Munday's avatar
      cmd/compile: fix s390x unsigned comparison constant merging rules · f75b5e99
      Michael Munday authored
      On s390x unsigned integer comparisons with immediates require the immediate
      to be an unsigned 32-bit integer. The rule was checking that the immediate
      was a signed 32-bit integer.
      
      This CL also adds a test for comparisons that could be turned into compare
      with immediate or equivalent instructions (depending on architecture and
      optimizations applied).
      
      Fixes #19940.
      
      Change-Id: Ifd6aa989fd3d50e282f7d30fec9db462c28422b1
      Reviewed-on: https://go-review.googlesource.com/40433
      Run-TryBot: Michael Munday <munday@ca.ibm.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarDavid Chase <drchase@google.com>
      f75b5e99
    • Brad Fitzpatrick's avatar
      test: disable flaky test/fixedbugs/issue10958.go · dc09a7af
      Brad Fitzpatrick authored
      Updates #18589
      
      Change-Id: I2c3bbc8257c68295051bd2e63e1e11794d0609c3
      Reviewed-on: https://go-review.googlesource.com/40651
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      Reviewed-by: default avatarJosh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarDavid Chase <drchase@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      dc09a7af
    • Austin Clements's avatar
      runtime: free workbufs during sweeping · 051809e3
      Austin Clements authored
      This extends the sweeper to free workbufs back to the heap between GC
      cycles, allowing this memory to be reused for GC'd allocations or
      eventually returned to the OS.
      
      This helps for applications that have high peak heap usage relative to
      their regular heap usage (for example, a high-memory initialization
      phase). Workbuf memory is roughly proportional to heap size and since
      we currently never free workbufs, it's proportional to *peak* heap
      size. By freeing workbufs, we can release and reuse this memory for
      other purposes when the heap shrinks.
      
      This is somewhat complicated because this costs ~1–2 µs per workbuf
      span, so for large heaps it's too expensive to just do synchronously
      after mark termination between starting the world and dropping the
      worldsema. Hence, we do it asynchronously in the sweeper. This adds a
      list of "free" workbuf spans that can be returned to the heap. GC
      moves all workbuf spans to this list after mark termination and the
      background sweeper drains this list back to the heap. If the sweeper
      doesn't finish, that's fine, since getempty can directly reuse any
      remaining spans to allocate more workbufs.
      
      Performance impact is negligible. On the x/benchmarks, this reduces
      GC-bytes-from-system by 6–11%.
      
      Fixes #19325.
      
      Change-Id: Icb92da2196f0c39ee984faf92d52f29fd9ded7a8
      Reviewed-on: https://go-review.googlesource.com/38582
      Run-TryBot: Austin Clements <austin@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRick Hudson <rlh@golang.org>
      051809e3
    • Austin Clements's avatar
      runtime: allocate GC workbufs from manually-managed spans · 9cc883a4
      Austin Clements authored
      Currently the runtime allocates workbufs from persistent memory, which
      means they can never be freed.
      
      Switch to allocating them from manually-managed heap spans. This
      doesn't free them yet, but it puts us in a position to do so.
      
      For #19325.
      
      Change-Id: I94b2512a2f2bbbb456cd9347761b9412e80d2da9
      Reviewed-on: https://go-review.googlesource.com/38581
      Run-TryBot: Austin Clements <austin@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRick Hudson <rlh@golang.org>
      9cc883a4
    • Austin Clements's avatar
      runtime: eliminate write barriers from alloc/mark bitmaps · 42c12147
      Austin Clements authored
      This introduces a new type, *gcBits, to use for alloc/mark bitmap
      allocations instead of *uint8. This type is marked go:notinheap, so
      uses of it correctly eliminate write barriers. Since we now have a
      type, this also extracts some common operations to methods both for
      convenience and to avoid (*uint8) casts at most use sites.
      
      For #19325.
      
      Change-Id: Id51f734fb2e96b8b7715caa348c8dcd4aef0696a
      Reviewed-on: https://go-review.googlesource.com/38580
      Run-TryBot: Austin Clements <austin@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRick Hudson <rlh@golang.org>
      42c12147
    • Austin Clements's avatar
      runtime: rename gcBits -> gcBitsArena · 9d1b2f88
      Austin Clements authored
      This clarifies that the gcBits type is actually an arena of gcBits and
      will let us introduce a new gcBits type representing a single
      mark/alloc bitmap allocated from the arena.
      
      For #19325.
      
      Change-Id: Idedf76d202d9174a17c61bcca9d5539e042e2445
      Reviewed-on: https://go-review.googlesource.com/38579
      Run-TryBot: Austin Clements <austin@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRick Hudson <rlh@golang.org>
      9d1b2f88
    • Austin Clements's avatar
      runtime: don't count manually-managed spans from heap_{inuse,sys} · dc0f0ab7
      Austin Clements authored
      Currently, manually-managed spans are included in memstats.heap_inuse
      and memstats.heap_sys, but when we export these stats to the user, we
      subtract out how much has been allocated for stack spans from both.
      This works for now because stacks are the only manually-managed spans
      we have.
      
      However, we're about to use manually-managed spans for more things
      that don't necessarily have obvious stats we can use to adjust the
      user-presented numbers. Prepare for this by changing the accounting so
      manually-managed spans don't count toward heap_inuse or heap_sys. This
      makes these fields align with the fields presented to the user and
      means we don't have to track more statistics just so we can adjust
      these statistics.
      
      For #19325.
      
      Change-Id: I5cb35527fd65587ff23339276ba2c3969e2ad98f
      Reviewed-on: https://go-review.googlesource.com/38577
      Run-TryBot: Austin Clements <austin@google.com>
      Reviewed-by: default avatarRick Hudson <rlh@golang.org>
      dc0f0ab7
    • Austin Clements's avatar
      runtime: generalize {alloc,free}Stack to {alloc,free}Manual · 407c56ae
      Austin Clements authored
      We're going to start using manually-managed spans for GC workbufs, so
      rename the allocate/free methods and pass in a pointer to the stats to
      use instead of using the stack stats directly.
      
      For #19325.
      
      Change-Id: I37df0147ae5a8e1f3cb37d59c8e57a1fcc6f2980
      Reviewed-on: https://go-review.googlesource.com/38576
      Run-TryBot: Austin Clements <austin@google.com>
      Reviewed-by: default avatarRick Hudson <rlh@golang.org>
      407c56ae
    • Austin Clements's avatar
      runtime: rename mspan.stackfreelist -> manualFreeList · ab9db51e
      Austin Clements authored
      We're going to use this free list for other types of manually-managed
      memory in the heap.
      
      For #19325.
      
      Change-Id: Ib7e682295133eabfddf3a84f44db43d937bfdd9c
      Reviewed-on: https://go-review.googlesource.com/38575
      Run-TryBot: Austin Clements <austin@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRick Hudson <rlh@golang.org>
      ab9db51e
    • Austin Clements's avatar
      runtime: rename _MSpanStack -> _MSpanManual · 8fbaa4f7
      Austin Clements authored
      We're about to generalize _MSpanStack to be used for other forms of
      in-heap manual memory management in the runtime. This is an automated
      rename of _MSpanStack to _MSpanManual plus some comment fix-ups.
      
      For #19325.
      
      Change-Id: I1e20a57bb3b87a0d324382f92a3e294ffc767395
      Reviewed-on: https://go-review.googlesource.com/38574
      Run-TryBot: Austin Clements <austin@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRick Hudson <rlh@golang.org>
      8fbaa4f7
    • Josh Bleecher Snyder's avatar
      cmd/compile: emit string symbols during walk · 16df2ccd
      Josh Bleecher Snyder authored
      This avoids needing a mutex to protect stringsym,
      and preserves a consistent ctxt.Data ordering
      in the face of a concurrent backend.
      
      Updates #15756
      
      Change-Id: I775daae11db5db1269533a00f5249e3a03086ffc
      Reviewed-on: https://go-review.googlesource.com/40509
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
      16df2ccd
    • Robert Griesemer's avatar
      spec: clarify size hint for make of maps · b0e5a0c9
      Robert Griesemer authored
      For #19903.
      
      Change-Id: Ib28d08d45bfad653bcc1446f160b7b4a485529af
      Reviewed-on: https://go-review.googlesource.com/40393Reviewed-by: default avatarRob Pike <r@golang.org>
      Reviewed-by: default avatarRuss Cox <rsc@golang.org>
      b0e5a0c9
    • Alberto Donizetti's avatar
      cmd/compile: remove last c-isms from typecheck.go comments · 55b56d2b
      Alberto Donizetti authored
      Change-Id: I0b1ae9d296115000fb30aab39f9eac1200ae68d0
      Reviewed-on: https://go-review.googlesource.com/40451Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      55b56d2b
    • Josh Bleecher Snyder's avatar
      cmd/internal/obj: cache dwarfSym · 7b5f94e7
      Josh Bleecher Snyder authored
      Follow-up to review feedback from
      mdempsky on CL 40507.
      
      Reduces mutex contention by about 1%.
      
      Change-Id: I540ea6772925f4a59e58f55a3458eff15880c328
      Reviewed-on: https://go-review.googlesource.com/40575
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      7b5f94e7
    • Josh Bleecher Snyder's avatar
      cmd/compile: refactor Linksym · adc80c06
      Josh Bleecher Snyder authored
      Extract a helper function, linksymname.
      This simplifies Linksym,
      and linksymname will be useful in future work.
      
      Change-Id: Ic5ff8b704a16d5020f6931e008e2f630f687cbd3
      Reviewed-on: https://go-review.googlesource.com/40550
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      adc80c06
    • Josh Bleecher Snyder's avatar
      cmd/internal/obj: generate function DWARF symbols early · 4e4e51c5
      Josh Bleecher Snyder authored
      This removes a concurrent access of ctxt.Data.
      
      Updates #15756
      
      Change-Id: Id017e90e47e093cd8825907f3853bb3d3bf8280d
      Reviewed-on: https://go-review.googlesource.com/40507
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
      4e4e51c5
    • Josh Bleecher Snyder's avatar
      cmd/vet/all: print all unparseable lines · 7fa3b79c
      Josh Bleecher Snyder authored
      In my experience, this usually happens when vet panics.
      Dumping all unparseable lines should help diagnosis.
      
      Inspired by the trybot failures in CL 40511.
      
      Change-Id: Ib73e8c8b2942832589c3cc5d33ef35fdafe9965a
      Reviewed-on: https://go-review.googlesource.com/40508Reviewed-by: default avatarRob Pike <r@golang.org>
      7fa3b79c
    • Wei Xiao's avatar
      hash/crc32: optimize arm64 crc32 implementation · ab636b89
      Wei Xiao authored
      ARMv8 defines crc32 instruction.
      
      Comparing to the original crc32 calculation, this patch makes use of
      crc32 instructions to do crc32 calculation instead of the multiple
      lookup table algorithms.
      
      ARMv8 provides IEEE and Castagnoli polynomials for crc32 calculation
      so that the perfomance of these two types of crc32 get significant
      improved.
      
      name                                        old time/op   new time/op    delta
      CRC32/poly=IEEE/size=15/align=0-32            117ns ± 0%      38ns ± 0%   -67.44%
      CRC32/poly=IEEE/size=15/align=1-32            117ns ± 0%      38ns ± 0%   -67.52%
      CRC32/poly=IEEE/size=40/align=0-32            129ns ± 0%      41ns ± 0%   -68.37%
      CRC32/poly=IEEE/size=40/align=1-32            129ns ± 0%      41ns ± 0%   -68.29%
      CRC32/poly=IEEE/size=512/align=0-32           828ns ± 0%     246ns ± 0%   -70.29%
      CRC32/poly=IEEE/size=512/align=1-32           828ns ± 0%     132ns ± 0%   -84.06%
      CRC32/poly=IEEE/size=1kB/align=0-32          1.58µs ± 0%    0.46µs ± 0%   -70.98%
      CRC32/poly=IEEE/size=1kB/align=1-32          1.58µs ± 0%    0.46µs ± 0%   -70.92%
      CRC32/poly=IEEE/size=4kB/align=0-32          6.06µs ± 0%    1.74µs ± 0%   -71.27%
      CRC32/poly=IEEE/size=4kB/align=1-32          6.10µs ± 0%    1.74µs ± 0%   -71.44%
      CRC32/poly=IEEE/size=32kB/align=0-32         48.3µs ± 0%    13.7µs ± 0%   -71.61%
      CRC32/poly=IEEE/size=32kB/align=1-32         48.3µs ± 0%    13.7µs ± 0%   -71.60%
      CRC32/poly=Castagnoli/size=15/align=0-32      116ns ± 0%      38ns ± 0%   -67.07%
      CRC32/poly=Castagnoli/size=15/align=1-32      116ns ± 0%      38ns ± 0%   -66.90%
      CRC32/poly=Castagnoli/size=40/align=0-32      127ns ± 0%      40ns ± 0%   -68.11%
      CRC32/poly=Castagnoli/size=40/align=1-32      127ns ± 0%      40ns ± 0%   -68.11%
      CRC32/poly=Castagnoli/size=512/align=0-32     828ns ± 0%     132ns ± 0%   -84.06%
      CRC32/poly=Castagnoli/size=512/align=1-32     827ns ± 0%     132ns ± 0%   -84.04%
      CRC32/poly=Castagnoli/size=1kB/align=0-32    1.59µs ± 0%    0.22µs ± 0%   -85.89%
      CRC32/poly=Castagnoli/size=1kB/align=1-32    1.58µs ± 0%    0.22µs ± 0%   -85.79%
      CRC32/poly=Castagnoli/size=4kB/align=0-32    6.14µs ± 0%    0.77µs ± 0%   -87.40%
      CRC32/poly=Castagnoli/size=4kB/align=1-32    6.06µs ± 0%    0.77µs ± 0%   -87.25%
      CRC32/poly=Castagnoli/size=32kB/align=0-32   48.3µs ± 0%     5.9µs ± 0%   -87.71%
      CRC32/poly=Castagnoli/size=32kB/align=1-32   48.4µs ± 0%     6.0µs ± 0%   -87.69%
      CRC32/poly=Koopman/size=15/align=0-32         104ns ± 0%     104ns ± 0%    +0.00%
      CRC32/poly=Koopman/size=15/align=1-32         104ns ± 0%     104ns ± 0%    +0.00%
      CRC32/poly=Koopman/size=40/align=0-32         235ns ± 0%     235ns ± 0%    +0.00%
      CRC32/poly=Koopman/size=40/align=1-32         235ns ± 0%     235ns ± 0%    +0.00%
      CRC32/poly=Koopman/size=512/align=0-32       2.71µs ± 0%    2.71µs ± 0%    -0.07%
      CRC32/poly=Koopman/size=512/align=1-32       2.71µs ± 0%    2.71µs ± 0%    -0.04%
      CRC32/poly=Koopman/size=1kB/align=0-32       5.40µs ± 0%    5.39µs ± 0%    -0.06%
      CRC32/poly=Koopman/size=1kB/align=1-32       5.40µs ± 0%    5.40µs ± 0%    +0.02%
      CRC32/poly=Koopman/size=4kB/align=0-32       21.5µs ± 0%    21.5µs ± 0%    -0.16%
      CRC32/poly=Koopman/size=4kB/align=1-32       21.5µs ± 0%    21.5µs ± 0%    -0.05%
      CRC32/poly=Koopman/size=32kB/align=0-32       172µs ± 0%     172µs ± 0%    -0.07%
      CRC32/poly=Koopman/size=32kB/align=1-32       172µs ± 0%     172µs ± 0%    -0.01%
      
      name                                        old speed     new speed      delta
      CRC32/poly=IEEE/size=15/align=0-32          128MB/s ± 0%   394MB/s ± 0%  +207.95%
      CRC32/poly=IEEE/size=15/align=1-32          128MB/s ± 0%   394MB/s ± 0%  +208.09%
      CRC32/poly=IEEE/size=40/align=0-32          310MB/s ± 0%   979MB/s ± 0%  +216.07%
      CRC32/poly=IEEE/size=40/align=1-32          310MB/s ± 0%   979MB/s ± 0%  +216.16%
      CRC32/poly=IEEE/size=512/align=0-32         618MB/s ± 0%  2074MB/s ± 0%  +235.72%
      CRC32/poly=IEEE/size=512/align=1-32         618MB/s ± 0%  3852MB/s ± 0%  +523.55%
      CRC32/poly=IEEE/size=1kB/align=0-32         646MB/s ± 0%  2225MB/s ± 0%  +244.57%
      CRC32/poly=IEEE/size=1kB/align=1-32         647MB/s ± 0%  2225MB/s ± 0%  +243.87%
      CRC32/poly=IEEE/size=4kB/align=0-32         676MB/s ± 0%  2352MB/s ± 0%  +248.02%
      CRC32/poly=IEEE/size=4kB/align=1-32         672MB/s ± 0%  2352MB/s ± 0%  +250.15%
      CRC32/poly=IEEE/size=32kB/align=0-32        678MB/s ± 0%  2387MB/s ± 0%  +252.17%
      CRC32/poly=IEEE/size=32kB/align=1-32        678MB/s ± 0%  2388MB/s ± 0%  +252.11%
      CRC32/poly=Castagnoli/size=15/align=0-32    129MB/s ± 0%   393MB/s ± 0%  +205.51%
      CRC32/poly=Castagnoli/size=15/align=1-32    129MB/s ± 0%   390MB/s ± 0%  +203.41%
      CRC32/poly=Castagnoli/size=40/align=0-32    314MB/s ± 0%   988MB/s ± 0%  +215.04%
      CRC32/poly=Castagnoli/size=40/align=1-32    314MB/s ± 0%   987MB/s ± 0%  +214.68%
      CRC32/poly=Castagnoli/size=512/align=0-32   618MB/s ± 0%  3860MB/s ± 0%  +524.32%
      CRC32/poly=Castagnoli/size=512/align=1-32   619MB/s ± 0%  3859MB/s ± 0%  +523.66%
      CRC32/poly=Castagnoli/size=1kB/align=0-32   645MB/s ± 0%  4568MB/s ± 0%  +608.56%
      CRC32/poly=Castagnoli/size=1kB/align=1-32   650MB/s ± 0%  4567MB/s ± 0%  +602.94%
      CRC32/poly=Castagnoli/size=4kB/align=0-32   667MB/s ± 0%  5297MB/s ± 0%  +693.81%
      CRC32/poly=Castagnoli/size=4kB/align=1-32   676MB/s ± 0%  5297MB/s ± 0%  +684.00%
      CRC32/poly=Castagnoli/size=32kB/align=0-32  678MB/s ± 0%  5519MB/s ± 0%  +713.83%
      CRC32/poly=Castagnoli/size=32kB/align=1-32  677MB/s ± 0%  5497MB/s ± 0%  +712.04%
      CRC32/poly=Koopman/size=15/align=0-32       143MB/s ± 0%   144MB/s ± 0%    +0.27%
      CRC32/poly=Koopman/size=15/align=1-32       143MB/s ± 0%   144MB/s ± 0%    +0.33%
      CRC32/poly=Koopman/size=40/align=0-32       169MB/s ± 0%   170MB/s ± 0%    +0.12%
      CRC32/poly=Koopman/size=40/align=1-32       170MB/s ± 0%   170MB/s ± 0%    +0.08%
      CRC32/poly=Koopman/size=512/align=0-32      189MB/s ± 0%   189MB/s ± 0%    +0.07%
      CRC32/poly=Koopman/size=512/align=1-32      189MB/s ± 0%   189MB/s ± 0%    +0.04%
      CRC32/poly=Koopman/size=1kB/align=0-32      190MB/s ± 0%   190MB/s ± 0%    +0.05%
      CRC32/poly=Koopman/size=1kB/align=1-32      190MB/s ± 0%   190MB/s ± 0%    -0.01%
      CRC32/poly=Koopman/size=4kB/align=0-32      190MB/s ± 0%   190MB/s ± 0%    +0.15%
      CRC32/poly=Koopman/size=4kB/align=1-32      190MB/s ± 0%   191MB/s ± 0%    +0.05%
      CRC32/poly=Koopman/size=32kB/align=0-32     191MB/s ± 0%   191MB/s ± 0%    +0.06%
      CRC32/poly=Koopman/size=32kB/align=1-32     191MB/s ± 0%   191MB/s ± 0%    +0.02%
      
      Also fix a bug of arm64 assembler
      
      The optimization is mainly contributed by Fangming.Fang <fangming.fang@arm.com>
      
      Change-Id: I900678c2e445d7e8ad9e2a9ab3305d649230905f
      Reviewed-on: https://go-review.googlesource.com/40074Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
      Run-TryBot: Cherry Zhang <cherryyz@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      ab636b89
    • Meir Fischer's avatar
      net/http/fcgi: expose cgi env vars in request context · aaf46821
      Meir Fischer authored
      The current interface can't access all environment
      variables directly or via cgi.RequestFromMap, which
      only reads variables on its "white list" to be set on
      the http.Request it returns. If an fcgi variable is
      not on the "white list" - e.g. REMOTE_USER - the old
      code has no access to its value.
      
      This passes variables in the Request context that aren't
      used to add data to the Request itself and adds a method
      that parses those env vars from the Request's context.
      
      Fixes #16546
      
      Change-Id: Ibf933a768b677ece1bb93d7bf99a14cef36ec671
      Reviewed-on: https://go-review.googlesource.com/40012
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      aaf46821
    • Mikio Hara's avatar
      internal/poll: rename RecvFrom to ReadFrom for consistency · 7c3fa418
      Mikio Hara authored
      Also adds missing docs.
      
      Change-Id: Ibd8dbe8441bc7a41f01ed2e2033db98e479a5176
      Reviewed-on: https://go-review.googlesource.com/40412
      Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      7c3fa418
    • Josh Bleecher Snyder's avatar
      cmd/compile: make TestAssembly resilient to output ordering · 0d36999a
      Josh Bleecher Snyder authored
      To preserve reproducible builds, the text entries
      during compilation will be sorted before being printed.
      TestAssembly currently assumes that function init
      comes after all user-defined functions.
      Remove that assumption.
      Instead of looking for "TEXT" to tell you where
      a function ends--which may now yield lots of
      non-function-code junk--look for a line beginning
      with non-whitespace.
      
      Updates #15756
      
      Change-Id: Ibc82dba6143d769ef4c391afc360e523b1a51348
      Reviewed-on: https://go-review.googlesource.com/39853
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
      0d36999a
    • Josh Bleecher Snyder's avatar
      cmd/internal/obj: build ctxt.Text during Sym init · c18fd098
      Josh Bleecher Snyder authored
      Instead of constructing ctxt.Text in Flushplist,
      which will be called concurrently,
      do it in InitTextSym, which must be called serially.
      This allows us to avoid a mutex for ctxt.Text,
      and preserves the existing ordering of functions
      for debug output.
      
      Passes toolstash-check.
      
      Updates #15756
      
      Change-Id: I6322b4da24f9f0db7ba25e5b1b50e8d3be2deb37
      Reviewed-on: https://go-review.googlesource.com/40502
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
      c18fd098
    • Brad Fitzpatrick's avatar
      cmd/dist: don't compile unneeded GOARCH SSA rewrite rules during bootstrap · 9dbba36a
      Brad Fitzpatrick authored
      Speeds up build (the bootstrap phase) by ~6 seconds.
      
      Bootstrap goes from ~18 seconds to ~12 seconds.
      
      Change-Id: I7e2ec8f5fc668bf6168d90098eaf70390b16e479
      Reviewed-on: https://go-review.googlesource.com/40503
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
      9dbba36a