mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
4c002fce9d
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.
17 lines
352 B
Rust
17 lines
352 B
Rust
//@ compile-flags: -O
|
|
|
|
#![crate_type = "lib"]
|
|
|
|
// CHECK-LABEL: @loop_skips_vtable_load
|
|
#[no_mangle]
|
|
pub fn loop_skips_vtable_load(x: &dyn Fn()) {
|
|
// CHECK: load ptr, ptr %0{{.*}}, !invariant.load
|
|
// CHECK-NEXT: tail call void %1
|
|
// CHECK-NOT: load ptr
|
|
x();
|
|
for _ in 0..100 {
|
|
// CHECK: tail call void %1
|
|
x();
|
|
}
|
|
}
|