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.
- TODO: https://golang.org/cl/304470: cmd/compile, runtime: add metadata for argument printing in traceback -
-TODO: complete the Runtime section
+
+ 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 -
- -- TODO: complete the Linker section, or delete if not needed