Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
5bbd22f
[release-branch.go1.26] net/http: apply header timeout to server's un…
neild Jun 24, 2026
a42fec4
[release-branch.go1.26] all: update x/net
neild Jul 10, 2026
07a0bbb
[release-branch.go1.26] os: don't expect an error from Root.ReadFile …
neild Jul 9, 2026
cc31225
[release-branch.go1.26] runtime: be sure to scan small frame introduc…
randall77 Jul 7, 2026
28f27d6
[release-branch.go1.26] os: properly handle trailing / in Root.MkdirAll
neild Jul 8, 2026
4238449
[release-branch.go1.26] os: strip trailing slashes in RemoveAll on Pl…
0intro Jul 9, 2026
88bf579
[release-branch.go1.26] runtime: don't emit write barrier for code po…
Zxilly Jul 21, 2026
ae63e27
[release-branch.go1.26] runtime: fix uninitialized 7th argument in ma…
Jorropo Jul 16, 2026
b643231
[release-branch.go1.26] crypto/tls: do not count handshake messages a…
nicholashusin Jul 22, 2026
019fcb0
[release-branch.go1.26] cmd/compile: don't require Heapaddr for heap …
derekparker Jun 22, 2026
0e8a244
[release-branch.go1.26] all: update x/net
cherrymui Jul 31, 2026
4d522f2
[release-branch.go1.26] cmd/compile: tighten mergelocals address use …
randall77 Jul 2, 2026
100fb8f
[release-branch.go1.26] cmd/link: quote PE .def library name
qmuntal Jun 23, 2026
605fd48
[release-branch.go1.26] crypto/tls: add fips140ems GODEBUG setting to…
FiloSottile Jun 19, 2026
efc7967
[release-branch.go1.26] cmd/compile: do not home mul/div results in H…
Jorropo Jul 24, 2026
f8d4fa6
[release-branch.go1.26] runtime: fix frame pointer adjustment around …
nsrip-dd Jul 31, 2026
f5bf46f
[release-branch.go1.26] cmd/compile: fix mips64le bigger than 32bits …
Jorropo Jul 28, 2026
db38ee7
[release-branch.go1.26] cmd/compile: fix prove to generate Const64 fo…
Jorropo Jun 6, 2026
52e5e2f
[release-branch.go1.26] cmd/compile: fix time traveling proofs in prove
Jorropo Jul 22, 2026
13c1940
[release-branch.go1.26] cmd/compile: do not elide riscv64 sign extens…
Jorropo Jul 27, 2026
128893d
[release-branch.go1.26] net/url: avoid quadratic complexity in resolv…
jitsu-net Jul 21, 2026
33ecb96
[release-branch.go1.26] html/template: fix JavaScript regexp tracking
thatnealpatel Jul 28, 2026
9918f26
[release-branch.go1.26] encoding/xml: fix depth processing in (*Decod…
jitsu-net Jul 20, 2026
6ec908d
[release-branch.go1.26] encoding/asn1: enforce maximum recursion depth
jitsu-net Jun 8, 2026
9f6980f
[release-branch.go1.26] cmd/vendor: fix CVE-2026-56864 in x/mod
thatnealpatel Aug 7, 2026
115eb47
[release-branch.go1.26] cmd/vendor: fix CVE-2026-56865 in x/mod
thatnealpatel Aug 7, 2026
1ea5a71
[release-branch.go1.26] go1.26.6
gopherbot Aug 13, 2026
9edaed7
Merge remote-tracking branch 'go/release-branch.go1.26' into patricko…
patrickod Aug 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions VERSION
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
go1.26.5
time 2026-07-01T21:24:27Z
go1.26.6
time 2026-08-11T00:40:52Z
4 changes: 4 additions & 0 deletions doc/godebug.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ and the [go command documentation](/cmd/go#hdr-Build_and_test_caching).

### Go 1.26

Go 1.26.6 added a `fips140ems` setting that when set to `0` disables the
enforcement of Extended Master Secret in FIPS 140-3 mode. There is no change in
default behavior.

Go 1.26.1 added a new `htmlmetacontenturlescape` setting that controls whether
html/template will escape URLs in the `url=` portion of the content attribute of
HTML meta tags. The default `htmlmetacontentescape=1` will cause URLs to be
Expand Down
12 changes: 8 additions & 4 deletions src/cmd/compile/internal/dwarfgen/dwarf.go
Original file line number Diff line number Diff line change
Expand Up @@ -288,10 +288,14 @@ func createDwarfVars(fnsym *obj.LSym, complexOK bool, fn *ir.Func, apDecls []*ir
DictIndex: n.DictIndex,
ClosureOffset: closureOffset(n, closureVars),
}
if n.Esc() == ir.EscHeap {
if n.Heapaddr == nil {
base.Fatalf("invalid heap allocated var without Heapaddr")
}
if n.Esc() == ir.EscHeap && n.Heapaddr != nil {
// The variable was promoted to the heap and has a known heap
// address, so describe its location by dereferencing the pointer
// stored at its stack offset. A heap-escaped variable may have no
// Heapaddr if it was declared in unreachable code: escape analysis
// marks it as heap-allocated, but SSA generation skips the dead
// declaration and never allocates the address. In that case fall
// through and emit a conservative variable with no location list.
debug := fn.DebugInfo.(*ssa.FuncDebug)
list := createHeapDerefLocationList(n, debug.EntryID)
dvar.PutLocationList = func(listSym, startPC dwarf.Sym) {
Expand Down
7 changes: 6 additions & 1 deletion src/cmd/compile/internal/liveness/mergelocals.go
Original file line number Diff line number Diff line change
Expand Up @@ -513,8 +513,13 @@ func (cs *cstate) populateIndirectUseTable(cands []*ir.Name) ([]*ir.Name, []cand
}
}
}
for _, arg := range v.Args {
for idx, arg := range v.Args {
if nc, ok := pendingUses[arg.ID]; ok {
if !v.AddrSinkArg(idx) {
// If this op may propagate the argument address to its output,
// then give up. See issue 80127.
continue
}
// We found a use of some value that took the
// address of nc.n. Record this inst as a
// potential indirect use.
Expand Down
16 changes: 15 additions & 1 deletion src/cmd/compile/internal/mips/ssa.go
Original file line number Diff line number Diff line change
Expand Up @@ -213,11 +213,25 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
ssa.OpMIPSMULTU,
ssa.OpMIPSDIV,
ssa.OpMIPSDIVU:
// result in hi,lo
// HI, LO results exist in low quality registers that can't
// be stored without using REGTMP.
// This used to cause corruptions since store might also need
// REGTMP to materialize the address.
// Instead we move the result into high quality registers.
p := s.Prog(v.Op.Asm())
p.From.Type = obj.TYPE_REG
p.From.Reg = v.Args[1].Reg()
p.Reg = v.Args[0].Reg()
p1 := s.Prog(mips.AMOVW)
p1.From.Type = obj.TYPE_REG
p1.From.Reg = mips.REG_HI
p1.To.Type = obj.TYPE_REG
p1.To.Reg = v.Reg0()
p2 := s.Prog(mips.AMOVW)
p2.From.Type = obj.TYPE_REG
p2.From.Reg = mips.REG_LO
p2.To.Type = obj.TYPE_REG
p2.To.Reg = v.Reg1()
case ssa.OpMIPSMOVWconst:
r := v.Reg()
p := s.Prog(v.Op.Asm())
Expand Down
16 changes: 15 additions & 1 deletion src/cmd/compile/internal/mips64/ssa.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,11 +207,25 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
ssa.OpMIPS64MULVU,
ssa.OpMIPS64DIVV,
ssa.OpMIPS64DIVVU:
// result in hi,lo
// HI, LO results exist in low quality registers that can't
// be stored without using REGTMP.
// This used to cause corruptions since store might also need
// REGTMP to materialize the address.
// Instead we move the result into high quality registers.
p := s.Prog(v.Op.Asm())
p.From.Type = obj.TYPE_REG
p.From.Reg = v.Args[1].Reg()
p.Reg = v.Args[0].Reg()
p1 := s.Prog(mips.AMOVV)
p1.From.Type = obj.TYPE_REG
p1.From.Reg = mips.REG_HI
p1.To.Type = obj.TYPE_REG
p1.To.Reg = v.Reg0()
p2 := s.Prog(mips.AMOVV)
p2.From.Type = obj.TYPE_REG
p2.From.Reg = mips.REG_LO
p2.To.Type = obj.TYPE_REG
p2.To.Reg = v.Reg1()
case ssa.OpMIPS64MOVVconst:
r := v.Reg()
p := s.Prog(v.Op.Asm())
Expand Down
178 changes: 92 additions & 86 deletions src/cmd/compile/internal/ssa/_gen/386Ops.go

Large diffs are not rendered by default.

555 changes: 282 additions & 273 deletions src/cmd/compile/internal/ssa/_gen/AMD64Ops.go

Large diffs are not rendered by default.

110 changes: 58 additions & 52 deletions src/cmd/compile/internal/ssa/_gen/ARM64Ops.go

Large diffs are not rendered by default.

64 changes: 35 additions & 29 deletions src/cmd/compile/internal/ssa/_gen/ARMOps.go
Original file line number Diff line number Diff line change
Expand Up @@ -375,35 +375,35 @@ func init() {

{name: "MOVWaddr", argLength: 1, reg: regInfo{inputs: []regMask{buildReg("SP") | buildReg("SB")}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVW", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxInt + aux.(*gc.Sym), arg0=SP/SB

{name: "MOVBload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVB", typ: "Int8", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVBUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVBU", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVHload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVH", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVHUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVHU", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVWload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVW", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVFload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVF", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVDload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVD", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux. arg1=mem.

{name: "MOVBstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 1 byte of arg1 to arg0 + auxInt + aux. arg2=mem.
{name: "MOVHstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 2 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.
{name: "MOVWstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.
{name: "MOVFstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVF", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.
{name: "MOVDstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.

{name: "MOVWloadidx", argLength: 3, reg: gp2load, asm: "MOVW", typ: "UInt32"}, // load from arg0 + arg1. arg2=mem
{name: "MOVWloadshiftLL", argLength: 3, reg: gp2load, asm: "MOVW", aux: "Int32", typ: "UInt32"}, // load from arg0 + arg1<<auxInt. arg2=mem
{name: "MOVWloadshiftRL", argLength: 3, reg: gp2load, asm: "MOVW", aux: "Int32", typ: "UInt32"}, // load from arg0 + arg1>>auxInt, unsigned shift. arg2=mem
{name: "MOVWloadshiftRA", argLength: 3, reg: gp2load, asm: "MOVW", aux: "Int32", typ: "UInt32"}, // load from arg0 + arg1>>auxInt, signed shift. arg2=mem
{name: "MOVBUloadidx", argLength: 3, reg: gp2load, asm: "MOVBU", typ: "UInt8"}, // load from arg0 + arg1. arg2=mem
{name: "MOVBloadidx", argLength: 3, reg: gp2load, asm: "MOVB", typ: "Int8"}, // load from arg0 + arg1. arg2=mem
{name: "MOVHUloadidx", argLength: 3, reg: gp2load, asm: "MOVHU", typ: "UInt16"}, // load from arg0 + arg1. arg2=mem
{name: "MOVHloadidx", argLength: 3, reg: gp2load, asm: "MOVH", typ: "Int16"}, // load from arg0 + arg1. arg2=mem

{name: "MOVWstoreidx", argLength: 4, reg: gp2store, asm: "MOVW", typ: "Mem"}, // store arg2 to arg0 + arg1. arg3=mem
{name: "MOVWstoreshiftLL", argLength: 4, reg: gp2store, asm: "MOVW", aux: "Int32", typ: "Mem"}, // store arg2 to arg0 + arg1<<auxInt. arg3=mem
{name: "MOVWstoreshiftRL", argLength: 4, reg: gp2store, asm: "MOVW", aux: "Int32", typ: "Mem"}, // store arg2 to arg0 + arg1>>auxInt, unsigned shift. arg3=mem
{name: "MOVWstoreshiftRA", argLength: 4, reg: gp2store, asm: "MOVW", aux: "Int32", typ: "Mem"}, // store arg2 to arg0 + arg1>>auxInt, signed shift. arg3=mem
{name: "MOVBstoreidx", argLength: 4, reg: gp2store, asm: "MOVB", typ: "Mem"}, // store arg2 to arg0 + arg1. arg3=mem
{name: "MOVHstoreidx", argLength: 4, reg: gp2store, asm: "MOVH", typ: "Mem"}, // store arg2 to arg0 + arg1. arg3=mem
{name: "MOVBload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVB", typ: "Int8", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVBUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVBU", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVHload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVH", typ: "Int16", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVHUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVHU", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVWload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVW", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVFload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVF", typ: "Float32", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true}, // load from arg0 + auxInt + aux. arg1=mem.
{name: "MOVDload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVD", typ: "Float64", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true}, // load from arg0 + auxInt + aux. arg1=mem.

{name: "MOVBstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true}, // store 1 byte of arg1 to arg0 + auxInt + aux. arg2=mem.
{name: "MOVHstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true}, // store 2 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.
{name: "MOVWstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true}, // store 4 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.
{name: "MOVFstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVF", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true}, // store 4 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.
{name: "MOVDstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true}, // store 8 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.

{name: "MOVWloadidx", argLength: 3, reg: gp2load, asm: "MOVW", typ: "UInt32", addrSinkArg0: true}, // load from arg0 + arg1. arg2=mem
{name: "MOVWloadshiftLL", argLength: 3, reg: gp2load, asm: "MOVW", aux: "Int32", typ: "UInt32", addrSinkArg0: true}, // load from arg0 + arg1<<auxInt. arg2=mem
{name: "MOVWloadshiftRL", argLength: 3, reg: gp2load, asm: "MOVW", aux: "Int32", typ: "UInt32", addrSinkArg0: true}, // load from arg0 + arg1>>auxInt, unsigned shift. arg2=mem
{name: "MOVWloadshiftRA", argLength: 3, reg: gp2load, asm: "MOVW", aux: "Int32", typ: "UInt32", addrSinkArg0: true}, // load from arg0 + arg1>>auxInt, signed shift. arg2=mem
{name: "MOVBUloadidx", argLength: 3, reg: gp2load, asm: "MOVBU", typ: "UInt8", addrSinkArg0: true}, // load from arg0 + arg1. arg2=mem
{name: "MOVBloadidx", argLength: 3, reg: gp2load, asm: "MOVB", typ: "Int8", addrSinkArg0: true}, // load from arg0 + arg1. arg2=mem
{name: "MOVHUloadidx", argLength: 3, reg: gp2load, asm: "MOVHU", typ: "UInt16", addrSinkArg0: true}, // load from arg0 + arg1. arg2=mem
{name: "MOVHloadidx", argLength: 3, reg: gp2load, asm: "MOVH", typ: "Int16", addrSinkArg0: true}, // load from arg0 + arg1. arg2=mem

{name: "MOVWstoreidx", argLength: 4, reg: gp2store, asm: "MOVW", typ: "Mem", addrSinkArg0: true}, // store arg2 to arg0 + arg1. arg3=mem
{name: "MOVWstoreshiftLL", argLength: 4, reg: gp2store, asm: "MOVW", aux: "Int32", typ: "Mem", addrSinkArg0: true}, // store arg2 to arg0 + arg1<<auxInt. arg3=mem
{name: "MOVWstoreshiftRL", argLength: 4, reg: gp2store, asm: "MOVW", aux: "Int32", typ: "Mem", addrSinkArg0: true}, // store arg2 to arg0 + arg1>>auxInt, unsigned shift. arg3=mem
{name: "MOVWstoreshiftRA", argLength: 4, reg: gp2store, asm: "MOVW", aux: "Int32", typ: "Mem", addrSinkArg0: true}, // store arg2 to arg0 + arg1>>auxInt, signed shift. arg3=mem
{name: "MOVBstoreidx", argLength: 4, reg: gp2store, asm: "MOVB", typ: "Mem", addrSinkArg0: true}, // store arg2 to arg0 + arg1. arg3=mem
{name: "MOVHstoreidx", argLength: 4, reg: gp2store, asm: "MOVH", typ: "Mem", addrSinkArg0: true}, // store arg2 to arg0 + arg1. arg3=mem

{name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVBS"}, // move from arg0, sign-extended from byte
{name: "MOVBUreg", argLength: 1, reg: gp11, asm: "MOVBU"}, // move from arg0, unsign-extended from byte
Expand Down Expand Up @@ -464,6 +464,7 @@ func init() {
clobbers: buildReg("R1 R12 R14"), // R14 is LR, R12 is linker trampoline scratch register
},
faultOnNilArg0: true,
addrSinkArg0: true,
},

// duffcopy (must be 4-byte aligned)
Expand All @@ -482,6 +483,8 @@ func init() {
},
faultOnNilArg0: true,
faultOnNilArg1: true,
addrSinkArg0: true,
addrSinkArg1: true,
},

// large or unaligned zeroing
Expand All @@ -503,6 +506,7 @@ func init() {
},
clobberFlags: true,
faultOnNilArg0: true,
addrSinkArg0: true,
},

// large or unaligned move
Expand All @@ -526,6 +530,8 @@ func init() {
clobberFlags: true,
faultOnNilArg0: true,
faultOnNilArg1: true,
addrSinkArg0: true,
addrSinkArg1: true,
},

// Scheduler ensures LoweredGetClosurePtr occurs only in entry block,
Expand Down
Loading
Loading