mirror of
https://github.com/golang/go.git
synced 2025-05-05 07:33:00 +00:00
Enable inlining tail calls and do not limit emitting tail calls only to the non-inlineable methods when generating wrappers. This change produces additional code size reduction. Code size difference measured with this change (tried for x86_64): etcd binary: .text section size: 10613393 -> 10593841 (0.18%) total binary size: 33450787 -> 33424307 (0.07%) compile binary: .text section size: 10171025 -> 10126545 (0.43%) total binary size: 28241012 -> 28192628 (0.17%) cockroach binary: .text section size: 83947260 -> 83694140 (0.3%) total binary size: 263799808 -> 263534160 (0.1%) Change-Id: I694f83cb838e64bd4c51f05b7b9f2bf0193bb551 Reviewed-on: https://go-review.googlesource.com/c/go/+/650455 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Keith Randall <khr@golang.org> Auto-Submit: Keith Randall <khr@golang.org>
28 lines
760 B
Go
28 lines
760 B
Go
// errorcheck -0 -d=tailcall=1
|
|
|
|
// Copyright 2024 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 p
|
|
|
|
// Test that when generating wrappers for methods, we generate a tail call to the pointer version of
|
|
// the method.
|
|
|
|
func (f *Foo) Get2Vals() [2]int { return [2]int{f.Val, f.Val + 1} }
|
|
func (f *Foo) Get3Vals() (int, int, int) { return f.Val, f.Val + 1, f.Val + 2 }
|
|
|
|
type Foo struct{ Val int }
|
|
|
|
type Bar struct { // ERROR "tail call emitted for the method \(\*Foo\).Get2Vals wrapper" "tail call emitted for the method \(\*Foo\).Get3Vals wrapper"
|
|
int64
|
|
*Foo // needs a method wrapper
|
|
string
|
|
}
|
|
|
|
var i any
|
|
|
|
func init() {
|
|
i = Bar{1, nil, "first"}
|
|
}
|