From 2bec019fb5a7d379772c29be6e3487640d43e6fa Mon Sep 17 00:00:00 2001 From: Cherry Mui Date: Thu, 27 May 2021 10:13:00 -0400 Subject: [PATCH] doc/go1.17: add release notes for register ABI Also delete the TODO for the linker section. Updates #44513. Updates #40724. Change-Id: I4d62a907e8c3070831a052cdfe1e21648698df12 Reviewed-on: https://go-review.googlesource.com/c/go/+/323289 Trust: Cherry Mui Reviewed-by: Michael Knyszek Reviewed-by: Jeremy Faller --- doc/go1.17.html | 52 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/doc/go1.17.html b/doc/go1.17.html index 02a58f89844..ee498f76035 100644 --- a/doc/go1.17.html +++ b/doc/go1.17.html @@ -226,31 +226,57 @@ Do not send CLs removing the interior tags from such phrases.

Runtime

-

- TODO: https://golang.org/cl/304470: cmd/compile, runtime: add metadata for argument printing in traceback -

-

TODO: complete the Runtime section

Compiler

-

+

+ Go 1.17 implements a new way of passing function arguments and results using + registers instead of the stack. This work is enabled for Linux, MacOS, and + Windows on the 64-bit x86 architecture (the linux/amd64, + darwin/amd64, windows/amd64 ports). For a + representative set of Go packages and programs, benchmarking has shown + performance improvements of about 5%, and a typical reduction in binary size + of about 2%. +

+

+ This change does not affect the functionality of any safe Go code. It can affect + code outside the compatibility guidelines with + minimal impact. To maintain compatibility with existing assembly functions, + adapter functions converting between the new register-based calling convention + and the previous stack-based calling convention (also known as ABI wrappers) + are sometimes used. This is mostly invisible to users, except for assembly + functions that have their addresses taken in Go. Using reflect.ValueOf(fn).Pointer() + (or similar approaches such as via unsafe.Pointer) to get the address + of an assembly function will now return the address of the ABI wrapper. This is + mostly harmless, except for special-purpose assembly code (such as accessing + thread-local storage or requiring a special stack alignment). Assembly functions + called indirectly from Go via func values will now be made through + ABI wrappers, which may cause a very small performance overhead. Also, calling + Go functions from assembly may now go through ABI wrappers, with a very small + performance overhead. +

+ +

+ The format of stack traces from the runtime (printed when an uncaught panic + occurs, or when runtime.Stack is called) is improved. Previously, + the function arguments were printed as hexadecimal words based on the memory + layout. Now each argument in the source code is printed separately, separated + by commas. Aggregate-typed (struct, array, string, slice, interface, and complex) + arguments are delimited by curly braces. A caveat is that the value of an + argument that only lives in a register and is not stored to memory may be + inaccurate. Results (which were usually inaccurate) are no longer printed. +

+ +

Functions containing closures can now be inlined. One effect of this change is that a function with a closure may actually produce a distinct closure function for each place that the function is inlined. Hence, this change could reveal bugs where Go functions are compared (incorrectly) by pointer value. Go functions are by definition not comparable. - - TODO: complete the Compiler section, or delete if not needed -

- -

Linker

- -

- TODO: complete the Linker section, or delete if not needed

Core library