Go: A Documentary

Go 1.3

Part II · commits first contained in tag go1.3 ^go1.2 (tagged 2014-06-19) · 599 in-scope commits

Contiguous (copied) stacks. Precise stack scanning on by default. Concurrent sweep, tiny allocator, 8K pages. liblink: instruction selection moves from the linkers into the compilers and assemblers, with a new object format. sync.Pool. NaCl and Solaris.

Each area lists the stage every thread reached in this release (with what was left open afterwards), then changes that are not part of a thread. Thread names link to the full thread on its topic page.

Memory management

From Memory management: GC and allocator (Go 1.0–1.17)

Concurrent sweep (3c3be62201), 8K pages, tiny allocator, specials replacing the finalizer table, parallel stack scanning.

Other changes

Scheduler and concurrency

From Scheduler and concurrency runtime (Go 1.0–1.17)

sync.Pool, lock-free local run-queue ring and parallel root marking, precise stacks; threads: Pool, scheduler.

Other changes

Data structures and type metadata

From Runtime data structures and type metadata (Go 1.0–1.17)

Map accessors take key/value by reference, evacuated bit moved into tophash, intra-bucket iteration offset, precise GC reflect.Value (4 words), smarter slice growth, SSE memclr.

Other changes

Diagnostics and knobs

From Diagnostics and knobs (Go 1.0–1.17)

Race calls via assembly thunks rather than cgo (about 40-50% faster); profiling and Goexit fixes.

Other changes

OS layer, stacks and panics

From OS interface, stacks and panics (Go 1.0–1.4)

Contiguous stacks and their bug fixes, VEH on Windows, Solaris and NaCl ports, monotonic clocks, SetPanicOnFault.

Other changes

Compiler frontend

From Compiler frontend (Go 1.1–1.9)

Precise stacks enabled (ecf700b5ee/53061193f1) with temporary-lifetime shortening and compact liveness bitmaps; mparith float-range fixes; -pack, -live.

Other changes

Middle end and SSA optimizer

From Middle end and SSA optimizer (Go 1.0–1.9)

Precise stack liveness drives order/walk: zeroed runtime temporaries and shortened temporary lifetimes (860→23 ambiguously live), uintptr ignored by escape analysis (threads: order/walk, escape analysis).

Other changes

Backends and assemblers

From Backends and assemblers (Go 1.0–1.6)

liblink: assemblers and compilers emit machine code and a new object format; liveness-based stack maps; NaCl and amd64p32; Duff's device in the runtime. Threads: liblink, pointer maps/liveness, NaCl, zeroing/copying.

Other changes

Linker and object files

From Linker and object files (Go 1.0–1.9)

liblink and the object-file reader/writer move instruction selection out of the linker; a Go skeleton cmd/link appears; Solaris and NaCl land.

Other changes