Auto merge of #68414 - michaelwoerister:share-drop-glue, r=alexcrichton
Also share drop-glue when compiling with -Zshare-generics (i.e. at opt-level=0) This PR adds drop-glue to the set of monomorphizations that can be shared across crates via `-Zshare-generics`. This version of the PR might have detrimental effects on performance as it makes lots of stuff dependent on a single query results (`upstream_monomorphizations_for(def_id_of_drop_in_place)`). That should be fixable but let's do a perf run first. Potentially fixes issue https://github.com/rust-lang/rust/issues/64140. (cc @alexcrichton) The changes here are related to @matthewjasper's https://github.com/rust-lang/rust/pull/67332 but should be mostly orthogonal. r? @ghost
This commit is contained in:
commit
73f76b74ef
14 changed files with 212 additions and 160 deletions
|
|
@ -1,4 +1,6 @@
|
|||
// compile-flags:-Zshare-generics=yes
|
||||
// NOTE: We always compile this test with -Copt-level=0 because higher opt-levels
|
||||
// prevent drop-glue from participating in share-generics.
|
||||
// compile-flags:-Zshare-generics=yes -Copt-level=0
|
||||
// no-prefer-dynamic
|
||||
|
||||
#![crate_type="rlib"]
|
||||
|
|
@ -8,5 +10,17 @@ pub fn generic_fn<T>(x: T, y: T) -> (T, T) {
|
|||
}
|
||||
|
||||
pub fn use_generic_fn_f32() -> (f32, f32) {
|
||||
// This line causes drop glue for Foo to be instantiated. We want to make
|
||||
// sure that this crate exports an instance to be re-used by share-generics.
|
||||
let _ = Foo(0);
|
||||
|
||||
generic_fn(0.0f32, 1.0f32)
|
||||
}
|
||||
|
||||
pub struct Foo(pub u32);
|
||||
|
||||
impl Drop for Foo {
|
||||
fn drop(&mut self) {
|
||||
println!("foo");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
// ignore-tidy-linelength
|
||||
// no-prefer-dynamic
|
||||
// compile-flags:-Zprint-mono-items=eager -Zshare-generics=yes -Zincremental=tmp/partitioning-tests/shared-generics-exe
|
||||
// NOTE: We always compile this test with -Copt-level=0 because higher opt-levels
|
||||
// prevent drop-glue from participating in share-generics.
|
||||
// compile-flags:-Zprint-mono-items=eager -Zshare-generics=yes -Zincremental=tmp/partitioning-tests/shared-generics-exe -Copt-level=0
|
||||
|
||||
#![crate_type="rlib"]
|
||||
|
||||
|
|
@ -16,6 +18,10 @@ pub fn foo() {
|
|||
// This should not generate a monomorphization because it's already
|
||||
// available in `shared_generics_aux`.
|
||||
let _ = shared_generics_aux::generic_fn(0.0f32, 3.0f32);
|
||||
}
|
||||
|
||||
// MONO_ITEM drop-glue i8
|
||||
// The following line will drop an instance of `Foo`, generating a call to
|
||||
// Foo's drop-glue function. However, share-generics should take care of
|
||||
// reusing the drop-glue from the upstream crate, so we do not expect a
|
||||
// mono item for the drop-glue
|
||||
let _ = shared_generics_aux::Foo(1);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue