-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Fix host code appearing in Wasm binaries #137457
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
Thanks for the pull request, and welcome! The Rust team is excited to review your changes, and you should hear from @Kobzol (or someone else) some time within the next two weeks. Please see the contribution instructions for more information. Namely, in order to ensure the minimum review times lag, PR authors and assigned reviewers should ensure that the review label (
|
This PR modifies cc @jieyouxu |
src/bootstrap/src/core/sanity.rs
Outdated
|
||
fn is_gcc_compiler(path: PathBuf, build: &Build) -> bool { | ||
let cc_output = command(&path).arg("--version").run_capture_stdout(build).stdout(); | ||
cc_output.contains("GCC") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i don't think this does what you want. on my machine, cc --version
prints "cc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0", even though it's really gcc.
i am not sure how to check this ... maybe the rust equivalent of realpath $(which cc) | rg gcc
? or we could check cc.is_like_clang()
: https://docs.rs/cc/latest/cc/struct.Tool.html#method.is_like_clang
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll try to find a gcc-specific flag to run. If all else fails, we can try compiling a C program and check if some headers are defined.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When going down this path I might recommend something like clang -E -dM -x c /dev/null | rg -i clang
which will print #define __clang__ 1
. That's a test for clang rather than a test for "not gcc" but at this time only clang has support for wasm, so it might work as a detection mechanism nonetheless?
Although IMO rejecting compilers like this is a bit of a tricky business that's bound to have false positives and negatives so personally I'd probably just skip this part and rely on the test you added instead.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This can just be a UI test (tests/ui
), which are cheaper to run than rmake
(one thing to compile rather than 2-3). You'll just need the directives //@ only-wasm32
and //@ compile-flags: -Dlinker-messages
.
Please make sure tests have a doc comment describing what they are testing as well.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Got it. I'll rewrite this next week - is there anything else?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just to be clear - this should be a //@ build-pass
test without an expected output, right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That sounds correct 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Detecting GCC would be also useful for other things, but it sounds a bit tricky. Left one nit, otherwise the bootstrap changes (modulo GCC detection, which isn't working yet) look fine. I don't know about WASM though, so someone else should look at that.
src/bootstrap/src/core/sanity.rs
Outdated
@@ -314,6 +314,17 @@ than building it. | |||
.entry(*target) | |||
.or_insert_with(|| Target::from_triple(&target.triple)); | |||
|
|||
// compiler-rt c fallbacks for wasm cannot be built with gcc | |||
if (target.triple == "wasm32-unknown-unknown" || target.triple == "wasm32v1-none") // bare metal targets without wasi sdk |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you please add a method to TargetSelection
named e.g. is_bare_wasm
, or is_wasm_without_wasi
or something like that that describes this family of targets?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If going down this compiler-detection route I'd recommend enabling this for all wasm targets, not just the unknown/none targets. The WASI targets have some auto-configuration but the same principle applies here where if gcc is used then that's a bug for WASI as well.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If going down this compiler-detection route I'd recommend enabling this for all wasm targets, not just the unknown/none targets.
Would this entail some sort of check to see if the wasi sdk is using gcc?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In theory (unless I'm misremembering something) nothing more than what's already here other than updating this conditional. The detected compiler for WASI targets should make its way to here and always be clang (wasi-sdk doesn't have gcc and won't for the forseeable future)
cc @alexcrichton (target maintainer for |
|
Do note that bootstrap |
Hey yall, just wanted everyone to be aware I'm in a power outage so I probably can't work on this today. |
There is never any requirement to work on a PR every day, thanks for being active but take your time :) |
Thanks, I'll probably finish the changes on Sunday or so then |
I've changed the test to a UI test, and changed the compiler detection. I'm not sure about the consensus on that - are we still going use it? The commits for that can be scrapped if so |
The UI and runtime tests sadly won't help that much for this issue, because it's possible that we might use Clang on test builders, but GCC on dist builders. But the bootstrap sanity check should hopefully do the trick. |
For wasm specifically targets I think that Clang should be used everywhere because gcc doesn't have support for wasm. If any builder is using gcc for wasm that's definitely a bug that needs fixing (which the tests might help detect?) |
Well, the dist builders only build stuff, it's not actually tested on most dist builders, which is why #132802 was a thing. So the UI/run-make tests are nice to have, but wouldn't help for this situation. But with the bootstrap sanity test I think it's fine. You can r=me, unless you want to do more changes. |
Oh, right, yes! (sorry your original comment is clearer now that I've woken up more...) |
Great, so the sanity test is going to be kept? |
Yeah, let's keep the tests. Let's see if CI works. @bors try |
fix for issue 132802: x86 code in `wasm32-unknown-unknown` binaries This is a direct fix for issue [132802](rust-lang#132802). Followed the outline as follows: > * give a hard error in bootstrap when using gcc to compile for wasm > * change our CI to use clang instead of gcc > * add a test that compiling a sample program for wasm32-unknown doesn't give any linker warnings The `test-various` ci job was also changed. try-job: test-various try-job: dist-various-2
This comment was marked as outdated.
This comment was marked as outdated.
This comment has been minimized.
This comment has been minimized.
This comment was marked as outdated.
This comment was marked as outdated.
I'm having some trouble reproducing the error, and the original logs are deleted. Perhaps we could let bors try it again so I could have a better idea of what's happening? |
@bors2 try |
Fix host code appearing in Wasm binaries <!-- homu-ignore:start --> <!-- If this PR is related to an unstable feature or an otherwise tracked effort, please link to the relevant tracking issue here. If you don't know of a related tracking issue or there are none, feel free to ignore this. This PR will get automatically assigned to a reviewer. In case you would like a specific user to review your work, you can assign it to them by using r? <reviewer name> --> <!-- homu-ignore:end --> This is a direct fix for issue [132802](#132802). Followed the outline as follows: > * give a hard error in bootstrap when using gcc to compile for wasm > * change our CI to use clang instead of gcc > * add a test that compiling a sample program for wasm32-unknown doesn't give any linker warnings The `test-various` ci job was also changed. try-job: test-various try-job: dist-various-1 try-job: dist-various-2 try-job: x86_64-msvc-1
For future reference, rust-log-analyzer saves a snip of the error in a comment that doesn't go away #137457 (comment). The problem here was that it's hitting the panic message that's added in this PR, meaning it's not trying to build with Clang, so you'll probably need what I mentioned here #137457 (comment). No harm in getting fresh results though! |
💔 Test failed
|
It's strange though - the only wasm target in dist-various-1 is the emscripten one, which should use emcc as its c compiler. It's based off of clang, but if you check a few lines above the error in that comment, it says that it failed to run the compiler detection tool with emcc. Perhaps that might be the issue? |
Good point, |
test-various works when ran locally, and it seems like the error was that the gnu mirror kept timing out. Maybe it was a one-off network issue when running CI?
|
@bors2 try |
Fix host code appearing in Wasm binaries <!-- homu-ignore:start --> <!-- If this PR is related to an unstable feature or an otherwise tracked effort, please link to the relevant tracking issue here. If you don't know of a related tracking issue or there are none, feel free to ignore this. This PR will get automatically assigned to a reviewer. In case you would like a specific user to review your work, you can assign it to them by using r? <reviewer name> --> <!-- homu-ignore:end --> This is a direct fix for issue [132802](#132802). Followed the outline as follows: > * give a hard error in bootstrap when using gcc to compile for wasm > * change our CI to use clang instead of gcc > * add a test that compiling a sample program for wasm32-unknown doesn't give any linker warnings The `test-various` ci job was also changed. try-job: test-various try-job: dist-various-1 try-job: dist-various-2 try-job: x86_64-msvc-1
💔 Test failed
|
Will look into soon |
For lack of a better idea about that seemingly spurious CI failure, let's just see where the other jobs get @bors2 try jobs=dist-various* |
Fix host code appearing in Wasm binaries <!-- homu-ignore:start --> <!-- If this PR is related to an unstable feature or an otherwise tracked effort, please link to the relevant tracking issue here. If you don't know of a related tracking issue or there are none, feel free to ignore this. This PR will get automatically assigned to a reviewer. In case you would like a specific user to review your work, you can assign it to them by using r? <reviewer name> --> <!-- homu-ignore:end --> This is a direct fix for issue [132802](#132802). Followed the outline as follows: > * give a hard error in bootstrap when using gcc to compile for wasm > * change our CI to use clang instead of gcc > * add a test that compiling a sample program for wasm32-unknown doesn't give any linker warnings The `test-various` ci job was also changed. try-job: test-various try-job: dist-various-1 try-job: dist-various-2 try-job: x86_64-msvc-1 try-job: dist-various*
Seems like the change to the dockerfile just busts cache and we're hitting a spurious download. Discussion at #t-infra > test-various |
💔 Test failed
|
That's more like it!
I guess you might need to check |
makes me wonder if there's a better way to detect emcc specifically, or group it into clang |
That's probably worth an issue on the cc repo if you're up for writing one up. @bors2 try |
Fix host code appearing in Wasm binaries <!-- homu-ignore:start --> <!-- If this PR is related to an unstable feature or an otherwise tracked effort, please link to the relevant tracking issue here. If you don't know of a related tracking issue or there are none, feel free to ignore this. This PR will get automatically assigned to a reviewer. In case you would like a specific user to review your work, you can assign it to them by using r? <reviewer name> --> <!-- homu-ignore:end --> This is a direct fix for issue [132802](#132802). Followed the outline as follows: > * give a hard error in bootstrap when using gcc to compile for wasm > * change our CI to use clang instead of gcc > * add a test that compiling a sample program for wasm32-unknown doesn't give any linker warnings The `test-various` ci job was also changed. try-job: test-various try-job: dist-various-1 try-job: dist-various-2 try-job: x86_64-msvc-1
ENV WASM_TARGETS=wasm32-wasip1 | ||
ENV WASM_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $WASM_TARGETS \ | ||
ENV WASM_WASIP_TARGET=wasm32-wasip1 | ||
ENV WASM_WASIP_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $WASM_WASIP_TARGET \ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What exactly is going on with the changes in this file btw? It looks like a variable rename, which should be inconsequential, plus installing gcc-multilib?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually, why is this wasi build succeeding? We don't set CC_wasm32_wasip1
to Clang anywhere, which would mean GCC is the default.
I think it would be good to set the CC_*
variables even if it works for some reason, to make it explicit that we want clang.
This is a direct fix for issue 132802.
Followed the outline as follows:
The
test-various
ci job was also changed.try-job: test-various
try-job: dist-various-1
try-job: dist-various-2
try-job: x86_64-msvc-1