Skip to content
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

Track panic in Unit early. #6170

Merged
merged 1 commit into from
Oct 15, 2018
Merged

Track panic in Unit early. #6170

merged 1 commit into from
Oct 15, 2018

Conversation

ehuss
Copy link
Contributor

@ehuss ehuss commented Oct 12, 2018

This is an alternate solution for #5445. It ensures that panic is cleared in the Profile for "for_host" targets (proc-macro/plugin/build-scripts) and dependencies. This helps avoid unnecessary recompiles in some situations (though does add extra units in some situations, see below).

Some examples where extra rebuilds are now avoided:

  • A workspace with a dependency shared with normal and build-deps. build --all should build everything, and then build -p foo was causing a recompile because the shared dep was no longer in the used_in_plugin set. Now it should not recompile.
  • panic=abort, with a shared dependency in build and dev, build would cause that shared dependency to be built twice (exactly the same without panic set). Now it should only build once.

Some examples where panic is now set correctly:

  • panic=abort, with a binary with a shared dependency in build and normal, test would cause that shared dependency to be built twice (exactly the same without panic set). Now it is still built twice, but the one for the normal (bin) dependency will correctly have panic set.

Some examples where new units are now generated:

  • panic=abort, with shared dependency between normal and proc-macro or build. Previously the shared dependency was built once with panic=unwind. Now it is built separately (once with panic, once without). I feel like that this is more correct behavior — that now the normal dependency avoids adding landing pads.

    For panic=abort cross-compiling, this makes no difference in compile time since it was already built twice.

Additional notes:

  • I left build-scripts with the old behavior where panic is cleared for it and all its dependencies. There could be arguments made to change that (Should build.rs be compiled like plugins? #5436), but it doesn't seem important to me.
  • Renamed and refactored ProfileFor to UnitFor. I expect this API to continue to evolve in the future.

Closes #6143, closes #6154.

@rust-highfive
Copy link

r? @alexcrichton

(rust_highfive has picked a reviewer for you, use r? to override)

@alexcrichton
Copy link
Member

@bors: r+

These seem like good tradeoffs to me and good to fix these bugs, thanks so much for digging into this @ehuss!

@bors
Copy link
Contributor

bors commented Oct 15, 2018

📌 Commit 8648994 has been approved by alexcrichton

@bors
Copy link
Contributor

bors commented Oct 15, 2018

⌛ Testing commit 8648994 with merge 571a542...

bors added a commit that referenced this pull request Oct 15, 2018
Track `panic` in Unit early.

This is an alternate solution for #5445. It ensures that `panic` is cleared in the Profile for "for_host" targets (proc-macro/plugin/build-scripts) and dependencies. This helps avoid unnecessary recompiles in some situations (though does add extra units in some situations, see below).

Some examples where extra rebuilds are now avoided:
* A workspace with a dependency shared with normal and build-deps.  `build --all` should build everything, and then `build -p foo` was causing a recompile because the shared dep was no longer in the `used_in_plugin` set. Now it should not recompile.
* `panic=abort`, with a shared dependency in build and dev, `build` would cause that shared dependency to be built twice (exactly the same without panic set). Now it should only build once.

Some examples where `panic` is now set correctly:
* `panic=abort`, with a binary with a shared dependency in build and normal, `test` would cause that shared dependency to be built twice (exactly the same without panic set).  Now it is still built twice, but the one for the normal (bin) dependency will correctly have `panic` set.

Some examples where new units are now generated:
* `panic=abort`, with shared dependency between normal and proc-macro or build. Previously the shared dependency was built once with `panic=unwind`. Now it is built separately (once with `panic`, once without). I feel like that this is more correct behavior — that now the normal dependency avoids adding landing pads.

   For `panic=abort` cross-compiling, this makes no difference in compile time since it was already built twice.

Additional notes:
- I left build-scripts with the old behavior where `panic` is cleared for it and all its dependencies. There could be arguments made to change that (#5436), but it doesn't seem important to me.
- Renamed and refactored `ProfileFor` to `UnitFor`. I expect this API to continue to evolve in the future.

Closes #6143, closes #6154.
@bors
Copy link
Contributor

bors commented Oct 15, 2018

☀️ Test successful - status-appveyor, status-travis
Approved by: alexcrichton
Pushing 571a542 to master...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
4 participants