Skip to content

feat(oxide): check native block participation and output ownership - #1572

Draft
tpn wants to merge 77 commits into
NVIDIA:mainfrom
tpn:codex/coop-interop-checked-collectives
Draft

tpn wants to merge 77 commits into
NVIDIA:mainfrom
tpn:codex/coop-interop-checked-collectives

Conversation

@tpn

@tpn tpn commented Oct 20, 2026 •

Copy link
Copy Markdown

Native block operations require every thread to reach the call, agree on its controls and complete conflicting output accesses. This adds those checks and typed collective output views.

The checker runs on prepared dialect MIR in rustc-free mir-transforms, after mem2reg, using the existing AnalysisManager. The rustc boundary supplies genuine identity/type/effect metadata. This update supports the upstream stable 1.99.1 toolchain, including primitive integer Ord::min/max controls, while keeping ordinary helper calls conservative. No compile-time speedup is claimed.

Validation: importer tests and strict checks; all 42 compiler controls; matching ordinary Git and fresh HTTPS builds in Normal and Full modes. The original Normal GPU runs pass 1,920 raw values and 672 checked cases (811,008 scalar comparisons). Final HTTPS executable sections, ABI, resources and launch facts match the ordinary builds. Older nightly artifacts differ by one bounded min instruction in each of seven helpers; whole-image/debug differences remain recorded. Current-head CI is separate.

This draft includes prerequisites #1566, #1567, #1570, #1565 and #1496. Its main base makes the Files tab cumulative. Narrow existing-number stacks require maintainer-created upstream parent branches or prerequisite landing; fork branches cannot serve as upstream bases. The MIR migration commit isolates the architecture change; the integer-control correction isolates the stable-toolchain fix. All related PRs remain draft.

fxeqxmulfx and others added 30 commits October 12, 2026 02:14
With `lto = "fat"` or `lto = "thin"`, the build of a binary that uses a
library with kernels stopped with an error: "failed to get bitcode from
object file for LTO (Can't find section .llvmbc)". rustc keeps a list of
the Rust objects in each rlib. This list contains the objects of all
modules. With LTO, rustc reads bitcode from these objects and removes
them from the link. The artifact objects have no bitcode.

If a session writes an rlib, the backend now gives each artifact object
to rustc as the DWARF object of its module. This object is in the rlib,
but it is not in the list. LTO does not read this object, and the linker
gets it from the rlib.

The system linker does not get the DWARF objects. If the session also
writes a binary or a dynamic library, the backend gives the artifact
objects to this linker as link arguments. With
`-Zlink-native-libraries=no`, rustc does not give link arguments to the
linker. Then the artifact objects of this session are Rust objects, as
before.

The book said that `join_codegen()` and `link()` only call the LLVM
backend. Now it tells what they add to the outputs.

CI builds `cuda_module_in_lib` with fat LTO. The library is an rlib, and
then an rlib and a cdylib. After each build, CI makes sure that the
binary has the PTX bundles of the library and of the binary. It also
makes sure that the cdylib has the PTX bundle of the library.

Fixes NVIDIA#1495

Signed-off-by: Mikhail Borisov <mikhail.boriso2014@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Use Cargo target names for standalone emit-ltoir artifacts. Bind the
compiler and reader to the same intermediate directory when invoked
from a Cargo workspace member.

Signed-off-by: Trent Nelson <trent@trent.me>
Accept ordered external LTO files when materializing embedded cubins.
Include their content in the codegen fingerprint and verify owned bytes
before linking through the existing finalizer. Preserve inputs that
overlap generated output paths and diagnose unresolved device symbols.

Add a standalone CUDA FFI example and a native regression script.

Signed-off-by: Trent Nelson <trent@trent.me>
Reuse existing example dependency pins and classify external LTO as
an FFI fixture. Run its linking regression in native sweeps and verify
relocatable debug output in the existing full-debug route.

Signed-off-by: Trent Nelson <trent@trent.me>
Preserve exact geometry and fixed dynamic shared-memory requirements
through artifact loading so preparation can select and validate the
compiled allocation. Keep artifact writers and readers on one in-tree
implementation while preserving legacy bundles without launch facts.

Signed-off-by: Trent Nelson <trent@trent.me>
Combine the reviewed compiler prerequisites for native library calls.
Keep the external LTO fixture on the shared in-tree artifact implementation.

Signed-off-by: Trent Nelson <trent@trent.me>
Use the reviewed Cargo target and output-directory correction in the
combined compiler prerequisite tree.

Signed-off-by: Trent Nelson <trent@trent.me>
Resolve concrete registration functions and scalar argument types during
device compilation, then invoke the native provider and link its owned
LTO output through the ordinary artifact finalizer.

Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Carry the convergence marker through private dependency metadata and
emit it on each marked LLVM declaration before native optimization.
Deduplicate repeated extern symbols while rejecting incompatible
signatures and convergence requirements.

Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>

# Conflicts:
#	cuda-oxide/crates/rustc-codegen-cuda/src/library.rs
Keep original MIR and static identities while emitting checked helper

bodies for each root. Route typed calls and native plans through those

bodies so shared helpers can use distinct block shapes.

Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Treat each block as one cluster when a known earlier target is selected.
Bind a device hint only after this fallback is used, so later feature
selection cannot silently change its semantics. Keep raw intrinsic and
cluster operation target requirements intact.

Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
@nihalpasham nihalpasham added device-apis User-facing device-side and kernel-authoring APIs (cuda-device, cuda-macros) safety Memory safety, soundness, or undefined behavior interop Interop with external compilers / frontends enhancement New feature or request Depends Blocked on another PR/issue or an upstream dependency labels Oct 21, 2026
tpn added 24 commits October 21, 2026 21:54
Instantiate a registration getter constant with its concrete function
arguments before reading the registration text. Exercise the existing
raw native calls through a generic associated-constant getter.

Signed-off-by: Trent Nelson <trent@trent.me>
Instantiate a registration getter constant with its concrete function
arguments before reading the registration text. Exercise the existing
raw native calls through a generic associated-constant getter.

Signed-off-by: Trent Nelson <trent@trent.me>
Carry native-call identities and source effects through the importer,
then validate collective participation and payload ownership in the
rustc-free MIR pipeline. Require the consumed proof before materializing
native calls and preserve destination checks during result forwarding.

Remove the raw rustc MIR collective checker.

Signed-off-by: Trent Nelson <trent@trent.me>
Carry the accepted generic registration owner into the block proof
chain. The merged source tree is unchanged.

Signed-off-by: Trent Nelson <trent@trent.me>
Carry the provider branch onto the upstream shared-host v0.5 source.
Refresh the launch-facts example lockfile for the four local packages
so the merged example workspace resolves with --locked.

Signed-off-by: Trent Nelson <trent@trent.me>
Keep both standalone native examples locked to the local v0.5 host
packages after the upstream integration. Third-party dependencies and
all dependency edges are unchanged.

Signed-off-by: Trent Nelson <trent@trent.me>
Retain the rustc-free collective analysis and typed provider changes
while joining the current upstream host and tooling updates.

Signed-off-by: Trent Nelson <trent@trent.me>
Return summaries already receive nonreturn effects through the settled
incoming states. Transfer return blocks to collect their results, and
keep the complete traversal when validating source obligations.

Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Preserve upstream backend selection and output ownership across the
prepared-module pause while retaining native proof and late lowering.

Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Signed-off-by: Trent Nelson <trent@trent.me>
Recognize genuine core integer methods at the import boundary and
retain their scalar effects on the original direct calls. Other
helper calls keep their conservative borrow handling.

Signed-off-by: Trent Nelson <trent@trent.me>
Check signed and unsigned imports and preserve ordinary call effects
when no direct target is selected. Clarify the source metadata comment.

Signed-off-by: Trent Nelson <trent@trent.me>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

codegen Device code-generation pipeline (Rust MIR to IR to PTX) cuda-oxide SIMT programming model: rustc backend, cargo oxide, cuda-device, cuda-host, book Depends Blocked on another PR/issue or an upstream dependency device-apis User-facing device-side and kernel-authoring APIs (cuda-device, cuda-macros) enhancement New feature or request interop Interop with external compilers / frontends safety Memory safety, soundness, or undefined behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants