Uh oh!
There was an error while loading. Please reload this page.
rustc: Lower link args to @-files on Windows more - #47507
Conversation
rust-highfive
commented
Jan 17, 2018
(rust_highfive has picked a reviewer for you, use r? to override) |
alexcrichton
commented
Jan 17, 2018
I'm also tagging this as beta-nominated since incremental is in beta now |
There was a problem hiding this comment.
This seems to be false? The code below compares with 6*1024, which is 6,144. Though it's already fairly clear what we're trying to say.
There was a problem hiding this comment.
Oh that's actually intentional in the sense that we are sort of checking against 8192, I just randomly chose 6k instead to assume some percentage of slop when calculating the length of the command line (I've updated the comment though to hopefully reflect this!)
michaelwoerister
commented
Jan 17, 2018
Thank you, Alex! r=me with the inconsistency that @Mark-Simulacrum mentioned ironed out. |
d09be7a to
9e50cc8Comparealexcrichton
commented
Jan 17, 2018
@bors: r=michaelwoerister |
bors
commented
Jan 17, 2018
📌 Commit 9e50cc8 has been approved by |
Work around excessive command-line length issues by disabling incremental rust compilation, which is enabled by default outside `cargo --release` starting with Rust 1.24. Incremental rust builds shouldn't help much in automation, where sccache provides the only continuity between build environments. In the meantime, they add a lot of object files to the link line. See rust-lang/rust#47507 about addressing the underlying issue upstream. MozReview-Commit-ID: LRwUj3fhiaO --HG-- extra : rebase_source : 1739a7570b2e7fe40ead3b301ea20c2fe79f0431
alexcrichton
commented
Jan 18, 2018
@bors: p=1 (this'll get backported to beta once merged) |
bors
commented
Jan 19, 2018
⌛ Testing commit 9e50cc8b73d8df9fae1645299a8bf1251e9493d4 with merge c75f68ca414269a3de08c9963657fc2b37a078b1... |
bors
commented
Jan 19, 2018
💔 Test failed - status-appveyor |
alexcrichton
commented
Jan 19, 2018
bors
commented
Jan 19, 2018
⌛ Testing commit 9e50cc8b73d8df9fae1645299a8bf1251e9493d4 with merge 0b574b519c158f160bcc9078c3fc693a7bee22ec... |
bors
commented
Jan 19, 2018
💔 Test failed - status-appveyor |
alexcrichton
commented
Jan 19, 2018
on second thought, not spurious |
9e50cc8 to
db2c548Comparealexcrichton
commented
Jan 20, 2018
@bors: r=michaelwoerister |
bors
commented
Jan 20, 2018
💔 Test failed - status-appveyor |
b3b3768 to
3ca320cComparealexcrichton
commented
Jan 20, 2018
@bors: r=michaelwoerister |
bors
commented
Jan 20, 2018
📌 Commit 3ca320c has been approved by |
bors
commented
Jan 21, 2018
…ster rustc: Lower link args to `@`-files on Windows more When spawning a linker rustc has historically been known to blow OS limits for the command line being too large, notably on Windows. This is especially true of incremental compilation where there can be dozens of object files per compilation. The compiler currently has logic for detecting a failure to spawn and instead passing arguments via a file instead, but this failure detection only triggers if a process actually fails to spawn. Unfortunately on Windows we've got something else to worry about which is `cmd.exe`. The compiler may be running a linker through `cmd.exe` where `cmd.exe` has a limit of 8192 on the command line vs 32k on `CreateProcess`. Moreso rustc actually succeeds in spawning `cmd.exe` today, it's just that after it's running `cmd.exe` fails to spawn its child, which rustc doesn't currently detect. Consequently this commit updates the logic for the spawning the linker on Windows to instead have a heuristic to see if we need to pass arguments via a file. This heuristic is an overly pessimistic and "inaccurate" calculation which just calls `len` on a bunch of `OsString` instances (where `len` is not precisely the length in u16 elements). This number, when exceeding the 6k threshold, will force rustc to always pass arguments through a file. This strategy should avoid us trying to parse the output on Windows of the linker to see if it successfully spawned yet failed to actually sub-spawn the linker. We may just be passing arguments through files a little more commonly now... The motivation for this commit was a recent bug in Gecko [1] when beta testing, notably when incremental compilation was enabled it blew out the limit on `cmd.exe`. This commit will also fix#46999 as well though as emscripten uses a bat script as well (and we're blowing the limit there). [1]: https://bugzilla.mozilla.org/show_bug.cgi?id=1430886Closes#46999
bors
commented
Jan 21, 2018
💔 Test failed - status-appveyor |
bors
commented
Jan 21, 2018
☔ The latest upstream changes (presumably #45684) made this pull request unmergeable. Please resolve the merge conflicts. |
When spawning a linker rustc has historically been known to blow OS limits for the command line being too large, notably on Windows. This is especially true of incremental compilation where there can be dozens of object files per compilation. The compiler currently has logic for detecting a failure to spawn and instead passing arguments via a file instead, but this failure detection only triggers if a process actually fails to spawn. Unfortunately on Windows we've got something else to worry about which is `cmd.exe`. The compiler may be running a linker through `cmd.exe` where `cmd.exe` has a limit of 8192 on the command line vs 32k on `CreateProcess`. Moreso rustc actually succeeds in spawning `cmd.exe` today, it's just that after it's running `cmd.exe` fails to spawn its child, which rustc doesn't currently detect. Consequently this commit updates the logic for the spawning the linker on Windows to instead have a heuristic to see if we need to pass arguments via a file. This heuristic is an overly pessimistic and "inaccurate" calculation which just calls `len` on a bunch of `OsString` instances (where `len` is not precisely the length in u16 elements). This number, when exceeding the 6k threshold, will force rustc to always pass arguments through a file. This strategy should avoid us trying to parse the output on Windows of the linker to see if it successfully spawned yet failed to actually sub-spawn the linker. We may just be passing arguments through files a little more commonly now... The motivation for this commit was a recent bug in Gecko [1] when beta testing, notably when incremental compilation was enabled it blew out the limit on `cmd.exe`. This commit will also fixrust-lang#46999 as well though as emscripten uses a bat script as well (and we're blowing the limit there). [1]: https://bugzilla.mozilla.org/show_bug.cgi?id=1430886Closesrust-lang#46999
3ca320c to
66366f9Comparealexcrichton
commented
Jan 22, 2018
I've rebased but this isn't ready for merging, I'm investigating that last failure. |
alexcrichton
commented
Jan 22, 2018
@bors: r=michaelwoerister |
bors
commented
Jan 22, 2018
📌 Commit 66366f9 has been approved by |
bors
commented
Jan 22, 2018
…ster rustc: Lower link args to `@`-files on Windows more When spawning a linker rustc has historically been known to blow OS limits for the command line being too large, notably on Windows. This is especially true of incremental compilation where there can be dozens of object files per compilation. The compiler currently has logic for detecting a failure to spawn and instead passing arguments via a file instead, but this failure detection only triggers if a process actually fails to spawn. Unfortunately on Windows we've got something else to worry about which is `cmd.exe`. The compiler may be running a linker through `cmd.exe` where `cmd.exe` has a limit of 8192 on the command line vs 32k on `CreateProcess`. Moreso rustc actually succeeds in spawning `cmd.exe` today, it's just that after it's running `cmd.exe` fails to spawn its child, which rustc doesn't currently detect. Consequently this commit updates the logic for the spawning the linker on Windows to instead have a heuristic to see if we need to pass arguments via a file. This heuristic is an overly pessimistic and "inaccurate" calculation which just calls `len` on a bunch of `OsString` instances (where `len` is not precisely the length in u16 elements). This number, when exceeding the 6k threshold, will force rustc to always pass arguments through a file. This strategy should avoid us trying to parse the output on Windows of the linker to see if it successfully spawned yet failed to actually sub-spawn the linker. We may just be passing arguments through files a little more commonly now... The motivation for this commit was a recent bug in Gecko [1] when beta testing, notably when incremental compilation was enabled it blew out the limit on `cmd.exe`. This commit will also fix#46999 as well though as emscripten uses a bat script as well (and we're blowing the limit there). [1]: https://bugzilla.mozilla.org/show_bug.cgi?id=1430886Closes#46999
bors
commented
Jan 22, 2018
☀️ Test successful - status-appveyor, status-travis |
Work around excessive command-line length issues by disabling incremental rust compilation, which is enabled by default outside `cargo --release` starting with Rust 1.24. Incremental rust builds shouldn't help much in automation, where sccache provides the only continuity between build environments. In the meantime, they add a lot of object files to the link line. See rust-lang/rust#47507 about addressing the underlying issue upstream. MozReview-Commit-ID: LRwUj3fhiaO UltraBlame original commit: 261725e65af9b5d98ff593db3db08632bf019454
Work around excessive command-line length issues by disabling incremental rust compilation, which is enabled by default outside `cargo --release` starting with Rust 1.24. Incremental rust builds shouldn't help much in automation, where sccache provides the only continuity between build environments. In the meantime, they add a lot of object files to the link line. See rust-lang/rust#47507 about addressing the underlying issue upstream. MozReview-Commit-ID: LRwUj3fhiaO UltraBlame original commit: 261725e65af9b5d98ff593db3db08632bf019454
Work around excessive command-line length issues by disabling incremental rust compilation, which is enabled by default outside `cargo --release` starting with Rust 1.24. Incremental rust builds shouldn't help much in automation, where sccache provides the only continuity between build environments. In the meantime, they add a lot of object files to the link line. See rust-lang/rust#47507 about addressing the underlying issue upstream. MozReview-Commit-ID: LRwUj3fhiaO UltraBlame original commit: 261725e65af9b5d98ff593db3db08632bf019454
Work around excessive command-line length issues by disabling incremental rust compilation, which is enabled by default outside `cargo --release` starting with Rust 1.24. Incremental rust builds shouldn't help much in automation, where sccache provides the only continuity between build environments. In the meantime, they add a lot of object files to the link line. See rust-lang/rust#47507 about addressing the underlying issue upstream. MozReview-Commit-ID: LRwUj3fhiaO
When spawning a linker rustc has historically been known to blow OS limits for
the command line being too large, notably on Windows. This is especially true of
incremental compilation where there can be dozens of object files per
compilation. The compiler currently has logic for detecting a failure to spawn
and instead passing arguments via a file instead, but this failure detection
only triggers if a process actually fails to spawn.
Unfortunately on Windows we've got something else to worry about which is
cmd.exe. The compiler may be running a linker throughcmd.exewherecmd.exehas a limit of 8192 on the command line vs 32k onCreateProcess.Moreso rustc actually succeeds in spawning
cmd.exetoday, it's just that afterit's running
cmd.exefails to spawn its child, which rustc doesn't currentlydetect.
Consequently this commit updates the logic for the spawning the linker on
Windows to instead have a heuristic to see if we need to pass arguments via a
file. This heuristic is an overly pessimistic and "inaccurate" calculation which
just calls
lenon a bunch ofOsStringinstances (wherelenis notprecisely the length in u16 elements). This number, when exceeding the 6k
threshold, will force rustc to always pass arguments through a file.
This strategy should avoid us trying to parse the output on Windows of the
linker to see if it successfully spawned yet failed to actually sub-spawn the
linker. We may just be passing arguments through files a little more commonly
now...
The motivation for this commit was a recent bug in Gecko 1 when beta testing,
notably when incremental compilation was enabled it blew out the limit on
cmd.exe. This commit will also fix#46999 as well though as emscripten uses abat script as well (and we're blowing the limit there).
Closes#46999