Go 1.27
Generic methods. Size-specialized malloc on. Goroutine-leak profile by default. asynctimerchan and gotypesalias removed. mapsplitgroup experiment. Known-bits and LICM passes. Switch lookup tables. NEON, wasm and portable SIMD. Promoted fields as composite-literal keys.
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 Runtime: memory allocator and garbage collector (Go 1.18–1.28)
- Green Tea: span-based marking with vector scan kernels — Done: kernel hardening: symbol names (
d8d2b90a46), retpoline-safe assembly (8572b1cfea), requiring POPCNT for GOAMD64=v1 (45929774c3), and requiring AVX512DQ forKMOVB(661aadb7c4). Left open: nothing noted. - Heap bitmap rewrite and allocation headers — Done: the small all-pointer-array fast path computed scan size as only the first pointer; fixed (
40a10063e8). Left open: nothing noted. - mallocgc decomposition and size-specialized malloc — Done: turned off at cycle start for “regressions in overall icache footprint at scale” (
4af8ad24ee); the go1.26.0 tag shipped with it off via a release-branch cherry-pick. Then: tiny functions consolidated (9936a78b78); the fast path split (75560e67c9,15f44ffcc3); benchmarks (15129eb73b,24e654197a); classes >128 B and then >class 7 dropped (55089b9e27,694604e524); dead race/valgrind branches removed (0a151acad8,bfbbe9667e); refactors (722ee60825,15fd4ff942,c410b4944e,fe4da8e5c5); generator fixes (9301a3eab2,b23aea0c94,2378242315);acquiremacross the fast path (63b51fc270). Routing heap-bits-in-span through the slow path was tried and reverted as slower (dd1da37fa4,01d183b000). Re-enabled by default (2a93576965). Left open: “We may want to test moving the boundary even lower” (55089b9e27).freegcfor pointerful objects is disabled under specialization (TODO infreegcat HEAD). - Allocation publication, zeroing and preemptibility — Done: a preemptible
memclrNoHeapPointersPreemptiblefor large pointer-freeclear()and allocations, chunked at 256 KB, landed (50126a8e44). A stack-pointer fix followed (cd2fa3b48d). Both were reverted because preemptible clears “expose existing unsafe use of notInHeapSlice” (16018b05ae,5f5f4ccdb3). Left open: #69327 (non-preemptible multi-MB clears blocking STW) remains open pending thenotInHeapSlicefix. - Stack and register root scanning — Done: extended (vector) register state of async-preempted goroutines is scanned conservatively, so vectorized moves may carry pointers (
683aa8893a). On arm64 the 16-byte frame holding R30 frompushCallis scanned (a129840779). Left open: nothing noted. - Address-space layout, tagged pointers and the mem.go layer — Done:
sysUnreserveand LSAN coverage (40ec033c33),sysFreedocs (4ce2612f21). Left open: “I am not completely confident that we always pass the full region to sysFree” (40ec033c33). - Linear-memory heaps (Wasm and sbrk platforms) — Done: nil pointer handling in
sysFreeOSon sbrk (649897800b). Left open: nothing noted.
Other changes
- Goroutine leak profile user-visible — experiment enabled by default (
253aa2a12a) then deleted (afcf04cb64); the main goroutine blocked onselect{}is still analysed as leaked for precision but reported as waiting (d81ba6c35d).
Scheduler and concurrency
From Runtime: scheduler, timers, channels, locks and synchronization (Go 1.18–1.28)
- Timer rewrite: per-P timer heap, timer.lock, and GC-able synchronous timer channels — Done: user-visible
asynctimerchanGODEBUG removed, deleting the async code paths (a5bc606a68); stale GODEBUG detection at startup (f5eb66f695). Left open: nothing noted. - Contended runtime-lock profiling (mutex profile for runtime-internal locks) — Done:
m.locksbit-split so lock/unlock count in steps of 16 whileacquiremstays +1, so a mutex-count of zero is detectable whenacquirem/releasemis interleaved (b99b8feaae; fixes dropped samples inTestRuntimeLockMetricsAndProfile); gscan vs profInsert rank deconflicted (29c1c946aa). Left open: nothing noted. - testing/synctest bubbles — Done: concurrent race-context use in synctest timers avoided (
784ea961a4); crypto/fips uses unbubbled monotonic clock (a81b20a431). Left open: nothing noted. - Asynchronous preemption: extended register state — Done: conservative scan of extended register state (
683aa8893a); loong64 fcsr0 (e76c910108). Left open: nothing noted. - sync package API evolution — Done: linkname replaced with import (
97259c5d6b); Cond.Broadcast lock guidance (1225feb0da). Left open: nothing noted. - sync/atomic and runtime atomics — Done: PPC64 Add/And/Or SQCST (
f4d1304904); linknames simplified (0dcd7ab1b9). Left open: nothing noted. - Goroutine lifecycle and identity — Done: goroutineleakprofile enabled by default then experiment dropped (
253aa2a12a,16449179ec); secret state inheritance (e26a373785). Left open: nothing noted. - Fast random numbers for the scheduler — Done: 32-bit
cheaprandvia 64-bit multiply;cheaprand64as 64-bit wyrand (27fcec4d8f). Left open: nothing noted.
Other changes
- cgo init wait internal — atomic bool before the init-done channel for C-created threads (
4f8aa414f0). - Misc internal — signal stack clearing when parking Ms (
62a1da372a);reflect.typelinksreturns types (87fae3622d); panic record cleanup (e93b26688c); AIX GCData (bd1b41eb81);tracebacklabelsdefault (3694f33692); invalid GODEBUG messages (0ed83956d3);Int16atomic non-goal documented (0af7dbf1e6).
Data structures and type metadata
From Runtime: maps, built-in data structures, hashing, randomness and type metadata (Go 1.18–1.28)
- Swiss-table maps (GOEXPERIMENT=swissmap → only implementation) — Done: user-visible
GOEXPERIMENT=mapsplitgroupadded, off by default: groups becomectrl; keys [8]K; elems [8]Vsomap[K]struct{}no longer pays a padded elem per slot (5560073398; trade-off stated: better key cache behaviour, elem no longer at a fixed offset from its key). Loweringmapaccess1*tomapaccess2*at walk time to share one implementation (62d08234b7); undone in the same cycle becauseOINDEXMAPis used in expression context and late replacement generated invalid code (2a4fbc3f24), leavingmapaccess1as a wrapper aroundmapaccess2. Devirtualised hashing in specialised maps (252a8adbc0), pointer-key fast variants were missingpruneTombstones(03dc8c482f,3cf84263ec),ctrlGroupMatchH2on arm64 rewritten to avoid cross-byte borrow false positives (f133609b75), small full maps only grow when inserting a new key (8042aaf03c), correct const for indirect elem flag (51a8f213cd). Left open:mapsplitgroupnot default; hashing not yet inlined into map functions (252a8adbc0says “opens opportunity for further improvement by inlining hashing calls in the future”). - Map hashing and hash functions (memhash, aeshash, fallback hash) — Done: all assembly hash functions (386/amd64/arm64, aes and noaes) moved from
runtimetointernal/runtime/mapsas “ground work” for rewriting with SIMD intrinsics and inlining into map functions (8594bf4621, 34 files);MemHash{32,64}rewritten withsimd/archsimdintrinsics underGOEXPERIMENT=simd(2403e594a5, -8.67% on one geomean, others within noise; MapAccessZero/Empty swings attributed to basic-block alignment); keys passed by value toMemHash{32,64}/StrHashto avoid address-taken keys and reloads, andstrHashAESfolded intomemHashAES(05f75fb9e8). Left open: hash inlining into map ops still future work. - Compiler-generated equality/hash functions and type descriptor emission (reflectdata) — Done: signature-based equality (
30dff416e4,6eec9bcdb2), signature-based hash (0da8979210), type descriptor alignment set to 8 (a430bc1bd7: cmd/go -88K),MaxPtrmaskBytesback to 16 since GC programs are gone (a409055b7c; tailscaled: types needing runtime-computed masks 6→49, ~100 bytes saved), descriptor size constants moved tointernal/abi(d440b8b485), zero-size array element crash fix (cf0c42c2ca), linker handling ofruntime.typesleading offset based on size, not GOOS (20bc194972), AIX user-created GCData adjustments (bd1b41eb81). Left open: “Maybe a TODO for the future”: only generated comparison functions use signatures, not the code generated for==itself (30dff416e4). - internal/abi type layout unification and type metadata (rtype → abi.Type) — Done: type descriptor sizes in
internal/abi(d440b8b485),MaxPtrmaskBytes=16(a409055b7c),reflect.typelinksreturns types, not offsets, via new runtime accessor; old function kept for linknamers (87fae3622d). Left open: nothing noted. - reflect implementation: performance, allocation and escape behaviour — Done: conversions between slices of named byte/rune and string (
a0796d8af6),Select[]runtimeSelectkept on stack (094aacdb04: B/op -12.9%),&zeroVal[0]for zero-sized payloads (60dc96479a),Value.Methods/Fieldsexamples and nil-interface panic (31768104cb,891f4a8711),MapMaxElemBytescorrection (f7d886207f), reflectlite cleanups (b04e7f31c8,d8034799e0). Left open: nothing noted. - memmove / memclr / memequal / internal/bytealg assembly optimisation — Done: android/arm64 fixes to never read outside 16-byte regions (
f5479628d3,1a0e1fb616), Rabin-Karp helpers unexported (f1e016bb3a). Left open: nothing noted. - Slice growth, string building and allocation-free bytes/strings helpers — Done:
moveSliceNoCaprounds size down to a whole multiple of element size (1a15699a43). Left open: nothing noted.
Other changes
- Runtime print helpers hardened internal —
printquotedkeeps invalid UTF-8 bytes and fixesdecoderuneuse,printfloat/printcomplexbuffer sizes,printint/printuintavoid append (Go 1.26/1.27:cdf8951060,e1e73b316c,cc1241f353,e2c6a2024c1.26). - Softfloat fixes internal — softfloat64 add/sub with normal operands cancelling to a subnormal (
a2fd613c3e); an earlier 1.26 corner-case alignment was reverted (b9f3accdcf1.26,bb2a14252b1.26); 1.18 had rewritten softfloat without float use (aa3d54da071.18) and fixed uint64->float32 (16a3cefc931.18). - Smaller max alignment on arm32; race instrumentation for
moduleToTypelinksLockinternal —10ed9b6ed5,1bb3f4ed2b. - reflect corrections user-visible — Seq/Seq2 with named boolean (
0ac9d84e3d), nil array pointer panic (d9a6e74180), docs on TypeAssert corner cases and function pointer comparison (4135faca66,0969751733).
Diagnostics and knobs
From Runtime: tracing, profiling, metrics and diagnostics (Go 1.18–1.28)
- The new execution tracer (trace v2): generations, per-M buffers, new parser — Done: no write barriers in
traceRegionAlloc(04772f022a); trace strings truncated before map insertion, fixing a fatal “alloc too large” with long region names (1cfd0dc9a3);ProcSyscallAbandonedstring (261d489139); preallocated PC array (34a03bed3c). Left open: nothing noted. - Frame-pointer unwinding in tracing and profiling; profile stack depth — Done: sentinel for logical stacks in runtime-lock profile removed as dead code (
6b7206feb2). Left open: nothing noted. - Mutex and block profiles, including runtime-internal lock contention — Done: leftover
mutexeventlinkname removed (84c8483e02); sentinel cleanup (6b7206feb2); patience for trailing thread in test (6c8731962d). Left open: nothing noted. - CPU profiling, goroutine profiling, pprof labels and the protobuf writer — Done: memory profile records drop redundant bytes fields, 64 bytes saved per
memRecord(d247ed00e4); gzip close error returned (8b672822b2); buffered writer in pprof (6eb5a41228); dangling-ID rejection (93a285f2bc1.28 in 1.28 log). Left open: nothing noted. - Goroutine leak profile (GC-based leak detection) — Done: main goroutine blocked on
select{}excluded (d81ba6c35d); user-visible experiment enabled by default (253aa2a12a, 2026-05-05) and flag deleted the same day (16449179ec,afcf04cb64); flake mitigation by allowing 4–6 leaked goroutines, tracked in #79452 (320e0be23d). Left open: root cause of the 5-instead-of-6 case unknown (320e0be23d). - runtime/metrics and MemStats — Done: panic in
Readwith empty slice fixed (6aef900af4); test ensuringReadnever needs a stop-the-world (24ec7d2120). Left open: nothing noted. - Coverage redesign: runtime/coverage, internal/coverage, covdata — Done: first write error is now recorded (
78314e0140). Left open: nothing noted. - Race detector, ASan, MSan and Valgrind integration — Done: LLVM zero-initialization fix (
325eedb2a9); arm64 syso without outline atomics (bcdf61fef4); test harness tolerates WaitGroup-reuse panic (86935037f41.28). Left open: nothing noted.
Other changes
- GODEBUG removals in crypto/tls user-visible — swept into bucket (
a7bc19bf37,14a4bc2051,0f4862de57,1634ae8c7c,2f57f7626e).
OS layer, stacks and panics
From Runtime: OS and platform layer, stacks, panics and tracebacks (Go 1.18–1.28)
- Defer, panic and recover re-implementation — Done: skip ahead to previous panic (
50d988e4e0),gopanicFPremoved (e93b26688c),PanicNilError.Errorgetsruntime error:prefix so it fully satisfiesruntime.Error(16e8e06751). Left open: nothing noted. - Symbol tables,
runtime.CallerandCallersFrames— Done: generic methods formatted properly in tracebacks (0252b4be03), pprof labels simplified in tracebacks (19c994cc0c). Left open: nothing noted. - C-to-Go callbacks: extra-M reuse, system-stack bounds, init gating — Done: atomic-bool init gate (
4f8aa414f0,f40560ff89race annotation);cgocallbackguses ABIInternal on amd64 (631fc4e629), arm64 (d44e4e062b), loong64 (8329d31307) so autogenerated linker frames show; Windows cgo thread init moved to Go (bf1c1b3bde);runtime/cgopthread helpers andx_cgo_init/crosscall1deduplicated (65b9017c0e,8a0bc29bed,a01a4f9802);asmcgocalltolerates missing G (0a56bf8858); clang mmap bug workaround removed (a00f0ed521);X15cleared beforecgocallbackg(52fd498a96). Left open: nothing noted. - Library entry points and runtime initialization — Done: initialization partly in Go (
6bdfdb5f51),libInitwithout G (78d5260426). Left open: nothing noted. runtime/secretand data-independent timing (DIT) — Done: secret state inherited by goroutines (e26a373785); cgo crash fix (1dd2bef375); crash tests under memory-validating modes (841fafcd58). Left open: nothing noted.- Signals and async-preemption machinery — Done:
os/signalignores bogus signals (c2fabf1a26),dieFromSignalfor pid 1 (974764364a), fcsr save loong64 (e76c910108), ios SIGSEGV emulation removed (fdd485c5f1). Left open: nothing noted. - Syscall layer:
AllThreadsSyscall,internal/runtime/syscall, libc and WindowsSyscallN— Done: SyscallN limit removed (7c42da1bc5); error code returned as value (4216fa3d04,9b4244e9ea); 32-bit time handling (ba402cd756,4e06ed21ac,04dc12c1a1). Left open: nothing noted. - Windows runtime port — Done: minimum Windows 10 (
341b5e2c02), thread init moved to Go (bf1c1b3bde), ARM64 feature detection (45138d477d). Left open: nothing noted. - New, ported and removed platforms — Done: linux/ppc64 ELFv2 and cgo/external linking (
35c5deb1d4,364de84f36); riscv64 FENCE refinement (ab7c8279a0). Left open: nothing noted. - CPU feature detection, GOAMD64 checks and cpu GODEBUG options — Done: RISC-V vector crypto and zbc (
ed1646a8ae,122eb7d035), Windows ARM64 viaIsProcessorFeaturePresent(45138d477d). Left open: nothing noted.
Other changes
- Misc internal —
runtime/cgoC cleanups (03d9d24404,2eb890bde3,a3b5ce2234,b2b1e923ed,bdd4c38ce3,ad168c5131,c7d87cda53), Solaris stack bound via pthreads and-lsocket -lxnet(0b39555723,e30e65f7a8), ENOSYS value on mips (c918cbd556), guard on unexpected return pc (d2aad0df60), spectre retpoline asm fix (8572b1cfea), arm64 32-bit hash seed (8fe0c0eb63), Windows error-code zero-extension (3ebdf12d7c), scan small frame fromsigctxt.pushCall(a129840779), loong64 time simplification (d61c0c9283). - Bounds-check/ID tables internal — hash functions moved to
internal/runtime/maps(8594bf4621),caa169ee48,4dde0f6c36,594517bf2blinkname exports. checkclose: small cleanups internal — (b8be5de81e,ef90a565b5docs).
Compiler frontend · types2
From Compiler frontend: the types2 type checker (Go 1.18–1.28)
- Bringing up generics in types2 (type-parameter operands, core/structural types, tparam-as-interface) — Done: unconstrained type parameters in type-set ranges now yield
(nil, nil)and are handled inappend,copyandNewSignatureType(a6949e942c).674ceb7c7bfixes the conversion error for a pointer to a type parameter. Left open: nothing noted. - Type sets, union terms, interfaces and constraint satisfaction — Done:
a6949e942chandles unconstrained type sets;1ca1b6e866substitutes receiver type arguments into method type-parameter bounds, soG[int].MwithP interface{~*T}is~*int(generic-methods work; the language sidee84da0405bis outside this bucket). Left open: nothing noted. - Instantiation, Named types, Context deduplication and lazy expansion — Done:
bdd2182ec5does not reuse declaredFuncs for expanded methods.3b00b08c44stashes the receiver on method selections to restore theInfo.Instancesinvariant that instantiatingUses[id].Type()withInstances[id].TypeArgsgives an equivalent ofInstances[id].Type.efddb5ac61user-friendly panics inInstantiate.183e201251sets underlying for imported types. - Type inference and unification — Done:
f757de83f4fixes inference “irregularity in certain assignment contexts” by briefly permitting generic expressions betweengenericExprandassignment(removesexprWithHint);96bc97f6a3allows type-argument inference for map keys;3d4ee07f7ffails interface inference against generic methods (a generic method never satisfies an interface method). - Generic type aliases and
Aliastype nodes — Done:6edb9f9c51removes thegotypesaliasGODEBUG flag (37 files, −619 lines),7239eead28traverses aliases in the completeness check,37bce6617falias tests. - Type declaration cycles, valid-type detection and the object path — Done:
a977717393,eb845eca72instantiated-cycle errors include type arguments,5fb2392a6f. - Language features as seen by the type checker (by release) — Done: user-visible
9f7e98d263promoted field names as keys in struct literals (#9859).710014bcc3adds a small generic trie (trie.go) to detect overlapping selectors in such literals.238d7bddebtheyieldfunction in range-over-func cannot be variadic. Generic methods:79cae3bd1a,3d4ee07f7f,1ca1b6e866(spec change ine84da0405b, which is outside this bucket).ed3ec75df4limits constant string addition to 10 GiB;d8cab4c45adisables the length check because go/constant avoids constructing string constants and the check would eagerly build them (“may need a new API”). - Composite-literal type elision via target types (#12854) — Done:
96bc97f6a3(map-key inference “will be more relevant when implementing #12854”),f757de83f4. - Method receiver checking — Done:
1ca1b6e866and3b00b08c44(see Named thread). - Error reporting: codes, messages, and sub-errors — Done:
2d37c20778field selected on type,803d53a53c,28279274c8. - Robustness: invariants, incomplete types and importers — Done:
183e201251,8c4c897d0arepeat of an importer change for types2,efddb5ac61.
Other changes
- Selector diagnostics internal —
6d89ab44cc,3d4ee07f7f. - Mechanical operand refactor internal —
operand.typandoperand.moderenamedtyp_/mode_and all access replaced by accessors andinvalidate()/isValid()(052e64e938,fd146ff3b3,cfe0f55571,cd92bae42f,934a79ff2f,e2a34c7e9b); preparation for other work, unrecorded purpose in these messages. - Misc user-visible —
91a81e5ae1go/typesStringmethods;b32177443dfirst argument tocopynever nil. - Small fixes, unifier/assignment refactors, message and tracing tweaks internal — 2 commits:
8ca47fab42,7fd116f864
Compiler frontend · syntax, IR, generics
From Compiler frontend: syntax, IR, unified IR and the generics implementation (Go 1.18–1.28)
- Generics via GC-shape stenciling and runtime dictionaries — Done: shape signatures and
hasShapefor shaped functions (b4a084d328,2dbd51e3b4), nested-instantiation reshaping fix (b1772bacc7), SIMD types in instantiation (38ed614748); generic methods extend the model (separate thread). - Unified IR: one serialization for noding, stenciling, inlining and export — Done: UIR V3 -> V4 for generic methods (
fd961d3eb3,a25e961a83revertedb7db5702b0, finalf3f3d0859a); promoted struct fields encoded for composite literals (d9a600a73b); common UIR version factored (655aa335c9); README (820c83da80). - Old typechecker and IR node-model cleanup — Done: leftover constant checking removed (
73db2f85aa,bf1b0973db). - Generic methods (type parameters on methods) — Done: user-visible parsers stop rejecting method type parameters, type checkers do (
06dc5db75d), then “allow generic methods starting with Go 1.27” (e84da0405b). Shape helpers (b4a084d328,2dbd51e3b4),isConcreteMethod/isGenericMethod(3524089944), encoding (affadc7997,8c61ad873a,328950b13c), decoding (ae1edbeb2f,f4b87f314d,ad7d6071acimporter,ac5968dac4,57868d0019),fd961d3eb3bumps pkgbits version; experiment gating87fe5fafbafixes use of the compiler’s own build experiment instead of the user-code experiment;4e4b780652hoists a version assertion (otherwise generic methods are silently dropped on old UIR versions);f3f3d0859amakes V4 default (V3 on opt-out),e212a16d1eflips the experiment default,fdd592745dtests. Left open: the experiment was explicitly “not included in the Go 1.27 release”; wrappers omitted (perf optimisation missing). - Static initialization and package init — Done:
1b7e5836adsplits large init functions (compile-time win for #77153) but3233439691reverts; OCONVIFACE unwrapped for OAS2 (45c6fb4b9b); embedded-field offsets in static init (e2c188568d). - Compile-time performance, concurrency and the self-PGO’d compiler — Done:
ac2b8fc093profile refresh (Unicode -6.3%);e296659b12plumbs the profile through the inliner and body reader; flags marked concurrency-ok (ba057f7950,9eb830a807);439a82ad25unsorted diagnostics flag. - Compiler debugging infrastructure: bisect/hash debugging, flags, dumps — Done:
-d=astdump(835d6d42c4), HTML output with collapse/expand (ae7b257f24,a3688ab13e; commit says AI-assisted),-d=ssa/phase/@keyword=valueoptions (bef396c3391.28) in 1.28. - Frontend support for new language features and spec changes — Done: user-visible generic methods (own thread), promoted fields as composite-literal keys (
d9a600a73b,30bfe53dd7,c0cd914383),linknamestd(46755cb4de), 1 GiB string-constant limit (543703d352), consolidated size limits (b8e0cb88c8), new line-directive semantics (a7ea4a7ecd,1926d1d95d), loopvar workarounds removed (8da2be3cd0), bloop refinements (540ccca0a7,bae9486d07), nointerface method / constraint (8ddf0031cf). - The syntax package (parser, scanner, tree) — Done:
//linefilenames resolve relative to source directory (a7ea4a7ecd). - Method wrappers and promoted-method sharing — Done: skip incomplete types in
needWrapper(b77fdc333a). - SIMD frontend: the “midway” source-to-source translator — Done: HTML “syntax” formatter for IR (
fda1299caf), first midway translator (f1aa77c984), cleanups (e07983a299), debugging flag (7624fb3f0a), sizeof non-constant for simd types (ee5e65d491), renaming types with dependent methods (cc1ee09473), method type-checking for inference (14596908b7). - ir.StaticValue, ReassignOracle and function-variable tracking — Done: singly assigned function variables treated as static callees in escape analysis, e.g.
var visit func(*Node); visit = func...(f4bfb1a9c6), generalised toFuncAssignmentswithteeHolemerging of known callees’ escape tags (5af294bac7), merged into the oracle (84e0c4965a), parens unwrapped (2f0459745c). Left open:2f0459745ccalls it “a parity step needed before more callers can switch fromir.StaticValuetoReassignOracle”.
Other changes
- ABI docs internal — loong64 (
baa6b1f2bf), s390x/riscv64 (1.262e5d12a2771.26,927c89bbc51.26). - Compiler error user-visible — oversized map element reports error rather than ICE (
3b5954c634), hint for unexported fields in “too few values” (e4bc71dac5). - Conversions internal — constant-to-type-parameter conversion fix (
6278b729c6),8fd906ad11. - Unified IR: noder/writer/reader refinements and pkgbits (1.27) internal — RType/implicit-conversion wiring,
*Athelpers, optional expression handling, UIR documentation and grammar,pkgbits.Index/SectionKindrenames, synthetic closure positions, unsafe.Sizeof handling and related reader/writer fixes (2de90fd48f,dadc8a5cd2,085187dc17,e7a2019a1b,dd8efe4b96) - Old typechecker and IR node-model cleanup (1.27) internal — removal of unused typecheck/ir/types code (Ntype, CurFunc uses, vargen, Resolve dependencies), more typed IR node construction, simplified DeclFunc/NewMethodExpr and constant handling (
914b632202,2677fe9bbe) - Housekeeping (1.27) internal — dead-code removal, ioutil/seek/slices/atomic-type replacements, README edits, debug-flag removal, assorted small bug fixes and doc comments (
adb64adfd7,a535896627,b408256be7,9ce4f3876e,82c5ec222a,879b659ae0,ce4fc9417c,0ac1ebdce6,679b34ec94)
Middle end and SSA optimizer
From Compiler: middle end and SSA optimization (Go 1.18–1.28)
- Profile-guided optimization (PGO): hot-call inlining, devirtualization, profile preprocessing — Done:
- A profile whose graph is empty after scaling now produces a parse error (
a1150b5017). - The PGO profile is threaded through the inliner and the body reader, so imported generic instantiations see it. Without it,
newinlinercould clearfn.Inland crash (e296659b12).
- A profile whose graph is empty after scaling now produces a parse error (
- Inliner: budget, closures, and the interleaved inline/devirtualize driver — Done: walk replaced
mapaccess1*calls withmapaccess2*(62d08234b7). Left open: this was reverted outside this bucket and redone in 1.28. - Escape analysis: call modelling, closures, func-variable callees, and solver speed — Done: user-visible fewer heap allocations.
- Singly-assigned func variables are treated as static callees, which helps recursive closures (
f4bfb1a9c6). - Callees are represented as a slice (
9be7615aa2), and multiply-assigned func variables merge their callees viateeHole(5af294bac7). - Call analysis uses
ReassignOracle.StaticValue(1bcfdf2df2).
- Singly-assigned func variables are treated as static callees, which helps recursive closures (
- Allocation avoidance: stack-allocated slice backing stores and allocation-free literals — Done:
- A range-over-slice transition is marked in the backing-store analysis (
6e04f9f830, #79909). - Prove handles
Phi(SliceMake, SliceMake)so bounds checks still go away after the stack/heap split (2a1d605e7f, #77375).
- A range-over-slice transition is marked in the backing-store analysis (
- New inliner heuristics (GOEXPERIMENT=newinliner,
inline/inlheur) — Done: PGO plumbing fixed a crash whererevisitInlinabilityclearedfn.Inlfor PGO-hot functions undernewinliner(e296659b12). Left open: nothing noted. - Prove pass and bounds-check elimination: from poset relations to a dense limit table, topo-sorted walk, and division-aware proofs — Done:
- Multiple induction variables per block (
8afbae3e51), including induction-variable pairs such asi, j = i+1, j-1(faeffecf86, #45078). - Ctz and PopCount modelling (
a4fda8d32a,f35fb95503,417d5e6627).noLimitcleanup (8f739162e6,82ef9f5b21). - A stronger subtraction bound using non-equality (
14a4cb13e3). - No-op
And/Orare removed via prove (33504a8696,e7b0a53f31), with the last #68857 workaround dropped (2df8c060e8). - Phi of two
SliceMakes (2a1d605e7f). - Loopbce: overflow logic fixed (
f5b77a7e2f, CVE-2026-27143, #78333). Loops that would overflow are not inverted (5edb5d729d). Minimum-integer step handled (e7c75c3ae8). Count-down code cleaned up (831c489f9c).
- Multiple induction variables per block (
- Known-bits pass (bitwise constant folding) — Done:
- The pass itself (
7a8dcab743). - Support for booleans and Eq (
b9e1876c11), Zext (1ad012aa6b), CvtBoolToUint8 (d75902b195), Sext (8963c303b4), Neq (9c0a8a2b46), Lsh/RshU/Rsh (977041b065,767140eff2,e133fb1569,c72ba16e07), Trunc (2bb808bfc2). - Call stack use is limited (
be9da6ce60). Shift iteration is faster (880ef11ecf). Debug printing improved (e73e73470e).
7a8dcab743leaves merging with prove’s limits for “someone … in the future”. - The pass itself (
- Memory-op optimization: memcombine, dead stores, store-to-load forwarding, alias analysis, mem2reg — Done:
- CSE of loads across disjoint stores (
c34b99a5e2), recognizingOpVarDef/OpZeroas memory definitions (13cab13f78). Memory-access overlap detection fixed (3985ca0b62). - DSE learned about
Moves (da6a4cd70a, ~<0.1% code) and usesAuxIntfor theMovesize (6559f48782). - memcombine uses
HasPointersto match the write-barrier check (deaf3e6789). - Small
Loads are forwarded throughMove(38ac6577cb).
0offset case did not match the forwarding rule, fixed in 1.28. - CSE of loads across disjoint stores (
- Lowering of builtins to memory ops: memmove/memclr/memequal inlining and generated equality — Done:
- Small constant-size
MemEq(c7258178cd). - Per-signature equality functions (
30dff416e4). - More
OpMoveinstead ofmemmoveon loong64 (93b78326c3). - A preemptible
memclrNoHeapPointersPreemptiblefor large pointer-free clears (50126a8e44, andadf9c27874for nosplit callers) was reverted (5f5f4ccdb3,0a750df0b2) because it exposed unsafe uses ofnotInHeapSlice.
30dff416e4says==code generation outside equality functions is unchanged (“Maybe a TODO”). Preemptible memclr awaits thenotInHeapSlicefix. - Small constant-size
- Switch lowering: jump tables, type-switch caches, and switch lookup tables — Done: user-visible faster switches.
- Lookup tables for constant-returning integer switches (
2a902c8a8a), extended to all constant return types (6797caf71a) and fallthroughs (1f5c165a81). - A missed case in binary-search-for-switch was fixed (
3f3387fab8). - Under retpoline, binary search is used for SIMD non-constant immediates (
d5ebe8100d).
- Lookup tables for constant-returning integer switches (
- Static devirtualization and shape-aware type-assertion pruning — Done: types are compared by pointer identity (
09031d907c), with better debug logs (4d1f503396). Impossible type assertions are pruned in generic functions (343fbe2971). Left open: nothing noted. - Loop variable per-iteration semantics (loopvar) — Done: version detection with line directives was fixed (
b408256be7). The compiler’s ownx := xcapture workarounds were removed (8da2be3cd0). Left open: nothing noted. - testing.B.Loop support in the compiler (bloop) — Done: extraneous heap allocations from autotmp scope are avoided (
bae9486d07). Blank nodes are kept alive (9ce4f3876e). Left open: nothing noted. - Range-loop and range-over-func lowering in walk — Done: slice/array range loops simplified on loong64 (
134035855c). Variadic signature preserved (670038a5a5), label shadowing fixed (f665ff8bc1), and the ranged-over length is not re-evaluated (7395fa1fd8). Left open: nothing noted. - Sparse conditional constant propagation (sccp) — Done: faster convergence (
033b11f257): no duplicate uses on the revisit worklist, no queueing of uses of values already at Bottom, early exit for Bottom values; ~9% less sccp time over make.bash with identical results. Left open: nothing noted. - Loop-invariant code motion (licm) — Done: pass added (
f9f351b130, 346 lines + tests). Hoisting was made opt-in: only ops on an explicit allow-list may be lifted, instead of a deny-list (f93424692d, fixing #78997). In the same cyclezcsewas taught not to lift arch-feature-gated instructions (7f7ce373ed1.28, 1.28 cycle). A separate new “merge conditional branches” pass was disabled as “late in the cycle, try again for 1.28” (31525e9db0, #80102). Left open: the merge-branches pass is off. - Branch-free lowering: CondSelect-into-math and ARM64 CCMP — Done: CCMP pass for ARM64 AND conditions (
fbe55325dd, 5.8k lines mostly generated rules); CondSelect math extended to OR/XOR and contrary forms and non-1 constants (de7f006df2,d9fbe4c90d,0a36b58888,68ee544e87), arm64 inline register shifts (a93560b70a), enabled on all arches with PPC64 keeping ISEL when the constant is not 1 (455d4f41fb). Left open: PPC64 other constants unoptimized. - Constant-folding loads from type metadata and dictionaries — Done: fix to sign-extend AuxInt in
rewriteFixedLoad(a78df5aa0a). - SSA values for zero-sized and multi-field direct-interface types — Done: pointer-shaped types SSA-able despite many 0-sized fields (
6435bf46c1); unwrapping of direct interfaces inStructMake/ArrayMake1(1aa534dbb8); general zero-sized handling and all zero-sized SSA-able (b48b2002fe,0886e65b11); ICE/bounds-check fixes (b16360470c,6f19c3b459). Left open: nothing noted. - ARM64 load/store pairing (LDP/STP) — Done: pair a load with a load in a subsequent block (
c8df1410d5); more stp merging (996b985008).
Other changes
- Misc internal — result selects stay in call block (
a415314c0b), bad write-barrier type ICE (244b156e67), array-index/slice-cap ICEs (28b1d8886b,e28acf5506), generic-rules miscompile (8dcb3171f6), race-instrumentation gating (76222756d9). - Boolean/arith canonicalization internal —
x==xfolds, bijective-op const comparisons, absorption laws,x+x→x<<1, Mul→shift improvements (74e9214b53,fabaedcbe8,f42f2a3bb3,74c35fca7a,666e8c59c9,e0c8676edd,cb41169895); dominatorsdomreverse-PO fix (a6c48f2ca9); width checks for ops (819c53c25f). - Correctness fixes internal — walk of clear arguments and OAS2RECV (
b8bccb9798,9002bd9fa1,286a79658e), static array init miscompile (dae71067ce), OINDEXMAP (2a4fbc3f24), oversized shifts boundedness (0c3b9f837d), FIPS-mode string literals (ab1a2c8874,e20a1b6035), nil check position merging (7c074f14e6).
Backends and assemblers · architectures, ABI
From Compiler backend: architectures, register allocation, ABI and assemblers (Go 1.18–1.28)
- Register-based calling convention (ABIInternal) ports beyond amd64 — Done: wrappers for embedded interfaces use tail calls
e7a09d1ffb, with arch fixes for indirect tail calls383000da24, arm3259b188cee2/97d6430458, mips64a95f60871f. - Register allocator, scheduler and block-level backend passes — Done: regMask refactored into a struct to allow >64 registers
1901161d96(later resync2868672202); riscv64 prefers x8–x15/f8–f15 (compressed-friendly)4212586726; desired registers propagated through phis (back-edges of innermost loops are dead ends)5b106947d1; schedule increments after flags628674a0c1; likely-used values moved into registers before entering a loop97d6430458; no lift of divides out of loops9c688e3f4dand lifting ops out of loops made opt-inf93424692d;earlyOkfor opsc3a43395bc; double-drop fixesf65692ea56,54ebdf6151; cachedsdomreverse POa6c48f2ca9; reduce lock/scheduler contention in the compilercc6923e839. - amd64 code generation and GOAMD64 microarchitecture levels — Done:
x86MOVQ r64,imm32shortened for positive immediates0db36238c6; 32-bit copies for 64-bit copies of 32-bit values478d86446e;float32(round64(float64(x)))optimization (amd64/arm64/wasm)7336381cd1,425a88193c,d51d4d75a6; flags→bool→flags round-trips removed9e0467b174; ADC/SBB can eat InvertFlags9f9476d09b; removal of the multi-register shift (SHRD/SHLD) rewrites because when count≡0 mod 64 they leavelorather thanlo|hia531ad45f7; miscompile fixes: SETcc/Jcc mapping38e988efb4,x+x<<63c3bfc824a5/truncated const shiftf2f369db0e; ssaConfigbranchelim arches2d33a456c61.26 (1.26). - arm64 code generation and assembler — Done: 128-bit vector ops for Move expansion (FMOVQ/FLDPQ/FSTPQ for 16–64 bytes)
ec3373e379,e0ebb4c646; TBZ/TBNZ merge shifts/ROR/SRA3d4fed3179,1f11689588,5e17860e1b; shift lowering cleanup0d54be530b; data-driven SVE assembling path79f3d38562, GP/SIMD reg support926a1bef08, register with indexce4459cf0e, register lists1aa9d9a69b, memory forms (14685c05aa,65203e06e6,356b87fa7b), special operands4398c11b51, immediates42083b1ea0, ASIMD shifts/arithmetic/misc/reduction/widening/narrowing instructions (9111d85e2f,b1c8857f95,c1352b7df1,f2e70034cc,e73621e34a,9a0be0742b), refactors that move encoding helpers into obj (f827b85425,845b7b0e49,85f838f46c,f91403c2a0); SVE put behindGOEXPERIMENT=simdd7a37379a9; fixes: missing condition in SBFX→SBFIZ943343f7fe, Rsh with 32-bit rhs miscompilef2f369db0e; RPRFM range prefetche49b53439d. - riscv64 compiler and assembler (RVA profiles, vector, compressed) — Done: Zicond codegen for CondSelect, enabled only for the ConstantTimeSelect intrinsic because on predictable branches zicond is 4 instructions vs 2
ca94cf1247,3a29ebeef9; Zbc91d1a88376, Zvbb/Zvbc58efaf3859, Zihintpause081aa64e61, FENCE operands/FENCE.TSOb5b9e3cdfe; CSR pseudo opsca10097f29; avoid improper control-transfer hints2d1f571c6b; constant materialization refactor and 32-bit unsigneddfd2e8027c,0a0c9c88fd,7f7e4942f1; float32(abs|sqrt64)f3966c1ada. - loong64 backend and assembler — Done: math.{Ceil,Trunc,Floor,RoundToEven} intrinsics
3fdac6780b; float32(abs|sqrt64)f65fe3216e; Bswapc61a48619f; unaligned equal functions045ceb7240; assembler refactored into a single opcode map and instruction file (de0d77c6f8,99d4927f69,b261436c52, merges003c0bbf16,73f72d8c99,c5f1695f79,9b07a7668c,72f89282ac); ll.acq/sc.rel/sc.q47f26133bd; FRINTf93504bfd6. - Duff’s device replaced by generated loops; Zero/Move lowering — Done: vector-based Move expansion on arm64
e0ebb4c646;LoweredMoveLoop/LoweredZeroLoopsimplified on loong64c1c0af1e16,a92edd97bf. - Stack slot merging, liveness and stack maps — Done: bitvec 2 GB limit removed
f745645e58, less reserved memorybfb851c31e. - Atomics and memory-ordering code generation — Done: ppc64 sync/atomic Add/And/Or sequentially consistent
f4d1304904. - WebAssembly backend — Done: constant folding/identity/mask/sign-extension elimination rules (
b764d47e4d,def4e491be,bd5dc3a2fb,65f76a20a3,55de3efde3); vector ops in WASM asm (dev.simd)3b2c371844. - s390x, MIPS, 386 and 32-bit ARM backends — Done: arm single BIC for AND with negative-rotated immediates (no REGTMP clobber)
358cf41413; s390x VSTRL4aa6dad54e; mips NORconst removed514790c2b9. - Backend hooks for GOEXPERIMENT=simd (amd64 AVX-512, arm64 SVE, wasm) — Done: X/Y/Z16–31 allocatable
e7ec26cf8f, callerSave of AVX-512/maskedc3b161cb/wasm vectorsb15400c775; mask optimizationsacc4bad854; arm64 helpers9076ed8750.
Other changes
- ssa.Func names storage
e7d8668a6a1.28 (1.28); unify DWARF variable generation70dc75b79b; alignment field on LSym67d449c0a6,174c92bd74,28b69f9bb0; FIPS string literalsab1a2c8874; -std flag to assembler3a0f18376f; linkname check for assembly symbolsaee6009ba5. - 3 small obj/x86 and amd64/386 rules commits internal — e.g. cc: combine some generic AMD64 simplifications; cc: crash if we try to generate a truncated AMD64 const shif; cc: shuffle bits.Sub intrinsic generation on amd64. (
5c595a811e,f2b1b38293,212065c922) - 14 small ssa/regalloc/liveness/obj generic commits internal — e.g. cc: add loclist for removed DCL nodes; cmd/link: modify the register used in trampoline; cc: ensure ops have the expected argument widths. (
874c3ceb3f,1e994e0a48,819c53c25f,97c48fd93d,1aa534dbb8,8438ace207,3c8b5e6738,0886e65b11,20897e5e2c,55ff407d4f,4a1c0efa83,80123ef4bf,6565f5517e,9463584647) - 9 small obj/arm64 and arm64 rules commits internal — e.g. obj: support arm64 FMOVQ from/to global address; obj/arm64: add remaining ASIMD compare instructions; obj: arm64 assembler support unshifted hi for large offsets. (
c373c59d68,4dffc57944,f2633386e0,9653f5abd3,684a434e4a,bb2ad49581,6faf5a6df5,7912a25a4e,581c1b1081) - 8 small obj/loong64 and loong64 asm commits internal — e.g. cc: avoid extending when already sufficiently shifted on loo; obj/loong64: rearrange optab entries; obj/loong64: improve ARNG type register name conversion. (
021d5ca042,9697bd96bc,6837583eec,5e6a6840ae,7b5ba1f8ae,ff7dfb5c3b,a1e7a41560,3c770e3233) - 4 small mips/s390x/arm/wasm commits internal — e.g. cc: (mips64x) optimize float32(abs|sqrt64(float64(x))); obj/wasm: use p.To instead of p.From; [dev.simd] simd: fix wasm bug; size was already 32. (
89ba6eec5c,4c6ba57ea7,5db690032c,9c6b9b2ece) - 1 small obj/riscv and riscv64 rules commits internal — e.g. cmd/asm,obj/riscv: update references to RISC-V specification. (
783a68b572)
Backends and assemblers · SIMD
From SIMD: the simd packages and their compiler support (Go 1.18–1.28)
- Compiler SIMD type system, ABI and register-allocation support — Done:
isSIMDplumbing reused unchanged for WASM (obj.WasmV128inssagen/abi.go) and arm64 NEON (8a1b0c8ecb); unsigned-constant fix for load folding (3f6eabdf091.26 was 1.26) ; cgocallback X15 clearing fixes by runtime team (52fd498a96, cross-area). Left open: nothing noted. - simdgen: the instruction-table-driven generator — Done: multi-architecture parametrisation and ARM64 definitions (
8a1b0c8ecb,8437d1b188,951257bd14); asmRule for patterns on asm instructions (9922fb1d24); argsMatchRule for broadcast-to-VMOVI folding (098d688071);ImmMaxto limit immediate jump-table sizes (b84139dfad); SetElem general-register width detection (f4d50e5ebf); auto-merge ofsimdgenericOps.go(d3a3061d75); zero-valued fields omitted fromsimdAMD64ops.go(6fb7a1cddd); decode non-broadcast memory operands (4136ffed69); insert_ordered_map for deterministic output (82489f7402). Left open: sort-order glitch only “attempted to pin down” (e3afca43e2). - AMD64 archsimd API: AVX, AVX2 and AVX-512 operations — Done: user-visible op additions/fixes: VPSHUF[HL]W and VPEXTR[BW] choices (
43a85e04d3,989942d20a), VPSRL immediate peepholes (aa80d7a7e6), signedNeg()and MaskString()(923c23ea10), VAES capture (83b232b0af),CopySign->MulSign(59740699ed), SumAbsDiff result type (f6c3137899), shift semantics fixes (39b20d32a9), Load/Store renames and GetElem/SetElem bounds panics (b70242b3b9,ff05f35fb6,13a70de131). Left open: nothing noted. - Mask representation, masked operations and merge peepholes — Done: user-visible
IfElsesupersedesMerge(e115b2f987,6f010acf75), ARM64IfElsesemantics corrected (a2b3c73f75),Mask.ToIntNsrepairs (54719fce02), arm64 uint->mask conversions removed because “everyone has signed” (07664b7a53). Left open: nothing noted. - Memory operands, constant-immediate forms and jump tables — Done:
4136ffed69,098d688071,aa80d7a7e6,b84139dfad. Left open: nothing noted. - dev.simd branch, GOEXPERIMENT=simd lifecycle and merges to master — Done: reverse merges
a004b4b1b0(2026-05-26),0d75fdfd4f(2026-05-29),33001a6225(2026-06-01) bring WASM, NEON, midway, GODEBUG=simd emulation switch to master; “for 1.27” API pruning (see API shaping thread). Left open: nothing noted. - Portable
simdpackage and the “midway” source translator — Done: user-visible first midway translator (f1aa77c984), arm64 support in midway (b7b03d9e3d), emulations (40eb69725e,10231ce696,d7b3da6e25rotates,edbc93f594FP negation,cedf3d5870unsigned OnesCount), CLMUL (cea3788e05), broadcast (b7327ecacf), GODEBUG switch (a92cf0ee94), shared type file (b2b5aa4d80), endianness test (c910146a98), docs and examples (c086c0e53b,c83d55f695),StorePartreturns length (d2b991c840),HiToLorouted through Float64x2 (2458ba018e). Left open: BUG notes in doc.go: reflection calls, SIMD-dependent global var initializers, and modified names in stack traces do not work properly. - ARM64 NEON archsimd — Done: user-visible initial Add/Sub/Mul (
8a1b0c8ecb), then the families above, test generator (61a10105e6), widening renamedLoLong->WidenLo(80ab7bc1fa). Release-trimming for 1.27: const-shift methods postponed (7de45e82f2),SetHiremoved andGetHirenamedHiToLo(20e9fe5d36),LookupOrKeepremoved (67c2e8b1fb), uint->mask conversions removed (07664b7a53), deprecatedAs...removed (9a23a318c9), Deinterleave/Transpose renamed (e50343d863), Reduce returns scalar (8d29cf23b1). Left open: multi-register TBL, const shifts needing rename. - WebAssembly SIMD — Done: user-visible
8742584113through the above. Left open: nothing noted. - API shaping and renames before stabilisation — Done: renames above incl.
b70242b3b9,fed139a1b3,35ea327859,8583ef15c8,3e04a409d1,3d6c5301df. Left open: nothing noted. - Emulation of missing instructions and test infrastructure — Done:
10231ce696,40eb69725e,edbc93f594,cedf3d5870, test deduplication. Left open: nothing noted.
Other changes
- Generator housekeeping and API polish (grouped, ~22 commits) internal — feature implication/cpufeature docs for mask/merge methods (
d8720e1c29,985b0b3fe2,096a80ff51), ToMask integer-only on branch copy (63d1eec2bb), per-arch file disambiguation (cb884c6552), Permute rule simplification (cb4f10f62f), generator guidance/annotations/template refactors (6f75386281,abdc5da461,60b0cc23d6,62a53580b1,bc1da486f8,c73b7f56e8,8b42aab894,f844b5eb8bfaster env pruning), go.mod/import repair (edf37149c3), broadcast1ToN unexported (a9ed6afb90), shift order/doc changes (3c60677325,acbbcf61df), Select(128)?FromPair renames (6639f3b4d8), BUG note removal (a72a4295ed), emulation String/format repairs (11c4fcb72c,9e5cf808f6,642abeced6), NEON SetHi/GetHi first added (3ea9804aef, later changed). - inline cost multiplier for rotate emulation internal (
d7b3da6e25). - nocheckptr on unsafe helpers internal (
1f8aff4386). - SetElem/GetElem bounds checks user-visible (
ff05f35fb6,13a70de131).
Linker and object files
From Linker, object files and debug info (Go 1.18–1.28)
- Type, itab and typelink layout (.go.type section, relro rework) — Done:
.go.typesection and relro rewrite13096a62e6; typelinks removed481ab86aaf; itabs into.go.typebcc369284d; itablinks removed6ef7fe9a48; gcmask grouped in noptrbss291ee5d7de; type descriptor length stored instead of end1172294145;type:*forced to the start of type datac08f6a5b26; AIX special cases removedee7a2119ac,9fd5a5fa7d;runtime.typeoffset reservation by size rather than GOOS20bc194972; type descriptor size calculation centralized ininternal/abi3390ec59af; itab sizes recorded9387929d09; SITABLINK and SFUNCTAB kinds removed5a928e5a37,5ec5fdc093; STYPE sort precomputes isItab/typeStr, recovering a dodata regression (714 ms to 325 ms on a large cgo binary versus 207 ms in 1.26.2)1215bd5ff6. Left open: reflect was to switch to type pointers rather than offsets (message of481ab86aaf); the dodata regression was only partly recovered (325 ms vs 207 ms). - DWARF 5 migration — Done: location list representation unified: structured
LocListEntry,PutLocationListDwarf4/5encode directly, singlecreateDwarfVarsloop70dc75b79b. Left open: nothing noted. - DWARF quality for debuggers (types, variables, trampolines) — Done: dot vars needed by debuggers preserved
d7b6fb44b5; preInliningDcls filtering improvedb77ae50ad1; heap vars in dead code9c9e880fe1; simplified closure names (always pre-inliningpkg.outer.funcN)409f784bea. Left open: nothing noted. - ELF/relro/hardening and external-link policy — Done: bfd ld 2.36+ replaces gold on linux/arm64
a8032d4c78; PIE on linux/s390x without cgo58bc91a967. Left open: nothing noted. - Per-platform object formats and internal linking (Mach-O, PE, XCOFF, wasm, ppc64, riscv64, loong64) — Done:
-macos/-macsdkflags and 13.0 minimum23fde5c48c,6614616b75; Windows 10 minimum341b5e2c02;.pdatasortedbbed50aaa3; loong64 immediate range checksb48b6fa2fa; openbsd/mips64 removed31a8396219. Left open: nothing noted.
Other changes
- Platform fixes internal — Mach-O UNSIGNED relocations and section alignment (
f4afab14d0,fdd38337f0), race syso weak import (e22437d192), host.pdataordering (a6500456f3), loong64 GOT relocs (9def4acb06), dynamic-linker paths (456d0fe409,81973b4038),.wm4/.wm8symbols (5f51b09284), MSVC clang+LLD and Windows min-version fallback (b4e37273ce,b3c54d2e59), XCOFF type/gcmask handling (03a6a20740,5593ea4634,fd7fc1b171), covctrs alignment (4fe1203111),-fignores version mismatch (cbaecb2830), content-hashed bit for cloned symbols (003833a138), dupok path clarified (8d1c4631fa), flag probes (99d7121934,8933fb98f3), Mach-O CodeSign avoids a copy (70e521bdff), PE .def name quoting (104f868a02). - Linker bookkeeping removals internal —
SFILEPATHremoved andSFirstUnallocatedadded in 1.26 (61de3a9dae1.26,6914dd11c01.26), obsolete duffzero/duffcopy code (f766b8da6c), loong64R_JMPLOONG64and R_CONST/R_GOTOFF handling (6a71295466,cfb67d0871,87013ffec0). - Response file parsing internal GCC-compatible (
4b7b1be731).