Uh oh!
There was an error while loading. Please reload this page.
Use protected visibility when building rustc with LLD - #131634
Conversation
tgross35
commented
Oct 13, 2024
Multiple atomic commits in a single PR are totally fine, that's easier to review and better for history anyway (the way you have this PR is ideal imo). We definitely don't want a bunch of back and forth WIP-style commits that make changes just to undo them or fix things up, but there is no 1PR=1commit rule like LLVM. |
nikic
commented
Oct 13, 2024
@bors try @rust-timer queue |
This comment has been minimized.
This comment has been minimized.
bors
commented
Oct 13, 2024
Use protected visibility when LLD feature is enabled and enable it when building rustc rust-lang/compiler-team#782 I wasn't sure about having two commits in a PR, but I figured, at least initially it might make sense to discuss these commits together. Happy to squash, or move the second commit to a separate PR. I contemplated trying to enable protected visibility for more cases when LLD will be used other than just `-Zlinker-features=+lld`, but that would be more a complex change that probably still wouldn't cover all cases when LLD is used, so went with the simplest option of just checking if the linker-feature is enabled. r? lqd
bors
commented
Oct 13, 2024
☀️ Try build successful - checks-actions |
This comment has been minimized.
This comment has been minimized.
rust-timer
commented
Oct 13, 2024
Finished benchmarking commit (6ad0952): comparison URL. Overall result: ✅ improvements - no action neededBenchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf. @bors rollup=never Instruction countThis is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.
Max RSS (memory usage)Results (primary -2.2%, secondary -3.2%)This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
CyclesResults (primary -3.3%, secondary -7.4%)This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
Binary sizeResults (primary -0.3%, secondary -0.7%)This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
Bootstrap: 783.66s -> 778.727s (-0.63%) |
lqd
commented
Oct 14, 2024
I was expecting we'd only do this when using lld by default on stable. Just using a different default linker on nightly has bitten us at least once in the recent past, and I didn't think we'd want the 2 configs to drift even more. But if others are fine with it, so am I. Cool, as expected these results match bjorn's old prototype I mentioned in the MCP. However, could you explain a bit about the intent? Did you want to change visibility when using lld in general, or when using
It's very much welcomed in general, however in this case I think we may need to extract the second commit in another PR: the exact handling of |
Kobzol
commented
Oct 14, 2024
Perf. results look great! 🎉 The bootstrap change is a bit drive-by, though. We should finally refactor the way we handle LLD in bootstrap, I'll try to priotize it soon-ish. That's partially orthogonal to this PR, though. I wonder if we should first enable this only for the compiler itself? Both to separate the perf. effect on the compiler from the perf. effect on the binaries, and also to test it for a while on nightly on the compiler before we enable it by default for all binaries compiled by a nightly compiler. |
davidlattimore
commented
Oct 15, 2024
My intent was primarily, at least initially to use protected visibility for rustc-driver. Not tying it to LLD and flagging it on for just rustc initially sounds sensible to me. One thing I'm not sure about though is whether that means I'll need to wait until |
Kobzol
commented
Oct 15, 2024
I would only do it for stage 2, we already do a bunch of optimizations on stage 2 only anyway, e.g. PGO and BOLT. So when building stage 2 rustc, I'd just forcefully set the -Zdefault-visibility flag. |
bootstrap uses beta and IIRC for stage-dependent flags, it should be done in bootstrap, e.g. around here (similarly to @rustbot author |
| let mut args = vec![]; | ||
| if !builder.is_lld_direct_linker(target) && builder.config.lld_mode.is_used() { | ||
| args.push(String::from("-Clink-arg=-fuse-ld=lld")); | ||
| args.push(String::from("-Zlinker-features=+lld")); |
There was a problem hiding this comment.
I think we should keep building the standard library with default visibility as CI will build with lld, but the end user may then use this version of the standard library with ld.bfd. For librustc_driver.so it is completely fine though. Same for tools and codegen backends.
There was a problem hiding this comment.
That's a very good point. I suspect that means that parts of the standard library that make it into the dylib, will unfortunately still have default visibility, but there might not be much we can do about that in the short term - unless we were to build a copy of the standard library specifically for use in rustc_driver that used protected visibility, then distribute a copy of the standard library that used default visibility. I guess that'd be like building the compiler with -Zbuild-std and -Zdefault-visibility=protected.
1e1bf2b to
977730bComparerustbot
commented
Oct 31, 2024
This PR modifies If appropriate, please update |
This comment has been minimized.
This comment has been minimized.
977730b to
1441a82Comparedavidlattimore
commented
Oct 31, 2024
As suggested, I've updated this PR so that LLD is no longer involved. I now just set I added a flag |
mati865
commented
Oct 31, 2024
Please update PR name. |
onur-ozkan
commented
Oct 31, 2024
Yeah, I’m aware of that. I was just pointing out if we are ever going to override this with |
Ah, yeah, I don't think that we would ever disable it, the config option would mostly be useful to people that build rustc and 1) use new LD and want to get the optimization or 2) use LLD and want to disable the optimization (for some reason). Both sounds kind of niche, so until someone tells us that they need it, I'd also just remove the option. |
d1f7f68 to
00da974Comparedavidlattimore
commented
Oct 31, 2024
Simpler change is good. I've removed the config option and now just use protected symbols when building rustc with LLD. |
lqd
commented
Oct 31, 2024
Since this is something important we don't want to change accidentally, we could/should set the interposable visibility we expect for std explicitly. |
davidlattimore
commented
Oct 31, 2024
I added a commit for this. |
Kobzol
commented
Oct 31, 2024
@rust-timer build 3639412 |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
rust-timer
commented
Oct 31, 2024
Finished benchmarking commit (3639412): comparison URL. Overall result: ✅ improvements - no action neededBenchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf. @bors rollup=never Instruction countThis is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.
Max RSS (memory usage)Results (primary -1.9%, secondary -2.7%)This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
CyclesResults (primary -6.5%, secondary -7.5%)This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
Binary sizeThis benchmark run did not return any relevant results for this metric. Bootstrap: 783.744s -> 781.748s (-0.25%) |
f572470 to
00da974CompareKobzol
commented
Oct 31, 2024
@bors r+ |
bors
commented
Oct 31, 2024
davidlattimore
commented
Oct 31, 2024
There was a test failure on mingw after I added the commit to set interposable visibility when building std. Not sure if it was a flake or an actual failure. Either way, I removed that commit from this PR and put it in a separate PR - #132432 |
Kobzol
commented
Oct 31, 2024
Looked like a genuine failure to me. Anyway, I agree that it's better to separate these two. |
bors
commented
Nov 1, 2024
bors
commented
Nov 1, 2024
☀️ Test successful - checks-actions |
rust-timer
commented
Nov 1, 2024
Finished benchmarking commit (9fa9ef3): comparison URL. Overall result: ✅ improvements - no action needed@rustbot label: -perf-regression Instruction countThis is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.
Max RSS (memory usage)Results (primary -2.1%, secondary -3.3%)This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
CyclesResults (primary -8.2%, secondary -7.4%)This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
Binary sizeThis benchmark run did not return any relevant results for this metric. Bootstrap: 782.66s -> 779.567s (-0.40%) |
Kobzol
commented
Nov 1, 2024
Great job David! |
Not related but noticed, that dep_graph https://perf.rust-lang.org/compare.html?start=a8e1186e3c14a54f7a38cc1183117dc7e77f4f82&end=9fa9ef385c0aad8f5d4c8f7d92dca474367943a3&stat=size%3Adep_graph&tab=compile&nonRelevant=true&showRawData=true values slightly unstable: 1-2 byte jumps around is weird (can be seen in history graph better). |
rust-lang/compiler-team#782
I wasn't sure about having two commits in a PR, but I figured, at least initially it might make sense to discuss these commits together. Happy to squash, or move the second commit to a separate PR.
I contemplated trying to enable protected visibility for more cases when LLD will be used other than just
-Zlinker-features=+lld, but that would be more a complex change that probably still wouldn't cover all cases when LLD is used, so went with the simplest option of just checking if the linker-feature is enabled.r? lqd