mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-20 11:37:32 +00:00

This replaces the drop_in_place reference with null in vtables. On librustc_driver.so, this drops about ~17k dynamic relocations from the output, since many vtables can now be placed in read-only memory, rather than having a relocated pointer included. This makes a tradeoff by adding a null check at vtable call sites. That's hard to avoid without changing the vtable format (e.g., to use a pc-relative relocation instead of an absolute address, and avoid the dynamic relocation that way). But it seems likely that the check is cheap at runtime.
99 lines
3.8 KiB
Rust
99 lines
3.8 KiB
Rust
// We specify incremental here because we want to test the partitioning for incremental compilation
|
|
//@ incremental
|
|
//@ compile-flags:-Zprint-mono-items=lazy
|
|
//@ compile-flags:-Zinline-in-all-cgus
|
|
|
|
// This test case makes sure, that references made through constants are
|
|
// recorded properly in the InliningMap.
|
|
|
|
#![feature(start)]
|
|
|
|
mod mod1 {
|
|
struct NeedsDrop;
|
|
|
|
impl Drop for NeedsDrop {
|
|
fn drop(&mut self) {}
|
|
}
|
|
|
|
pub trait Trait1 {
|
|
fn do_something(&self) {}
|
|
fn do_something_else(&self) {}
|
|
}
|
|
|
|
impl Trait1 for NeedsDrop {}
|
|
|
|
pub trait Trait1Gen<T> {
|
|
fn do_something(&self, x: T) -> T;
|
|
fn do_something_else(&self, x: T) -> T;
|
|
}
|
|
|
|
impl<T> Trait1Gen<T> for NeedsDrop {
|
|
fn do_something(&self, x: T) -> T { x }
|
|
fn do_something_else(&self, x: T) -> T { x }
|
|
}
|
|
|
|
//~ MONO_ITEM fn mod1::id::<i64> @@ vtable_through_const-mod1.volatile[Internal]
|
|
fn id<T>(x: T) -> T { x }
|
|
|
|
// These are referenced, so they produce mono-items (see start())
|
|
pub const TRAIT1_REF: &'static Trait1 = &NeedsDrop as &Trait1;
|
|
pub const TRAIT1_GEN_REF: &'static Trait1Gen<u8> = &NeedsDrop as &Trait1Gen<u8>;
|
|
pub const ID_CHAR: fn(char) -> char = id::<char>;
|
|
|
|
|
|
|
|
pub trait Trait2 {
|
|
fn do_something(&self) {}
|
|
fn do_something_else(&self) {}
|
|
}
|
|
|
|
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait2>::do_something @@ vtable_through_const-mod1.volatile[Internal]
|
|
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait2>::do_something_else @@ vtable_through_const-mod1.volatile[Internal]
|
|
impl Trait2 for NeedsDrop {}
|
|
|
|
pub trait Trait2Gen<T> {
|
|
fn do_something(&self, x: T) -> T;
|
|
fn do_something_else(&self, x: T) -> T;
|
|
}
|
|
|
|
impl<T> Trait2Gen<T> for NeedsDrop {
|
|
fn do_something(&self, x: T) -> T { x }
|
|
fn do_something_else(&self, x: T) -> T { x }
|
|
}
|
|
|
|
// These are not referenced, so they do not produce mono-items
|
|
pub const TRAIT2_REF: &'static Trait2 = &NeedsDrop as &Trait2;
|
|
pub const TRAIT2_GEN_REF: &'static Trait2Gen<u8> = &NeedsDrop as &Trait2Gen<u8>;
|
|
pub const ID_I64: fn(i64) -> i64 = id::<i64>;
|
|
}
|
|
|
|
//~ MONO_ITEM fn start
|
|
#[start]
|
|
fn start(_: isize, _: *const *const u8) -> isize {
|
|
//~ MONO_ITEM fn <mod1::NeedsDrop as std::ops::Drop>::drop @@ vtable_through_const-fallback.cgu[Internal]
|
|
//~ MONO_ITEM fn std::ptr::drop_in_place::<mod1::NeedsDrop> - shim(Some(mod1::NeedsDrop)) @@ vtable_through_const-fallback.cgu[External]
|
|
|
|
// Since Trait1::do_something() is instantiated via its default implementation,
|
|
// it is considered a generic and is instantiated here only because it is
|
|
// referenced in this module.
|
|
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait1>::do_something_else @@ vtable_through_const-mod1.volatile[External]
|
|
|
|
// Although it is never used, Trait1::do_something_else() has to be
|
|
// instantiated locally here too, otherwise the <&NeedsDrop as &Trait1> vtable
|
|
// could not be fully constructed.
|
|
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait1>::do_something @@ vtable_through_const-mod1.volatile[External]
|
|
mod1::TRAIT1_REF.do_something();
|
|
|
|
// Same as above
|
|
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait1Gen<u8>>::do_something @@ vtable_through_const-mod1.volatile[External]
|
|
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait1Gen<u8>>::do_something_else @@ vtable_through_const-mod1.volatile[External]
|
|
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait2Gen<u8>>::do_something @@ vtable_through_const-mod1.volatile[Internal]
|
|
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait2Gen<u8>>::do_something_else @@ vtable_through_const-mod1.volatile[Internal]
|
|
mod1::TRAIT1_GEN_REF.do_something(0u8);
|
|
|
|
//~ MONO_ITEM fn mod1::id::<char> @@ vtable_through_const-mod1.volatile[External]
|
|
mod1::ID_CHAR('x');
|
|
|
|
0
|
|
}
|