-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Use GEP inbounds for ZST and DST field offsets #122048
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
//! This file tests that we correctly generate GEP instructions for DST | ||
//! field offsets. | ||
//@ compile-flags: -C no-prepopulate-passes -Copt-level=0 | ||
|
||
#![crate_type = "lib"] | ||
|
||
#![feature(extern_types)] | ||
|
||
use std::ptr::addr_of; | ||
|
||
// Hack to get the correct type for usize | ||
// CHECK: @helper([[USIZE:i[0-9]+]] %_1) | ||
#[no_mangle] | ||
pub fn helper(_: usize) { | ||
} | ||
|
||
struct Dst<T: ?Sized> { | ||
x: u32, | ||
y: u8, | ||
z: T, | ||
} | ||
|
||
// CHECK: @dst_dyn_trait_offset(ptr align {{[0-9]+}} [[DATA_PTR:%.+]], ptr align {{[0-9]+}} [[VTABLE_PTR:%.+]]) | ||
#[no_mangle] | ||
pub fn dst_dyn_trait_offset(s: &Dst<dyn Drop>) -> &dyn Drop { | ||
// The alignment of dyn trait is unknown, so we compute the offset based on align from the vtable. | ||
|
||
// CHECK: [[SIZE_PTR:%[0-9]+]] = getelementptr inbounds {{.+}} [[VTABLE_PTR]] | ||
// CHECK: load [[USIZE]], ptr [[SIZE_PTR]] | ||
// CHECK: [[ALIGN_PTR:%[0-9]+]] = getelementptr inbounds {{.+}} [[VTABLE_PTR]] | ||
// CHECK: load [[USIZE]], ptr [[ALIGN_PTR]] | ||
|
||
// CHECK: getelementptr inbounds i8, ptr [[DATA_PTR]] | ||
// CHECK-NEXT: insertvalue | ||
// CHECK-NEXT: insertvalue | ||
// CHECK-NEXT: ret | ||
&s.z | ||
} | ||
|
||
// CHECK-LABEL: @dst_slice_offset | ||
#[no_mangle] | ||
pub fn dst_slice_offset(s: &Dst<[u16]>) -> &[u16] { | ||
// The alignment of [u16] is known, so we generate a GEP directly. | ||
|
||
// CHECK: start: | ||
// CHECK-NEXT: getelementptr inbounds i8, {{.+}}, [[USIZE]] 6 | ||
// CHECK-NEXT: insertvalue | ||
// CHECK-NEXT: insertvalue | ||
// CHECK-NEXT: ret | ||
&s.z | ||
} | ||
|
||
#[repr(packed)] | ||
struct PackedDstSlice { | ||
x: u32, | ||
y: u8, | ||
z: [u16], | ||
} | ||
|
||
// CHECK-LABEL: @packed_dst_slice_offset | ||
#[no_mangle] | ||
pub fn packed_dst_slice_offset(s: &PackedDstSlice) -> *const [u16] { | ||
// The alignment of [u16] is known, so we generate a GEP directly. | ||
|
||
// CHECK: start: | ||
// CHECK-NEXT: getelementptr inbounds i8, {{.+}}, [[USIZE]] 5 | ||
// CHECK-NEXT: insertvalue | ||
// CHECK-NEXT: insertvalue | ||
// CHECK-NEXT: ret | ||
addr_of!(s.z) | ||
} | ||
|
||
extern { | ||
pub type Extern; | ||
} | ||
|
||
// CHECK-LABEL: @dst_extern | ||
#[no_mangle] | ||
pub fn dst_extern(s: &Dst<Extern>) -> &Extern { | ||
// Computing the alignment of an extern type is currently unsupported and just panics. | ||
|
||
// CHECK: call void @{{.+}}panic | ||
&s.z | ||
} | ||
Comment on lines
+73
to
+84
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure if this is what you expected... Full IR: @str.0 = internal unnamed_addr constant [66 x i8] c"attempted to compute the size or alignment of extern type `Extern`"
define align 1 ptr @dst_extern(ptr align 4 %s) unnamed_addr #0 {
start:
; call core::panicking::panic_nounwind
call void @_ZN4core9panicking14panic_nounwind17h5c216434c597abbdE(ptr align 1 @str.0, i64 66) #2
%_0 = getelementptr inbounds i8, ptr %s, i64 5
ret ptr %_0
} funnily enough it still generates an unreachable GEP. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yea, as long as we have a test, whatever the behaviour, that is fine with me. I just want to protect against accidentally changing behaviour here in the future |
Uh oh!
There was an error while loading. Please reload this page.