Skip to content

Update openmp/offload to new LLVM-22 build setup#152011

Open
ZuseZ4 wants to merge 1 commit intorust-lang:mainfrom
ZuseZ4:update-offload-bootstrap
Open

Update openmp/offload to new LLVM-22 build setup#152011
ZuseZ4 wants to merge 1 commit intorust-lang:mainfrom
ZuseZ4:update-offload-bootstrap

Conversation

@ZuseZ4
Copy link
Member

@ZuseZ4 ZuseZ4 commented Feb 2, 2026

I'm just testing the libc-gpu build as well, will push an update later.

cc @jhuber6 Does that look like what you have in mind? I'm running all 3 reusing the same output directory (out_dir). I know I shouldn't do that for higher level differences like llvm vs omp/offload builds, but when just having different targets it seems to work fine (?)

cc @Sa4dUs can you test this please for nvidia?

blocked-on LLVM rc3 in #152428, which should include: llvm/llvm-project#179375

blocked on LLVM RC-final, which should include llvm/llvm-project#181048

@ZuseZ4 ZuseZ4 added T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) F-gpu_offload `#![feature(gpu_offload)]` labels Feb 2, 2026
@rustbot rustbot added the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Feb 2, 2026
.profile(profile)
.env("LLVM_CONFIG_REAL", &host_llvm_config)
.define("LLVM_ENABLE_ASSERTIONS", "ON")
.define("LLVM_ENABLE_RUNTIMES", "openmp;offload")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

offload won't work targeting a GPU. I made a change to silently accept this upstream but I don't think you're on that.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried it, but I don't think it's worth backporting. Fwiw this config works locally without your LLVM PR.

@jieyouxu jieyouxu self-assigned this Feb 3, 2026
@rustbot rustbot added the A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. label Feb 3, 2026
@rust-log-analyzer

This comment has been minimized.

@ZuseZ4 ZuseZ4 force-pushed the update-offload-bootstrap branch from 1a6f0e4 to a85f0aa Compare February 6, 2026 00:49
@rust-bors

This comment has been minimized.

@ZuseZ4 ZuseZ4 force-pushed the update-offload-bootstrap branch from a85f0aa to 3becbd2 Compare February 12, 2026 18:05
@rust-log-analyzer

This comment has been minimized.

@ZuseZ4
Copy link
Member Author

ZuseZ4 commented Feb 12, 2026

So, with the vendored llvm patch (it's backport will be in the next Release candidate in 2 weeks) I can now locally build libc-for-gpu, which is the last piece that I had to postpone so far. Now it finishes the llvm and ompoffload/libc build steps.

@rust-bors

This comment has been minimized.

@ZuseZ4 ZuseZ4 force-pushed the update-offload-bootstrap branch from 3becbd2 to 4e818c9 Compare February 27, 2026 20:35
@ZuseZ4
Copy link
Member Author

ZuseZ4 commented Feb 27, 2026

@jieyouxu I rebased one the latest llvm, which had another backport for us.
I got it to work in one config, but the main setup for local builds now still fails. That is, if someone sets clang = true and offload = true.

The problem is simply, that we want to compile libc-for-gpu with a nvptx/amdgcn as targets.
We don't want a full cross-compilation of rustc, so we have x86 as target.
That works for all other omp/offload libraries, but libc-for-gpu breaks if we try to compile it for x86, which is fair.
I tried to remove the line where we set the target in configure_cmake (cfg.target(&target.triple).host(&builder.config.host_target.triple);), so libc-for-gpu could guess its GPU target, and rust bootstrap on the other hand isn't "surprised" by a different target.

This runs into the following assertion:

Building OpenMP/Offload for x86_64-unknown-linux-gnu

thread 'main' (868937) panicked at /g/g90/drehwald1/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cmake-0.1.54/src/lib.rs:1119:5:

environment variable `TARGET` not defined

build script failed, must exit now

I also tried to hardcode it as amdgcn-amd-amdhsa. This resulted in

Building OpenMP/Offload for x86_64-unknown-linux-gnu
CMAKE_TOOLCHAIN_FILE_x86_64-unknown-linux-gnu = None
CMAKE_TOOLCHAIN_FILE_x86_64_unknown_linux_gnu = None
TARGET_CMAKE_TOOLCHAIN_FILE = None
CMAKE_TOOLCHAIN_FILE = None

thread 'main' (831028) panicked at /g/g90/drehwald1/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cmake-0.1.54/src/lib.rs:1119:5:

environment variable `CARGO_CFG_TARGET_OS` not defined

build script failed, must exit now

I experimented a bit with setting CARGO_CFG_TARGET_{OS|ARCH}, but that just lead to more bugs.
Do you know a somewhat clean solution to this?

@ZuseZ4 ZuseZ4 marked this pull request as ready for review February 27, 2026 22:42
@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Feb 27, 2026
@jieyouxu
Copy link
Member

(I'll try to take a look this weekend)

Comment on lines +1091 to +1094
cfg.define("LIBC_INCLUDE_BENCHMARKS", "OFF");
cfg.define("LIBC_TARGET_TRIPLE", omp_target);
cfg.define("LLVM_LIBC_FULL_BUILD", "ON");
cfg.define("LLVM_ENABLE_RUNTIMES", "openmp;libc");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Discussion: unfortunately I'm not sure.

I tried to remove the line where we set the target in configure_cmake (cfg.target(&target.triple).host(&builder.config.host_target.triple);), so libc-for-gpu could guess its GPU target, and rust bootstrap on the other hand isn't "surprised" by a different target.

I wonder if you are running into something like #138784 or rust-lang/cmake-rs#242 where cmake-rs isn't really equipped to handle cross-compilation outside of build.rs (i.e. used as a runtime library)?

Copy link
Member Author

@ZuseZ4 ZuseZ4 Mar 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like that we're both here being unsure about a cmake change, while you link an issue about two other rustc devs being unsure about a cmake change. I see a common pattern here :D

@madsmtm it looks like you've been involved in some related issues. I have a single cmake invocation (out of 3 or 4) during bootstrap where I want the cpu target to either not be printed, or replace it once with a gpu target. Is there a way to achieve that?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes 4 in total 😆

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. Since we already know that we don't understand it, I did the only reasonable thing: I didn't change anything and recompiled. It now works.

I also rebased and re-tested it in both combinations (enabling the clang project which is the normal local workflow, and with an external clang/llvm which is our CI workflow).

libc still uses the compiler name as a C++ namespace, which breaks since rust uses a . in our compiler name (1.96). I undefine and redefine it which breaks if you ctrl-C during the build and re-start (since it doesn't re-undefine the old name), but there should be a tracked variable for it.

To be clear, our current behaviour of setting the target to the host cpu when we compile libc (or some of the other gpu projects here) for a gpu is wrong, but we don't seem to know how to resolve that properly and it works for now, so I'll take that.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. Since we already know that we don't understand it, I did the only reasonable thing: I didn't change anything and recompiled. It now works.

Image

To be clear, our current behaviour of setting the target to the host cpu when we compile libc (or some of the other gpu projects here) for a gpu is wrong, but we don't seem to know how to resolve that properly and it works for now, so I'll take that.

Can you leave that as an FIXME in the code / tracked as an issue somewhere?

@ZuseZ4 ZuseZ4 force-pushed the update-offload-bootstrap branch from 4e818c9 to c462c5b Compare March 18, 2026 19:43
@rustbot
Copy link
Collaborator

rustbot commented Mar 18, 2026

This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed.

Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers.

Copy link
Member

@jieyouxu jieyouxu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes seem okay, one FIXME request. You can r=me after.

View changes since this review

Comment on lines +1091 to +1094
cfg.define("LIBC_INCLUDE_BENCHMARKS", "OFF");
cfg.define("LIBC_TARGET_TRIPLE", omp_target);
cfg.define("LLVM_LIBC_FULL_BUILD", "ON");
cfg.define("LLVM_ENABLE_RUNTIMES", "openmp;libc");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. Since we already know that we don't understand it, I did the only reasonable thing: I didn't change anything and recompiled. It now works.

Image

To be clear, our current behaviour of setting the target to the host cpu when we compile libc (or some of the other gpu projects here) for a gpu is wrong, but we don't seem to know how to resolve that properly and it works for now, so I'll take that.

Can you leave that as an FIXME in the code / tracked as an issue somewhere?

@jieyouxu jieyouxu added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Mar 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. F-gpu_offload `#![feature(gpu_offload)]` S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants