cmd/compile: separate entry argument maps from stack growth - #134
Merged
Conversation
This was referenced Aug 13, 2026
zhouguangyuan0718
force-pushed
the
codex/runtime-entry-argmaps
branch
2 times, most recently
from
August 13, 2026 19:15
c8d2fe8 to
b4cf8a6
Compare
zhouguangyuan0718
force-pushed
the
codex/runtime-traceback
branch
from
August 13, 2026 19:15
82da305 to
6d8885a
Compare
zhouguangyuan0718
force-pushed
the
codex/runtime-entry-argmaps
branch
from
August 14, 2026 02:24
b4cf8a6 to
ef993ed
Compare
zhouguangyuan0718
force-pushed
the
codex/runtime-traceback
branch
2 times, most recently
from
August 14, 2026 18:29
a42b371 to
4fffe0a
Compare
zhouguangyuan0718
force-pushed
the
codex/runtime-entry-argmaps
branch
from
August 14, 2026 18:30
ef993ed to
3d5ecf8
Compare
zhouguangyuan0718
added a commit
that referenced
this pull request
Aug 14, 2026
This is 1/5 of the remaining runtime LLVM support stack after the runtime-lowering and builtin foundation merged in #136. Stack: #136 (merged) -> this PR -> #132 -> #133 -> #134 -> #135. This layer completes the Go producer side of the name-only GoObj reference contract already consumed by merged LLVM #79: - external source linkname pulls use the `<linkname>` LLVM declaration suffix - a one-time `name+ABI` definition set keeps local function and data pushes on canonical names - both ordinary `linkname` and standard-library `linknamestd` references are handled - builtin lookup takes precedence, so builtin and linkname encodings remain mutually exclusive - `<ABI0>` stays the outer ABI suffix - suffixed references do not receive ordinary imported-package symbol metadata - local `linknamestd` data definitions retain the standard-library authorization flag The Go IR, SSA, AuxCall, and LSym models are unchanged; no linkname metadata table is added. This PR also does not reintroduce eager full-table builtin declarations, provisional `any` signatures, closure provenance checks, a second cgo parameter-home mechanism, or named-aggregate ABI reshaping. Validation: - `go test -tags="llvm23 dynamicllvm" cmd/internal/goobj cmd/compile/internal/ssa` - raw and O2 LLVM FileCheck for external pulls, local definitions, and ABI0 wrappers - IR -> O2 -> llc -> GoObj smoke: the external symbol is a `nonpackage_reference` with `linkname`; local ABIInternal and ABI0 definitions remain canonical - full stacked joint `make.bash` and downstream focused tests Supersedes only the linkname portion of #128 and the previous mixed implementation in this PR.
zhouguangyuan0718
added a commit
that referenced
this pull request
Aug 15, 2026
This is 2/5 of the remaining runtime LLVM support stack. It depends on the pure linkname contract in #131; the runtime-lowering and builtin foundation is merged in #136. Stack: #136 (merged) -> #131 -> this PR -> #133 -> #134 -> #135. Keep named aggregate types in ABIInternal declarations and definitions. When a caller and callee describe the same physical Go ABI carrier with different nominal types, the caller rebuilds the value at the call boundary. This includes compiler-generated runtime calls, promoted method receivers, results, and open-defer result carriers. The callee signature is recovered from the current-package definition; the caller AuxCall remains authoritative for physical ABI assignment. The differential ABI tests run the normal O2 pipeline before checking fixed stack homes. Focused unit and codegen tests cover named runtime aggregates, caller-side carrier reshaping, promoted receivers, current-package callee signatures, defined aggregate conversions, and named open-defer results. Rebased validation: - joint `make.bash` with the LLVM #79 payload - `cmd/compile/internal/ssa` unit tests - LLVM ABI differential and `llvm_opendefer.go` codegen tests Supersedes the named-ABI and promoted-receiver portions of #128.
zhouguangyuan0718
force-pushed
the
codex/runtime-traceback
branch
2 times, most recently
from
August 15, 2026 04:04
c42a1af to
e59e788
Compare
zhouguangyuan0718
added a commit
that referenced
this pull request
Aug 15, 2026
This is the traceback/inline layer of the remaining runtime LLVM support. PR #132 is merged. Stack: #136 (merged) -> #131 (merged) -> #132 (merged) -> this PR -> #134 -> #135. Preserve runtime traceback and defer semantics across LLVM optimization: - record required frontend inline edges independently of surviving instructions - materialize machine-level inline anchors only when optimization removed an edge - attach the native function-end source position to the synthetic deferreturn recovery call - keep runtime.gorecover itself as a physical frame, while allowing its direct callers to be represented by Go inline frames - conservatively keep nosplit functions out of LLVM inlining so the runtime callRet chain stays within the linker-enforced final GoObj stack limit The nosplit fence is intentionally temporary: native Go permits nosplit inlining, and the linker checks the final PCSP tables and call relocations. The source now carries a TODO to replace the blanket fence with a targeted policy after the callRet frame growth is understood. The debug fixture uses the final machine layout after LLVM #78, including small-leaf stack-check elision. Validation after rebasing onto b79bf4b: - joint make.bash - full cmd/compile/internal/ssa tests with LLVM enabled - focused gorecover identity test - 90/90 plugin CTest, including X86 and AArch64 debug-inline GoObj checks - open-defer codegen through LLVM O2, checking the recover caller attribute group has no noinline - recover1.go passed three consecutive LLVM O2 runs - optimized IR confirms LLVM actually inlined direct recover callers and retained their inlinedAt locations; direct, nested, recursive, and no-op recover semantics still pass - runtime and its 28 dependencies through LLVM O2 with test dependencies native: runtime.test links successfully and the previous callRet nosplit overflow is gone Executing that runtime.test reaches a separate LLVM late stack-check issue before test enumeration: runtime.tlsinit.abi0 receives a stack-growth prologue although the native Go ABI0 wrapper does not. This is after successful linking and is not a symbol-resolution or inline-budget failure in this PR. Supersedes the traceback/defer portion of #128.
zhouguangyuan0718
force-pushed
the
codex/runtime-entry-argmaps
branch
from
August 15, 2026 05:10
3d5ecf8 to
342b7a1
Compare
zhouguangyuan0718
changed the base branch from
codex/runtime-traceback
to
go1.27.master
August 15, 2026 05:10
zhouguangyuan0718
force-pushed
the
codex/runtime-entry-argmaps
branch
2 times, most recently
from
August 15, 2026 05:57
bbb964c to
871dbc2
Compare
zhouguangyuan0718
force-pushed
the
codex/runtime-entry-argmaps
branch
from
August 15, 2026 07:57
871dbc2 to
0c9d14d
Compare
zhouguangyuan0718
added a commit
that referenced
this pull request
Aug 15, 2026
Supersedes #135, which GitHub automatically closed when its dependent base branch from #134 was merged and deleted. This version is rebased on go1.27.master.\n\nQualify LLVM-built standard-library dependency closures:\n\n- compile every whitelisted package and its standard-library dependency closure with LLVM O2 by default\n- remove the old entry-package-only mode and the per-package dependency_closure opt-in\n- execute each whitelisted package test once\n- compile runtime_test and the generated runtime.test main with the native Go backend\n- link runtime tests with -w because complete LLVM DWARF emission is not yet in scope\n- keep G0StackOverflow as real recursion so LLVM tail-call optimization cannot erase the intended stack growth\n- keep archive/zip, compress/gzip, and compress/zlib blacklisted because their closures include the unresolved compress/flate SelectionDAG failure\n\nThe runtime qualification baseline passed Linux amd64 and arm64 in GoALLC run 31874637309 before the policy was generalized. Focused llvmtoolexec and stdlib-policy tests also pass locally. The updated full-closure policy is validated by this PR CI.\n\nThis is the final runtime and stdlib dependency-closure qualification layer split from #128.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This is the entry-argument-map and stack-growth layer of the remaining runtime LLVM support. PR #133 is merged.
Stack: #136 (merged) -> #131 (merged) -> #132 (merged) -> #133 (merged) -> this PR -> #135.
Implement the final entry-map and stack-growth contract agreed with LLVM #78:
The Machine StackMaps bridge remains Go-owned:
GoALLCStackMapPrinterdistinguishes the function-entrySTACKMAPfrom ordinary statepoint records and passes their raw locations throughMCContext; LLVM only provides generic metadata-printer dispatch and final GoObj serialization. Object-levelobjviewchecks cover entry PCDATA=-1, entry ArgsPointerMaps map 0, ordinary statepoint map 1, returning to entry depth, and the morestack map-0 path.The pinned payload is
goallc-llvm23.1.0-20260815T055258Z, revisionce1ede9c622755eeeb0ea695d5bffad3bac32dcc, released after LLVM #81 merged.Validation after rebasing onto #133 merge
24581b9a69:make.bashand linux amd64/arm64 CI on the fallback payloadcmd/compile/internal/ssatests with LLVM enabledThe stale LLVM
nowritebarrierrecpropagation test from the old stack was removed: finalized-IR enforcement remains the existing explicit TODO and is outside this entry-map PR.Supersedes the entry-argmap and stack-growth portion of #128.